@acorex/charts 20.6.17 → 20.6.19

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.
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-charts-gauge-chart.mjs","sources":["../tmp-esm2022/gauge-chart/lib/gauge-chart.config.js","../tmp-esm2022/gauge-chart/lib/gauge-chart.component.js","../tmp-esm2022/gauge-chart/acorex-charts-gauge-chart.js"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nexport const AXGaugeChartDefaultConfig = {\n minValue: 0,\n maxValue: 100,\n gaugeWidth: 22,\n cornerRadius: 5,\n showValue: true,\n showTooltip: true,\n animationDuration: 750,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide a value to display the gauge',\n noDataIcon: 'fa-light fa-gauge',\n },\n};\nexport const AX_GAUGE_CHART_CONFIG = new InjectionToken('AX_GAUGE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXGaugeChartDefaultConfig,\n});\nexport function gaugeChartConfig(config = {}) {\n const result = {\n ...AXGaugeChartDefaultConfig,\n ...config,\n };\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2hhcnQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXVCO0lBQzNELFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLEdBQUc7SUFDYixVQUFVLEVBQUUsRUFBRTtJQUNkLFlBQVksRUFBRSxDQUFDO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLE1BQU0sRUFBRSxtQkFBbUI7UUFDM0IsVUFBVSxFQUFFLDZDQUE2QztRQUN6RCxVQUFVLEVBQUUsbUJBQW1CO0tBQ2hDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUFxQix1QkFBdUIsRUFBRTtJQUNuRyxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMseUJBQXlCO0NBQ3pDLENBQUMsQ0FBQztBQUlILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxTQUFrQyxFQUFFO0lBQ25FLE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyx5QkFBeUI7UUFDNUIsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhHYXVnZUNoYXJ0T3B0aW9uIH0gZnJvbSAnLi9nYXVnZS1jaGFydC50eXBlJztcblxuZXhwb3J0IGNvbnN0IEFYR2F1Z2VDaGFydERlZmF1bHRDb25maWc6IEFYR2F1Z2VDaGFydE9wdGlvbiA9IHtcbiAgbWluVmFsdWU6IDAsXG4gIG1heFZhbHVlOiAxMDAsXG4gIGdhdWdlV2lkdGg6IDIyLFxuICBjb3JuZXJSYWRpdXM6IDUsXG4gIHNob3dWYWx1ZTogdHJ1ZSxcbiAgc2hvd1Rvb2x0aXA6IHRydWUsXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA3NTAsXG4gIGFuaW1hdGlvbkVhc2luZzogJ2N1YmljLW91dCcsXG4gIG1lc3NhZ2VzOiB7XG4gICAgbm9EYXRhOiAnTm8gZGF0YSBhdmFpbGFibGUnLFxuICAgIG5vRGF0YUhlbHA6ICdQbGVhc2UgcHJvdmlkZSBhIHZhbHVlIHRvIGRpc3BsYXkgdGhlIGdhdWdlJyxcbiAgICBub0RhdGFJY29uOiAnZmEtbGlnaHQgZmEtZ2F1Z2UnLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEFYX0dBVUdFX0NIQVJUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBWEdhdWdlQ2hhcnRPcHRpb24+KCdBWF9HQVVHRV9DSEFSVF9DT05GSUcnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4gQVhHYXVnZUNoYXJ0RGVmYXVsdENvbmZpZyxcbn0pO1xuXG5leHBvcnQgdHlwZSBQYXJ0aWFsR2F1Z2VDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhHYXVnZUNoYXJ0T3B0aW9uPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdhdWdlQ2hhcnRDb25maWcoY29uZmlnOiBQYXJ0aWFsR2F1Z2VDaGFydENvbmZpZyA9IHt9KTogQVhHYXVnZUNoYXJ0T3B0aW9uIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIC4uLkFYR2F1Z2VDaGFydERlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICB9O1xuICByZXR1cm4gcmVzdWx0O1xufVxuIl19","import { AXChartComponent, computeTooltipPosition, formatLargeNumber, getEasingFunction, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, afterNextRender, computed, effect, inject, input, signal, viewChild, } from '@angular/core';\nimport { AX_GAUGE_CHART_CONFIG } from './gauge-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Gauge Chart Component\n * Renders a semi-circular gauge chart with animated needle and thresholds\n */\nexport class AXGaugeChartComponent extends AXChartComponent {\n // Inputs\n /** Chart value input */\n value = input(0, ...(ngDevMode ? [{ debugName: \"value\" }] : []));\n /** Chart options input */\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // SVG element reference (created in the code)\n svgElement = null;\n // D3 reference - loaded asynchronously\n d3;\n // Signals for component state\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n _prevValue = signal(null, ...(ngDevMode ? [{ debugName: \"_prevValue\" }] : []));\n // Track previous options to detect changes\n _prevOptionsString = '';\n // Cache for container dimensions to avoid repeated DOM reads\n _lastContainerRect = null;\n // Tooltip signals\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n _tooltipRafId = null;\n _pendingTooltipCoords = null;\n // Expose tooltip signals as read-only 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_GAUGE_CHART_CONFIG);\n // Computed configuration options\n effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Constants\n TOOLTIP_GAP = 10;\n HALF_CIRCLE_RADIANS = Math.PI;\n QUARTER_CIRCLE_RADIANS = Math.PI / 2;\n DEGREES_PER_RADIAN = 180 / Math.PI;\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 // Watch for changes to redraw the chart\n effect(() => {\n // Access inputs to track them\n const currentValue = this.value();\n const options = this.effectiveOptions();\n // Update previous value\n this._prevValue.set(currentValue);\n // Only update if already rendered\n if (this._rendered()) {\n // If only the value changed, just update the value display and dial\n const optionsString = JSON.stringify(options);\n if (this._prevOptionsString === optionsString) {\n this.updateValueAndDial(currentValue);\n }\n else {\n // If options changed, recreate the whole chart\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n }\n });\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n /**\n * Loads D3.js dynamically\n */\n async loadD3() {\n if (this.d3)\n return; // Already loaded\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n /**\n * Creates the gauge chart with all elements\n */\n createChart() {\n // Clear container and create SVG\n if (this.svgElement) {\n this.svgElement.remove();\n }\n // Create SVG element\n this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.chartContainerEl().nativeElement.appendChild(this.svgElement);\n // Get current options\n const options = this.effectiveOptions();\n // Store options string for comparison\n this._prevOptionsString = JSON.stringify(options);\n const { minValue, maxValue, showValue, label = '', gaugeWidth, cornerRadius, animationDuration } = options;\n const thresholds = options.thresholds ?? [];\n // Calculate responsive dimensions\n const containerElement = this.chartContainerEl().nativeElement;\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // Cache container dimensions\n this._lastContainerRect = { width: containerWidth, height: containerHeight };\n // Determine chart dimensions - use options if provided, otherwise use container dimensions\n const width = options.width ?? containerWidth;\n const height = options.height ?? containerHeight;\n // Ensure minimum dimensions\n const effectiveWidth = Math.max(width, 100);\n const effectiveHeight = Math.max(height, 50);\n // For a semi-circular gauge, width should be approximately twice the height\n const size = Math.min(effectiveWidth, effectiveHeight * 2);\n // Calculate margin as percentage of size (5-8% with reasonable bounds)\n const marginRatio = 0.08;\n const margin = Math.max(5, Math.min(size * marginRatio, 30));\n // Calculate space needed for ticks and labels (increased for larger font sizes)\n const tickLabelSpace = Math.max(12, Math.min(size * 0.12, 40));\n const totalVerticalSpace = size / 2 + tickLabelSpace;\n // Calculate horizontal padding for tick labels (they extend beyond gauge edges)\n // Estimate based on font size - tick labels are roughly 2-3 characters wide\n const estimatedTickFontSize = Math.max(14, Math.min(18, Math.floor(size / 35)));\n const horizontalPadding = Math.max(20, estimatedTickFontSize * 1.5);\n const totalWidth = size + horizontalPadding * 2;\n // Set up SVG with responsive viewBox that accounts for overflow\n const svg = this.d3\n .select(this.svgElement)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${totalWidth} ${totalVerticalSpace}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n // Create a group for the chart centered horizontally with padding, positioned to show only the top half\n const chartGroup = svg\n .append('g')\n .attr('transform', `translate(${size / 2 + horizontalPadding}, ${size / 2 - margin})`);\n // Define gauge parameters\n const radius = size / 2 - margin;\n const desiredGaugeWidth = typeof gaugeWidth === 'number' && !Number.isNaN(gaugeWidth) ? gaugeWidth : size * 0.12;\n const clampedGaugeWidth = Math.max(size * 0.06, Math.min(desiredGaugeWidth, size * 0.2));\n const innerRadius = radius - clampedGaugeWidth;\n const outerRadius = radius;\n // Create gradient definitions\n this.createGradients(svg, thresholds);\n // Draw the background arc\n this.drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius);\n // Draw the threshold arcs if thresholds exist\n if (thresholds.length > 0) {\n this.drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius);\n }\n // Draw tick marks\n this.drawTicks(chartGroup, outerRadius, minValue, maxValue, size);\n // Draw the dial/needle with animation\n this.drawDial(chartGroup, radius, this.value(), minValue, maxValue, animationDuration);\n // Draw the value display (after the dial so it's on top)\n if (showValue) {\n this.drawValueDisplay(chartGroup, this.value(), label, radius, size);\n }\n // Hide tooltip initially\n this._tooltipVisible.set(false);\n }\n /**\n * Updates the chart when options change\n */\n updateChart() {\n this.createChart();\n }\n /**\n * Updates only the value display and dial position without recreating the chart\n */\n updateValueAndDial(value) {\n if (!this.svgElement)\n return;\n const options = this.effectiveOptions();\n const minValue = options.minValue;\n const maxValue = options.maxValue;\n const animationDuration = options.animationDuration;\n const easingFunction = getEasingFunction(this.d3, options.animationEasing);\n const currentValue = value;\n const svg = this.d3.select(this.svgElement);\n // Update value text\n svg.select('.gauge-value').text(currentValue.toLocaleString());\n // Update needle position\n const angle = this.scaleValueToAngle(currentValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n svg\n .select('.gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n /**\n * Draw the background arc\n */\n drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius) {\n // Create arc for the background\n const backgroundArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .startAngle(-this.QUARTER_CIRCLE_RADIANS) // Start from bottom (-90 degrees)\n .endAngle(this.QUARTER_CIRCLE_RADIANS) // End at top (90 degrees)\n .cornerRadius(cornerRadius);\n // Draw background arc\n const backgroundPath = chartGroup\n .append('path')\n .attr('d', backgroundArc)\n .attr('class', 'gauge-arc gauge-base')\n .attr('fill', 'url(#gauge-bg-gradient)')\n .attr('filter', 'drop-shadow(0px 2px 3px rgba(0,0,0,0.1))');\n // Add tooltip for single arc if no thresholds\n if (!this.effectiveOptions().thresholds || this.effectiveOptions().thresholds.length === 0) {\n backgroundPath\n .style('cursor', 'pointer')\n .on('mouseenter', (event) => {\n if (!this.effectiveOptions().showTooltip)\n return;\n this.showSingleRangeTooltip(event);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n /**\n * Draw the thresholds arcs\n */\n drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius) {\n // Create arc generator\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98)\n .cornerRadius(cornerRadius);\n // Sort thresholds by value in ascending order (only if needed)\n const sortedThresholds = thresholds.length > 1 ? [...thresholds].sort((a, b) => a.value - b.value) : thresholds;\n // Calculate all angles first using the color angle calculation\n const angles = sortedThresholds.map((t) => this.scaleValueToColorAngle(t.value, minValue, maxValue));\n // Start from the minimum value angle\n let previousEndAngle = this.scaleValueToColorAngle(minValue, minValue, maxValue);\n sortedThresholds.forEach((threshold, i) => {\n const endAngle = angles[i];\n // Skip if end angle is not greater than start angle\n if (endAngle <= previousEndAngle)\n return;\n const arcPath = chartGroup\n .append('path')\n .attr('d', arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle,\n }))\n .attr('fill', threshold.color || `url(#threshold-gradient-${i})`)\n .attr('class', 'gauge-arc threshold-arc')\n .attr('data-value', threshold.value)\n .style('cursor', 'pointer');\n // Add tooltip interaction\n if (this.effectiveOptions().showTooltip) {\n // Convert angles back to values for tooltip\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = threshold.value;\n arcPath\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, threshold.color, threshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n // Update the previous end angle for the next threshold\n previousEndAngle = endAngle;\n });\n // Draw the last segment if the last threshold is less than the max value\n if (previousEndAngle < this.QUARTER_CIRCLE_RADIANS) {\n const lastArc = chartGroup\n .append('path')\n .attr('d', arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle: this.QUARTER_CIRCLE_RADIANS,\n }))\n .attr('fill', 'url(#gauge-bg-gradient)')\n .attr('class', 'gauge-arc threshold-arc')\n .style('cursor', 'pointer');\n // Add tooltip for the last segment\n if (this.effectiveOptions().showTooltip) {\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = maxValue;\n const lastThreshold = thresholds[thresholds.length - 1];\n lastArc\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, lastThreshold.color, lastThreshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n }\n /**\n * Shows tooltip for a threshold arc\n */\n showThresholdTooltip(event, startValue, endValue, color, label) {\n // Create tooltip data\n this._tooltipData.set({\n title: label || 'Range',\n value: `${startValue.toLocaleString()} - ${endValue.toLocaleString()}`,\n color: color,\n });\n // Show tooltip\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n /**\n * Shows tooltip for the entire range when no thresholds are defined\n */\n showSingleRangeTooltip(event) {\n const options = this.effectiveOptions();\n if (!options.showTooltip)\n return;\n this.updateTooltipPosition(event);\n this._tooltipData.set({\n title: options.label || 'Range',\n value: `${options.minValue.toLocaleString()} - ${options.maxValue.toLocaleString()}`,\n color: 'rgb(var(--ax-comp-gauge-chart-track-color))',\n });\n this._tooltipVisible.set(true);\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 rect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;\n const pos = computeTooltipPosition(rect, tooltipRect, coords.x + 10, coords.y - 10, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n /**\n * Hides the tooltip\n */\n hideTooltip() {\n this._tooltipVisible.set(false);\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 if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n this._tooltipVisible.set(false);\n this._lastContainerRect = null;\n }\n /**\n * Creates gradient definitions for thresholds\n */\n createGradients(svg, thresholds) {\n const defs = svg.append('defs');\n // Create a radial gradient for the background\n const bgGradient = defs\n .append('radialGradient')\n .attr('id', 'gauge-bg-gradient')\n .attr('cx', '50%')\n .attr('cy', '50%')\n .attr('r', '50%')\n .attr('gradientUnits', 'userSpaceOnUse');\n // Get CSS variable for track color\n if (thresholds.length === 0) {\n // Default gradient when no thresholds are provided\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n }\n else {\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n // Create gradients for each threshold\n thresholds.forEach((threshold, i) => {\n const gradient = defs\n .append('linearGradient')\n .attr('id', `threshold-gradient-${i}`)\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('x1', '-1')\n .attr('y1', '0')\n .attr('x2', '1')\n .attr('y2', '0');\n gradient\n .append('stop')\n .attr('offset', '0%')\n .attr('stop-color', this.d3.color(threshold.color)?.brighter(0.5).toString() || threshold.color);\n gradient.append('stop').attr('offset', '100%').attr('stop-color', threshold.color);\n });\n }\n }\n /**\n * Draws tick marks and labels around the gauge\n */\n drawTicks(chartGroup, radius, minValue, maxValue, size) {\n // Dynamically choose tick count based on chart size (reduced for better spacing)\n let tickCount = 5;\n if (size < 200)\n tickCount = 3; // Very small: only show min, mid, max\n else if (size < 300)\n tickCount = 4;\n else if (size < 400)\n tickCount = 5;\n else if (size > 520)\n tickCount = 7;\n // Scale tick length and label offset proportionally to size\n const tickLength = Math.max(4, Math.min(radius * 0.12, 14));\n // Increased label offset to prevent overlap with tick lines and wide labels (like 100M)\n const labelOffset = Math.max(22, Math.min(radius * 0.28, 45));\n // Create a group for the ticks\n const tickGroup = chartGroup.append('g').attr('class', 'ticks');\n // Generate tick values\n const tickValues = [];\n const step = (maxValue - minValue) / (tickCount - 1);\n for (let i = 0; i < tickCount; i++) {\n tickValues.push(minValue + i * step);\n }\n // Create ticks and labels\n tickValues.forEach((tick) => {\n // Calculate angle for this tick\n const angle = this.scaleValueToAngle(tick, minValue, maxValue);\n const radians = angle - this.QUARTER_CIRCLE_RADIANS; // Adjust for starting at bottom (-90 degrees)\n // Calculate positions\n const x1 = Math.cos(radians) * (radius + 5);\n const y1 = Math.sin(radians) * (radius + 5);\n const x2 = Math.cos(radians) * (radius + tickLength);\n const y2 = Math.sin(radians) * (radius + tickLength);\n // Calculate label position\n const labelX = Math.cos(radians) * (radius + labelOffset);\n const labelY = Math.sin(radians) * (radius + labelOffset);\n // Draw tick line\n tickGroup\n .append('line')\n .attr('x1', x1)\n .attr('y1', y1)\n .attr('x2', x2)\n .attr('y2', y2)\n .attr('stroke', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.5)')\n .attr('stroke-width', 2);\n // Add tick label with dynamic font size (minimum 14px)\n const tickFontPx = Math.max(14, Math.min(18, Math.floor(size / 35)));\n // Smart formatting: preserve decimals for small ranges, round for large values\n const valueRange = maxValue - minValue;\n let formattedValue;\n if (valueRange <= 10) {\n // Small range: show up to 2 decimal places, remove trailing zeros\n formattedValue = tick.toFixed(2).replace(/\\.?0+$/, '');\n }\n else if (valueRange < 1000) {\n // Medium range: show 1 decimal if needed\n formattedValue = tick % 1 === 0 ? tick.toString() : tick.toFixed(1);\n }\n else {\n // Large range: use abbreviated format (K, M, B)\n formattedValue = formatLargeNumber(Math.round(tick));\n }\n tickGroup\n .append('text')\n .attr('x', labelX)\n .attr('y', labelY)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('fill', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.7)')\n .style('font-size', `${tickFontPx}px`)\n .text(formattedValue);\n });\n }\n /**\n * Draws the value and label text in the center\n */\n drawValueDisplay(chartGroup, value, label, radius, size) {\n // Px-based scaling for robust small/large sizes with better small-size handling\n const valueFontPx = Math.max(18, Math.min(32, Math.floor(size / 8)));\n const labelFontPx = Math.max(10, Math.min(16, Math.floor(valueFontPx * 0.55)));\n // More vertical gap for small sizes: use larger base value\n const verticalGap = Math.max(6, Math.min(12, Math.floor(size / 40)));\n // Create group for the value display\n const valueGroup = chartGroup.append('g').attr('class', 'gauge-value-display').attr('text-anchor', 'middle');\n // Add value display\n valueGroup\n .append('text')\n .attr('class', 'gauge-value')\n .attr('x', 0)\n .attr('y', radius * 0.15 + valueFontPx)\n .style('font-size', `${valueFontPx}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .text(value.toLocaleString());\n // Add label display (if provided)\n if (label) {\n valueGroup\n .append('text')\n .attr('class', 'gauge-label')\n .attr('x', 0)\n .attr('y', radius * 0.24 + valueFontPx + verticalGap)\n .style('font-size', `${labelFontPx}px`)\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .style('opacity', '0.8')\n .text(label);\n }\n }\n /**\n * Draws the dial/needle pointing to the current value with animation\n */\n drawDial(chartGroup, radius, value, minValue, maxValue, animationDuration) {\n // Clamp value to min/max range\n const clampedValue = Math.max(minValue, Math.min(maxValue, value));\n // Calculate angle for needle based on value\n const angle = this.scaleValueToAngle(clampedValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n // Create a group for the needle\n const dialGroup = chartGroup.append('g').attr('class', 'dial');\n // Draw the needle with initial position at minimum value\n const needlePath = dialGroup\n .append('path')\n .attr('d', this.createNeedlePath(radius))\n .attr('class', 'gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('transform', `rotate(${this.radiansToDegrees(-this.HALF_CIRCLE_RADIANS)})`); // Start at -180 degrees (left)\n // Add a center circle\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.08)\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('stroke', '#fff')\n .attr('stroke-width', 2);\n // Add a smaller white center\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.03)\n .attr('fill', '#fff');\n // Get easing function\n const easingFunction = getEasingFunction(this.d3, this.options()?.animationEasing);\n // Animate the needle from min to current value\n needlePath\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n // getEasingFunction moved to shared chart utils\n /**\n * Creates a path string for the needle\n */\n createNeedlePath(radius) {\n const needleLength = radius * 0.8;\n const needleWidth = radius * 0.06;\n return `M 0,${needleWidth / 2} L ${needleLength},0 L 0,${-needleWidth / 2} Z`;\n }\n /**\n * Scales a value to an angle (in radians)\n */\n scaleValueToAngle(value, min, max) {\n const valueRange = max - min;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n /**\n * Scales a value to an angle for color arcs (in radians)\n */\n scaleValueToColorAngle(value, min, max) {\n const valueRange = max - min;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n /**\n * Converts an angle back to a value\n */\n angleToValue(angle, min, max) {\n const valueRange = max - min;\n return min + ((angle + this.QUARTER_CIRCLE_RADIANS) / this.HALF_CIRCLE_RADIANS) * valueRange;\n }\n /**\n * Converts radians to degrees\n */\n radiansToDegrees(radians) {\n return radians * this.DEGREES_PER_RADIAN;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXGaugeChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXGaugeChartComponent, isStandalone: true, selector: \"ax-gauge-chart\", inputs: { value: { classPropertyName: \"value\", publicName: \"value\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-gauge-chart\\\" role=\\\"img\\\" #chartContainer></div>\\n<ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\"></ax-chart-tooltip>\\n\", styles: [\"ax-gauge-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}ax-gauge-chart .ax-gauge-chart-no-data-message{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:1rem;width:100%;height:100%;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgb(var(--ax-comp-gauge-chart-bg-color))}ax-gauge-chart .ax-gauge-chart-no-data-icon{margin-bottom:.75rem;color:rgba(var(--ax-comp-gauge-chart-text-color),.6)}ax-gauge-chart .ax-gauge-chart-no-data-text{font-weight:600;color:rgb(var(--ax-comp-gauge-chart-text-color))}\\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: AXGaugeChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-gauge-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-gauge-chart\\\" role=\\\"img\\\" #chartContainer></div>\\n<ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\"></ax-chart-tooltip>\\n\", styles: [\"ax-gauge-chart{display:block;width:100%;height:100%;min-height:200px;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{width:100%;height:100%;max-width:100%;max-height:100%;overflow:visible}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}ax-gauge-chart .ax-gauge-chart-no-data-message{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:1rem;width:100%;height:100%;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgb(var(--ax-comp-gauge-chart-bg-color))}ax-gauge-chart .ax-gauge-chart-no-data-icon{margin-bottom:.75rem;color:rgba(var(--ax-comp-gauge-chart-text-color),.6)}ax-gauge-chart .ax-gauge-chart-no-data-text{font-weight:600;color:rgb(var(--ax-comp-gauge-chart-text-color))}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSx1QkFBdUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFHVCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUc3RDs7O0dBR0c7QUFTSCxNQUFNLE9BQU8scUJBQXNCLFNBQVEsZ0JBQWdCO0lBQ3pELFNBQVM7SUFDVCx3QkFBd0I7SUFDeEIsS0FBSyxHQUFHLEtBQUssQ0FBb0IsQ0FBQyxpREFBQyxDQUFDO0lBRXBDLDBCQUEwQjtJQUMxQixPQUFPLEdBQUcsS0FBSyxDQUFxQixFQUFFLG1EQUFDLENBQUM7SUFFeEMsNEJBQTRCO0lBQ1gsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBNkIsZ0JBQWdCLENBQUMsQ0FBQztJQUVyRyw4Q0FBOEM7SUFDdEMsVUFBVSxHQUF5QixJQUFJLENBQUM7SUFFaEQsdUNBQXVDO0lBQzdCLEVBQUUsQ0FBdUI7SUFFbkMsOEJBQThCO0lBQ3RCLFlBQVksR0FBRyxNQUFNLENBQUMsS0FBSyx3REFBQyxDQUFDO0lBQzdCLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxxREFBQyxDQUFDO0lBQzFCLFVBQVUsR0FBRyxNQUFNLENBQWdCLElBQUksc0RBQUMsQ0FBQztJQUVqRCwyQ0FBMkM7SUFDbkMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0lBRWhDLDZEQUE2RDtJQUNyRCxrQkFBa0IsR0FBNkMsSUFBSSxDQUFDO0lBRTVFLGtCQUFrQjtJQUNWLGVBQWUsR0FBRyxNQUFNLENBQUMsS0FBSywyREFBQyxDQUFDO0lBQ2hDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSw0REFBQyxDQUFDO0lBQzFDLFlBQVksR0FBRyxNQUFNLENBQXFCO1FBQ2hELEtBQUssRUFBRSxFQUFFO1FBQ1QsS0FBSyxFQUFFLEVBQUU7S0FDVix3REFBQyxDQUFDO0lBQ0ssYUFBYSxHQUFrQixJQUFJLENBQUM7SUFDcEMscUJBQXFCLEdBQW9DLElBQUksQ0FBQztJQUV0RSx1REFBdUQ7SUFDN0MsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbkQsZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNyRCxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUV2RCx1QkFBdUI7SUFDZixXQUFXLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFcEQsaUNBQWlDO0lBQ3ZCLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDekMsT0FBTztZQUNMLEdBQUcsSUFBSSxDQUFDLFdBQVc7WUFDbkIsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFO1NBQ2xCLENBQUM7SUFDSixDQUFDLDREQUFDLENBQUM7SUFFSCxZQUFZO0lBQ0ssV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNqQixtQkFBbUIsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQzlCLHNCQUFzQixHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLGtCQUFrQixHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBRXBEO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFDUiwyRUFBMkU7UUFDM0UsZUFBZSxDQUFDLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7UUFFSCx3Q0FBd0M7UUFDeEMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLDhCQUE4QjtZQUM5QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFFeEMsd0JBQXdCO1lBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRWxDLGtDQUFrQztZQUNsQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO2dCQUNyQixvRUFBb0U7Z0JBQ3BFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLGFBQWEsRUFBRSxDQUFDO29CQUM5QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3hDLENBQUM7cUJBQU0sQ0FBQztvQkFDTiwrQ0FBK0M7b0JBQy9DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxhQUFhLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNPLEtBQUssQ0FBQyxNQUFNO1FBQ3BCLElBQUksSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPLENBQUMsaUJBQWlCO1FBRXRDLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0Isc0NBQXNDO1lBQ3RDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNoQixpQ0FBaUM7UUFDakMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBRUQscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVuRSxzQkFBc0I7UUFDdEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEMsc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWxELE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEdBQUcsRUFBRSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDM0csTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFFNUMsa0NBQWtDO1FBQ2xDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsYUFBYSxDQUFDO1FBQy9ELE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQztRQUNwRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7UUFFdEQsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxDQUFDO1FBRTdFLDJGQUEyRjtRQUMzRixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLGNBQWMsQ0FBQztRQUM5QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLGVBQWUsQ0FBQztRQUVqRCw0QkFBNEI7UUFDNUIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFN0MsNEVBQTRFO1FBQzVFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUUzRCx1RUFBdUU7UUFDdkUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTdELGdGQUFnRjtRQUNoRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRCxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsY0FBYyxDQUFDO1FBRXJELGdGQUFnRjtRQUNoRiw0RUFBNEU7UUFDNUUsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxxQkFBcUIsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNwRSxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBRWhELGdFQUFnRTtRQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRTthQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUN2QixJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQzthQUNyQixJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQzthQUN0QixJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sVUFBVSxJQUFJLGtCQUFrQixFQUFFLENBQUM7YUFDMUQsSUFBSSxDQUFDLHFCQUFxQixFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRWhELHdHQUF3RztRQUN4RyxNQUFNLFVBQVUsR0FBRyxHQUFHO2FBQ25CLE1BQU0sQ0FBQyxHQUFHLENBQUM7YUFDWCxJQUFJLENBQUMsV0FBVyxFQUFFLGFBQWEsSUFBSSxHQUFHLENBQUMsR0FBRyxpQkFBaUIsS0FBSyxJQUFJLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFekYsMEJBQTBCO1FBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ2pDLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pILE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekYsTUFBTSxXQUFXLEdBQUcsTUFBTSxHQUFHLGlCQUFpQixDQUFDO1FBQy9DLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUUzQiw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFdEMsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUUzRSw4Q0FBOEM7UUFDOUMsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUcsQ0FBQztRQUVELGtCQUFrQjtRQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVsRSxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFFdkYseURBQXlEO1FBQ3pELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFRCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNoQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksa0JBQWtCLENBQUMsS0FBYTtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPO1FBRTdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDbEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztRQUNwRCxNQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUUzRSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDM0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTVDLG9CQUFvQjtRQUNwQixHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUUvRCx5QkFBeUI7UUFDekIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdkUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUVsRixHQUFHO2FBQ0EsTUFBTSxDQUFDLGVBQWUsQ0FBQzthQUN2QixJQUFJLENBQUMsTUFBTSxFQUFFLDhDQUE4QyxDQUFDO2FBQzVELFVBQVUsRUFBRTthQUNaLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQzthQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDO2FBQ3BCLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQixDQUN2QixVQUErRCxFQUMvRCxXQUFtQixFQUNuQixXQUFtQixFQUNuQixZQUFvQjtRQUVwQixnQ0FBZ0M7UUFDaEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEVBQUU7YUFDMUIsR0FBRyxFQUFFO2FBQ0wsV0FBVyxDQUFDLFdBQVcsQ0FBQzthQUN4QixXQUFXLENBQUMsV0FBVyxDQUFDO2FBQ3hCLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLGtDQUFrQzthQUMzRSxRQUFRLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsMEJBQTBCO2FBQ2hFLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU5QixzQkFBc0I7UUFDdEIsTUFBTSxjQUFjLEdBQUcsVUFBVTthQUM5QixNQUFNLENBQUMsTUFBTSxDQUFDO2FBQ2QsSUFBSSxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUM7YUFDeEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQzthQUNyQyxJQUFJLENBQUMsTUFBTSxFQUFFLHlCQUF5QixDQUFDO2FBQ3ZDLElBQUksQ0FBQyxRQUFRLEVBQUUsMENBQTBDLENBQUMsQ0FBQztRQUU5RCw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNGLGNBQWM7aUJBQ1gsS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUM7aUJBQzFCLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFdBQVc7b0JBQUUsT0FBTztnQkFDakQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBQztpQkFDRCxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3pCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7b0JBQzNCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEMsQ0FBQztZQUNILENBQUMsQ0FBQztpQkFDRCxFQUFFLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtnQkFDckIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FDcEIsVUFBK0QsRUFDL0QsV0FBbUIsRUFDbkIsV0FBbUIsRUFDbkIsUUFBZ0IsRUFDaEIsUUFBZ0IsRUFDaEIsVUFBOEQsRUFDOUQsWUFBb0I7UUFFcEIsdUJBQXVCO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFO2FBQ2hCLEdBQUcsRUFBRTthQUNMLFdBQVcsQ0FBQyxXQUFXLENBQUM7YUFDeEIsV0FBVyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7YUFDL0IsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTlCLCtEQUErRDtRQUMvRCxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUVoSCwrREFBK0Q7UUFDL0QsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUVyRyxxQ0FBcUM7UUFDckMsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVqRixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTNCLG9EQUFvRDtZQUNwRCxJQUFJLFFBQVEsSUFBSSxnQkFBZ0I7Z0JBQUUsT0FBTztZQUV6QyxNQUFNLE9BQU8sR0FBRyxVQUFVO2lCQUN2QixNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUNkLElBQUksQ0FDSCxHQUFHLEVBQ0gsR0FBRyxDQUFDO2dCQUNGLFdBQVc7Z0JBQ1gsV0FBVztnQkFDWCxVQUFVLEVBQUUsZ0JBQWdCO2dCQUM1QixRQUFRO2FBQ1QsQ0FBQyxDQUNIO2lCQUNBLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEtBQUssSUFBSSwyQkFBMkIsQ0FBQyxHQUFHLENBQUM7aUJBQ2hFLElBQUksQ0FBQyxPQUFPLEVBQUUseUJBQXlCLENBQUM7aUJBQ3hDLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQztpQkFDbkMsS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUU5QiwwQkFBMEI7WUFDMUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDeEMsNENBQTRDO2dCQUM1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDM0UsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztnQkFFakMsT0FBTztxQkFDSixFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0YsQ0FBQyxDQUFDO3FCQUNELEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDekIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNwQyxDQUFDO2dCQUNILENBQUMsQ0FBQztxQkFDRCxFQUFFLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtvQkFDckIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNyQixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7WUFFRCx1REFBdUQ7WUFDdkQsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBRUgseUVBQXlFO1FBQ3pFLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDbkQsTUFBTSxPQUFPLEdBQUcsVUFBVTtpQkFDdkIsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDZCxJQUFJLENBQ0gsR0FBRyxFQUNILEdBQUcsQ0FBQztnQkFDRixXQUFXO2dCQUNYLFdBQVc7Z0JBQ1gsVUFBVSxFQUFFLGdCQUFnQjtnQkFDNUIsUUFBUSxFQUFFLElBQUksQ0FBQyxzQkFBc0I7YUFDdEMsQ0FBQyxDQUNIO2lCQUNBLElBQUksQ0FBQyxNQUFNLEVBQUUseUJBQXlCLENBQUM7aUJBQ3ZDLElBQUksQ0FBQyxPQUFPLEVBQUUseUJBQXlCLENBQUM7aUJBQ3hDLEtBQUssQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFOUIsbUNBQW1DO1lBQ25DLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMzRSxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUM7Z0JBQzFCLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUV4RCxPQUFPO3FCQUNKLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDMUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuRyxDQUFDLENBQUM7cUJBQ0QsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUN6QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO3dCQUMzQixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3BDLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDO3FCQUNELEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO29CQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3JCLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0IsQ0FDMUIsS0FBaUIsRUFDakIsVUFBa0IsRUFDbEIsUUFBZ0IsRUFDaEIsS0FBYSxFQUNiLEtBQWM7UUFFZCxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7WUFDcEIsS0FBSyxFQUFFLEtBQUssSUFBSSxPQUFPO1lBQ3ZCLEtBQUssRUFBRSxHQUFHLFVBQVUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxRQUFRLENBQUMsY0FBYyxFQUFFLEVBQUU7WUFDdEUsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDLENBQUM7UUFFSCxlQUFlO1FBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQixDQUFDLEtBQWlCO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVztZQUFFLE9BQU87UUFFakMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO1lBQ3BCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU87WUFDL0IsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxFQUFFO1lBQ3BGLEtBQUssRUFBRSw2Q0FBNkM7U0FDckQsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVPLHFCQUFxQixDQUFDLEtBQWlCO1FBQzdDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEUsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUk7WUFBRSxPQUFPO1FBQ3ZDLElBQUksQ0FBQyxhQUFhLEdBQUcscUJBQXFCLENBQUMsR0FBRyxFQUFFO1lBQzlDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztZQUMxQyxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPO1lBQ3BCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLGFBQWEsQ0FBQztZQUMzRCxJQUFJLENBQUMsV0FBVztnQkFBRSxPQUFPO1lBQ3pCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2pELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQXVCLENBQUM7WUFDcEYsTUFBTSxXQUFXLEdBQUcsU0FBUyxFQUFFLHFCQUFxQixFQUFFLElBQUksSUFBSSxDQUFDO1lBQy9ELE1BQU0sR0FBRyxHQUFHLHNCQUFzQixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3RHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxXQUFXO1FBQ2pCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVk7UUFDakIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQy9CLG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUVsQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWUsQ0FDckIsR0FBMEQsRUFDMUQsVUFBOEM7UUFFOUMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVoQyw4Q0FBOEM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsSUFBSTthQUNwQixNQUFNLENBQUMsZ0JBQWdCLENBQUM7YUFDeEIsSUFBSSxDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQzthQUMvQixJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQzthQUNqQixJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQzthQUNqQixJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQzthQUNoQixJQUFJLENBQUMsZUFBZSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFM0MsbUNBQW1DO1FBQ25DLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixtREFBbUQ7WUFDbkQsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsNkNBQTZDLENBQUMsQ0FBQztZQUNqSCxVQUFVO2lCQUNQLE1BQU0sQ0FBQyxNQUFNLENBQUM7aUJBQ2QsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7aUJBQ3RCLElBQUksQ0FBQyxZQUFZLEVBQUUsbURBQW1ELENBQUMsQ0FBQztRQUM3RSxDQUFDO2FBQU0sQ0FBQztZQUNOLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLDZDQUE2QyxDQUFDLENBQUM7WUFDakgsVUFBVTtpQkFDUCxNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUNkLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO2lCQUN0QixJQUFJLENBQUMsWUFBWSxFQUFFLG1EQUFtRCxDQUFDLENBQUM7WUFFM0Usc0NBQXNDO1lBQ3RDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUk7cUJBQ2xCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztxQkFDeEIsSUFBSSxDQUFDLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7cUJBQ3JDLElBQUksQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLENBQUM7cUJBQ3ZDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO3FCQUNoQixJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztxQkFDZixJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztxQkFDZixJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUVuQixRQUFRO3FCQUNMLE1BQU0sQ0FBQyxNQUFNLENBQUM7cUJBQ2QsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7cUJBQ3BCLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRW5HLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxTQUFTLENBQ2YsVUFBK0QsRUFDL0QsTUFBYyxFQUNkLFFBQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLElBQVk7UUFFWixpRkFBaUY7UUFDakYsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksSUFBSSxHQUFHLEdBQUc7WUFDWixTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsc0NBQXNDO2FBQ2xELElBQUksSUFBSSxHQUFHLEdBQUc7WUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDO2FBQzlCLElBQUksSUFBSSxHQUFHLEdBQUc7WUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDO2FBQzlCLElBQUksSUFBSSxHQUFHLEdBQUc7WUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRW5DLDREQUE0RDtRQUM1RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RCx3RkFBd0Y7UUFDeEYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFOUQsK0JBQStCO1FBQy9CLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVoRSx1QkFBdUI7UUFDdkIsTUFBTSxVQUFVLEdBQUcsRUFBYyxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDMUIsZ0NBQWdDO1lBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sT0FBTyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyw4Q0FBOEM7WUFFbkcsc0JBQXNCO1lBQ3RCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFFckQsMkJBQTJCO1lBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUM7WUFDMUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQztZQUUxRCxpQkFBaUI7WUFDakIsU0FBUztpQkFDTixNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUNkLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2lCQUNkLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2lCQUNkLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2lCQUNkLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2lCQUNkLElBQUksQ0FBQyxRQUFRLEVBQUUsa0RBQWtELENBQUM7aUJBQ2xFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFM0IsdURBQXVEO1lBQ3ZELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVyRSwrRUFBK0U7WUFDL0UsTUFBTSxVQUFVLEdBQUcsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUN2QyxJQUFJLGNBQXNCLENBQUM7WUFFM0IsSUFBSSxVQUFVLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ3JCLGtFQUFrRTtnQkFDbEUsY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6RCxDQUFDO2lCQUFNLElBQUksVUFBVSxHQUFHLElBQUksRUFBRSxDQUFDO2dCQUM3Qix5Q0FBeUM7Z0JBQ3pDLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixnREFBZ0Q7Z0JBQ2hELGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkQsQ0FBQztZQUVELFNBQVM7aUJBQ04sTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDZCxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQztpQkFDakIsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUM7aUJBQ2pCLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDO2lCQUM3QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDO2lCQUNuQyxJQUFJLENBQUMsTUFBTSxFQUFFLGtEQUFrRCxDQUFDO2lCQUNoRSxLQUFLLENBQUMsV0FBVyxFQUFFLEdBQUcsVUFBVSxJQUFJLENBQUM7aUJBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUN0QixVQUErRCxFQUMvRCxLQUFhLEVBQ2IsS0FBYSxFQUNiLE1BQWMsRUFDZCxJQUFZO1FBRVosZ0ZBQWdGO1FBQ2hGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0UsMkRBQTJEO1FBQzNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyRSxxQ0FBcUM7UUFDckMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUU3RyxvQkFBb0I7UUFDcEIsVUFBVTthQUNQLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDZCxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQzthQUM1QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQzthQUNaLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLElBQUksR0FBRyxXQUFXLENBQUM7YUFDdEMsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLFdBQVcsSUFBSSxDQUFDO2FBQ3RDLEtBQUssQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDO2FBQzNCLEtBQUssQ0FBQyxNQUFNLEVBQUUsNENBQTRDLENBQUM7YUFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBRWhDLGtDQUFrQztRQUNsQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsVUFBVTtpQkFDUCxNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUNkLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDO2lCQUM1QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztpQkFDWixJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxJQUFJLEdBQUcsV0FBVyxHQUFHLFdBQVcsQ0FBQztpQkFDcEQsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLFdBQVcsSUFBSSxDQUFDO2lCQUN0QyxLQUFLLENBQUMsTUFBTSxFQUFFLDRDQUE0QyxDQUFDO2lCQUMzRCxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQztpQkFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxRQUFRLENBQ2QsVUFBK0QsRUFDL0QsTUFBYyxFQUNkLEtBQWEsRUFDYixRQUFnQixFQUNoQixRQUFnQixFQUNoQixpQkFBeUI7UUFFekIsK0JBQStCO1FBQy9CLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFbkUsNENBQTRDO1FBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFbEYsZ0NBQWdDO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUvRCx5REFBeUQ7UUFDekQsTUFBTSxVQUFVLEdBQUcsU0FBUzthQUN6QixNQUFNLENBQUMsTUFBTSxDQUFDO2FBQ2QsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDeEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUM7YUFDN0IsSUFBSSxDQUFDLE1BQU0sRUFBRSw4Q0FBOEMsQ0FBQzthQUM1RCxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsK0JBQStCO1FBRXBILHNCQUFzQjtRQUN0QixTQUFTO2FBQ04sTUFBTSxDQUFDLFFBQVEsQ0FBQzthQUNoQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUNiLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQ2IsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQ3hCLElBQUksQ0FBQyxNQUFNLEVBQUUsOENBQThDLENBQUM7YUFDNUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7YUFDdEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUzQiw2QkFBNkI7UUFDN0IsU0FBUzthQUNOLE1BQU0sQ0FBQyxRQUFRLENBQUM7YUFDaEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7YUFDYixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUNiLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FBQzthQUN4QixJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXhCLHNCQUFzQjtRQUN0QixNQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUVuRiwrQ0FBK0M7UUFDL0MsVUFBVTthQUNQLFVBQVUsRUFBRTthQUNaLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQzthQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDO2FBQ3BCLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxnREFBZ0Q7SUFFaEQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxNQUFjO1FBQ3JDLE1BQU0sWUFBWSxHQUFHLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNsQyxPQUFPLE9BQU8sV0FBVyxHQUFHLENBQUMsTUFBTSxZQUFZLFVBQVUsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFDaEYsQ0FBQztJQUVEOztPQUVHO0lBQ0ssaUJBQWlCLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxHQUFXO1FBQy9ELE1BQU0sVUFBVSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDN0IsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDL0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssc0JBQXNCLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxHQUFXO1FBQ3BFLE1BQU0sVUFBVSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDN0IsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDL0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWSxDQUFDLEtBQWEsRUFBRSxHQUFXLEVBQUUsR0FBVztRQUMxRCxNQUFNLFVBQVUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQzdCLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsVUFBVSxDQUFDO0lBQy9GLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLE9BQWU7UUFDdEMsT0FBTyxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQzNDLENBQUM7dUdBeHdCVSxxQkFBcUI7MkZBQXJCLHFCQUFxQix1ZUN2Q2xDLHFNQUVBLDB5Q0RrQ1ksdUJBQXVCOzsyRkFHdEIscUJBQXFCO2tCQVJqQyxTQUFTOytCQUNFLGdCQUFnQixpQkFHWCxpQkFBaUIsQ0FBQyxJQUFJLFdBQzVCLENBQUMsdUJBQXVCLENBQUMsbUJBQ2pCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBWENoYXJ0Q29tcG9uZW50LFxuICBBWENoYXJ0Q29tcG9uZW50QmFzZSxcbiAgY29tcHV0ZVRvb2x0aXBQb3NpdGlvbixcbiAgZm9ybWF0TGFyZ2VOdW1iZXIsXG4gIGdldEVhc2luZ0Z1bmN0aW9uLFxufSBmcm9tICdAYWNvcmV4L2NoYXJ0cyc7XG5pbXBvcnQgeyBBWENoYXJ0VG9vbHRpcENvbXBvbmVudCwgQVhDaGFydFRvb2x0aXBEYXRhIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtdG9vbHRpcCc7XG5cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uRGVzdHJveSxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGFmdGVyTmV4dFJlbmRlcixcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgc2lnbmFsLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgeyBBWF9HQVVHRV9DSEFSVF9DT05GSUcgfSBmcm9tICcuL2dhdWdlLWNoYXJ0LmNvbmZpZyc7XG5pbXBvcnQgeyBBWEdhdWdlQ2hhcnRPcHRpb24sIEFYR2F1Z2VDaGFydFZhbHVlIH0gZnJvbSAnLi9nYXVnZS1jaGFydC50eXBlJztcblxuLyoqXG4gKiBHYXVnZSBDaGFydCBDb21wb25lbnRcbiAqIFJlbmRlcnMgYSBzZW1pLWNpcmN1bGFyIGdhdWdlIGNoYXJ0IHdpdGggYW5pbWF0ZWQgbmVlZGxlIGFuZCB0aHJlc2hvbGRzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F4LWdhdWdlLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dhdWdlLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2F1Z2UtY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW0FYQ2hhcnRUb29sdGlwQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFYR2F1Z2VDaGFydENvbXBvbmVudCBleHRlbmRzIEFYQ2hhcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFYQ2hhcnRDb21wb25lbnRCYXNlIHtcbiAgLy8gSW5wdXRzXG4gIC8qKiBDaGFydCB2YWx1ZSBpbnB1dCAqL1xuICB2YWx1ZSA9IGlucHV0PEFYR2F1Z2VDaGFydFZhbHVlPigwKTtcblxuICAvKiogQ2hhcnQgb3B0aW9ucyBpbnB1dCAqL1xuICBvcHRpb25zID0gaW5wdXQ8QVhHYXVnZUNoYXJ0T3B0aW9uPih7fSk7XG5cbiAgLy8gQ2hhcnQgY29udGFpbmVyIHJlZmVyZW5jZVxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0Q29udGFpbmVyRWwgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjaGFydENvbnRhaW5lcicpO1xuXG4gIC8vIFNWRyBlbGVtZW50IHJlZmVyZW5jZSAoY3JlYXRlZCBpbiB0aGUgY29kZSlcbiAgcHJpdmF0ZSBzdmdFbGVtZW50OiBTVkdTVkdFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRDMgcmVmZXJlbmNlIC0gbG9hZGVkIGFzeW5jaHJvbm91c2x5XG4gIHByb3RlY3RlZCBkMyE6IHR5cGVvZiBpbXBvcnQoJ2QzJyk7XG5cbiAgLy8gU2lnbmFscyBmb3IgY29tcG9uZW50IHN0YXRlXG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfcmVuZGVyZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9wcmV2VmFsdWUgPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVHJhY2sgcHJldmlvdXMgb3B0aW9ucyB0byBkZXRlY3QgY2hhbmdlc1xuICBwcml2YXRlIF9wcmV2T3B0aW9uc1N0cmluZyA9ICcnO1xuXG4gIC8vIENhY2hlIGZvciBjb250YWluZXIgZGltZW5zaW9ucyB0byBhdm9pZCByZXBlYXRlZCBET00gcmVhZHNcbiAgcHJpdmF0ZSBfbGFzdENvbnRhaW5lclJlY3Q6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFRvb2x0aXAgc2lnbmFsc1xuICBwcml2YXRlIF90b29sdGlwVmlzaWJsZSA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBQb3NpdGlvbiA9IHNpZ25hbCh7IHg6IDAsIHk6IDAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBEYXRhID0gc2lnbmFsPEFYQ2hhcnRUb29sdGlwRGF0YT4oe1xuICAgIHRpdGxlOiAnJyxcbiAgICB2YWx1ZTogJycsXG4gIH0pO1xuICBwcml2YXRlIF90b29sdGlwUmFmSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9wZW5kaW5nVG9vbHRpcENvb3JkczogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRXhwb3NlIHRvb2x0aXAgc2lnbmFscyBhcyByZWFkLW9ubHkgZm9yIHRoZSB0ZW1wbGF0ZVxuICBwcm90ZWN0ZWQgdG9vbHRpcFZpc2libGUgPSB0aGlzLl90b29sdGlwVmlzaWJsZS5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwUG9zaXRpb24gPSB0aGlzLl90b29sdGlwUG9zaXRpb24uYXNSZWFkb25seSgpO1xuICBwcm90ZWN0ZWQgdG9vbHRpcERhdGEgPSB0aGlzLl90b29sdGlwRGF0YS5hc1JlYWRvbmx5KCk7XG5cbiAgLy8gSW5qZWN0IGNvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBjb25maWdUb2tlbiA9IGluamVjdChBWF9HQVVHRV9DSEFSVF9DT05GSUcpO1xuXG4gIC8vIENvbXB1dGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICBwcm90ZWN0ZWQgZWZmZWN0aXZlT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWdUb2tlbixcbiAgICAgIC4uLnRoaXMub3B0aW9ucygpLFxuICAgIH07XG4gIH0pO1xuXG4gIC8vIENvbnN0YW50c1xuICBwcml2YXRlIHJlYWRvbmx5IFRPT0xUSVBfR0FQID0gMTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSEFMRl9DSVJDTEVfUkFESUFOUyA9IE1hdGguUEk7XG4gIHByaXZhdGUgcmVhZG9ubHkgUVVBUlRFUl9DSVJDTEVfUkFESUFOUyA9IE1hdGguUEkgLyAyO1xuICBwcml2YXRlIHJlYWRvbmx5IERFR1JFRVNfUEVSX1JBRElBTiA9IDE4MCAvIE1hdGguUEk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBEeW5hbWljYWxseSBsb2FkIEQzIGFuZCBpbml0aWFsaXplIHRoZSBjaGFydCB3aGVuIHRoZSBjb21wb25lbnQgaXMgcmVhZHlcbiAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQuc2V0KHRydWUpO1xuICAgICAgdGhpcy5sb2FkRDMoKTtcbiAgICB9KTtcblxuICAgIC8vIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHJlZHJhdyB0aGUgY2hhcnRcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gQWNjZXNzIGlucHV0cyB0byB0cmFjayB0aGVtXG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBwcmV2aW91cyB2YWx1ZVxuICAgICAgdGhpcy5fcHJldlZhbHVlLnNldChjdXJyZW50VmFsdWUpO1xuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSBpZiBhbHJlYWR5IHJlbmRlcmVkXG4gICAgICBpZiAodGhpcy5fcmVuZGVyZWQoKSkge1xuICAgICAgICAvLyBJZiBvbmx5IHRoZSB2YWx1ZSBjaGFuZ2VkLCBqdXN0IHVwZGF0ZSB0aGUgdmFsdWUgZGlzcGxheSBhbmQgZGlhbFxuICAgICAgICBjb25zdCBvcHRpb25zU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucyk7XG4gICAgICAgIGlmICh0aGlzLl9wcmV2T3B0aW9uc1N0cmluZyA9PT0gb3B0aW9uc1N0cmluZykge1xuICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmREaWFsKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgb3B0aW9ucyBjaGFuZ2VkLCByZWNyZWF0ZSB0aGUgd2hvbGUgY2hhcnRcbiAgICAgICAgICB0aGlzLl9wcmV2T3B0aW9uc1N0cmluZyA9IG9wdGlvbnNTdHJpbmc7XG4gICAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIEQzLmpzIGR5bmFtaWNhbGx5XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZEQzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmQzKSByZXR1cm47IC8vIEFscmVhZHkgbG9hZGVkXG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5kMyA9IGF3YWl0IGltcG9ydCgnZDMnKTtcbiAgICAgIC8vIElmIGNvbnRhaW5lciBpcyByZWFkeSwgY3JlYXRlIGNoYXJ0XG4gICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQoKSAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgRDMuanM6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBnYXVnZSBjaGFydCB3aXRoIGFsbCBlbGVtZW50c1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGNvbnRhaW5lciBhbmQgY3JlYXRlIFNWR1xuICAgIGlmICh0aGlzLnN2Z0VsZW1lbnQpIHtcbiAgICAgIHRoaXMuc3ZnRWxlbWVudC5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgU1ZHIGVsZW1lbnRcbiAgICB0aGlzLnN2Z0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpO1xuICAgIHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zdmdFbGVtZW50KTtcblxuICAgIC8vIEdldCBjdXJyZW50IG9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG5cbiAgICAvLyBTdG9yZSBvcHRpb25zIHN0cmluZyBmb3IgY29tcGFyaXNvblxuICAgIHRoaXMuX3ByZXZPcHRpb25zU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucyk7XG5cbiAgICBjb25zdCB7IG1pblZhbHVlLCBtYXhWYWx1ZSwgc2hvd1ZhbHVlLCBsYWJlbCA9ICcnLCBnYXVnZVdpZHRoLCBjb3JuZXJSYWRpdXMsIGFuaW1hdGlvbkR1cmF0aW9uIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHRocmVzaG9sZHMgPSBvcHRpb25zLnRocmVzaG9sZHMgPz8gW107XG5cbiAgICAvLyBDYWxjdWxhdGUgcmVzcG9uc2l2ZSBkaW1lbnNpb25zXG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBjb250YWluZXJFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lckVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXG4gICAgLy8gQ2FjaGUgY29udGFpbmVyIGRpbWVuc2lvbnNcbiAgICB0aGlzLl9sYXN0Q29udGFpbmVyUmVjdCA9IHsgd2lkdGg6IGNvbnRhaW5lcldpZHRoLCBoZWlnaHQ6IGNvbnRhaW5lckhlaWdodCB9O1xuXG4gICAgLy8gRGV0ZXJtaW5lIGNoYXJ0IGRpbWVuc2lvbnMgLSB1c2Ugb3B0aW9ucyBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIHVzZSBjb250YWluZXIgZGltZW5zaW9uc1xuICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucy53aWR0aCA/PyBjb250YWluZXJXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBvcHRpb25zLmhlaWdodCA/PyBjb250YWluZXJIZWlnaHQ7XG5cbiAgICAvLyBFbnN1cmUgbWluaW11bSBkaW1lbnNpb25zXG4gICAgY29uc3QgZWZmZWN0aXZlV2lkdGggPSBNYXRoLm1heCh3aWR0aCwgMTAwKTtcbiAgICBjb25zdCBlZmZlY3RpdmVIZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIDUwKTtcblxuICAgIC8vIEZvciBhIHNlbWktY2lyY3VsYXIgZ2F1Z2UsIHdpZHRoIHNob3VsZCBiZSBhcHByb3hpbWF0ZWx5IHR3aWNlIHRoZSBoZWlnaHRcbiAgICBjb25zdCBzaXplID0gTWF0aC5taW4oZWZmZWN0aXZlV2lkdGgsIGVmZmVjdGl2ZUhlaWdodCAqIDIpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG1hcmdpbiBhcyBwZXJjZW50YWdlIG9mIHNpemUgKDUtOCUgd2l0aCByZWFzb25hYmxlIGJvdW5kcylcbiAgICBjb25zdCBtYXJnaW5SYXRpbyA9IDAuMDg7XG4gICAgY29uc3QgbWFyZ2luID0gTWF0aC5tYXgoNSwgTWF0aC5taW4oc2l6ZSAqIG1hcmdpblJhdGlvLCAzMCkpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHNwYWNlIG5lZWRlZCBmb3IgdGlja3MgYW5kIGxhYmVscyAoaW5jcmVhc2VkIGZvciBsYXJnZXIgZm9udCBzaXplcylcbiAgICBjb25zdCB0aWNrTGFiZWxTcGFjZSA9IE1hdGgubWF4KDEyLCBNYXRoLm1pbihzaXplICogMC4xMiwgNDApKTtcbiAgICBjb25zdCB0b3RhbFZlcnRpY2FsU3BhY2UgPSBzaXplIC8gMiArIHRpY2tMYWJlbFNwYWNlO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGhvcml6b250YWwgcGFkZGluZyBmb3IgdGljayBsYWJlbHMgKHRoZXkgZXh0ZW5kIGJleW9uZCBnYXVnZSBlZGdlcylcbiAgICAvLyBFc3RpbWF0ZSBiYXNlZCBvbiBmb250IHNpemUgLSB0aWNrIGxhYmVscyBhcmUgcm91Z2hseSAyLTMgY2hhcmFjdGVycyB3aWRlXG4gICAgY29uc3QgZXN0aW1hdGVkVGlja0ZvbnRTaXplID0gTWF0aC5tYXgoMTQsIE1hdGgubWluKDE4LCBNYXRoLmZsb29yKHNpemUgLyAzNSkpKTtcbiAgICBjb25zdCBob3Jpem9udGFsUGFkZGluZyA9IE1hdGgubWF4KDIwLCBlc3RpbWF0ZWRUaWNrRm9udFNpemUgKiAxLjUpO1xuICAgIGNvbnN0IHRvdGFsV2lkdGggPSBzaXplICsgaG9yaXpvbnRhbFBhZGRpbmcgKiAyO1xuXG4gICAgLy8gU2V0IHVwIFNWRyB3aXRoIHJlc3BvbnNpdmUgdmlld0JveCB0aGF0IGFjY291bnRzIGZvciBvdmVyZmxvd1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QodGhpcy5zdmdFbGVtZW50KVxuICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCd2aWV3Qm94JywgYDAgMCAke3RvdGFsV2lkdGh9ICR7dG90YWxWZXJ0aWNhbFNwYWNlfWApXG4gICAgICAuYXR0cigncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0Jyk7XG5cbiAgICAvLyBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGNoYXJ0IGNlbnRlcmVkIGhvcml6b250YWxseSB3aXRoIHBhZGRpbmcsIHBvc2l0aW9uZWQgdG8gc2hvdyBvbmx5IHRoZSB0b3AgaGFsZlxuICAgIGNvbnN0IGNoYXJ0R3JvdXAgPSBzdmdcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHtzaXplIC8gMiArIGhvcml6b250YWxQYWRkaW5nfSwgJHtzaXplIC8gMiAtIG1hcmdpbn0pYCk7XG5cbiAgICAvLyBEZWZpbmUgZ2F1Z2UgcGFyYW1ldGVyc1xuICAgIGNvbnN0IHJhZGl1cyA9IHNpemUgLyAyIC0gbWFyZ2luO1xuICAgIGNvbnN0IGRlc2lyZWRHYXVnZVdpZHRoID0gdHlwZW9mIGdhdWdlV2lkdGggPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4oZ2F1Z2VXaWR0aCkgPyBnYXVnZVdpZHRoIDogc2l6ZSAqIDAuMTI7XG4gICAgY29uc3QgY2xhbXBlZEdhdWdlV2lkdGggPSBNYXRoLm1heChzaXplICogMC4wNiwgTWF0aC5taW4oZGVzaXJlZEdhdWdlV2lkdGgsIHNpemUgKiAwLjIpKTtcbiAgICBjb25zdCBpbm5lclJhZGl1cyA9IHJhZGl1cyAtIGNsYW1wZWRHYXVnZVdpZHRoO1xuICAgIGNvbnN0IG91dGVyUmFkaXVzID0gcmFkaXVzO1xuXG4gICAgLy8gQ3JlYXRlIGdyYWRpZW50IGRlZmluaXRpb25zXG4gICAgdGhpcy5jcmVhdGVHcmFkaWVudHMoc3ZnLCB0aHJlc2hvbGRzKTtcblxuICAgIC8vIERyYXcgdGhlIGJhY2tncm91bmQgYXJjXG4gICAgdGhpcy5kcmF3QmFja2dyb3VuZEFyYyhjaGFydEdyb3VwLCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIGNvcm5lclJhZGl1cyk7XG5cbiAgICAvLyBEcmF3IHRoZSB0aHJlc2hvbGQgYXJjcyBpZiB0aHJlc2hvbGRzIGV4aXN0XG4gICAgaWYgKHRocmVzaG9sZHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kcmF3VGhyZXNob2xkcyhjaGFydEdyb3VwLCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIG1pblZhbHVlLCBtYXhWYWx1ZSwgdGhyZXNob2xkcywgY29ybmVyUmFkaXVzKTtcbiAgICB9XG5cbiAgICAvLyBEcmF3IHRpY2sgbWFya3NcbiAgICB0aGlzLmRyYXdUaWNrcyhjaGFydEdyb3VwLCBvdXRlclJhZGl1cywgbWluVmFsdWUsIG1heFZhbHVlLCBzaXplKTtcblxuICAgIC8vIERyYXcgdGhlIGRpYWwvbmVlZGxlIHdpdGggYW5pbWF0aW9uXG4gICAgdGhpcy5kcmF3RGlhbChjaGFydEdyb3VwLCByYWRpdXMsIHRoaXMudmFsdWUoKSwgbWluVmFsdWUsIG1heFZhbHVlLCBhbmltYXRpb25EdXJhdGlvbik7XG5cbiAgICAvLyBEcmF3IHRoZSB2YWx1ZSBkaXNwbGF5IChhZnRlciB0aGUgZGlhbCBzbyBpdCdzIG9uIHRvcClcbiAgICBpZiAoc2hvd1ZhbHVlKSB7XG4gICAgICB0aGlzLmRyYXdWYWx1ZURpc3BsYXkoY2hhcnRHcm91cCwgdGhpcy52YWx1ZSgpLCBsYWJlbCwgcmFkaXVzLCBzaXplKTtcbiAgICB9XG5cbiAgICAvLyBIaWRlIHRvb2x0aXAgaW5pdGlhbGx5XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjaGFydCB3aGVuIG9wdGlvbnMgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgb25seSB0aGUgdmFsdWUgZGlzcGxheSBhbmQgZGlhbCBwb3NpdGlvbiB3aXRob3V0IHJlY3JlYXRpbmcgdGhlIGNoYXJ0XG4gICAqL1xuICBwdWJsaWMgdXBkYXRlVmFsdWVBbmREaWFsKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIGNvbnN0IG1pblZhbHVlID0gb3B0aW9ucy5taW5WYWx1ZTtcbiAgICBjb25zdCBtYXhWYWx1ZSA9IG9wdGlvbnMubWF4VmFsdWU7XG4gICAgY29uc3QgYW5pbWF0aW9uRHVyYXRpb24gPSBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGVhc2luZ0Z1bmN0aW9uID0gZ2V0RWFzaW5nRnVuY3Rpb24odGhpcy5kMywgb3B0aW9ucy5hbmltYXRpb25FYXNpbmcpO1xuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFsdWU7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5kMy5zZWxlY3QodGhpcy5zdmdFbGVtZW50KTtcblxuICAgIC8vIFVwZGF0ZSB2YWx1ZSB0ZXh0XG4gICAgc3ZnLnNlbGVjdCgnLmdhdWdlLXZhbHVlJykudGV4dChjdXJyZW50VmFsdWUudG9Mb2NhbGVTdHJpbmcoKSk7XG5cbiAgICAvLyBVcGRhdGUgbmVlZGxlIHBvc2l0aW9uXG4gICAgY29uc3QgYW5nbGUgPSB0aGlzLnNjYWxlVmFsdWVUb0FuZ2xlKGN1cnJlbnRWYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICBjb25zdCBhbmdsZUluRGVncmVlcyA9IHRoaXMucmFkaWFuc1RvRGVncmVlcyhhbmdsZSAtIHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUyk7XG5cbiAgICBzdmdcbiAgICAgIC5zZWxlY3QoJy5nYXVnZS1uZWVkbGUnKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtbmVlZGxlLWNvbG9yKSknKVxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmVhc2UoZWFzaW5nRnVuY3Rpb24pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHJvdGF0ZSgke2FuZ2xlSW5EZWdyZWVzfSlgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSBiYWNrZ3JvdW5kIGFyY1xuICAgKi9cbiAgcHJpdmF0ZSBkcmF3QmFja2dyb3VuZEFyYyhcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgaW5uZXJSYWRpdXM6IG51bWJlcixcbiAgICBvdXRlclJhZGl1czogbnVtYmVyLFxuICAgIGNvcm5lclJhZGl1czogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYXJjIGZvciB0aGUgYmFja2dyb3VuZFxuICAgIGNvbnN0IGJhY2tncm91bmRBcmMgPSB0aGlzLmQzXG4gICAgICAuYXJjKClcbiAgICAgIC5pbm5lclJhZGl1cyhpbm5lclJhZGl1cylcbiAgICAgIC5vdXRlclJhZGl1cyhvdXRlclJhZGl1cylcbiAgICAgIC5zdGFydEFuZ2xlKC10aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpIC8vIFN0YXJ0IGZyb20gYm90dG9tICgtOTAgZGVncmVlcylcbiAgICAgIC5lbmRBbmdsZSh0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpIC8vIEVuZCBhdCB0b3AgKDkwIGRlZ3JlZXMpXG4gICAgICAuY29ybmVyUmFkaXVzKGNvcm5lclJhZGl1cyk7XG5cbiAgICAvLyBEcmF3IGJhY2tncm91bmQgYXJjXG4gICAgY29uc3QgYmFja2dyb3VuZFBhdGggPSBjaGFydEdyb3VwXG4gICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgIC5hdHRyKCdkJywgYmFja2dyb3VuZEFyYylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS1hcmMgZ2F1Z2UtYmFzZScpXG4gICAgICAuYXR0cignZmlsbCcsICd1cmwoI2dhdWdlLWJnLWdyYWRpZW50KScpXG4gICAgICAuYXR0cignZmlsdGVyJywgJ2Ryb3Atc2hhZG93KDBweCAycHggM3B4IHJnYmEoMCwwLDAsMC4xKSknKTtcblxuICAgIC8vIEFkZCB0b29sdGlwIGZvciBzaW5nbGUgYXJjIGlmIG5vIHRocmVzaG9sZHNcbiAgICBpZiAoIXRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnRocmVzaG9sZHMgfHwgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkudGhyZXNob2xkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJhY2tncm91bmRQYXRoXG4gICAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5zaG93U2luZ2xlUmFuZ2VUb29sdGlwKGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fdG9vbHRpcFZpc2libGUoKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIHRocmVzaG9sZHMgYXJjc1xuICAgKi9cbiAgcHJpdmF0ZSBkcmF3VGhyZXNob2xkcyhcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgaW5uZXJSYWRpdXM6IG51bWJlcixcbiAgICBvdXRlclJhZGl1czogbnVtYmVyLFxuICAgIG1pblZhbHVlOiBudW1iZXIsXG4gICAgbWF4VmFsdWU6IG51bWJlcixcbiAgICB0aHJlc2hvbGRzOiB7IHZhbHVlOiBudW1iZXI7IGNvbG9yOiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH1bXSxcbiAgICBjb3JuZXJSYWRpdXM6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGFyYyBnZW5lcmF0b3JcbiAgICBjb25zdCBhcmMgPSB0aGlzLmQzXG4gICAgICAuYXJjKClcbiAgICAgIC5pbm5lclJhZGl1cyhpbm5lclJhZGl1cylcbiAgICAgIC5vdXRlclJhZGl1cyhvdXRlclJhZGl1cyAqIDAuOTgpXG4gICAgICAuY29ybmVyUmFkaXVzKGNvcm5lclJhZGl1cyk7XG5cbiAgICAvLyBTb3J0IHRocmVzaG9sZHMgYnkgdmFsdWUgaW4gYXNjZW5kaW5nIG9yZGVyIChvbmx5IGlmIG5lZWRlZClcbiAgICBjb25zdCBzb3J0ZWRUaHJlc2hvbGRzID0gdGhyZXNob2xkcy5sZW5ndGggPiAxID8gWy4uLnRocmVzaG9sZHNdLnNvcnQoKGEsIGIpID0+IGEudmFsdWUgLSBiLnZhbHVlKSA6IHRocmVzaG9sZHM7XG5cbiAgICAvLyBDYWxjdWxhdGUgYWxsIGFuZ2xlcyBmaXJzdCB1c2luZyB0aGUgY29sb3IgYW5nbGUgY2FsY3VsYXRpb25cbiAgICBjb25zdCBhbmdsZXMgPSBzb3J0ZWRUaHJlc2hvbGRzLm1hcCgodCkgPT4gdGhpcy5zY2FsZVZhbHVlVG9Db2xvckFuZ2xlKHQudmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSkpO1xuXG4gICAgLy8gU3RhcnQgZnJvbSB0aGUgbWluaW11bSB2YWx1ZSBhbmdsZVxuICAgIGxldCBwcmV2aW91c0VuZEFuZ2xlID0gdGhpcy5zY2FsZVZhbHVlVG9Db2xvckFuZ2xlKG1pblZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuXG4gICAgc29ydGVkVGhyZXNob2xkcy5mb3JFYWNoKCh0aHJlc2hvbGQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVuZEFuZ2xlID0gYW5nbGVzW2ldO1xuXG4gICAgICAvLyBTa2lwIGlmIGVuZCBhbmdsZSBpcyBub3QgZ3JlYXRlciB0aGFuIHN0YXJ0IGFuZ2xlXG4gICAgICBpZiAoZW5kQW5nbGUgPD0gcHJldmlvdXNFbmRBbmdsZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcmNQYXRoID0gY2hhcnRHcm91cFxuICAgICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgICAgLmF0dHIoXG4gICAgICAgICAgJ2QnLFxuICAgICAgICAgIGFyYyh7XG4gICAgICAgICAgICBpbm5lclJhZGl1cyxcbiAgICAgICAgICAgIG91dGVyUmFkaXVzLFxuICAgICAgICAgICAgc3RhcnRBbmdsZTogcHJldmlvdXNFbmRBbmdsZSxcbiAgICAgICAgICAgIGVuZEFuZ2xlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIC5hdHRyKCdmaWxsJywgdGhyZXNob2xkLmNvbG9yIHx8IGB1cmwoI3RocmVzaG9sZC1ncmFkaWVudC0ke2l9KWApXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS1hcmMgdGhyZXNob2xkLWFyYycpXG4gICAgICAgIC5hdHRyKCdkYXRhLXZhbHVlJywgdGhyZXNob2xkLnZhbHVlKVxuICAgICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJyk7XG5cbiAgICAgIC8vIEFkZCB0b29sdGlwIGludGVyYWN0aW9uXG4gICAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd1Rvb2x0aXApIHtcbiAgICAgICAgLy8gQ29udmVydCBhbmdsZXMgYmFjayB0byB2YWx1ZXMgZm9yIHRvb2x0aXBcbiAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHRoaXMuYW5nbGVUb1ZhbHVlKHByZXZpb3VzRW5kQW5nbGUsIG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGVuZFZhbHVlID0gdGhyZXNob2xkLnZhbHVlO1xuXG4gICAgICAgIGFyY1BhdGhcbiAgICAgICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1RocmVzaG9sZFRvb2x0aXAoZXZlbnQsIHN0YXJ0VmFsdWUsIGVuZFZhbHVlLCB0aHJlc2hvbGQuY29sb3IsIHRocmVzaG9sZC5sYWJlbCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAub24oJ21vdXNlbW92ZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Rvb2x0aXBWaXNpYmxlKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlVG9vbHRpcCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdGhlIHByZXZpb3VzIGVuZCBhbmdsZSBmb3IgdGhlIG5leHQgdGhyZXNob2xkXG4gICAgICBwcmV2aW91c0VuZEFuZ2xlID0gZW5kQW5nbGU7XG4gICAgfSk7XG5cbiAgICAvLyBEcmF3IHRoZSBsYXN0IHNlZ21lbnQgaWYgdGhlIGxhc3QgdGhyZXNob2xkIGlzIGxlc3MgdGhhbiB0aGUgbWF4IHZhbHVlXG4gICAgaWYgKHByZXZpb3VzRW5kQW5nbGUgPCB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpIHtcbiAgICAgIGNvbnN0IGxhc3RBcmMgPSBjaGFydEdyb3VwXG4gICAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgICAuYXR0cihcbiAgICAgICAgICAnZCcsXG4gICAgICAgICAgYXJjKHtcbiAgICAgICAgICAgIGlubmVyUmFkaXVzLFxuICAgICAgICAgICAgb3V0ZXJSYWRpdXMsXG4gICAgICAgICAgICBzdGFydEFuZ2xlOiBwcmV2aW91c0VuZEFuZ2xlLFxuICAgICAgICAgICAgZW5kQW5nbGU6IHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICAuYXR0cignZmlsbCcsICd1cmwoI2dhdWdlLWJnLWdyYWRpZW50KScpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS1hcmMgdGhyZXNob2xkLWFyYycpXG4gICAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKTtcblxuICAgICAgLy8gQWRkIHRvb2x0aXAgZm9yIHRoZSBsYXN0IHNlZ21lbnRcbiAgICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCkge1xuICAgICAgICBjb25zdCBzdGFydFZhbHVlID0gdGhpcy5hbmdsZVRvVmFsdWUocHJldmlvdXNFbmRBbmdsZSwgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICAgICAgY29uc3QgZW5kVmFsdWUgPSBtYXhWYWx1ZTtcbiAgICAgICAgY29uc3QgbGFzdFRocmVzaG9sZCA9IHRocmVzaG9sZHNbdGhyZXNob2xkcy5sZW5ndGggLSAxXTtcblxuICAgICAgICBsYXN0QXJjXG4gICAgICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dUaHJlc2hvbGRUb29sdGlwKGV2ZW50LCBzdGFydFZhbHVlLCBlbmRWYWx1ZSwgbGFzdFRocmVzaG9sZC5jb2xvciwgbGFzdFRocmVzaG9sZC5sYWJlbCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAub24oJ21vdXNlbW92ZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Rvb2x0aXBWaXNpYmxlKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlVG9vbHRpcCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyB0b29sdGlwIGZvciBhIHRocmVzaG9sZCBhcmNcbiAgICovXG4gIHByaXZhdGUgc2hvd1RocmVzaG9sZFRvb2x0aXAoXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgc3RhcnRWYWx1ZTogbnVtYmVyLFxuICAgIGVuZFZhbHVlOiBudW1iZXIsXG4gICAgY29sb3I6IHN0cmluZyxcbiAgICBsYWJlbD86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIHRvb2x0aXAgZGF0YVxuICAgIHRoaXMuX3Rvb2x0aXBEYXRhLnNldCh7XG4gICAgICB0aXRsZTogbGFiZWwgfHwgJ1JhbmdlJyxcbiAgICAgIHZhbHVlOiBgJHtzdGFydFZhbHVlLnRvTG9jYWxlU3RyaW5nKCl9IC0gJHtlbmRWYWx1ZS50b0xvY2FsZVN0cmluZygpfWAsXG4gICAgICBjb2xvcjogY29sb3IsXG4gICAgfSk7XG5cbiAgICAvLyBTaG93IHRvb2x0aXBcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQodHJ1ZSk7XG4gICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIHRvb2x0aXAgZm9yIHRoZSBlbnRpcmUgcmFuZ2Ugd2hlbiBubyB0aHJlc2hvbGRzIGFyZSBkZWZpbmVkXG4gICAqL1xuICBwcml2YXRlIHNob3dTaW5nbGVSYW5nZVRvb2x0aXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG4gICAgaWYgKCFvcHRpb25zLnNob3dUb29sdGlwKSByZXR1cm47XG5cbiAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgdGhpcy5fdG9vbHRpcERhdGEuc2V0KHtcbiAgICAgIHRpdGxlOiBvcHRpb25zLmxhYmVsIHx8ICdSYW5nZScsXG4gICAgICB2YWx1ZTogYCR7b3B0aW9ucy5taW5WYWx1ZS50b0xvY2FsZVN0cmluZygpfSAtICR7b3B0aW9ucy5tYXhWYWx1ZS50b0xvY2FsZVN0cmluZygpfWAsXG4gICAgICBjb2xvcjogJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRyYWNrLWNvbG9yKSknLFxuICAgIH0pO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fcGVuZGluZ1Rvb2x0aXBDb29yZHMgPSB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfTtcbiAgICBpZiAodGhpcy5fdG9vbHRpcFJhZklkICE9IG51bGwpIHJldHVybjtcbiAgICB0aGlzLl90b29sdGlwUmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzO1xuICAgICAgaWYgKCFjb29yZHMpIHJldHVybjtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWNvbnRhaW5lckVsKSByZXR1cm47XG4gICAgICBjb25zdCByZWN0ID0gY29udGFpbmVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCB0b29sdGlwRWwgPSBjb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuY2hhcnQtdG9vbHRpcCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGNvbnN0IHRvb2x0aXBSZWN0ID0gdG9vbHRpcEVsPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA/PyBudWxsO1xuICAgICAgY29uc3QgcG9zID0gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbihyZWN0LCB0b29sdGlwUmVjdCwgY29vcmRzLnggKyAxMCwgY29vcmRzLnkgLSAxMCwgdGhpcy5UT09MVElQX0dBUCk7XG4gICAgICB0aGlzLl90b29sdGlwUG9zaXRpb24uc2V0KHBvcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIHRvb2x0aXBcbiAgICovXG4gIHByaXZhdGUgaGlkZVRvb2x0aXAoKTogdm9pZCB7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnMgdXAgY2hhcnQgcmVzb3VyY2VzXG4gICAqL1xuICBwdWJsaWMgY2xlYW51cENoYXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl90b29sdGlwUmFmSWQgIT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFJhZklkKTtcbiAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0gbnVsbDtcblxuICAgIGlmICh0aGlzLnN2Z0VsZW1lbnQpIHtcbiAgICAgIHRoaXMuc3ZnRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3ZnRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gICAgdGhpcy5fbGFzdENvbnRhaW5lclJlY3QgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZ3JhZGllbnQgZGVmaW5pdGlvbnMgZm9yIHRocmVzaG9sZHNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlR3JhZGllbnRzKFxuICAgIHN2ZzogZDMuU2VsZWN0aW9uPFNWR1NWR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgdGhyZXNob2xkczogeyB2YWx1ZTogbnVtYmVyOyBjb2xvcjogc3RyaW5nIH1bXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZGVmcyA9IHN2Zy5hcHBlbmQoJ2RlZnMnKTtcblxuICAgIC8vIENyZWF0ZSBhIHJhZGlhbCBncmFkaWVudCBmb3IgdGhlIGJhY2tncm91bmRcbiAgICBjb25zdCBiZ0dyYWRpZW50ID0gZGVmc1xuICAgICAgLmFwcGVuZCgncmFkaWFsR3JhZGllbnQnKVxuICAgICAgLmF0dHIoJ2lkJywgJ2dhdWdlLWJnLWdyYWRpZW50JylcbiAgICAgIC5hdHRyKCdjeCcsICc1MCUnKVxuICAgICAgLmF0dHIoJ2N5JywgJzUwJScpXG4gICAgICAuYXR0cigncicsICc1MCUnKVxuICAgICAgLmF0dHIoJ2dyYWRpZW50VW5pdHMnLCAndXNlclNwYWNlT25Vc2UnKTtcblxuICAgIC8vIEdldCBDU1MgdmFyaWFibGUgZm9yIHRyYWNrIGNvbG9yXG4gICAgaWYgKHRocmVzaG9sZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBEZWZhdWx0IGdyYWRpZW50IHdoZW4gbm8gdGhyZXNob2xkcyBhcmUgcHJvdmlkZWRcbiAgICAgIGJnR3JhZGllbnQuYXBwZW5kKCdzdG9wJykuYXR0cignb2Zmc2V0JywgJzAlJykuYXR0cignc3RvcC1jb2xvcicsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10cmFjay1jb2xvcikpJyk7XG4gICAgICBiZ0dyYWRpZW50XG4gICAgICAgIC5hcHBlbmQoJ3N0b3AnKVxuICAgICAgICAuYXR0cignb2Zmc2V0JywgJzEwMCUnKVxuICAgICAgICAuYXR0cignc3RvcC1jb2xvcicsICdyZ2JhKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdHJhY2stY29sb3IpLCAwLjgpJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJnR3JhZGllbnQuYXBwZW5kKCdzdG9wJykuYXR0cignb2Zmc2V0JywgJzAlJykuYXR0cignc3RvcC1jb2xvcicsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10cmFjay1jb2xvcikpJyk7XG4gICAgICBiZ0dyYWRpZW50XG4gICAgICAgIC5hcHBlbmQoJ3N0b3AnKVxuICAgICAgICAuYXR0cignb2Zmc2V0JywgJzEwMCUnKVxuICAgICAgICAuYXR0cignc3RvcC1jb2xvcicsICdyZ2JhKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdHJhY2stY29sb3IpLCAwLjgpJyk7XG5cbiAgICAgIC8vIENyZWF0ZSBncmFkaWVudHMgZm9yIGVhY2ggdGhyZXNob2xkXG4gICAgICB0aHJlc2hvbGRzLmZvckVhY2goKHRocmVzaG9sZCwgaSkgPT4ge1xuICAgICAgICBjb25zdCBncmFkaWVudCA9IGRlZnNcbiAgICAgICAgICAuYXBwZW5kKCdsaW5lYXJHcmFkaWVudCcpXG4gICAgICAgICAgLmF0dHIoJ2lkJywgYHRocmVzaG9sZC1ncmFkaWVudC0ke2l9YClcbiAgICAgICAgICAuYXR0cignZ3JhZGllbnRVbml0cycsICd1c2VyU3BhY2VPblVzZScpXG4gICAgICAgICAgLmF0dHIoJ3gxJywgJy0xJylcbiAgICAgICAgICAuYXR0cigneTEnLCAnMCcpXG4gICAgICAgICAgLmF0dHIoJ3gyJywgJzEnKVxuICAgICAgICAgIC5hdHRyKCd5MicsICcwJyk7XG5cbiAgICAgICAgZ3JhZGllbnRcbiAgICAgICAgICAuYXBwZW5kKCdzdG9wJylcbiAgICAgICAgICAuYXR0cignb2Zmc2V0JywgJzAlJylcbiAgICAgICAgICAuYXR0cignc3RvcC1jb2xvcicsIHRoaXMuZDMuY29sb3IodGhyZXNob2xkLmNvbG9yKT8uYnJpZ2h0ZXIoMC41KS50b1N0cmluZygpIHx8IHRocmVzaG9sZC5jb2xvcik7XG5cbiAgICAgICAgZ3JhZGllbnQuYXBwZW5kKCdzdG9wJykuYXR0cignb2Zmc2V0JywgJzEwMCUnKS5hdHRyKCdzdG9wLWNvbG9yJywgdGhyZXNob2xkLmNvbG9yKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyB0aWNrIG1hcmtzIGFuZCBsYWJlbHMgYXJvdW5kIHRoZSBnYXVnZVxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3VGlja3MoXG4gICAgY2hhcnRHcm91cDogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIHJhZGl1czogbnVtYmVyLFxuICAgIG1pblZhbHVlOiBudW1iZXIsXG4gICAgbWF4VmFsdWU6IG51bWJlcixcbiAgICBzaXplOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIC8vIER5bmFtaWNhbGx5IGNob29zZSB0aWNrIGNvdW50IGJhc2VkIG9uIGNoYXJ0IHNpemUgKHJlZHVjZWQgZm9yIGJldHRlciBzcGFjaW5nKVxuICAgIGxldCB0aWNrQ291bnQgPSA1O1xuICAgIGlmIChzaXplIDwgMjAwKVxuICAgICAgdGlja0NvdW50ID0gMzsgLy8gVmVyeSBzbWFsbDogb25seSBzaG93IG1pbiwgbWlkLCBtYXhcbiAgICBlbHNlIGlmIChzaXplIDwgMzAwKSB0aWNrQ291bnQgPSA0O1xuICAgIGVsc2UgaWYgKHNpemUgPCA0MDApIHRpY2tDb3VudCA9IDU7XG4gICAgZWxzZSBpZiAoc2l6ZSA+IDUyMCkgdGlja0NvdW50ID0gNztcblxuICAgIC8vIFNjYWxlIHRpY2sgbGVuZ3RoIGFuZCBsYWJlbCBvZmZzZXQgcHJvcG9ydGlvbmFsbHkgdG8gc2l6ZVxuICAgIGNvbnN0IHRpY2tMZW5ndGggPSBNYXRoLm1heCg0LCBNYXRoLm1pbihyYWRpdXMgKiAwLjEyLCAxNCkpO1xuICAgIC8vIEluY3JlYXNlZCBsYWJlbCBvZmZzZXQgdG8gcHJldmVudCBvdmVybGFwIHdpdGggdGljayBsaW5lcyBhbmQgd2lkZSBsYWJlbHMgKGxpa2UgMTAwTSlcbiAgICBjb25zdCBsYWJlbE9mZnNldCA9IE1hdGgubWF4KDIyLCBNYXRoLm1pbihyYWRpdXMgKiAwLjI4LCA0NSkpO1xuXG4gICAgLy8gQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSB0aWNrc1xuICAgIGNvbnN0IHRpY2tHcm91cCA9IGNoYXJ0R3JvdXAuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAndGlja3MnKTtcblxuICAgIC8vIEdlbmVyYXRlIHRpY2sgdmFsdWVzXG4gICAgY29uc3QgdGlja1ZhbHVlcyA9IFtdIGFzIG51bWJlcltdO1xuICAgIGNvbnN0IHN0ZXAgPSAobWF4VmFsdWUgLSBtaW5WYWx1ZSkgLyAodGlja0NvdW50IC0gMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aWNrQ291bnQ7IGkrKykge1xuICAgICAgdGlja1ZhbHVlcy5wdXNoKG1pblZhbHVlICsgaSAqIHN0ZXApO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aWNrcyBhbmQgbGFiZWxzXG4gICAgdGlja1ZhbHVlcy5mb3JFYWNoKCh0aWNrKSA9PiB7XG4gICAgICAvLyBDYWxjdWxhdGUgYW5nbGUgZm9yIHRoaXMgdGlja1xuICAgICAgY29uc3QgYW5nbGUgPSB0aGlzLnNjYWxlVmFsdWVUb0FuZ2xlKHRpY2ssIG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICBjb25zdCByYWRpYW5zID0gYW5nbGUgLSB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlM7IC8vIEFkanVzdCBmb3Igc3RhcnRpbmcgYXQgYm90dG9tICgtOTAgZGVncmVlcylcblxuICAgICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uc1xuICAgICAgY29uc3QgeDEgPSBNYXRoLmNvcyhyYWRpYW5zKSAqIChyYWRpdXMgKyA1KTtcbiAgICAgIGNvbnN0IHkxID0gTWF0aC5zaW4ocmFkaWFucykgKiAocmFkaXVzICsgNSk7XG4gICAgICBjb25zdCB4MiA9IE1hdGguY29zKHJhZGlhbnMpICogKHJhZGl1cyArIHRpY2tMZW5ndGgpO1xuICAgICAgY29uc3QgeTIgPSBNYXRoLnNpbihyYWRpYW5zKSAqIChyYWRpdXMgKyB0aWNrTGVuZ3RoKTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIGxhYmVsIHBvc2l0aW9uXG4gICAgICBjb25zdCBsYWJlbFggPSBNYXRoLmNvcyhyYWRpYW5zKSAqIChyYWRpdXMgKyBsYWJlbE9mZnNldCk7XG4gICAgICBjb25zdCBsYWJlbFkgPSBNYXRoLnNpbihyYWRpYW5zKSAqIChyYWRpdXMgKyBsYWJlbE9mZnNldCk7XG5cbiAgICAgIC8vIERyYXcgdGljayBsaW5lXG4gICAgICB0aWNrR3JvdXBcbiAgICAgICAgLmFwcGVuZCgnbGluZScpXG4gICAgICAgIC5hdHRyKCd4MScsIHgxKVxuICAgICAgICAuYXR0cigneTEnLCB5MSlcbiAgICAgICAgLmF0dHIoJ3gyJywgeDIpXG4gICAgICAgIC5hdHRyKCd5MicsIHkyKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJ3JnYmEodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10ZXh0LWNvbG9yKSwgMC41KScpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAyKTtcblxuICAgICAgLy8gQWRkIHRpY2sgbGFiZWwgd2l0aCBkeW5hbWljIGZvbnQgc2l6ZSAobWluaW11bSAxNHB4KVxuICAgICAgY29uc3QgdGlja0ZvbnRQeCA9IE1hdGgubWF4KDE0LCBNYXRoLm1pbigxOCwgTWF0aC5mbG9vcihzaXplIC8gMzUpKSk7XG4gICAgICBcbiAgICAgIC8vIFNtYXJ0IGZvcm1hdHRpbmc6IHByZXNlcnZlIGRlY2ltYWxzIGZvciBzbWFsbCByYW5nZXMsIHJvdW5kIGZvciBsYXJnZSB2YWx1ZXNcbiAgICAgIGNvbnN0IHZhbHVlUmFuZ2UgPSBtYXhWYWx1ZSAtIG1pblZhbHVlO1xuICAgICAgbGV0IGZvcm1hdHRlZFZhbHVlOiBzdHJpbmc7XG4gICAgICBcbiAgICAgIGlmICh2YWx1ZVJhbmdlIDw9IDEwKSB7XG4gICAgICAgIC8vIFNtYWxsIHJhbmdlOiBzaG93IHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMsIHJlbW92ZSB0cmFpbGluZyB6ZXJvc1xuICAgICAgICBmb3JtYXR0ZWRWYWx1ZSA9IHRpY2sudG9GaXhlZCgyKS5yZXBsYWNlKC9cXC4/MCskLywgJycpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZVJhbmdlIDwgMTAwMCkge1xuICAgICAgICAvLyBNZWRpdW0gcmFuZ2U6IHNob3cgMSBkZWNpbWFsIGlmIG5lZWRlZFxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZSA9IHRpY2sgJSAxID09PSAwID8gdGljay50b1N0cmluZygpIDogdGljay50b0ZpeGVkKDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTGFyZ2UgcmFuZ2U6IHVzZSBhYmJyZXZpYXRlZCBmb3JtYXQgKEssIE0sIEIpXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlID0gZm9ybWF0TGFyZ2VOdW1iZXIoTWF0aC5yb3VuZCh0aWNrKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRpY2tHcm91cFxuICAgICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgLmF0dHIoJ3gnLCBsYWJlbFgpXG4gICAgICAgIC5hdHRyKCd5JywgbGFiZWxZKVxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJ3JnYmEodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10ZXh0LWNvbG9yKSwgMC43KScpXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7dGlja0ZvbnRQeH1weGApXG4gICAgICAgIC50ZXh0KGZvcm1hdHRlZFZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyB0aGUgdmFsdWUgYW5kIGxhYmVsIHRleHQgaW4gdGhlIGNlbnRlclxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3VmFsdWVEaXNwbGF5KFxuICAgIGNoYXJ0R3JvdXA6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPixcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgcmFkaXVzOiBudW1iZXIsXG4gICAgc2l6ZTogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICAvLyBQeC1iYXNlZCBzY2FsaW5nIGZvciByb2J1c3Qgc21hbGwvbGFyZ2Ugc2l6ZXMgd2l0aCBiZXR0ZXIgc21hbGwtc2l6ZSBoYW5kbGluZ1xuICAgIGNvbnN0IHZhbHVlRm9udFB4ID0gTWF0aC5tYXgoMTgsIE1hdGgubWluKDMyLCBNYXRoLmZsb29yKHNpemUgLyA4KSkpO1xuICAgIGNvbnN0IGxhYmVsRm9udFB4ID0gTWF0aC5tYXgoMTAsIE1hdGgubWluKDE2LCBNYXRoLmZsb29yKHZhbHVlRm9udFB4ICogMC41NSkpKTtcbiAgICAvLyBNb3JlIHZlcnRpY2FsIGdhcCBmb3Igc21hbGwgc2l6ZXM6IHVzZSBsYXJnZXIgYmFzZSB2YWx1ZVxuICAgIGNvbnN0IHZlcnRpY2FsR2FwID0gTWF0aC5tYXgoNiwgTWF0aC5taW4oMTIsIE1hdGguZmxvb3Ioc2l6ZSAvIDQwKSkpO1xuXG4gICAgLy8gQ3JlYXRlIGdyb3VwIGZvciB0aGUgdmFsdWUgZGlzcGxheVxuICAgIGNvbnN0IHZhbHVlR3JvdXAgPSBjaGFydEdyb3VwLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLXZhbHVlLWRpc3BsYXknKS5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKTtcblxuICAgIC8vIEFkZCB2YWx1ZSBkaXNwbGF5XG4gICAgdmFsdWVHcm91cFxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtdmFsdWUnKVxuICAgICAgLmF0dHIoJ3gnLCAwKVxuICAgICAgLmF0dHIoJ3knLCByYWRpdXMgKiAwLjE1ICsgdmFsdWVGb250UHgpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke3ZhbHVlRm9udFB4fXB4YClcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNjAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10ZXh0LWNvbG9yKSknKVxuICAgICAgLnRleHQodmFsdWUudG9Mb2NhbGVTdHJpbmcoKSk7XG5cbiAgICAvLyBBZGQgbGFiZWwgZGlzcGxheSAoaWYgcHJvdmlkZWQpXG4gICAgaWYgKGxhYmVsKSB7XG4gICAgICB2YWx1ZUdyb3VwXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtbGFiZWwnKVxuICAgICAgICAuYXR0cigneCcsIDApXG4gICAgICAgIC5hdHRyKCd5JywgcmFkaXVzICogMC4yNCArIHZhbHVlRm9udFB4ICsgdmVydGljYWxHYXApXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7bGFiZWxGb250UHh9cHhgKVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdGV4dC1jb2xvcikpJylcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzAuOCcpXG4gICAgICAgIC50ZXh0KGxhYmVsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgdGhlIGRpYWwvbmVlZGxlIHBvaW50aW5nIHRvIHRoZSBjdXJyZW50IHZhbHVlIHdpdGggYW5pbWF0aW9uXG4gICAqL1xuICBwcml2YXRlIGRyYXdEaWFsKFxuICAgIGNoYXJ0R3JvdXA6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPixcbiAgICByYWRpdXM6IG51bWJlcixcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIG1pblZhbHVlOiBudW1iZXIsXG4gICAgbWF4VmFsdWU6IG51bWJlcixcbiAgICBhbmltYXRpb25EdXJhdGlvbjogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICAvLyBDbGFtcCB2YWx1ZSB0byBtaW4vbWF4IHJhbmdlXG4gICAgY29uc3QgY2xhbXBlZFZhbHVlID0gTWF0aC5tYXgobWluVmFsdWUsIE1hdGgubWluKG1heFZhbHVlLCB2YWx1ZSkpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZ2xlIGZvciBuZWVkbGUgYmFzZWQgb24gdmFsdWVcbiAgICBjb25zdCBhbmdsZSA9IHRoaXMuc2NhbGVWYWx1ZVRvQW5nbGUoY2xhbXBlZFZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgIGNvbnN0IGFuZ2xlSW5EZWdyZWVzID0gdGhpcy5yYWRpYW5zVG9EZWdyZWVzKGFuZ2xlIC0gdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TKTtcblxuICAgIC8vIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgbmVlZGxlXG4gICAgY29uc3QgZGlhbEdyb3VwID0gY2hhcnRHcm91cC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkaWFsJyk7XG5cbiAgICAvLyBEcmF3IHRoZSBuZWVkbGUgd2l0aCBpbml0aWFsIHBvc2l0aW9uIGF0IG1pbmltdW0gdmFsdWVcbiAgICBjb25zdCBuZWVkbGVQYXRoID0gZGlhbEdyb3VwXG4gICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgIC5hdHRyKCdkJywgdGhpcy5jcmVhdGVOZWVkbGVQYXRoKHJhZGl1cykpXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtbmVlZGxlJylcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LW5lZWRsZS1jb2xvcikpJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgcm90YXRlKCR7dGhpcy5yYWRpYW5zVG9EZWdyZWVzKC10aGlzLkhBTEZfQ0lSQ0xFX1JBRElBTlMpfSlgKTsgLy8gU3RhcnQgYXQgLTE4MCBkZWdyZWVzIChsZWZ0KVxuXG4gICAgLy8gQWRkIGEgY2VudGVyIGNpcmNsZVxuICAgIGRpYWxHcm91cFxuICAgICAgLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgIC5hdHRyKCdjeCcsIDApXG4gICAgICAuYXR0cignY3knLCAwKVxuICAgICAgLmF0dHIoJ3InLCByYWRpdXMgKiAwLjA4KVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtbmVlZGxlLWNvbG9yKSknKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsICcjZmZmJylcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAyKTtcblxuICAgIC8vIEFkZCBhIHNtYWxsZXIgd2hpdGUgY2VudGVyXG4gICAgZGlhbEdyb3VwXG4gICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgLmF0dHIoJ2N4JywgMClcbiAgICAgIC5hdHRyKCdjeScsIDApXG4gICAgICAuYXR0cigncicsIHJhZGl1cyAqIDAuMDMpXG4gICAgICAuYXR0cignZmlsbCcsICcjZmZmJyk7XG5cbiAgICAvLyBHZXQgZWFzaW5nIGZ1bmN0aW9uXG4gICAgY29uc3QgZWFzaW5nRnVuY3Rpb24gPSBnZXRFYXNpbmdGdW5jdGlvbih0aGlzLmQzLCB0aGlzLm9wdGlvbnMoKT8uYW5pbWF0aW9uRWFzaW5nKTtcblxuICAgIC8vIEFuaW1hdGUgdGhlIG5lZWRsZSBmcm9tIG1pbiB0byBjdXJyZW50IHZhbHVlXG4gICAgbmVlZGxlUGF0aFxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmVhc2UoZWFzaW5nRnVuY3Rpb24pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHJvdGF0ZSgke2FuZ2xlSW5EZWdyZWVzfSlgKTtcbiAgfVxuXG4gIC8vIGdldEVhc2luZ0Z1bmN0aW9uIG1vdmVkIHRvIHNoYXJlZCBjaGFydCB1dGlsc1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGF0aCBzdHJpbmcgZm9yIHRoZSBuZWVkbGVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlTmVlZGxlUGF0aChyYWRpdXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbmVlZGxlTGVuZ3RoID0gcmFkaXVzICogMC44O1xuICAgIGNvbnN0IG5lZWRsZVdpZHRoID0gcmFkaXVzICogMC4wNjtcbiAgICByZXR1cm4gYE0gMCwke25lZWRsZVdpZHRoIC8gMn0gTCAke25lZWRsZUxlbmd0aH0sMCBMIDAsJHstbmVlZGxlV2lkdGggLyAyfSBaYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FsZXMgYSB2YWx1ZSB0byBhbiBhbmdsZSAoaW4gcmFkaWFucylcbiAgICovXG4gIHByaXZhdGUgc2NhbGVWYWx1ZVRvQW5nbGUodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZVJhbmdlID0gbWF4IC0gbWluO1xuICAgIHJldHVybiAoKHZhbHVlIC0gbWluKSAvIHZhbHVlUmFuZ2UpICogdGhpcy5IQUxGX0NJUkNMRV9SQURJQU5TIC0gdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlcyBhIHZhbHVlIHRvIGFuIGFuZ2xlIGZvciBjb2xvciBhcmNzIChpbiByYWRpYW5zKVxuICAgKi9cbiAgcHJpdmF0ZSBzY2FsZVZhbHVlVG9Db2xvckFuZ2xlKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdmFsdWVSYW5nZSA9IG1heCAtIG1pbjtcbiAgICByZXR1cm4gKCh2YWx1ZSAtIG1pbikgLyB2YWx1ZVJhbmdlKSAqIHRoaXMuSEFMRl9DSVJDTEVfUkFESUFOUyAtIHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBhbmdsZSBiYWNrIHRvIGEgdmFsdWVcbiAgICovXG4gIHByaXZhdGUgYW5nbGVUb1ZhbHVlKGFuZ2xlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdmFsdWVSYW5nZSA9IG1heCAtIG1pbjtcbiAgICByZXR1cm4gbWluICsgKChhbmdsZSArIHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUykgLyB0aGlzLkhBTEZfQ0lSQ0xFX1JBRElBTlMpICogdmFsdWVSYW5nZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyByYWRpYW5zIHRvIGRlZ3JlZXNcbiAgICovXG4gIHByaXZhdGUgcmFkaWFuc1RvRGVncmVlcyhyYWRpYW5zOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByYWRpYW5zICogdGhpcy5ERUdSRUVTX1BFUl9SQURJQU47XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJheC1nYXVnZS1jaGFydFwiIHJvbGU9XCJpbWdcIiAjY2hhcnRDb250YWluZXI+PC9kaXY+XG48YXgtY2hhcnQtdG9vbHRpcCBbZGF0YV09XCJ0b29sdGlwRGF0YSgpXCIgW3Bvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbigpXCIgW3Zpc2libGVdPVwidG9vbHRpcFZpc2libGUoKVwiPjwvYXgtY2hhcnQtdG9vbHRpcD5cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1nYXVnZS1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9nYXVnZS1jaGFydC9zcmMvYWNvcmV4LWNoYXJ0cy1nYXVnZS1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-charts-gauge-chart.mjs","sources":["../tmp-esm2022/gauge-chart/lib/gauge-chart.config.js","../tmp-esm2022/gauge-chart/lib/gauge-chart.component.js","../tmp-esm2022/gauge-chart/acorex-charts-gauge-chart.js"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nexport const AXGaugeChartDefaultConfig = {\n minValue: 0,\n maxValue: 100,\n gaugeWidth: 22,\n cornerRadius: 5,\n showValue: true,\n showTooltip: true,\n animationDuration: 750,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide a value to display the gauge',\n noDataIcon: 'fa-light fa-gauge',\n },\n};\nexport const AX_GAUGE_CHART_CONFIG = new InjectionToken('AX_GAUGE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXGaugeChartDefaultConfig,\n});\nexport function gaugeChartConfig(config = {}) {\n const result = {\n ...AXGaugeChartDefaultConfig,\n ...config,\n };\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2hhcnQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXVCO0lBQzNELFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLEdBQUc7SUFDYixVQUFVLEVBQUUsRUFBRTtJQUNkLFlBQVksRUFBRSxDQUFDO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLE1BQU0sRUFBRSxtQkFBbUI7UUFDM0IsVUFBVSxFQUFFLDZDQUE2QztRQUN6RCxVQUFVLEVBQUUsbUJBQW1CO0tBQ2hDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUFxQix1QkFBdUIsRUFBRTtJQUNuRyxVQUFVLEVBQUUsTUFBTTtJQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMseUJBQXlCO0NBQ3pDLENBQUMsQ0FBQztBQUlILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxTQUFrQyxFQUFFO0lBQ25FLE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyx5QkFBeUI7UUFDNUIsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhHYXVnZUNoYXJ0T3B0aW9uIH0gZnJvbSAnLi9nYXVnZS1jaGFydC50eXBlJztcblxuZXhwb3J0IGNvbnN0IEFYR2F1Z2VDaGFydERlZmF1bHRDb25maWc6IEFYR2F1Z2VDaGFydE9wdGlvbiA9IHtcbiAgbWluVmFsdWU6IDAsXG4gIG1heFZhbHVlOiAxMDAsXG4gIGdhdWdlV2lkdGg6IDIyLFxuICBjb3JuZXJSYWRpdXM6IDUsXG4gIHNob3dWYWx1ZTogdHJ1ZSxcbiAgc2hvd1Rvb2x0aXA6IHRydWUsXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA3NTAsXG4gIGFuaW1hdGlvbkVhc2luZzogJ2N1YmljLW91dCcsXG4gIG1lc3NhZ2VzOiB7XG4gICAgbm9EYXRhOiAnTm8gZGF0YSBhdmFpbGFibGUnLFxuICAgIG5vRGF0YUhlbHA6ICdQbGVhc2UgcHJvdmlkZSBhIHZhbHVlIHRvIGRpc3BsYXkgdGhlIGdhdWdlJyxcbiAgICBub0RhdGFJY29uOiAnZmEtbGlnaHQgZmEtZ2F1Z2UnLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEFYX0dBVUdFX0NIQVJUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBWEdhdWdlQ2hhcnRPcHRpb24+KCdBWF9HQVVHRV9DSEFSVF9DT05GSUcnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4gQVhHYXVnZUNoYXJ0RGVmYXVsdENvbmZpZyxcbn0pO1xuXG5leHBvcnQgdHlwZSBQYXJ0aWFsR2F1Z2VDaGFydENvbmZpZyA9IFBhcnRpYWw8QVhHYXVnZUNoYXJ0T3B0aW9uPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdhdWdlQ2hhcnRDb25maWcoY29uZmlnOiBQYXJ0aWFsR2F1Z2VDaGFydENvbmZpZyA9IHt9KTogQVhHYXVnZUNoYXJ0T3B0aW9uIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIC4uLkFYR2F1Z2VDaGFydERlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICB9O1xuICByZXR1cm4gcmVzdWx0O1xufVxuIl19","import { AXChartComponent, computeTooltipPosition, formatLargeNumber, getEasingFunction, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, afterNextRender, computed, effect, inject, input, signal, viewChild, } from '@angular/core';\nimport { AX_GAUGE_CHART_CONFIG } from './gauge-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Gauge Chart Component\n * Renders a semi-circular gauge chart with animated needle and thresholds\n */\nexport class AXGaugeChartComponent extends AXChartComponent {\n // Inputs\n /** Chart value input */\n value = input(0, ...(ngDevMode ? [{ debugName: \"value\" }] : []));\n /** Chart options input */\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // SVG element reference (created in the code)\n svgElement = null;\n // D3 reference - loaded asynchronously\n d3;\n // Signals for component state\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n _prevValue = signal(null, ...(ngDevMode ? [{ debugName: \"_prevValue\" }] : []));\n // Track previous options to detect changes\n _prevOptionsString = '';\n // Cache for container dimensions to avoid repeated DOM reads\n _lastContainerRect = null;\n // Tooltip signals\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n _tooltipRafId = null;\n _pendingTooltipCoords = null;\n // Expose tooltip signals as read-only 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_GAUGE_CHART_CONFIG);\n // Computed configuration options\n effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Constants\n TOOLTIP_GAP = 10;\n HALF_CIRCLE_RADIANS = Math.PI;\n QUARTER_CIRCLE_RADIANS = Math.PI / 2;\n DEGREES_PER_RADIAN = 180 / Math.PI;\n CHART_EDGE_PADDING = 12;\n TICK_LABEL_CHAR_WIDTH_RATIO = 0.62;\n TICK_LABEL_SIDE_PADDING = 6;\n LABEL_TICK_CLEARANCE = 4;\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 // Watch for changes to redraw the chart\n effect(() => {\n // Access inputs to track them\n const currentValue = this.value();\n const options = this.effectiveOptions();\n // Update previous value\n this._prevValue.set(currentValue);\n // Only update if already rendered\n if (this._rendered()) {\n // If only the value changed, just update the value display and dial\n const optionsString = JSON.stringify(options);\n if (this._prevOptionsString === optionsString) {\n this.updateValueAndDial(currentValue);\n }\n else {\n // If options changed, recreate the whole chart\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n }\n });\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n /**\n * Loads D3.js dynamically\n */\n async loadD3() {\n if (this.d3)\n return; // Already loaded\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n /**\n * Creates the gauge chart with all elements\n */\n createChart() {\n // Clear container and create SVG\n if (this.svgElement) {\n this.svgElement.remove();\n }\n // Create SVG element\n this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.chartContainerEl().nativeElement.appendChild(this.svgElement);\n // Get current options\n const options = this.effectiveOptions();\n // Store options string for comparison\n this._prevOptionsString = JSON.stringify(options);\n const { minValue, maxValue, showValue, label = '', gaugeWidth, cornerRadius, animationDuration } = options;\n const thresholds = options.thresholds ?? [];\n // Calculate responsive dimensions\n const containerElement = this.chartContainerEl().nativeElement;\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // Cache container dimensions\n this._lastContainerRect = { width: containerWidth, height: containerHeight };\n // Determine chart dimensions - use options if provided, otherwise use container dimensions\n const width = options.width ?? containerWidth;\n const height = options.height ?? containerHeight;\n // Ensure minimum dimensions\n const effectiveWidth = Math.max(width, 100);\n const effectiveHeight = Math.max(height, 50);\n // For a semi-circular gauge, width should be approximately twice the height\n const size = Math.min(effectiveWidth, effectiveHeight * 2);\n // Calculate margin as percentage of size (5-8% with reasonable bounds)\n const marginRatio = 0.08;\n const margin = Math.max(5, Math.min(size * marginRatio, 30));\n const tickCount = this.getTickCount(size);\n const tickFontPx = this.getTickFontSize(size);\n const maxTickLabelWidth = this.estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx);\n const tickLength = Math.max(4, Math.min((size / 2) * 0.12, 14));\n // Keep labels closer to the gauge arc while preserving readability.\n const labelGap = Math.max(6, Math.min((size / 2) * 0.06, 14));\n const labelOffsetFromTickEnd = labelGap + tickFontPx * 0.35;\n const tickLabelSpace = tickLength + labelOffsetFromTickEnd + tickFontPx;\n const totalVerticalSpace = size / 2 + tickLabelSpace;\n // Labels at edge ticks use start/end anchors, so they can extend by near full width.\n const horizontalPadding = Math.max(18, maxTickLabelWidth + 8);\n const totalWidth = size + horizontalPadding * 2;\n const viewBoxWidth = totalWidth + this.CHART_EDGE_PADDING * 2;\n const viewBoxHeight = totalVerticalSpace + this.CHART_EDGE_PADDING * 2;\n // Set up SVG with responsive viewBox that accounts for overflow\n const svg = this.d3\n .select(this.svgElement)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${viewBoxWidth} ${viewBoxHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n // Create a group for the chart centered horizontally with padding, positioned to show only the top half\n const chartGroup = svg\n .append('g')\n .attr('transform', `translate(${size / 2 + horizontalPadding + this.CHART_EDGE_PADDING}, ${size / 2 - margin + this.CHART_EDGE_PADDING})`);\n // Define gauge parameters\n const radius = size / 2 - margin;\n const desiredGaugeWidth = typeof gaugeWidth === 'number' && !Number.isNaN(gaugeWidth) ? gaugeWidth : 30;\n // Respect explicit gaugeWidth in px with sane absolute bounds.\n const clampedGaugeWidth = Math.max(6, Math.min(desiredGaugeWidth, radius * 0.7));\n const innerRadius = radius - clampedGaugeWidth;\n const outerRadius = radius;\n // Create gradient definitions\n this.createGradients(svg, thresholds);\n // Draw the background arc\n this.drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius);\n // Draw the threshold arcs if thresholds exist\n if (thresholds.length > 0) {\n this.drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius);\n }\n // Draw tick marks\n this.drawTicks(chartGroup, outerRadius, minValue, maxValue, size, tickCount, tickFontPx);\n // Draw the dial/needle with animation\n this.drawDial(chartGroup, radius, this.value(), minValue, maxValue, animationDuration);\n // Draw the value display (after the dial so it's on top)\n if (showValue) {\n this.drawValueDisplay(chartGroup, this.value(), label, radius, size);\n }\n // Hide tooltip initially\n this._tooltipVisible.set(false);\n }\n /**\n * Updates the chart when options change\n */\n updateChart() {\n this.createChart();\n }\n /**\n * Updates only the value display and dial position without recreating the chart\n */\n updateValueAndDial(value) {\n if (!this.svgElement)\n return;\n const options = this.effectiveOptions();\n const minValue = options.minValue;\n const maxValue = options.maxValue;\n const animationDuration = options.animationDuration;\n const easingFunction = getEasingFunction(this.d3, options.animationEasing);\n const currentValue = value;\n const svg = this.d3.select(this.svgElement);\n // Update value text\n svg.select('.gauge-value').text(currentValue.toLocaleString());\n // Update needle position\n const angle = this.scaleValueToAngle(currentValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n svg\n .select('.gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n /**\n * Draw the background arc\n */\n drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius) {\n // Create arc for the background\n const backgroundArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .startAngle(-this.QUARTER_CIRCLE_RADIANS) // Start from bottom (-90 degrees)\n .endAngle(this.QUARTER_CIRCLE_RADIANS) // End at top (90 degrees)\n .cornerRadius(cornerRadius);\n // Draw background arc\n const backgroundPath = chartGroup\n .append('path')\n .attr('d', backgroundArc)\n .attr('class', 'gauge-arc gauge-base')\n .attr('fill', 'url(#gauge-bg-gradient)')\n .attr('filter', 'drop-shadow(0px 2px 3px rgba(0,0,0,0.1))');\n // Add tooltip for single arc if no thresholds\n if (!this.effectiveOptions().thresholds || this.effectiveOptions().thresholds.length === 0) {\n backgroundPath\n .style('cursor', 'pointer')\n .on('mouseenter', (event) => {\n if (!this.effectiveOptions().showTooltip)\n return;\n this.showSingleRangeTooltip(event);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n /**\n * Draw the thresholds arcs\n */\n drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius) {\n // Create arc generator\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98)\n .cornerRadius(cornerRadius);\n // Sort thresholds by value in ascending order (only if needed)\n const sortedThresholds = thresholds.length > 1 ? [...thresholds].sort((a, b) => a.value - b.value) : thresholds;\n // Calculate all angles first using the color angle calculation\n const angles = sortedThresholds.map((t) => this.scaleValueToColorAngle(t.value, minValue, maxValue));\n // Start from the minimum value angle\n let previousEndAngle = this.scaleValueToColorAngle(minValue, minValue, maxValue);\n sortedThresholds.forEach((threshold, i) => {\n const endAngle = angles[i];\n // Skip if end angle is not greater than start angle\n if (endAngle <= previousEndAngle)\n return;\n const arcPath = chartGroup\n .append('path')\n .attr('d', arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle,\n }))\n .attr('fill', threshold.color || `url(#threshold-gradient-${i})`)\n .attr('class', 'gauge-arc threshold-arc')\n .attr('data-value', threshold.value)\n .style('cursor', 'pointer');\n // Add tooltip interaction\n if (this.effectiveOptions().showTooltip) {\n // Convert angles back to values for tooltip\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = threshold.value;\n arcPath\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, threshold.color, threshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n // Update the previous end angle for the next threshold\n previousEndAngle = endAngle;\n });\n // Draw the last segment if the last threshold is less than the max value\n if (previousEndAngle < this.QUARTER_CIRCLE_RADIANS) {\n const lastArc = chartGroup\n .append('path')\n .attr('d', arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle: this.QUARTER_CIRCLE_RADIANS,\n }))\n .attr('fill', 'url(#gauge-bg-gradient)')\n .attr('class', 'gauge-arc threshold-arc')\n .style('cursor', 'pointer');\n // Add tooltip for the last segment\n if (this.effectiveOptions().showTooltip) {\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = maxValue;\n const lastThreshold = thresholds[thresholds.length - 1];\n lastArc\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, lastThreshold.color, lastThreshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n }\n /**\n * Shows tooltip for a threshold arc\n */\n showThresholdTooltip(event, startValue, endValue, color, label) {\n // Create tooltip data\n this._tooltipData.set({\n title: label || 'Range',\n value: `${startValue.toLocaleString()} - ${endValue.toLocaleString()}`,\n color: color,\n });\n // Show tooltip\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n /**\n * Shows tooltip for the entire range when no thresholds are defined\n */\n showSingleRangeTooltip(event) {\n const options = this.effectiveOptions();\n if (!options.showTooltip)\n return;\n this.updateTooltipPosition(event);\n this._tooltipData.set({\n title: options.label || 'Range',\n value: `${options.minValue.toLocaleString()} - ${options.maxValue.toLocaleString()}`,\n color: 'rgb(var(--ax-comp-gauge-chart-track-color))',\n });\n this._tooltipVisible.set(true);\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 rect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;\n const pos = computeTooltipPosition(rect, tooltipRect, coords.x + 10, coords.y - 10, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n /**\n * Hides the tooltip\n */\n hideTooltip() {\n this._tooltipVisible.set(false);\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 if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n this._tooltipVisible.set(false);\n this._lastContainerRect = null;\n }\n /**\n * Creates gradient definitions for thresholds\n */\n createGradients(svg, thresholds) {\n const defs = svg.append('defs');\n // Create a radial gradient for the background\n const bgGradient = defs\n .append('radialGradient')\n .attr('id', 'gauge-bg-gradient')\n .attr('cx', '50%')\n .attr('cy', '50%')\n .attr('r', '50%')\n .attr('gradientUnits', 'userSpaceOnUse');\n // Get CSS variable for track color\n if (thresholds.length === 0) {\n // Default gradient when no thresholds are provided\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n }\n else {\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n // Create gradients for each threshold\n thresholds.forEach((threshold, i) => {\n const gradient = defs\n .append('linearGradient')\n .attr('id', `threshold-gradient-${i}`)\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('x1', '-1')\n .attr('y1', '0')\n .attr('x2', '1')\n .attr('y2', '0');\n gradient\n .append('stop')\n .attr('offset', '0%')\n .attr('stop-color', this.d3.color(threshold.color)?.brighter(0.5).toString() || threshold.color);\n gradient.append('stop').attr('offset', '100%').attr('stop-color', threshold.color);\n });\n }\n }\n /**\n * Draws tick marks and labels around the gauge\n */\n drawTicks(chartGroup, radius, minValue, maxValue, size, tickCount, tickFontPx) {\n const tickLength = Math.max(4, Math.min(radius * 0.12, 14));\n const baseLabelOffset = this.getBaseLabelOffset(radius, tickLength, tickFontPx);\n const tickGroup = chartGroup.append('g').attr('class', 'ticks');\n const tickValues = [];\n const step = (maxValue - minValue) / (tickCount - 1);\n for (let i = 0; i < tickCount; i++) {\n tickValues.push(minValue + i * step);\n }\n const tickMetrics = tickValues.map((tick) => {\n const angle = this.scaleValueToAngle(tick, minValue, maxValue);\n const radians = angle - this.QUARTER_CIRCLE_RADIANS;\n return {\n radians,\n cos: Math.cos(radians),\n sin: Math.sin(radians),\n label: this.formatTickValue(tick, minValue, maxValue),\n };\n });\n tickMetrics.forEach((metric) => {\n tickGroup\n .append('line')\n .attr('x1', metric.cos * (radius + 5))\n .attr('y1', metric.sin * (radius + 5))\n .attr('x2', metric.cos * (radius + tickLength))\n .attr('y2', metric.sin * (radius + tickLength))\n .attr('stroke', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.5)')\n .attr('stroke-width', 2);\n });\n const textSelection = tickGroup\n .selectAll('text.gauge-tick-label')\n .data(tickMetrics)\n .enter()\n .append('text')\n .attr('class', 'gauge-tick-label')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.7)')\n .style('font-size', `${tickFontPx}px`)\n .text((d) => d.label);\n textSelection.each((d, index, nodes) => {\n const node = nodes[index];\n let bboxWidth = this.estimateLabelWidth(d.label, tickFontPx);\n let bboxHeight = tickFontPx;\n try {\n const bbox = node.getBBox();\n if (bbox.width > 0)\n bboxWidth = bbox.width;\n if (bbox.height > 0)\n bboxHeight = bbox.height;\n }\n catch {\n // Keep fallback estimates.\n }\n const anchor = this.getTickLabelAnchor(d.cos);\n const nearEdgeExtent = this.getNearEdgeProjection(anchor, d.cos, d.sin, bboxWidth, bboxHeight);\n const requiredOffset = tickLength + this.LABEL_TICK_CLEARANCE + nearEdgeExtent;\n const effectiveLabelOffset = Math.max(baseLabelOffset, requiredOffset);\n const nudge = tickFontPx * 0.1;\n const x = d.cos * (radius + effectiveLabelOffset) + (anchor === 'start' ? nudge : anchor === 'end' ? -nudge : 0);\n const y = d.sin * (radius + effectiveLabelOffset);\n this.d3.select(node).attr('x', x).attr('y', y).attr('text-anchor', anchor).attr('dominant-baseline', 'middle');\n });\n }\n getTickCount(size) {\n if (size < 200)\n return 3;\n if (size < 300)\n return 4;\n if (size < 400)\n return 5;\n if (size > 520)\n return 7;\n return 5;\n }\n getTickFontSize(size) {\n return Math.max(14, Math.min(18, Math.floor(size / 35)));\n }\n getBaseLabelOffset(radius, tickLength, tickFontPx) {\n const labelGap = Math.max(6, Math.min(radius * 0.06, 14));\n return tickLength + labelGap + tickFontPx * 0.2;\n }\n getTickLabelAnchor(cosValue) {\n if (cosValue > 0.35)\n return 'start';\n if (cosValue < -0.35)\n return 'end';\n return 'middle';\n }\n getNearEdgeProjection(anchor, cosValue, sinValue, bboxWidth, bboxHeight) {\n const absCos = Math.abs(cosValue);\n const absSin = Math.abs(sinValue);\n const halfHeightProjection = absSin * (bboxHeight / 2);\n // For start/end anchored labels on edge ticks, the nearest side is close to the anchor point.\n if (anchor === 'start' || anchor === 'end') {\n return halfHeightProjection + absCos * this.TICK_LABEL_SIDE_PADDING;\n }\n // For centered labels, nearest side includes half text width projection.\n return absCos * (bboxWidth / 2) + halfHeightProjection;\n }\n formatTickValue(tick, minValue, maxValue) {\n const valueRange = maxValue - minValue;\n if (valueRange <= 10) {\n return tick.toFixed(2).replace(/\\.?0+$/, '');\n }\n if (valueRange < 1000) {\n return tick % 1 === 0 ? tick.toString() : tick.toFixed(1);\n }\n return formatLargeNumber(Math.round(tick));\n }\n estimateLabelWidth(label, tickFontPx) {\n return label.length * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx) {\n if (tickCount <= 1)\n return tickFontPx;\n const step = (maxValue - minValue) / (tickCount - 1);\n let maxChars = 0;\n for (let i = 0; i < tickCount; i++) {\n const label = this.formatTickValue(minValue + i * step, minValue, maxValue);\n maxChars = Math.max(maxChars, label.length);\n }\n return maxChars * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n /**\n * Draws the value and label text in the center\n */\n drawValueDisplay(chartGroup, value, label, radius, size) {\n // Px-based scaling for robust small/large sizes with better small-size handling\n const valueFontPx = Math.max(18, Math.min(32, Math.floor(size / 8)));\n const labelFontPx = Math.max(10, Math.min(16, Math.floor(valueFontPx * 0.55)));\n // More vertical gap for small sizes: use larger base value\n const verticalGap = Math.max(6, Math.min(12, Math.floor(size / 40)));\n // Create group for the value display\n const valueGroup = chartGroup.append('g').attr('class', 'gauge-value-display').attr('text-anchor', 'middle');\n // Add value display\n valueGroup\n .append('text')\n .attr('class', 'gauge-value')\n .attr('x', 0)\n .attr('y', radius * 0.15 + valueFontPx)\n .style('font-size', `${valueFontPx}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .text(value.toLocaleString());\n // Add label display (if provided)\n if (label) {\n valueGroup\n .append('text')\n .attr('class', 'gauge-label')\n .attr('x', 0)\n .attr('y', radius * 0.24 + valueFontPx + verticalGap)\n .style('font-size', `${labelFontPx}px`)\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .style('opacity', '0.8')\n .text(label);\n }\n }\n /**\n * Draws the dial/needle pointing to the current value with animation\n */\n drawDial(chartGroup, radius, value, minValue, maxValue, animationDuration) {\n // Clamp value to min/max range\n const clampedValue = Math.max(minValue, Math.min(maxValue, value));\n // Calculate angle for needle based on value\n const angle = this.scaleValueToAngle(clampedValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n // Create a group for the needle\n const dialGroup = chartGroup.append('g').attr('class', 'dial');\n // Draw the needle with initial position at minimum value\n const needlePath = dialGroup\n .append('path')\n .attr('d', this.createNeedlePath(radius))\n .attr('class', 'gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('transform', `rotate(${this.radiansToDegrees(-this.HALF_CIRCLE_RADIANS)})`); // Start at -180 degrees (left)\n // Add a center circle\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.08)\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('stroke', '#fff')\n .attr('stroke-width', 2);\n // Add a smaller white center\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.03)\n .attr('fill', '#fff');\n // Get easing function\n const easingFunction = getEasingFunction(this.d3, this.options()?.animationEasing);\n // Animate the needle from min to current value\n needlePath\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n // getEasingFunction moved to shared chart utils\n /**\n * Creates a path string for the needle\n */\n createNeedlePath(radius) {\n const needleLength = radius * 0.8;\n const needleWidth = radius * 0.06;\n return `M 0,${needleWidth / 2} L ${needleLength},0 L 0,${-needleWidth / 2} Z`;\n }\n /**\n * Scales a value to an angle (in radians)\n */\n scaleValueToAngle(value, min, max) {\n const valueRange = max - min;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n /**\n * Scales a value to an angle for color arcs (in radians)\n */\n scaleValueToColorAngle(value, min, max) {\n const valueRange = max - min;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n /**\n * Converts an angle back to a value\n */\n angleToValue(angle, min, max) {\n const valueRange = max - min;\n return min + ((angle + this.QUARTER_CIRCLE_RADIANS) / this.HALF_CIRCLE_RADIANS) * valueRange;\n }\n /**\n * Converts radians to degrees\n */\n radiansToDegrees(radians) {\n return radians * this.DEGREES_PER_RADIAN;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXGaugeChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXGaugeChartComponent, isStandalone: true, selector: \"ax-gauge-chart\", inputs: { value: { classPropertyName: \"value\", publicName: \"value\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-gauge-chart\\\" role=\\\"img\\\" #chartContainer></div>\\n<ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\"></ax-chart-tooltip>\\n\", styles: [\"ax-gauge-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}ax-gauge-chart .ax-gauge-chart-no-data-message{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:1rem;width:100%;height:100%;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgb(var(--ax-comp-gauge-chart-bg-color))}ax-gauge-chart .ax-gauge-chart-no-data-icon{margin-bottom:.75rem;color:rgba(var(--ax-comp-gauge-chart-text-color),.6)}ax-gauge-chart .ax-gauge-chart-no-data-text{font-weight:600;color:rgb(var(--ax-comp-gauge-chart-text-color))}\\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: AXGaugeChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-gauge-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-gauge-chart\\\" role=\\\"img\\\" #chartContainer></div>\\n<ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\"></ax-chart-tooltip>\\n\", styles: [\"ax-gauge-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}ax-gauge-chart .ax-gauge-chart-no-data-message{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:1rem;width:100%;height:100%;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgb(var(--ax-comp-gauge-chart-bg-color))}ax-gauge-chart .ax-gauge-chart-no-data-icon{margin-bottom:.75rem;color:rgba(var(--ax-comp-gauge-chart-text-color),.6)}ax-gauge-chart .ax-gauge-chart-no-data-text{font-weight:600;color:rgb(var(--ax-comp-gauge-chart-text-color))}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSx1QkFBdUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFHVCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUc3RDs7O0dBR0c7QUFTSCxNQUFNLE9BQU8scUJBQXNCLFNBQVEsZ0JBQWdCO0lBQ3pELFNBQVM7SUFDVCx3QkFBd0I7SUFDeEIsS0FBSyxHQUFHLEtBQUssQ0FBb0IsQ0FBQyxpREFBQyxDQUFDO0lBRXBDLDBCQUEwQjtJQUMxQixPQUFPLEdBQUcsS0FBSyxDQUFxQixFQUFFLG1EQUFDLENBQUM7SUFFeEMsNEJBQTRCO0lBQ1gsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBNkIsZ0JBQWdCLENBQUMsQ0FBQztJQUVyRyw4Q0FBOEM7SUFDdEMsVUFBVSxHQUF5QixJQUFJLENBQUM7SUFFaEQsdUNBQXVDO0lBQzdCLEVBQUUsQ0FBdUI7SUFFbkMsOEJBQThCO0lBQ3RC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L0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWSxDQUFDLEtBQWEsRUFBRSxHQUFXLEVBQUUsR0FBVztRQUMxRCxNQUFNLFVBQVUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQzdCLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsVUFBVSxDQUFDO0lBQy9GLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLE9BQWU7UUFDdEMsT0FBTyxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQzNDLENBQUM7dUdBbjFCVSxxQkFBcUI7MkZBQXJCLHFCQUFxQix1ZUN2Q2xDLHFNQUVBLDIxQ0RrQ1ksdUJBQXVCOzsyRkFHdEIscUJBQXFCO2tCQVJqQyxTQUFTOytCQUNFLGdCQUFnQixpQkFHWCxpQkFBaUIsQ0FBQyxJQUFJLFdBQzVCLENBQUMsdUJBQXVCLENBQUMsbUJBQ2pCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBWENoYXJ0Q29tcG9uZW50LFxuICBBWENoYXJ0Q29tcG9uZW50QmFzZSxcbiAgY29tcHV0ZVRvb2x0aXBQb3NpdGlvbixcbiAgZm9ybWF0TGFyZ2VOdW1iZXIsXG4gIGdldEVhc2luZ0Z1bmN0aW9uLFxufSBmcm9tICdAYWNvcmV4L2NoYXJ0cyc7XG5pbXBvcnQgeyBBWENoYXJ0VG9vbHRpcENvbXBvbmVudCwgQVhDaGFydFRvb2x0aXBEYXRhIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtdG9vbHRpcCc7XG5cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uRGVzdHJveSxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGFmdGVyTmV4dFJlbmRlcixcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgc2lnbmFsLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgeyBBWF9HQVVHRV9DSEFSVF9DT05GSUcgfSBmcm9tICcuL2dhdWdlLWNoYXJ0LmNvbmZpZyc7XG5pbXBvcnQgeyBBWEdhdWdlQ2hhcnRPcHRpb24sIEFYR2F1Z2VDaGFydFZhbHVlIH0gZnJvbSAnLi9nYXVnZS1jaGFydC50eXBlJztcblxuLyoqXG4gKiBHYXVnZSBDaGFydCBDb21wb25lbnRcbiAqIFJlbmRlcnMgYSBzZW1pLWNpcmN1bGFyIGdhdWdlIGNoYXJ0IHdpdGggYW5pbWF0ZWQgbmVlZGxlIGFuZCB0aHJlc2hvbGRzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F4LWdhdWdlLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dhdWdlLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2F1Z2UtY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW0FYQ2hhcnRUb29sdGlwQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFYR2F1Z2VDaGFydENvbXBvbmVudCBleHRlbmRzIEFYQ2hhcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIEFYQ2hhcnRDb21wb25lbnRCYXNlIHtcbiAgLy8gSW5wdXRzXG4gIC8qKiBDaGFydCB2YWx1ZSBpbnB1dCAqL1xuICB2YWx1ZSA9IGlucHV0PEFYR2F1Z2VDaGFydFZhbHVlPigwKTtcblxuICAvKiogQ2hhcnQgb3B0aW9ucyBpbnB1dCAqL1xuICBvcHRpb25zID0gaW5wdXQ8QVhHYXVnZUNoYXJ0T3B0aW9uPih7fSk7XG5cbiAgLy8gQ2hhcnQgY29udGFpbmVyIHJlZmVyZW5jZVxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0Q29udGFpbmVyRWwgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjaGFydENvbnRhaW5lcicpO1xuXG4gIC8vIFNWRyBlbGVtZW50IHJlZmVyZW5jZSAoY3JlYXRlZCBpbiB0aGUgY29kZSlcbiAgcHJpdmF0ZSBzdmdFbGVtZW50OiBTVkdTVkdFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRDMgcmVmZXJlbmNlIC0gbG9hZGVkIGFzeW5jaHJvbm91c2x5XG4gIHByb3RlY3RlZCBkMyE6IHR5cGVvZiBpbXBvcnQoJ2QzJyk7XG5cbiAgLy8gU2lnbmFscyBmb3IgY29tcG9uZW50IHN0YXRlXG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfcmVuZGVyZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9wcmV2VmFsdWUgPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVHJhY2sgcHJldmlvdXMgb3B0aW9ucyB0byBkZXRlY3QgY2hhbmdlc1xuICBwcml2YXRlIF9wcmV2T3B0aW9uc1N0cmluZyA9ICcnO1xuXG4gIC8vIENhY2hlIGZvciBjb250YWluZXIgZGltZW5zaW9ucyB0byBhdm9pZCByZXBlYXRlZCBET00gcmVhZHNcbiAgcHJpdmF0ZSBfbGFzdENvbnRhaW5lclJlY3Q6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFRvb2x0aXAgc2lnbmFsc1xuICBwcml2YXRlIF90b29sdGlwVmlzaWJsZSA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBQb3NpdGlvbiA9IHNpZ25hbCh7IHg6IDAsIHk6IDAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBEYXRhID0gc2lnbmFsPEFYQ2hhcnRUb29sdGlwRGF0YT4oe1xuICAgIHRpdGxlOiAnJyxcbiAgICB2YWx1ZTogJycsXG4gIH0pO1xuICBwcml2YXRlIF90b29sdGlwUmFmSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9wZW5kaW5nVG9vbHRpcENvb3JkczogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRXhwb3NlIHRvb2x0aXAgc2lnbmFscyBhcyByZWFkLW9ubHkgZm9yIHRoZSB0ZW1wbGF0ZVxuICBwcm90ZWN0ZWQgdG9vbHRpcFZpc2libGUgPSB0aGlzLl90b29sdGlwVmlzaWJsZS5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwUG9zaXRpb24gPSB0aGlzLl90b29sdGlwUG9zaXRpb24uYXNSZWFkb25seSgpO1xuICBwcm90ZWN0ZWQgdG9vbHRpcERhdGEgPSB0aGlzLl90b29sdGlwRGF0YS5hc1JlYWRvbmx5KCk7XG5cbiAgLy8gSW5qZWN0IGNvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBjb25maWdUb2tlbiA9IGluamVjdChBWF9HQVVHRV9DSEFSVF9DT05GSUcpO1xuXG4gIC8vIENvbXB1dGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICBwcm90ZWN0ZWQgZWZmZWN0aXZlT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWdUb2tlbixcbiAgICAgIC4uLnRoaXMub3B0aW9ucygpLFxuICAgIH07XG4gIH0pO1xuXG4gIC8vIENvbnN0YW50c1xuICBwcml2YXRlIHJlYWRvbmx5IFRPT0xUSVBfR0FQID0gMTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSEFMRl9DSVJDTEVfUkFESUFOUyA9IE1hdGguUEk7XG4gIHByaXZhdGUgcmVhZG9ubHkgUVVBUlRFUl9DSVJDTEVfUkFESUFOUyA9IE1hdGguUEkgLyAyO1xuICBwcml2YXRlIHJlYWRvbmx5IERFR1JFRVNfUEVSX1JBRElBTiA9IDE4MCAvIE1hdGguUEk7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hBUlRfRURHRV9QQURESU5HID0gMTI7XG4gIHByaXZhdGUgcmVhZG9ubHkgVElDS19MQUJFTF9DSEFSX1dJRFRIX1JBVElPID0gMC42MjtcbiAgcHJpdmF0ZSByZWFkb25seSBUSUNLX0xBQkVMX1NJREVfUEFERElORyA9IDY7XG4gIHByaXZhdGUgcmVhZG9ubHkgTEFCRUxfVElDS19DTEVBUkFOQ0UgPSA0O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gRHluYW1pY2FsbHkgbG9hZCBEMyBhbmQgaW5pdGlhbGl6ZSB0aGUgY2hhcnQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMubG9hZEQzKCk7XG4gICAgfSk7XG5cbiAgICAvLyBXYXRjaCBmb3IgY2hhbmdlcyB0byByZWRyYXcgdGhlIGNoYXJ0XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIC8vIEFjY2VzcyBpbnB1dHMgdG8gdHJhY2sgdGhlbVxuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgICAvLyBVcGRhdGUgcHJldmlvdXMgdmFsdWVcbiAgICAgIHRoaXMuX3ByZXZWYWx1ZS5zZXQoY3VycmVudFZhbHVlKTtcblxuICAgICAgLy8gT25seSB1cGRhdGUgaWYgYWxyZWFkeSByZW5kZXJlZFxuICAgICAgaWYgKHRoaXMuX3JlbmRlcmVkKCkpIHtcbiAgICAgICAgLy8gSWYgb25seSB0aGUgdmFsdWUgY2hhbmdlZCwganVzdCB1cGRhdGUgdGhlIHZhbHVlIGRpc3BsYXkgYW5kIGRpYWxcbiAgICAgICAgY29uc3Qgb3B0aW9uc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpO1xuICAgICAgICBpZiAodGhpcy5fcHJldk9wdGlvbnNTdHJpbmcgPT09IG9wdGlvbnNTdHJpbmcpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kRGlhbChjdXJyZW50VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG9wdGlvbnMgY2hhbmdlZCwgcmVjcmVhdGUgdGhlIHdob2xlIGNoYXJ0XG4gICAgICAgICAgdGhpcy5fcHJldk9wdGlvbnNTdHJpbmcgPSBvcHRpb25zU3RyaW5nO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwQ2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBEMy5qcyBkeW5hbWljYWxseVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWREMygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5kMykgcmV0dXJuOyAvLyBBbHJlYWR5IGxvYWRlZFxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZDMgPSBhd2FpdCBpbXBvcnQoJ2QzJyk7XG4gICAgICAvLyBJZiBjb250YWluZXIgaXMgcmVhZHksIGNyZWF0ZSBjaGFydFxuICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKCkgJiYgdGhpcy5jaGFydENvbnRhaW5lckVsKCkpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlZC5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIEQzLmpzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZ2F1Z2UgY2hhcnQgd2l0aCBhbGwgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVDaGFydCgpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBjb250YWluZXIgYW5kIGNyZWF0ZSBTVkdcbiAgICBpZiAodGhpcy5zdmdFbGVtZW50KSB7XG4gICAgICB0aGlzLnN2Z0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIFNWRyBlbGVtZW50XG4gICAgdGhpcy5zdmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcbiAgICB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3ZnRWxlbWVudCk7XG5cbiAgICAvLyBHZXQgY3VycmVudCBvcHRpb25zXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgLy8gU3RvcmUgb3B0aW9ucyBzdHJpbmcgZm9yIGNvbXBhcmlzb25cbiAgICB0aGlzLl9wcmV2T3B0aW9uc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpO1xuXG4gICAgY29uc3QgeyBtaW5WYWx1ZSwgbWF4VmFsdWUsIHNob3dWYWx1ZSwgbGFiZWwgPSAnJywgZ2F1Z2VXaWR0aCwgY29ybmVyUmFkaXVzLCBhbmltYXRpb25EdXJhdGlvbiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB0aHJlc2hvbGRzID0gb3B0aW9ucy50aHJlc2hvbGRzID8/IFtdO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHJlc3BvbnNpdmUgZGltZW5zaW9uc1xuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXJFbGVtZW50LmNsaWVudEhlaWdodDtcblxuICAgIC8vIENhY2hlIGNvbnRhaW5lciBkaW1lbnNpb25zXG4gICAgdGhpcy5fbGFzdENvbnRhaW5lclJlY3QgPSB7IHdpZHRoOiBjb250YWluZXJXaWR0aCwgaGVpZ2h0OiBjb250YWluZXJIZWlnaHQgfTtcblxuICAgIC8vIERldGVybWluZSBjaGFydCBkaW1lbnNpb25zIC0gdXNlIG9wdGlvbnMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2UgY29udGFpbmVyIGRpbWVuc2lvbnNcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGggPz8gY29udGFpbmVyV2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgPz8gY29udGFpbmVySGVpZ2h0O1xuXG4gICAgLy8gRW5zdXJlIG1pbmltdW0gZGltZW5zaW9uc1xuICAgIGNvbnN0IGVmZmVjdGl2ZVdpZHRoID0gTWF0aC5tYXgod2lkdGgsIDEwMCk7XG4gICAgY29uc3QgZWZmZWN0aXZlSGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCA1MCk7XG5cbiAgICAvLyBGb3IgYSBzZW1pLWNpcmN1bGFyIGdhdWdlLCB3aWR0aCBzaG91bGQgYmUgYXBwcm94aW1hdGVseSB0d2ljZSB0aGUgaGVpZ2h0XG4gICAgY29uc3Qgc2l6ZSA9IE1hdGgubWluKGVmZmVjdGl2ZVdpZHRoLCBlZmZlY3RpdmVIZWlnaHQgKiAyKTtcblxuICAgIC8vIENhbGN1bGF0ZSBtYXJnaW4gYXMgcGVyY2VudGFnZSBvZiBzaXplICg1LTglIHdpdGggcmVhc29uYWJsZSBib3VuZHMpXG4gICAgY29uc3QgbWFyZ2luUmF0aW8gPSAwLjA4O1xuICAgIGNvbnN0IG1hcmdpbiA9IE1hdGgubWF4KDUsIE1hdGgubWluKHNpemUgKiBtYXJnaW5SYXRpbywgMzApKTtcblxuICAgIGNvbnN0IHRpY2tDb3VudCA9IHRoaXMuZ2V0VGlja0NvdW50KHNpemUpO1xuICAgIGNvbnN0IHRpY2tGb250UHggPSB0aGlzLmdldFRpY2tGb250U2l6ZShzaXplKTtcbiAgICBjb25zdCBtYXhUaWNrTGFiZWxXaWR0aCA9IHRoaXMuZXN0aW1hdGVNYXhUaWNrTGFiZWxXaWR0aCh0aWNrQ291bnQsIG1pblZhbHVlLCBtYXhWYWx1ZSwgdGlja0ZvbnRQeCk7XG4gICAgY29uc3QgdGlja0xlbmd0aCA9IE1hdGgubWF4KDQsIE1hdGgubWluKChzaXplIC8gMikgKiAwLjEyLCAxNCkpO1xuICAgIC8vIEtlZXAgbGFiZWxzIGNsb3NlciB0byB0aGUgZ2F1Z2UgYXJjIHdoaWxlIHByZXNlcnZpbmcgcmVhZGFiaWxpdHkuXG4gICAgY29uc3QgbGFiZWxHYXAgPSBNYXRoLm1heCg2LCBNYXRoLm1pbigoc2l6ZSAvIDIpICogMC4wNiwgMTQpKTtcbiAgICBjb25zdCBsYWJlbE9mZnNldEZyb21UaWNrRW5kID0gbGFiZWxHYXAgKyB0aWNrRm9udFB4ICogMC4zNTtcbiAgICBjb25zdCB0aWNrTGFiZWxTcGFjZSA9IHRpY2tMZW5ndGggKyBsYWJlbE9mZnNldEZyb21UaWNrRW5kICsgdGlja0ZvbnRQeDtcbiAgICBjb25zdCB0b3RhbFZlcnRpY2FsU3BhY2UgPSBzaXplIC8gMiArIHRpY2tMYWJlbFNwYWNlO1xuXG4gICAgLy8gTGFiZWxzIGF0IGVkZ2UgdGlja3MgdXNlIHN0YXJ0L2VuZCBhbmNob3JzLCBzbyB0aGV5IGNhbiBleHRlbmQgYnkgbmVhciBmdWxsIHdpZHRoLlxuICAgIGNvbnN0IGhvcml6b250YWxQYWRkaW5nID0gTWF0aC5tYXgoMTgsIG1heFRpY2tMYWJlbFdpZHRoICsgOCk7XG4gICAgY29uc3QgdG90YWxXaWR0aCA9IHNpemUgKyBob3Jpem9udGFsUGFkZGluZyAqIDI7XG4gICAgY29uc3Qgdmlld0JveFdpZHRoID0gdG90YWxXaWR0aCArIHRoaXMuQ0hBUlRfRURHRV9QQURESU5HICogMjtcbiAgICBjb25zdCB2aWV3Qm94SGVpZ2h0ID0gdG90YWxWZXJ0aWNhbFNwYWNlICsgdGhpcy5DSEFSVF9FREdFX1BBRERJTkcgKiAyO1xuXG4gICAgLy8gU2V0IHVwIFNWRyB3aXRoIHJlc3BvbnNpdmUgdmlld0JveCB0aGF0IGFjY291bnRzIGZvciBvdmVyZmxvd1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QodGhpcy5zdmdFbGVtZW50KVxuICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCd2aWV3Qm94JywgYDAgMCAke3ZpZXdCb3hXaWR0aH0gJHt2aWV3Qm94SGVpZ2h0fWApXG4gICAgICAuYXR0cigncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0Jyk7XG5cbiAgICAvLyBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGNoYXJ0IGNlbnRlcmVkIGhvcml6b250YWxseSB3aXRoIHBhZGRpbmcsIHBvc2l0aW9uZWQgdG8gc2hvdyBvbmx5IHRoZSB0b3AgaGFsZlxuICAgIGNvbnN0IGNoYXJ0R3JvdXAgPSBzdmdcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoXG4gICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICBgdHJhbnNsYXRlKCR7c2l6ZSAvIDIgKyBob3Jpem9udGFsUGFkZGluZyArIHRoaXMuQ0hBUlRfRURHRV9QQURESU5HfSwgJHtzaXplIC8gMiAtIG1hcmdpbiArIHRoaXMuQ0hBUlRfRURHRV9QQURESU5HfSlgLFxuICAgICAgKTtcblxuICAgIC8vIERlZmluZSBnYXVnZSBwYXJhbWV0ZXJzXG4gICAgY29uc3QgcmFkaXVzID0gc2l6ZSAvIDIgLSBtYXJnaW47XG4gICAgY29uc3QgZGVzaXJlZEdhdWdlV2lkdGggPSB0eXBlb2YgZ2F1Z2VXaWR0aCA9PT0gJ251bWJlcicgJiYgIU51bWJlci5pc05hTihnYXVnZVdpZHRoKSA/IGdhdWdlV2lkdGggOiAzMDtcbiAgICAvLyBSZXNwZWN0IGV4cGxpY2l0IGdhdWdlV2lkdGggaW4gcHggd2l0aCBzYW5lIGFic29sdXRlIGJvdW5kcy5cbiAgICBjb25zdCBjbGFtcGVkR2F1Z2VXaWR0aCA9IE1hdGgubWF4KDYsIE1hdGgubWluKGRlc2lyZWRHYXVnZVdpZHRoLCByYWRpdXMgKiAwLjcpKTtcbiAgICBjb25zdCBpbm5lclJhZGl1cyA9IHJhZGl1cyAtIGNsYW1wZWRHYXVnZVdpZHRoO1xuICAgIGNvbnN0IG91dGVyUmFkaXVzID0gcmFkaXVzO1xuXG4gICAgLy8gQ3JlYXRlIGdyYWRpZW50IGRlZmluaXRpb25zXG4gICAgdGhpcy5jcmVhdGVHcmFkaWVudHMoc3ZnLCB0aHJlc2hvbGRzKTtcblxuICAgIC8vIERyYXcgdGhlIGJhY2tncm91bmQgYXJjXG4gICAgdGhpcy5kcmF3QmFja2dyb3VuZEFyYyhjaGFydEdyb3VwLCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIGNvcm5lclJhZGl1cyk7XG5cbiAgICAvLyBEcmF3IHRoZSB0aHJlc2hvbGQgYXJjcyBpZiB0aHJlc2hvbGRzIGV4aXN0XG4gICAgaWYgKHRocmVzaG9sZHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kcmF3VGhyZXNob2xkcyhjaGFydEdyb3VwLCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIG1pblZhbHVlLCBtYXhWYWx1ZSwgdGhyZXNob2xkcywgY29ybmVyUmFkaXVzKTtcbiAgICB9XG5cbiAgICAvLyBEcmF3IHRpY2sgbWFya3NcbiAgICB0aGlzLmRyYXdUaWNrcyhjaGFydEdyb3VwLCBvdXRlclJhZGl1cywgbWluVmFsdWUsIG1heFZhbHVlLCBzaXplLCB0aWNrQ291bnQsIHRpY2tGb250UHgpO1xuXG4gICAgLy8gRHJhdyB0aGUgZGlhbC9uZWVkbGUgd2l0aCBhbmltYXRpb25cbiAgICB0aGlzLmRyYXdEaWFsKGNoYXJ0R3JvdXAsIHJhZGl1cywgdGhpcy52YWx1ZSgpLCBtaW5WYWx1ZSwgbWF4VmFsdWUsIGFuaW1hdGlvbkR1cmF0aW9uKTtcblxuICAgIC8vIERyYXcgdGhlIHZhbHVlIGRpc3BsYXkgKGFmdGVyIHRoZSBkaWFsIHNvIGl0J3Mgb24gdG9wKVxuICAgIGlmIChzaG93VmFsdWUpIHtcbiAgICAgIHRoaXMuZHJhd1ZhbHVlRGlzcGxheShjaGFydEdyb3VwLCB0aGlzLnZhbHVlKCksIGxhYmVsLCByYWRpdXMsIHNpemUpO1xuICAgIH1cblxuICAgIC8vIEhpZGUgdG9vbHRpcCBpbml0aWFsbHlcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGNoYXJ0IHdoZW4gb3B0aW9ucyBjaGFuZ2VcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVDaGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBvbmx5IHRoZSB2YWx1ZSBkaXNwbGF5IGFuZCBkaWFsIHBvc2l0aW9uIHdpdGhvdXQgcmVjcmVhdGluZyB0aGUgY2hhcnRcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVWYWx1ZUFuZERpYWwodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdmdFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG4gICAgY29uc3QgbWluVmFsdWUgPSBvcHRpb25zLm1pblZhbHVlO1xuICAgIGNvbnN0IG1heFZhbHVlID0gb3B0aW9ucy5tYXhWYWx1ZTtcbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IG9wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb247XG4gICAgY29uc3QgZWFzaW5nRnVuY3Rpb24gPSBnZXRFYXNpbmdGdW5jdGlvbih0aGlzLmQzLCBvcHRpb25zLmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB2YWx1ZTtcbiAgICBjb25zdCBzdmcgPSB0aGlzLmQzLnNlbGVjdCh0aGlzLnN2Z0VsZW1lbnQpO1xuXG4gICAgLy8gVXBkYXRlIHZhbHVlIHRleHRcbiAgICBzdmcuc2VsZWN0KCcuZ2F1Z2UtdmFsdWUnKS50ZXh0KGN1cnJlbnRWYWx1ZS50b0xvY2FsZVN0cmluZygpKTtcblxuICAgIC8vIFVwZGF0ZSBuZWVkbGUgcG9zaXRpb25cbiAgICBjb25zdCBhbmdsZSA9IHRoaXMuc2NhbGVWYWx1ZVRvQW5nbGUoY3VycmVudFZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgIGNvbnN0IGFuZ2xlSW5EZWdyZWVzID0gdGhpcy5yYWRpYW5zVG9EZWdyZWVzKGFuZ2xlIC0gdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TKTtcblxuICAgIHN2Z1xuICAgICAgLnNlbGVjdCgnLmdhdWdlLW5lZWRsZScpXG4gICAgICAuYXR0cignZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC1uZWVkbGUtY29sb3IpKScpXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAuZWFzZShlYXNpbmdGdW5jdGlvbilcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgcm90YXRlKCR7YW5nbGVJbkRlZ3JlZXN9KWApO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIGJhY2tncm91bmQgYXJjXG4gICAqL1xuICBwcml2YXRlIGRyYXdCYWNrZ3JvdW5kQXJjKFxuICAgIGNoYXJ0R3JvdXA6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPixcbiAgICBpbm5lclJhZGl1czogbnVtYmVyLFxuICAgIG91dGVyUmFkaXVzOiBudW1iZXIsXG4gICAgY29ybmVyUmFkaXVzOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhcmMgZm9yIHRoZSBiYWNrZ3JvdW5kXG4gICAgY29uc3QgYmFja2dyb3VuZEFyYyA9IHRoaXMuZDNcbiAgICAgIC5hcmMoKVxuICAgICAgLmlubmVyUmFkaXVzKGlubmVyUmFkaXVzKVxuICAgICAgLm91dGVyUmFkaXVzKG91dGVyUmFkaXVzKVxuICAgICAgLnN0YXJ0QW5nbGUoLXRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUykgLy8gU3RhcnQgZnJvbSBib3R0b20gKC05MCBkZWdyZWVzKVxuICAgICAgLmVuZEFuZ2xlKHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUykgLy8gRW5kIGF0IHRvcCAoOTAgZGVncmVlcylcbiAgICAgIC5jb3JuZXJSYWRpdXMoY29ybmVyUmFkaXVzKTtcblxuICAgIC8vIERyYXcgYmFja2dyb3VuZCBhcmNcbiAgICBjb25zdCBiYWNrZ3JvdW5kUGF0aCA9IGNoYXJ0R3JvdXBcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgLmF0dHIoJ2QnLCBiYWNrZ3JvdW5kQXJjKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLWFyYyBnYXVnZS1iYXNlJylcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3VybCgjZ2F1Z2UtYmctZ3JhZGllbnQpJylcbiAgICAgIC5hdHRyKCdmaWx0ZXInLCAnZHJvcC1zaGFkb3coMHB4IDJweCAzcHggcmdiYSgwLDAsMCwwLjEpKScpO1xuXG4gICAgLy8gQWRkIHRvb2x0aXAgZm9yIHNpbmdsZSBhcmMgaWYgbm8gdGhyZXNob2xkc1xuICAgIGlmICghdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkudGhyZXNob2xkcyB8fCB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS50aHJlc2hvbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYmFja2dyb3VuZFBhdGhcbiAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpXG4gICAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd1Rvb2x0aXApIHJldHVybjtcbiAgICAgICAgICB0aGlzLnNob3dTaW5nbGVSYW5nZVRvb2x0aXAoZXZlbnQpO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ21vdXNlbW92ZScsIChldmVudCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl90b29sdGlwVmlzaWJsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5oaWRlVG9vbHRpcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgdGhyZXNob2xkcyBhcmNzXG4gICAqL1xuICBwcml2YXRlIGRyYXdUaHJlc2hvbGRzKFxuICAgIGNoYXJ0R3JvdXA6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPixcbiAgICBpbm5lclJhZGl1czogbnVtYmVyLFxuICAgIG91dGVyUmFkaXVzOiBudW1iZXIsXG4gICAgbWluVmFsdWU6IG51bWJlcixcbiAgICBtYXhWYWx1ZTogbnVtYmVyLFxuICAgIHRocmVzaG9sZHM6IHsgdmFsdWU6IG51bWJlcjsgY29sb3I6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfVtdLFxuICAgIGNvcm5lclJhZGl1czogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYXJjIGdlbmVyYXRvclxuICAgIGNvbnN0IGFyYyA9IHRoaXMuZDNcbiAgICAgIC5hcmMoKVxuICAgICAgLmlubmVyUmFkaXVzKGlubmVyUmFkaXVzKVxuICAgICAgLm91dGVyUmFkaXVzKG91dGVyUmFkaXVzICogMC45OClcbiAgICAgIC5jb3JuZXJSYWRpdXMoY29ybmVyUmFkaXVzKTtcblxuICAgIC8vIFNvcnQgdGhyZXNob2xkcyBieSB2YWx1ZSBpbiBhc2NlbmRpbmcgb3JkZXIgKG9ubHkgaWYgbmVlZGVkKVxuICAgIGNvbnN0IHNvcnRlZFRocmVzaG9sZHMgPSB0aHJlc2hvbGRzLmxlbmd0aCA+IDEgPyBbLi4udGhyZXNob2xkc10uc29ydCgoYSwgYikgPT4gYS52YWx1ZSAtIGIudmFsdWUpIDogdGhyZXNob2xkcztcblxuICAgIC8vIENhbGN1bGF0ZSBhbGwgYW5nbGVzIGZpcnN0IHVzaW5nIHRoZSBjb2xvciBhbmdsZSBjYWxjdWxhdGlvblxuICAgIGNvbnN0IGFuZ2xlcyA9IHNvcnRlZFRocmVzaG9sZHMubWFwKCh0KSA9PiB0aGlzLnNjYWxlVmFsdWVUb0NvbG9yQW5nbGUodC52YWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlKSk7XG5cbiAgICAvLyBTdGFydCBmcm9tIHRoZSBtaW5pbXVtIHZhbHVlIGFuZ2xlXG4gICAgbGV0IHByZXZpb3VzRW5kQW5nbGUgPSB0aGlzLnNjYWxlVmFsdWVUb0NvbG9yQW5nbGUobWluVmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSk7XG5cbiAgICBzb3J0ZWRUaHJlc2hvbGRzLmZvckVhY2goKHRocmVzaG9sZCwgaSkgPT4ge1xuICAgICAgY29uc3QgZW5kQW5nbGUgPSBhbmdsZXNbaV07XG5cbiAgICAgIC8vIFNraXAgaWYgZW5kIGFuZ2xlIGlzIG5vdCBncmVhdGVyIHRoYW4gc3RhcnQgYW5nbGVcbiAgICAgIGlmIChlbmRBbmdsZSA8PSBwcmV2aW91c0VuZEFuZ2xlKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGFyY1BhdGggPSBjaGFydEdyb3VwXG4gICAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgICAuYXR0cihcbiAgICAgICAgICAnZCcsXG4gICAgICAgICAgYXJjKHtcbiAgICAgICAgICAgIGlubmVyUmFkaXVzLFxuICAgICAgICAgICAgb3V0ZXJSYWRpdXMsXG4gICAgICAgICAgICBzdGFydEFuZ2xlOiBwcmV2aW91c0VuZEFuZ2xlLFxuICAgICAgICAgICAgZW5kQW5nbGUsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCB0aHJlc2hvbGQuY29sb3IgfHwgYHVybCgjdGhyZXNob2xkLWdyYWRpZW50LSR7aX0pYClcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLWFyYyB0aHJlc2hvbGQtYXJjJylcbiAgICAgICAgLmF0dHIoJ2RhdGEtdmFsdWUnLCB0aHJlc2hvbGQudmFsdWUpXG4gICAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKTtcblxuICAgICAgLy8gQWRkIHRvb2x0aXAgaW50ZXJhY3Rpb25cbiAgICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93VG9vbHRpcCkge1xuICAgICAgICAvLyBDb252ZXJ0IGFuZ2xlcyBiYWNrIHRvIHZhbHVlcyBmb3IgdG9vbHRpcFxuICAgICAgICBjb25zdCBzdGFydFZhbHVlID0gdGhpcy5hbmdsZVRvVmFsdWUocHJldmlvdXNFbmRBbmdsZSwgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICAgICAgY29uc3QgZW5kVmFsdWUgPSB0aHJlc2hvbGQudmFsdWU7XG5cbiAgICAgICAgYXJjUGF0aFxuICAgICAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93VGhyZXNob2xkVG9vbHRpcChldmVudCwgc3RhcnRWYWx1ZSwgZW5kVmFsdWUsIHRocmVzaG9sZC5jb2xvciwgdGhyZXNob2xkLmxhYmVsKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdG9vbHRpcFZpc2libGUoKSkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGVUb29sdGlwKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcHJldmlvdXMgZW5kIGFuZ2xlIGZvciB0aGUgbmV4dCB0aHJlc2hvbGRcbiAgICAgIHByZXZpb3VzRW5kQW5nbGUgPSBlbmRBbmdsZTtcbiAgICB9KTtcblxuICAgIC8vIERyYXcgdGhlIGxhc3Qgc2VnbWVudCBpZiB0aGUgbGFzdCB0aHJlc2hvbGQgaXMgbGVzcyB0aGFuIHRoZSBtYXggdmFsdWVcbiAgICBpZiAocHJldmlvdXNFbmRBbmdsZSA8IHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUykge1xuICAgICAgY29uc3QgbGFzdEFyYyA9IGNoYXJ0R3JvdXBcbiAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgIC5hdHRyKFxuICAgICAgICAgICdkJyxcbiAgICAgICAgICBhcmMoe1xuICAgICAgICAgICAgaW5uZXJSYWRpdXMsXG4gICAgICAgICAgICBvdXRlclJhZGl1cyxcbiAgICAgICAgICAgIHN0YXJ0QW5nbGU6IHByZXZpb3VzRW5kQW5nbGUsXG4gICAgICAgICAgICBlbmRBbmdsZTogdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJ3VybCgjZ2F1Z2UtYmctZ3JhZGllbnQpJylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLWFyYyB0aHJlc2hvbGQtYXJjJylcbiAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpO1xuXG4gICAgICAvLyBBZGQgdG9vbHRpcCBmb3IgdGhlIGxhc3Qgc2VnbWVudFxuICAgICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB0aGlzLmFuZ2xlVG9WYWx1ZShwcmV2aW91c0VuZEFuZ2xlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgICAgICBjb25zdCBlbmRWYWx1ZSA9IG1heFZhbHVlO1xuICAgICAgICBjb25zdCBsYXN0VGhyZXNob2xkID0gdGhyZXNob2xkc1t0aHJlc2hvbGRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIGxhc3RBcmNcbiAgICAgICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1RocmVzaG9sZFRvb2x0aXAoZXZlbnQsIHN0YXJ0VmFsdWUsIGVuZFZhbHVlLCBsYXN0VGhyZXNob2xkLmNvbG9yLCBsYXN0VGhyZXNob2xkLmxhYmVsKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdG9vbHRpcFZpc2libGUoKSkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGVUb29sdGlwKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIHRvb2x0aXAgZm9yIGEgdGhyZXNob2xkIGFyY1xuICAgKi9cbiAgcHJpdmF0ZSBzaG93VGhyZXNob2xkVG9vbHRpcChcbiAgICBldmVudDogTW91c2VFdmVudCxcbiAgICBzdGFydFZhbHVlOiBudW1iZXIsXG4gICAgZW5kVmFsdWU6IG51bWJlcixcbiAgICBjb2xvcjogc3RyaW5nLFxuICAgIGxhYmVsPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgdG9vbHRpcCBkYXRhXG4gICAgdGhpcy5fdG9vbHRpcERhdGEuc2V0KHtcbiAgICAgIHRpdGxlOiBsYWJlbCB8fCAnUmFuZ2UnLFxuICAgICAgdmFsdWU6IGAke3N0YXJ0VmFsdWUudG9Mb2NhbGVTdHJpbmcoKX0gLSAke2VuZFZhbHVlLnRvTG9jYWxlU3RyaW5nKCl9YCxcbiAgICAgIGNvbG9yOiBjb2xvcixcbiAgICB9KTtcblxuICAgIC8vIFNob3cgdG9vbHRpcFxuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgdG9vbHRpcCBmb3IgdGhlIGVudGlyZSByYW5nZSB3aGVuIG5vIHRocmVzaG9sZHMgYXJlIGRlZmluZWRcbiAgICovXG4gIHByaXZhdGUgc2hvd1NpbmdsZVJhbmdlVG9vbHRpcChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKTtcbiAgICBpZiAoIW9wdGlvbnMuc2hvd1Rvb2x0aXApIHJldHVybjtcblxuICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICB0aGlzLl90b29sdGlwRGF0YS5zZXQoe1xuICAgICAgdGl0bGU6IG9wdGlvbnMubGFiZWwgfHwgJ1JhbmdlJyxcbiAgICAgIHZhbHVlOiBgJHtvcHRpb25zLm1pblZhbHVlLnRvTG9jYWxlU3RyaW5nKCl9IC0gJHtvcHRpb25zLm1heFZhbHVlLnRvTG9jYWxlU3RyaW5nKCl9YCxcbiAgICAgIGNvbG9yOiAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdHJhY2stY29sb3IpKScsXG4gICAgfSk7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9wZW5kaW5nVG9vbHRpcENvb3JkcyA9IHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9O1xuICAgIGlmICh0aGlzLl90b29sdGlwUmFmSWQgIT0gbnVsbCkgcmV0dXJuO1xuICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLl90b29sdGlwUmFmSWQgPSBudWxsO1xuICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5fcGVuZGluZ1Rvb2x0aXBDb29yZHM7XG4gICAgICBpZiAoIWNvb3JkcykgcmV0dXJuO1xuICAgICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghY29udGFpbmVyRWwpIHJldHVybjtcbiAgICAgIGNvbnN0IHJlY3QgPSBjb250YWluZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHRvb2x0aXBFbCA9IGNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5jaGFydC10b29sdGlwJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgY29uc3QgdG9vbHRpcFJlY3QgPSB0b29sdGlwRWw/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpID8/IG51bGw7XG4gICAgICBjb25zdCBwb3MgPSBjb21wdXRlVG9vbHRpcFBvc2l0aW9uKHJlY3QsIHRvb2x0aXBSZWN0LCBjb29yZHMueCArIDEwLCBjb29yZHMueSAtIDEwLCB0aGlzLlRPT0xUSVBfR0FQKTtcbiAgICAgIHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5zZXQocG9zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgdG9vbHRpcFxuICAgKi9cbiAgcHJpdmF0ZSBoaWRlVG9vbHRpcCgpOiB2b2lkIHtcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB1cCBjaGFydCByZXNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhbnVwQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl90b29sdGlwUmFmSWQpO1xuICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fcGVuZGluZ1Rvb2x0aXBDb29yZHMgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMuc3ZnRWxlbWVudCkge1xuICAgICAgdGhpcy5zdmdFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdmdFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLl9sYXN0Q29udGFpbmVyUmVjdCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBncmFkaWVudCBkZWZpbml0aW9ucyBmb3IgdGhyZXNob2xkc1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVHcmFkaWVudHMoXG4gICAgc3ZnOiBkMy5TZWxlY3Rpb248U1ZHU1ZHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPixcbiAgICB0aHJlc2hvbGRzOiB7IHZhbHVlOiBudW1iZXI7IGNvbG9yOiBzdHJpbmcgfVtdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBkZWZzID0gc3ZnLmFwcGVuZCgnZGVmcycpO1xuXG4gICAgLy8gQ3JlYXRlIGEgcmFkaWFsIGdyYWRpZW50IGZvciB0aGUgYmFja2dyb3VuZFxuICAgIGNvbnN0IGJnR3JhZGllbnQgPSBkZWZzXG4gICAgICAuYXBwZW5kKCdyYWRpYWxHcmFkaWVudCcpXG4gICAgICAuYXR0cignaWQnLCAnZ2F1Z2UtYmctZ3JhZGllbnQnKVxuICAgICAgLmF0dHIoJ2N4JywgJzUwJScpXG4gICAgICAuYXR0cignY3knLCAnNTAlJylcbiAgICAgIC5hdHRyKCdyJywgJzUwJScpXG4gICAgICAuYXR0cignZ3JhZGllbnRVbml0cycsICd1c2VyU3BhY2VPblVzZScpO1xuXG4gICAgLy8gR2V0IENTUyB2YXJpYWJsZSBmb3IgdHJhY2sgY29sb3JcbiAgICBpZiAodGhyZXNob2xkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIERlZmF1bHQgZ3JhZGllbnQgd2hlbiBubyB0aHJlc2hvbGRzIGFyZSBwcm92aWRlZFxuICAgICAgYmdHcmFkaWVudC5hcHBlbmQoJ3N0b3AnKS5hdHRyKCdvZmZzZXQnLCAnMCUnKS5hdHRyKCdzdG9wLWNvbG9yJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRyYWNrLWNvbG9yKSknKTtcbiAgICAgIGJnR3JhZGllbnRcbiAgICAgICAgLmFwcGVuZCgnc3RvcCcpXG4gICAgICAgIC5hdHRyKCdvZmZzZXQnLCAnMTAwJScpXG4gICAgICAgIC5hdHRyKCdzdG9wLWNvbG9yJywgJ3JnYmEodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10cmFjay1jb2xvciksIDAuOCknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmdHcmFkaWVudC5hcHBlbmQoJ3N0b3AnKS5hdHRyKCdvZmZzZXQnLCAnMCUnKS5hdHRyKCdzdG9wLWNvbG9yJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRyYWNrLWNvbG9yKSknKTtcbiAgICAgIGJnR3JhZGllbnRcbiAgICAgICAgLmFwcGVuZCgnc3RvcCcpXG4gICAgICAgIC5hdHRyKCdvZmZzZXQnLCAnMTAwJScpXG4gICAgICAgIC5hdHRyKCdzdG9wLWNvbG9yJywgJ3JnYmEodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10cmFjay1jb2xvciksIDAuOCknKTtcblxuICAgICAgLy8gQ3JlYXRlIGdyYWRpZW50cyBmb3IgZWFjaCB0aHJlc2hvbGRcbiAgICAgIHRocmVzaG9sZHMuZm9yRWFjaCgodGhyZXNob2xkLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyYWRpZW50ID0gZGVmc1xuICAgICAgICAgIC5hcHBlbmQoJ2xpbmVhckdyYWRpZW50JylcbiAgICAgICAgICAuYXR0cignaWQnLCBgdGhyZXNob2xkLWdyYWRpZW50LSR7aX1gKVxuICAgICAgICAgIC5hdHRyKCdncmFkaWVudFVuaXRzJywgJ3VzZXJTcGFjZU9uVXNlJylcbiAgICAgICAgICAuYXR0cigneDEnLCAnLTEnKVxuICAgICAgICAgIC5hdHRyKCd5MScsICcwJylcbiAgICAgICAgICAuYXR0cigneDInLCAnMScpXG4gICAgICAgICAgLmF0dHIoJ3kyJywgJzAnKTtcblxuICAgICAgICBncmFkaWVudFxuICAgICAgICAgIC5hcHBlbmQoJ3N0b3AnKVxuICAgICAgICAgIC5hdHRyKCdvZmZzZXQnLCAnMCUnKVxuICAgICAgICAgIC5hdHRyKCdzdG9wLWNvbG9yJywgdGhpcy5kMy5jb2xvcih0aHJlc2hvbGQuY29sb3IpPy5icmlnaHRlcigwLjUpLnRvU3RyaW5nKCkgfHwgdGhyZXNob2xkLmNvbG9yKTtcblxuICAgICAgICBncmFkaWVudC5hcHBlbmQoJ3N0b3AnKS5hdHRyKCdvZmZzZXQnLCAnMTAwJScpLmF0dHIoJ3N0b3AtY29sb3InLCB0aHJlc2hvbGQuY29sb3IpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXdzIHRpY2sgbWFya3MgYW5kIGxhYmVscyBhcm91bmQgdGhlIGdhdWdlXG4gICAqL1xuICBwcml2YXRlIGRyYXdUaWNrcyhcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgcmFkaXVzOiBudW1iZXIsXG4gICAgbWluVmFsdWU6IG51bWJlcixcbiAgICBtYXhWYWx1ZTogbnVtYmVyLFxuICAgIHNpemU6IG51bWJlcixcbiAgICB0aWNrQ291bnQ6IG51bWJlcixcbiAgICB0aWNrRm9udFB4OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRpY2tMZW5ndGggPSBNYXRoLm1heCg0LCBNYXRoLm1pbihyYWRpdXMgKiAwLjEyLCAxNCkpO1xuICAgIGNvbnN0IGJhc2VMYWJlbE9mZnNldCA9IHRoaXMuZ2V0QmFzZUxhYmVsT2Zmc2V0KHJhZGl1cywgdGlja0xlbmd0aCwgdGlja0ZvbnRQeCk7XG4gICAgY29uc3QgdGlja0dyb3VwID0gY2hhcnRHcm91cC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICd0aWNrcycpO1xuXG4gICAgY29uc3QgdGlja1ZhbHVlcyA9IFtdIGFzIG51bWJlcltdO1xuICAgIGNvbnN0IHN0ZXAgPSAobWF4VmFsdWUgLSBtaW5WYWx1ZSkgLyAodGlja0NvdW50IC0gMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aWNrQ291bnQ7IGkrKykge1xuICAgICAgdGlja1ZhbHVlcy5wdXNoKG1pblZhbHVlICsgaSAqIHN0ZXApO1xuICAgIH1cblxuICAgIGNvbnN0IHRpY2tNZXRyaWNzID0gdGlja1ZhbHVlcy5tYXAoKHRpY2spID0+IHtcbiAgICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5zY2FsZVZhbHVlVG9BbmdsZSh0aWNrLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgICAgY29uc3QgcmFkaWFucyA9IGFuZ2xlIC0gdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmFkaWFucyxcbiAgICAgICAgY29zOiBNYXRoLmNvcyhyYWRpYW5zKSxcbiAgICAgICAgc2luOiBNYXRoLnNpbihyYWRpYW5zKSxcbiAgICAgICAgbGFiZWw6IHRoaXMuZm9ybWF0VGlja1ZhbHVlKHRpY2ssIG1pblZhbHVlLCBtYXhWYWx1ZSksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgdGlja01ldHJpY3MuZm9yRWFjaCgobWV0cmljKSA9PiB7XG4gICAgICB0aWNrR3JvdXBcbiAgICAgICAgLmFwcGVuZCgnbGluZScpXG4gICAgICAgIC5hdHRyKCd4MScsIG1ldHJpYy5jb3MgKiAocmFkaXVzICsgNSkpXG4gICAgICAgIC5hdHRyKCd5MScsIG1ldHJpYy5zaW4gKiAocmFkaXVzICsgNSkpXG4gICAgICAgIC5hdHRyKCd4MicsIG1ldHJpYy5jb3MgKiAocmFkaXVzICsgdGlja0xlbmd0aCkpXG4gICAgICAgIC5hdHRyKCd5MicsIG1ldHJpYy5zaW4gKiAocmFkaXVzICsgdGlja0xlbmd0aCkpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAncmdiYSh2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRleHQtY29sb3IpLCAwLjUpJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDIpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdGV4dFNlbGVjdGlvbiA9IHRpY2tHcm91cFxuICAgICAgLnNlbGVjdEFsbDxTVkdUZXh0RWxlbWVudCwgKHR5cGVvZiB0aWNrTWV0cmljcylbbnVtYmVyXT4oJ3RleHQuZ2F1Z2UtdGljay1sYWJlbCcpXG4gICAgICAuZGF0YSh0aWNrTWV0cmljcylcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS10aWNrLWxhYmVsJylcbiAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgIC5hdHRyKCd5JywgMClcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3JnYmEodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10ZXh0LWNvbG9yKSwgMC43KScpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke3RpY2tGb250UHh9cHhgKVxuICAgICAgLnRleHQoKGQpID0+IGQubGFiZWwpO1xuXG4gICAgdGV4dFNlbGVjdGlvbi5lYWNoKChkLCBpbmRleCwgbm9kZXMpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpbmRleF07XG4gICAgICBsZXQgYmJveFdpZHRoID0gdGhpcy5lc3RpbWF0ZUxhYmVsV2lkdGgoZC5sYWJlbCwgdGlja0ZvbnRQeCk7XG4gICAgICBsZXQgYmJveEhlaWdodCA9IHRpY2tGb250UHg7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBiYm94ID0gbm9kZS5nZXRCQm94KCk7XG4gICAgICAgIGlmIChiYm94LndpZHRoID4gMCkgYmJveFdpZHRoID0gYmJveC53aWR0aDtcbiAgICAgICAgaWYgKGJib3guaGVpZ2h0ID4gMCkgYmJveEhlaWdodCA9IGJib3guaGVpZ2h0O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEtlZXAgZmFsbGJhY2sgZXN0aW1hdGVzLlxuICAgICAgfVxuXG4gICAgICBjb25zdCBhbmNob3IgPSB0aGlzLmdldFRpY2tMYWJlbEFuY2hvcihkLmNvcyk7XG4gICAgICBjb25zdCBuZWFyRWRnZUV4dGVudCA9IHRoaXMuZ2V0TmVhckVkZ2VQcm9qZWN0aW9uKGFuY2hvciwgZC5jb3MsIGQuc2luLCBiYm94V2lkdGgsIGJib3hIZWlnaHQpO1xuICAgICAgY29uc3QgcmVxdWlyZWRPZmZzZXQgPSB0aWNrTGVuZ3RoICsgdGhpcy5MQUJFTF9USUNLX0NMRUFSQU5DRSArIG5lYXJFZGdlRXh0ZW50O1xuICAgICAgY29uc3QgZWZmZWN0aXZlTGFiZWxPZmZzZXQgPSBNYXRoLm1heChiYXNlTGFiZWxPZmZzZXQsIHJlcXVpcmVkT2Zmc2V0KTtcbiAgICAgIGNvbnN0IG51ZGdlID0gdGlja0ZvbnRQeCAqIDAuMTtcblxuICAgICAgY29uc3QgeCA9IGQuY29zICogKHJhZGl1cyArIGVmZmVjdGl2ZUxhYmVsT2Zmc2V0KSArIChhbmNob3IgPT09ICdzdGFydCcgPyBudWRnZSA6IGFuY2hvciA9PT0gJ2VuZCcgPyAtbnVkZ2UgOiAwKTtcbiAgICAgIGNvbnN0IHkgPSBkLnNpbiAqIChyYWRpdXMgKyBlZmZlY3RpdmVMYWJlbE9mZnNldCk7XG5cbiAgICAgIHRoaXMuZDMuc2VsZWN0KG5vZGUpLmF0dHIoJ3gnLCB4KS5hdHRyKCd5JywgeSkuYXR0cigndGV4dC1hbmNob3InLCBhbmNob3IpLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUaWNrQ291bnQoc2l6ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoc2l6ZSA8IDIwMCkgcmV0dXJuIDM7XG4gICAgaWYgKHNpemUgPCAzMDApIHJldHVybiA0O1xuICAgIGlmIChzaXplIDwgNDAwKSByZXR1cm4gNTtcbiAgICBpZiAoc2l6ZSA+IDUyMCkgcmV0dXJuIDc7XG4gICAgcmV0dXJuIDU7XG4gIH1cblxuICBwcml2YXRlIGdldFRpY2tGb250U2l6ZShzaXplOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCgxNCwgTWF0aC5taW4oMTgsIE1hdGguZmxvb3Ioc2l6ZSAvIDM1KSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCYXNlTGFiZWxPZmZzZXQocmFkaXVzOiBudW1iZXIsIHRpY2tMZW5ndGg6IG51bWJlciwgdGlja0ZvbnRQeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBsYWJlbEdhcCA9IE1hdGgubWF4KDYsIE1hdGgubWluKHJhZGl1cyAqIDAuMDYsIDE0KSk7XG4gICAgcmV0dXJuIHRpY2tMZW5ndGggKyBsYWJlbEdhcCArIHRpY2tGb250UHggKiAwLjI7XG4gIH1cblxuICBwcml2YXRlIGdldFRpY2tMYWJlbEFuY2hvcihjb3NWYWx1ZTogbnVtYmVyKTogJ3N0YXJ0JyB8ICdtaWRkbGUnIHwgJ2VuZCcge1xuICAgIGlmIChjb3NWYWx1ZSA+IDAuMzUpIHJldHVybiAnc3RhcnQnO1xuICAgIGlmIChjb3NWYWx1ZSA8IC0wLjM1KSByZXR1cm4gJ2VuZCc7XG4gICAgcmV0dXJuICdtaWRkbGUnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROZWFyRWRnZVByb2plY3Rpb24oXG4gICAgYW5jaG9yOiAnc3RhcnQnIHwgJ21pZGRsZScgfCAnZW5kJyxcbiAgICBjb3NWYWx1ZTogbnVtYmVyLFxuICAgIHNpblZhbHVlOiBudW1iZXIsXG4gICAgYmJveFdpZHRoOiBudW1iZXIsXG4gICAgYmJveEhlaWdodDogbnVtYmVyLFxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IGFic0NvcyA9IE1hdGguYWJzKGNvc1ZhbHVlKTtcbiAgICBjb25zdCBhYnNTaW4gPSBNYXRoLmFicyhzaW5WYWx1ZSk7XG4gICAgY29uc3QgaGFsZkhlaWdodFByb2plY3Rpb24gPSBhYnNTaW4gKiAoYmJveEhlaWdodCAvIDIpO1xuXG4gICAgLy8gRm9yIHN0YXJ0L2VuZCBhbmNob3JlZCBsYWJlbHMgb24gZWRnZSB0aWNrcywgdGhlIG5lYXJlc3Qgc2lkZSBpcyBjbG9zZSB0byB0aGUgYW5jaG9yIHBvaW50LlxuICAgIGlmIChhbmNob3IgPT09ICdzdGFydCcgfHwgYW5jaG9yID09PSAnZW5kJykge1xuICAgICAgcmV0dXJuIGhhbGZIZWlnaHRQcm9qZWN0aW9uICsgYWJzQ29zICogdGhpcy5USUNLX0xBQkVMX1NJREVfUEFERElORztcbiAgICB9XG5cbiAgICAvLyBGb3IgY2VudGVyZWQgbGFiZWxzLCBuZWFyZXN0IHNpZGUgaW5jbHVkZXMgaGFsZiB0ZXh0IHdpZHRoIHByb2plY3Rpb24uXG4gICAgcmV0dXJuIGFic0NvcyAqIChiYm94V2lkdGggLyAyKSArIGhhbGZIZWlnaHRQcm9qZWN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRUaWNrVmFsdWUodGljazogbnVtYmVyLCBtaW5WYWx1ZTogbnVtYmVyLCBtYXhWYWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZVJhbmdlID0gbWF4VmFsdWUgLSBtaW5WYWx1ZTtcbiAgICBpZiAodmFsdWVSYW5nZSA8PSAxMCkge1xuICAgICAgcmV0dXJuIHRpY2sudG9GaXhlZCgyKS5yZXBsYWNlKC9cXC4/MCskLywgJycpO1xuICAgIH1cbiAgICBpZiAodmFsdWVSYW5nZSA8IDEwMDApIHtcbiAgICAgIHJldHVybiB0aWNrICUgMSA9PT0gMCA/IHRpY2sudG9TdHJpbmcoKSA6IHRpY2sudG9GaXhlZCgxKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1hdExhcmdlTnVtYmVyKE1hdGgucm91bmQodGljaykpO1xuICB9XG5cbiAgcHJpdmF0ZSBlc3RpbWF0ZUxhYmVsV2lkdGgobGFiZWw6IHN0cmluZywgdGlja0ZvbnRQeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gbGFiZWwubGVuZ3RoICogdGlja0ZvbnRQeCAqIHRoaXMuVElDS19MQUJFTF9DSEFSX1dJRFRIX1JBVElPICsgdGhpcy5USUNLX0xBQkVMX1NJREVfUEFERElORztcbiAgfVxuXG4gIHByaXZhdGUgZXN0aW1hdGVNYXhUaWNrTGFiZWxXaWR0aCh0aWNrQ291bnQ6IG51bWJlciwgbWluVmFsdWU6IG51bWJlciwgbWF4VmFsdWU6IG51bWJlciwgdGlja0ZvbnRQeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodGlja0NvdW50IDw9IDEpIHJldHVybiB0aWNrRm9udFB4O1xuICAgIGNvbnN0IHN0ZXAgPSAobWF4VmFsdWUgLSBtaW5WYWx1ZSkgLyAodGlja0NvdW50IC0gMSk7XG4gICAgbGV0IG1heENoYXJzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRpY2tDb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IHRoaXMuZm9ybWF0VGlja1ZhbHVlKG1pblZhbHVlICsgaSAqIHN0ZXAsIG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICBtYXhDaGFycyA9IE1hdGgubWF4KG1heENoYXJzLCBsYWJlbC5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gbWF4Q2hhcnMgKiB0aWNrRm9udFB4ICogdGhpcy5USUNLX0xBQkVMX0NIQVJfV0lEVEhfUkFUSU8gKyB0aGlzLlRJQ0tfTEFCRUxfU0lERV9QQURESU5HO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXdzIHRoZSB2YWx1ZSBhbmQgbGFiZWwgdGV4dCBpbiB0aGUgY2VudGVyXG4gICAqL1xuICBwcml2YXRlIGRyYXdWYWx1ZURpc3BsYXkoXG4gICAgY2hhcnRHcm91cDogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICByYWRpdXM6IG51bWJlcixcbiAgICBzaXplOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIC8vIFB4LWJhc2VkIHNjYWxpbmcgZm9yIHJvYnVzdCBzbWFsbC9sYXJnZSBzaXplcyB3aXRoIGJldHRlciBzbWFsbC1zaXplIGhhbmRsaW5nXG4gICAgY29uc3QgdmFsdWVGb250UHggPSBNYXRoLm1heCgxOCwgTWF0aC5taW4oMzIsIE1hdGguZmxvb3Ioc2l6ZSAvIDgpKSk7XG4gICAgY29uc3QgbGFiZWxGb250UHggPSBNYXRoLm1heCgxMCwgTWF0aC5taW4oMTYsIE1hdGguZmxvb3IodmFsdWVGb250UHggKiAwLjU1KSkpO1xuICAgIC8vIE1vcmUgdmVydGljYWwgZ2FwIGZvciBzbWFsbCBzaXplczogdXNlIGxhcmdlciBiYXNlIHZhbHVlXG4gICAgY29uc3QgdmVydGljYWxHYXAgPSBNYXRoLm1heCg2LCBNYXRoLm1pbigxMiwgTWF0aC5mbG9vcihzaXplIC8gNDApKSk7XG5cbiAgICAvLyBDcmVhdGUgZ3JvdXAgZm9yIHRoZSB2YWx1ZSBkaXNwbGF5XG4gICAgY29uc3QgdmFsdWVHcm91cCA9IGNoYXJ0R3JvdXAuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZ2F1Z2UtdmFsdWUtZGlzcGxheScpLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpO1xuXG4gICAgLy8gQWRkIHZhbHVlIGRpc3BsYXlcbiAgICB2YWx1ZUdyb3VwXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS12YWx1ZScpXG4gICAgICAuYXR0cigneCcsIDApXG4gICAgICAuYXR0cigneScsIHJhZGl1cyAqIDAuMTUgKyB2YWx1ZUZvbnRQeClcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7dmFsdWVGb250UHh9cHhgKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc2MDAnKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRleHQtY29sb3IpKScpXG4gICAgICAudGV4dCh2YWx1ZS50b0xvY2FsZVN0cmluZygpKTtcblxuICAgIC8vIEFkZCBsYWJlbCBkaXNwbGF5IChpZiBwcm92aWRlZClcbiAgICBpZiAobGFiZWwpIHtcbiAgICAgIHZhbHVlR3JvdXBcbiAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS1sYWJlbCcpXG4gICAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgICAgLmF0dHIoJ3knLCByYWRpdXMgKiAwLjI0ICsgdmFsdWVGb250UHggKyB2ZXJ0aWNhbEdhcClcbiAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHtsYWJlbEZvbnRQeH1weGApXG4gICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10ZXh0LWNvbG9yKSknKVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC44JylcbiAgICAgICAgLnRleHQobGFiZWwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyB0aGUgZGlhbC9uZWVkbGUgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgdmFsdWUgd2l0aCBhbmltYXRpb25cbiAgICovXG4gIHByaXZhdGUgZHJhd0RpYWwoXG4gICAgY2hhcnRHcm91cDogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIHJhZGl1czogbnVtYmVyLFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgbWluVmFsdWU6IG51bWJlcixcbiAgICBtYXhWYWx1ZTogbnVtYmVyLFxuICAgIGFuaW1hdGlvbkR1cmF0aW9uOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIC8vIENsYW1wIHZhbHVlIHRvIG1pbi9tYXggcmFuZ2VcbiAgICBjb25zdCBjbGFtcGVkVmFsdWUgPSBNYXRoLm1heChtaW5WYWx1ZSwgTWF0aC5taW4obWF4VmFsdWUsIHZhbHVlKSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgYW5nbGUgZm9yIG5lZWRsZSBiYXNlZCBvbiB2YWx1ZVxuICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5zY2FsZVZhbHVlVG9BbmdsZShjbGFtcGVkVmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgY29uc3QgYW5nbGVJbkRlZ3JlZXMgPSB0aGlzLnJhZGlhbnNUb0RlZ3JlZXMoYW5nbGUgLSB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpO1xuXG4gICAgLy8gQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBuZWVkbGVcbiAgICBjb25zdCBkaWFsR3JvdXAgPSBjaGFydEdyb3VwLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2RpYWwnKTtcblxuICAgIC8vIERyYXcgdGhlIG5lZWRsZSB3aXRoIGluaXRpYWwgcG9zaXRpb24gYXQgbWluaW11bSB2YWx1ZVxuICAgIGNvbnN0IG5lZWRsZVBhdGggPSBkaWFsR3JvdXBcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgLmF0dHIoJ2QnLCB0aGlzLmNyZWF0ZU5lZWRsZVBhdGgocmFkaXVzKSlcbiAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS1uZWVkbGUnKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtbmVlZGxlLWNvbG9yKSknKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGByb3RhdGUoJHt0aGlzLnJhZGlhbnNUb0RlZ3JlZXMoLXRoaXMuSEFMRl9DSVJDTEVfUkFESUFOUyl9KWApOyAvLyBTdGFydCBhdCAtMTgwIGRlZ3JlZXMgKGxlZnQpXG5cbiAgICAvLyBBZGQgYSBjZW50ZXIgY2lyY2xlXG4gICAgZGlhbEdyb3VwXG4gICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgLmF0dHIoJ2N4JywgMClcbiAgICAgIC5hdHRyKCdjeScsIDApXG4gICAgICAuYXR0cigncicsIHJhZGl1cyAqIDAuMDgpXG4gICAgICAuYXR0cignZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC1uZWVkbGUtY29sb3IpKScpXG4gICAgICAuYXR0cignc3Ryb2tlJywgJyNmZmYnKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDIpO1xuXG4gICAgLy8gQWRkIGEgc21hbGxlciB3aGl0ZSBjZW50ZXJcbiAgICBkaWFsR3JvdXBcbiAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAuYXR0cignY3gnLCAwKVxuICAgICAgLmF0dHIoJ2N5JywgMClcbiAgICAgIC5hdHRyKCdyJywgcmFkaXVzICogMC4wMylcbiAgICAgIC5hdHRyKCdmaWxsJywgJyNmZmYnKTtcblxuICAgIC8vIEdldCBlYXNpbmcgZnVuY3Rpb25cbiAgICBjb25zdCBlYXNpbmdGdW5jdGlvbiA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIHRoaXMub3B0aW9ucygpPy5hbmltYXRpb25FYXNpbmcpO1xuXG4gICAgLy8gQW5pbWF0ZSB0aGUgbmVlZGxlIGZyb20gbWluIHRvIGN1cnJlbnQgdmFsdWVcbiAgICBuZWVkbGVQYXRoXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAuZWFzZShlYXNpbmdGdW5jdGlvbilcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgcm90YXRlKCR7YW5nbGVJbkRlZ3JlZXN9KWApO1xuICB9XG5cbiAgLy8gZ2V0RWFzaW5nRnVuY3Rpb24gbW92ZWQgdG8gc2hhcmVkIGNoYXJ0IHV0aWxzXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwYXRoIHN0cmluZyBmb3IgdGhlIG5lZWRsZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVOZWVkbGVQYXRoKHJhZGl1czogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBuZWVkbGVMZW5ndGggPSByYWRpdXMgKiAwLjg7XG4gICAgY29uc3QgbmVlZGxlV2lkdGggPSByYWRpdXMgKiAwLjA2O1xuICAgIHJldHVybiBgTSAwLCR7bmVlZGxlV2lkdGggLyAyfSBMICR7bmVlZGxlTGVuZ3RofSwwIEwgMCwkey1uZWVkbGVXaWR0aCAvIDJ9IFpgO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlcyBhIHZhbHVlIHRvIGFuIGFuZ2xlIChpbiByYWRpYW5zKVxuICAgKi9cbiAgcHJpdmF0ZSBzY2FsZVZhbHVlVG9BbmdsZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbHVlUmFuZ2UgPSBtYXggLSBtaW47XG4gICAgcmV0dXJuICgodmFsdWUgLSBtaW4pIC8gdmFsdWVSYW5nZSkgKiB0aGlzLkhBTEZfQ0lSQ0xFX1JBRElBTlMgLSB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlM7XG4gIH1cblxuICAvKipcbiAgICogU2NhbGVzIGEgdmFsdWUgdG8gYW4gYW5nbGUgZm9yIGNvbG9yIGFyY3MgKGluIHJhZGlhbnMpXG4gICAqL1xuICBwcml2YXRlIHNjYWxlVmFsdWVUb0NvbG9yQW5nbGUodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZVJhbmdlID0gbWF4IC0gbWluO1xuICAgIHJldHVybiAoKHZhbHVlIC0gbWluKSAvIHZhbHVlUmFuZ2UpICogdGhpcy5IQUxGX0NJUkNMRV9SQURJQU5TIC0gdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIGFuZ2xlIGJhY2sgdG8gYSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhbmdsZVRvVmFsdWUoYW5nbGU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZVJhbmdlID0gbWF4IC0gbWluO1xuICAgIHJldHVybiBtaW4gKyAoKGFuZ2xlICsgdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TKSAvIHRoaXMuSEFMRl9DSVJDTEVfUkFESUFOUykgKiB2YWx1ZVJhbmdlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHJhZGlhbnMgdG8gZGVncmVlc1xuICAgKi9cbiAgcHJpdmF0ZSByYWRpYW5zVG9EZWdyZWVzKHJhZGlhbnM6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHJhZGlhbnMgKiB0aGlzLkRFR1JFRVNfUEVSX1JBRElBTjtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImF4LWdhdWdlLWNoYXJ0XCIgcm9sZT1cImltZ1wiICNjaGFydENvbnRhaW5lcj48L2Rpdj5cbjxheC1jaGFydC10b29sdGlwIFtkYXRhXT1cInRvb2x0aXBEYXRhKClcIiBbcG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uKClcIiBbdmlzaWJsZV09XCJ0b29sdGlwVmlzaWJsZSgpXCI+PC9heC1jaGFydC10b29sdGlwPlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1nYXVnZS1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9nYXVnZS1jaGFydC9zcmMvYWNvcmV4LWNoYXJ0cy1nYXVnZS1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}