UNPKG

ngx-gem-spaas

Version:

This library contains services, components, images and styles to provide a unified look and way-of-working throughout GEM SPaaS.

263 lines 45.1 kB
import * as am4charts from '@amcharts/amcharts4/charts'; import * as am4core from '@amcharts/amcharts4/core'; import { Tooltip } from '@amcharts/amcharts4/core'; import { Injectable } from '@angular/core'; import { Subject } from "rxjs"; import { takeUntil } from "rxjs/operators"; import * as i0 from "@angular/core"; import * as i1 from "ngx-gem-spaas"; am4core.addLicense('CH222128706'); export class AmchartsService { constructor(themeService) { this.themeService = themeService; this.theme = null; this.onDestroy$ = new Subject(); this.onNewTheme(); } ngOnDestroy() { this.onDestroy$.next(); this.onDestroy$.complete(); } onNewTheme() { this.themeService.onNewActiveTheme() .pipe(takeUntil(this.onDestroy$)) .subscribe((theme) => { this.theme = theme; }); } // create xy chart createChartXY(chartDiv, withLegend = true) { const chart = am4core.create(chartDiv, am4charts.XYChart); chart.paddingBottom = 5; chart.paddingRight = 4; chart.paddingLeft = 18; // @ts-ignore chart.preloader.background.fill = am4core.color(this.theme?.getRgb('bg')); chart.zoomOutButton.background.fill = am4core.color(this.theme?.getRgb('color')); chart.zoomOutButton.icon.stroke = am4core.color(this.theme?.getRgb('bg')); chart.zoomOutButton.icon.strokeWidth = 2; chart.zoomOutButton.parent = chart.tooltipContainer; chart.zoomOutButton.background.cornerRadius(4, 4, 4, 4); chart.zoomOutButton.padding(0, 6, 0, 6); // @ts-ignore chart.zoomOutButton.background.states.getKey('hover').properties.fill = am4core.color(this.theme?.getRgb('primary')); // @ts-ignore chart.zoomOutButton.background.states.getKey('down').properties.fill = am4core.color(this.theme?.getRgb('primary')); chart.cursor = new am4charts.XYCursor(); chart.cursor.behavior = 'zoomX'; chart.cursor.lineX.fill = am4core.color(this.theme?.getRgb('color')); chart.cursor.lineX.stroke = am4core.color(this.theme?.getRgb('color')); chart.cursor.lineY.disabled = true; if (withLegend) { chart.legend = new am4charts.Legend(); chart.legend.position = 'top'; const markerTemplate = chart.legend.markers.template; markerTemplate.width = 10; markerTemplate.height = 10; chart.legend.labels.template.fill = am4core.color(this.theme?.getRgb('color')); chart.legend.valueLabels.template.fill = am4core.color(this.theme?.getRgb('color')); chart.legend.labels.template.textDecoration = 'none'; chart.legend.valueLabels.template.textDecoration = 'none'; chart.legend.fontSize = '85%'; const as = chart.legend.labels.template.states.getKey('active'); // @ts-ignore as.properties.textDecoration = 'line-through'; // @ts-ignore as.properties.fill = am4core.color(this.theme?.getRgb('color', 0.4)); const as2 = chart.legend.valueLabels.template.states.getKey('active'); // @ts-ignore as2.properties.textDecoration = 'line-through'; // @ts-ignore as2.properties.fill = am4core.color(this.theme?.getRgb('color', 0.4)); } return chart; } // create pie chart createChartPie(chartDiv, innerRadius = 0, startAngle = 0, endAngle = 360) { const chart = am4core.create(chartDiv, am4charts.PieChart); chart.innerRadius = innerRadius; chart.startAngle = startAngle; chart.endAngle = endAngle; return chart; } destroyChart(chart) { if (chart) { chart.dispose(); } } // AXES addCategoryAxis(chart, xOrY, category, withTooltip, withGrid, withLabels) { const axes = xOrY === 'x' ? chart.xAxes : chart.yAxes; const axis = axes.push(new am4charts.CategoryAxis()); this.setAxisTooltip(axis, withTooltip); this.setGenericAxisProps(axis, withGrid, withLabels); axis.dataFields.category = category; axis.renderer.minGridDistance = 1; axis.renderer.labels.template.location = 0.5; // 0 & 1 IS ON TICK, 0.5 CENTERS BETWEEN TICKS return axis; } addDateAxis(chart, xOrY, date, withTooltip = true, withGrid = false, withLabels = true) { const axes = xOrY === 'x' ? chart.xAxes : chart.yAxes; const axis = axes.push(new am4charts.DateAxis()); this.setAxisTooltip(axis, withTooltip); this.setGenericAxisProps(axis, withGrid, withLabels); // axis.baseInterval = {'timeUnit': 'hour', 'count': 1}; axis.dataFields.date = date; axis.renderer.labels.template.location = 0; // 0.5 CENTERS BETWEEN TICKS axis.renderer.minGridDistance = 40; return axis; } addValueAxis(chart, xOrY, title = '', withTooltip = false, withGrid = true, withLabels = true) { const axes = xOrY === 'x' ? chart.xAxes : chart.yAxes; const axis = axes.push(new am4charts.ValueAxis()); this.setAxisTooltip(axis, withTooltip); this.setGenericAxisProps(axis, withGrid, withLabels); axis.extraMax = .0; axis.extraMin = .0; axis.title.text = title; return axis; } setAxisTooltip(axis, withToolTip, dy = 5) { axis.tooltip.disabled = !withToolTip; if (withToolTip) { const axisTooltip = axis.tooltip; axisTooltip.background.fill = am4core.color(this.theme?.getRgb('primary')); axisTooltip.label.fill = am4core.color(this.theme?.getRgb('bg')); axisTooltip.background.strokeWidth = 0; axisTooltip.background.cornerRadius = 4; axisTooltip.dy = dy; } } setGenericAxisProps(axis, withGrid, withLabels) { axis.cursorTooltipEnabled = true; axis.renderer.fontSize = '0.7em'; axis.renderer.grid.template.disabled = !withGrid; axis.renderer.grid.template.location = 1; // THIS ALSO IMPACTS TOOLTIP LOCATION !! axis.renderer.grid.template.stroke = am4core.color(this.theme?.getRgb('color')); axis.renderer.labels.template.disabled = !withLabels; axis.renderer.labels.template.fill = am4core.color(this.theme?.getRgb('color')); axis.renderer.minWidth = 10; // IMPACTS SPACE FOR Y-AXIS LABELS axis.title.fill = am4core.color(this.theme?.getRgb('color')); } // SERIES addSeriesXY(chart, type, dataType, name, valueX, valueY, openValueY, stacked = false, color = '', defToolTipColor = false, tooltipText = '', strokeWidth = 2) { let series; switch (type) { case 'line': series = new am4charts.LineSeries(); break; case 'bar': series = new am4charts.ColumnSeries(); break; case 'stepline': series = new am4charts.StepLineSeries(); break; } series.name = name; switch (dataType) { case 'category': series.dataFields.categoryX = valueX; break; case 'date': series.dataFields.dateX = valueX; if (!(series instanceof am4charts.ColumnSeries)) { series.dataItems.template.locations['dateX'] = 0; } break; case 'value': series.dataFields.valueX = valueX; break; } series.dataFields.valueY = valueY; if (!(series instanceof am4charts.ColumnSeries)) { series.connect = false; } series.stacked = stacked; if (openValueY) { // RANGE SERIES: UPPER AND LOWER BAND WITH FILL series.dataFields.openValueY = openValueY; series.strokeWidth = 0; if (color) { series.fill = am4core.color(color); series.stroke = am4core.color(color); } series.sequencedInterpolation = false; series.fillOpacity = 0.1; if (!(series instanceof am4charts.ColumnSeries)) { series.tensionX = 5; } series.tooltipText = tooltipText || '[bold]' + name + ': [/]{openValueY.value} to {valueY}'; } else { // NORMAL SERIES if (color) { series.fill = am4core.color(color); series.stroke = am4core.color(color); } series.strokeWidth = strokeWidth; if (series instanceof am4charts.ColumnSeries) { series.fillOpacity = 0.4; series.strokeWidth = 1; // keep this default of 1 ? Under evaluation } series.tooltipText = tooltipText || '[bold]' + name + ':[/] {valueY}'; } // TOOLTIP STUFF series.tooltip = new Tooltip(); series.tooltip.background.filters.clear(); // NO SHADOW series.tooltip.background.stroke = am4core.color(this.theme?.getRgb('bg')); if (defToolTipColor) { series.tooltip.getFillFromObject = false; series.tooltip.background.fill = am4core.color(this.theme?.getRgb('color')); series.tooltip.label.fill = am4core.color(this.theme?.getRgb('bg')); } chart.series.push(series); return series; } addSeriesPie(chart, cat, value, colorAttr = '', color = '', withLabels = true, tooltipText = '') { const series = new am4charts.PieSeries(); series.dataFields.category = cat; series.dataFields.value = value; series.slices.template.stroke = am4core.color(this.theme?.getRgb('bg')); series.slices.template.strokeWidth = 2; series.slices.template.strokeOpacity = 1; series.labels.template.disabled = !withLabels; series.labels.template.text = tooltipText || '[bold]{category}:[/] {value.percent.formatNumber(\'#\')}% '; series.labels.template.fill = am4core.color(this.theme?.getRgb('color')); series.ticks.template.stroke = am4core.color(this.theme?.getRgb('color')); series.ticks.template.strokeWidth = 2; // disable sliding out of slices // @ts-ignore series.slices.template.states.getKey('hover').properties.shiftRadius = 0; // @ts-ignore series.slices.template.states.getKey('hover').properties.scale = 1; if (colorAttr) { series.slices.template.propertyFields.fill = colorAttr; } if (color) { series.slices.template.fill = am4core.color(color); const cs = series.colors; cs.list = [am4core.color(new am4core.ColorSet().getIndex(0))]; cs.stepOptions = { lightness: -0.05, hue: 0 }; cs.wrap = false; } // TOOLTIP STUFF series.slices.template.tooltipText = tooltipText || '[bold]{category}:[/] {value.percent.formatNumber(\'#\')}% '; series.tooltip = new Tooltip(); series.tooltip.background.filters.clear(); // NO SHADOW series.tooltip.background.stroke = am4core.color(this.theme?.getRgb('bg')); chart.series.push(series); return series; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AmchartsService, deps: [{ token: i1.ThemeService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AmchartsService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AmchartsService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.ThemeService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1jaGFydHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1nZW0tc3BhYXMvY2hhcnRzL3NyYy9fc2VydmljZXMvYW1jaGFydHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssU0FBUyxNQUFNLDRCQUE0QixDQUFDO0FBRXhELE9BQU8sS0FBSyxPQUFPLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFFcEQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7OztBQUV6QyxPQUFPLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBS2xDLE1BQU0sT0FBTyxlQUFlO0lBSzFCLFlBQ1UsWUFBMEI7UUFBMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFKNUIsVUFBSyxHQUFzQixJQUFJLENBQUM7UUFDaEMsZUFBVSxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBS3RELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFO2FBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2hDLFNBQVMsQ0FBQyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUss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QUUsQ0FBQztRQUMvQixNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxZQUFZO1FBQ3ZELE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFM0UsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzsrR0F0VlUsZUFBZTttSEFBZixlQUFlLGNBRmQsTUFBTTs7NEZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhbTRjaGFydHMgZnJvbSAnQGFtY2hhcnRzL2FtY2hhcnRzNC9jaGFydHMnO1xyXG5pbXBvcnQge1BpZUNoYXJ0fSBmcm9tICdAYW1jaGFydHMvYW1jaGFydHM0L2NoYXJ0cyc7XHJcbmltcG9ydCAqIGFzIGFtNGNvcmUgZnJvbSAnQGFtY2hhcnRzL2FtY2hhcnRzNC9jb3JlJztcclxuaW1wb3J0IHtUb29sdGlwfSBmcm9tICdAYW1jaGFydHMvYW1jaGFydHM0L2NvcmUnO1xyXG5pbXBvcnQge0luamVjdGFibGUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7VGhlbWVNb2RlbCwgVGhlbWVTZXJ2aWNlfSBmcm9tIFwibmd4LWdlbS1zcGFhc1wiO1xyXG5pbXBvcnQge1N1YmplY3R9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7dGFrZVVudGlsfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbmFtNGNvcmUuYWRkTGljZW5zZSgnQ0gyMjIxMjg3MDYnKTtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFtY2hhcnRzU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHByaXZhdGUgdGhlbWU6IFRoZW1lTW9kZWwgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIG9uRGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2UsXHJcbiAgKSB7XHJcbiAgICB0aGlzLm9uTmV3VGhlbWUoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5vbkRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMub25EZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk5ld1RoZW1lKCk6IHZvaWQge1xyXG4gICAgdGhpcy50aGVtZVNlcnZpY2Uub25OZXdBY3RpdmVUaGVtZSgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCh0aGVtZTogVGhlbWVNb2RlbCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50aGVtZSA9IHRoZW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8vIGNyZWF0ZSB4eSBjaGFydFxyXG4gIGNyZWF0ZUNoYXJ0WFkoY2hhcnREaXY6IHN0cmluZywgd2l0aExlZ2VuZCA9IHRydWUpOiBhbTRjaGFydHMuWFlDaGFydCB7XHJcblxyXG4gICAgY29uc3QgY2hhcnQgPSBhbTRjb3JlLmNyZWF0ZShjaGFydERpdiwgYW00Y2hhcnRzLlhZQ2hhcnQpO1xyXG5cclxuICAgIGNoYXJ0LnBhZGRpbmdCb3R0b20gPSA1O1xyXG4gICAgY2hhcnQucGFkZGluZ1JpZ2h0ID0gNDtcclxuICAgIGNoYXJ0LnBhZGRpbmdMZWZ0ID0gMTg7XHJcblxyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgY2hhcnQucHJlbG9hZGVyLmJhY2tncm91bmQuZmlsbCA9IGFtNGNvcmUuY29sb3IodGhpcy50aGVtZT8uZ2V0UmdiKCdiZycpKTtcclxuXHJcbiAgICBjaGFydC56b29tT3V0QnV0dG9uLmJhY2tncm91bmQuZmlsbCA9IGFtNGNvcmUuY29sb3IodGhpcy50aGVtZT8uZ2V0UmdiKCdjb2xvcicpKTtcclxuICAgIGNoYXJ0Lnpvb21PdXRCdXR0b24uaWNvbi5zdHJva2UgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignYmcnKSk7XHJcbiAgICBjaGFydC56b29tT3V0QnV0dG9uLmljb24uc3Ryb2tlV2lkdGggPSAyO1xyXG4gICAgY2hhcnQuem9vbU91dEJ1dHRvbi5wYXJlbnQgPSBjaGFydC50b29sdGlwQ29udGFpbmVyO1xyXG4gICAgY2hhcnQuem9vbU91dEJ1dHRvbi5iYWNrZ3JvdW5kLmNvcm5lclJhZGl1cyg0LCA0LCA0LCA0KTtcclxuICAgIGNoYXJ0Lnpvb21PdXRCdXR0b24ucGFkZGluZygwLCA2LCAwLCA2KTtcclxuICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIGNoYXJ0Lnpvb21PdXRCdXR0b24uYmFja2dyb3VuZC5zdGF0ZXMuZ2V0S2V5KCdob3ZlcicpLnByb3BlcnRpZXMuZmlsbCA9IGFtNGNvcmUuY29sb3IodGhpcy50aGVtZT8uZ2V0UmdiKCdwcmltYXJ5JykpO1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgY2hhcnQuem9vbU91dEJ1dHRvbi5iYWNrZ3JvdW5kLnN0YXRlcy5nZXRLZXkoJ2Rvd24nKS5wcm9wZXJ0aWVzLmZpbGwgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYigncHJpbWFyeScpKTtcclxuXHJcbiAgICBjaGFydC5jdXJzb3IgPSBuZXcgYW00Y2hhcnRzLlhZQ3Vyc29yKCk7XHJcbiAgICBjaGFydC5jdXJzb3IuYmVoYXZpb3IgPSAnem9vbVgnO1xyXG4gICAgY2hhcnQuY3Vyc29yLmxpbmVYLmZpbGwgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignY29sb3InKSk7XHJcbiAgICBjaGFydC5jdXJzb3IubGluZVguc3Ryb2tlID0gYW00Y29yZS5jb2xvcih0aGlzLnRoZW1lPy5nZXRSZ2IoJ2NvbG9yJykpO1xyXG4gICAgY2hhcnQuY3Vyc29yLmxpbmVZLmRpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAod2l0aExlZ2VuZCkge1xyXG4gICAgICBjaGFydC5sZWdlbmQgPSBuZXcgYW00Y2hhcnRzLkxlZ2VuZCgpO1xyXG4gICAgICBjaGFydC5sZWdlbmQucG9zaXRpb24gPSAndG9wJztcclxuICAgICAgY29uc3QgbWFya2VyVGVtcGxhdGUgPSBjaGFydC5sZWdlbmQubWFya2Vycy50ZW1wbGF0ZTtcclxuICAgICAgbWFya2VyVGVtcGxhdGUud2lkdGggPSAxMDtcclxuICAgICAgbWFya2VyVGVtcGxhdGUuaGVpZ2h0ID0gMTA7XHJcblxyXG4gICAgICBjaGFydC5sZWdlbmQubGFiZWxzLnRlbXBsYXRlLmZpbGwgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignY29sb3InKSk7XHJcbiAgICAgIGNoYXJ0LmxlZ2VuZC52YWx1ZUxhYmVscy50ZW1wbGF0ZS5maWxsID0gYW00Y29yZS5jb2xvcih0aGlzLnRoZW1lPy5nZXRSZ2IoJ2NvbG9yJykpO1xyXG5cclxuICAgICAgY2hhcnQubGVnZW5kLmxhYmVscy50ZW1wbGF0ZS50ZXh0RGVjb3JhdGlvbiA9ICdub25lJztcclxuICAgICAgY2hhcnQubGVnZW5kLnZhbHVlTGFiZWxzLnRlbXBsYXRlLnRleHREZWNvcmF0aW9uID0gJ25vbmUnO1xyXG4gICAgICBjaGFydC5sZWdlbmQuZm9udFNpemUgPSAnODUlJztcclxuXHJcbiAgICAgIGNvbnN0IGFzID0gY2hhcnQubGVnZW5kLmxhYmVscy50ZW1wbGF0ZS5zdGF0ZXMuZ2V0S2V5KCdhY3RpdmUnKTtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBhcy5wcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uID0gJ2xpbmUtdGhyb3VnaCc7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgYXMucHJvcGVydGllcy5maWxsID0gYW00Y29yZS5jb2xvcih0aGlzLnRoZW1lPy5nZXRSZ2IoJ2NvbG9yJywgMC40KSk7XHJcblxyXG4gICAgICBjb25zdCBhczIgPSBjaGFydC5sZWdlbmQudmFsdWVMYWJlbHMudGVtcGxhdGUuc3RhdGVzLmdldEtleSgnYWN0aXZlJyk7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgYXMyLnByb3BlcnRpZXMudGV4dERlY29yYXRpb24gPSAnbGluZS10aHJvdWdoJztcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBhczIucHJvcGVydGllcy5maWxsID0gYW00Y29yZS5jb2xvcih0aGlzLnRoZW1lPy5nZXRSZ2IoJ2NvbG9yJywgMC40KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNoYXJ0O1xyXG4gIH1cclxuXHJcbiAgLy8gY3JlYXRlIHBpZSBjaGFydFxyXG4gIGNyZWF0ZUNoYXJ0UGllKFxyXG4gICAgY2hhcnREaXY6IHN0cmluZyxcclxuICAgIGlubmVyUmFkaXVzOiBudW1iZXIgPSAwLFxyXG4gICAgc3RhcnRBbmdsZTogbnVtYmVyID0gMCxcclxuICAgIGVuZEFuZ2xlOiBudW1iZXIgPSAzNjBcclxuICApOiBhbTRjaGFydHMuUGllQ2hhcnQge1xyXG4gICAgY29uc3QgY2hhcnQgPSBhbTRjb3JlLmNyZWF0ZShjaGFydERpdiwgYW00Y2hhcnRzLlBpZUNoYXJ0KTtcclxuXHJcbiAgICBjaGFydC5pbm5lclJhZGl1cyA9IGlubmVyUmFkaXVzO1xyXG4gICAgY2hhcnQuc3RhcnRBbmdsZSA9IHN0YXJ0QW5nbGU7XHJcbiAgICBjaGFydC5lbmRBbmdsZSA9IGVuZEFuZ2xlO1xyXG5cclxuICAgIHJldHVybiBjaGFydDtcclxuICB9XHJcblxyXG4gIGRlc3Ryb3lDaGFydChjaGFydDogYW00Y2hhcnRzLlhZQ2hhcnQgfCBhbTRjaGFydHMuUGllQ2hhcnQgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIGlmIChjaGFydCkge1xyXG4gICAgICBjaGFydC5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBBWEVTXHJcblxyXG4gIGFkZENhdGVnb3J5QXhpcyhcclxuICAgIGNoYXJ0OiBhbTRjaGFydHMuWFlDaGFydCxcclxuICAgIHhPclk6ICd4JyB8ICd5JyxcclxuICAgIGNhdGVnb3J5OiBzdHJpbmcsXHJcbiAgICB3aXRoVG9vbHRpcDogYm9vbGVhbixcclxuICAgIHdpdGhHcmlkOiBib29sZWFuLFxyXG4gICAgd2l0aExhYmVsczogYm9vbGVhbixcclxuICApOiBhbTRjaGFydHMuQ2F0ZWdvcnlBeGlzIHtcclxuICAgIGNvbnN0IGF4ZXMgPSB4T3JZID09PSAneCcgPyBjaGFydC54QXhlcyA6IGNoYXJ0LnlBeGVzO1xyXG4gICAgY29uc3QgYXhpcyA9IGF4ZXMucHVzaChuZXcgYW00Y2hhcnRzLkNhdGVnb3J5QXhpcygpKTtcclxuICAgIHRoaXMuc2V0QXhpc1Rvb2x0aXAoYXhpcywgd2l0aFRvb2x0aXApO1xyXG4gICAgdGhpcy5zZXRHZW5lcmljQXhpc1Byb3BzKGF4aXMsIHdpdGhHcmlkLCB3aXRoTGFiZWxzKTtcclxuICAgIGF4aXMuZGF0YUZpZWxkcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xyXG4gICAgYXhpcy5yZW5kZXJlci5taW5HcmlkRGlzdGFuY2UgPSAxO1xyXG4gICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUubG9jYXRpb24gPSAwLjU7IC8vIDAgJiAxIElTIE9OIFRJQ0ssIDAuNSBDRU5URVJTIEJFVFdFRU4gVElDS1NcclxuICAgIHJldHVybiBheGlzO1xyXG4gIH1cclxuXHJcbiAgYWRkRGF0ZUF4aXMoXHJcbiAgICBjaGFydDogYW00Y2hhcnRzLlhZQ2hhcnQsXHJcbiAgICB4T3JZOiAneCcgfCAneScsXHJcbiAgICBkYXRlOiBzdHJpbmcsXHJcbiAgICB3aXRoVG9vbHRpcDogYm9vbGVhbiA9IHRydWUsXHJcbiAgICB3aXRoR3JpZDogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgd2l0aExhYmVsczogYm9vbGVhbiA9IHRydWUsXHJcbiAgKTogYW00Y2hhcnRzLkRhdGVBeGlzIHtcclxuICAgIGNvbnN0IGF4ZXMgPSB4T3JZID09PSAneCcgPyBjaGFydC54QXhlcyA6IGNoYXJ0LnlBeGVzO1xyXG4gICAgY29uc3QgYXhpcyA9IGF4ZXMucHVzaChuZXcgYW00Y2hhcnRzLkRhdGVBeGlzKCkpO1xyXG4gICAgdGhpcy5zZXRBeGlzVG9vbHRpcChheGlzLCB3aXRoVG9vbHRpcCk7XHJcbiAgICB0aGlzLnNldEdlbmVyaWNBeGlzUHJvcHMoYXhpcywgd2l0aEdyaWQsIHdpdGhMYWJlbHMpO1xyXG4gICAgLy8gYXhpcy5iYXNlSW50ZXJ2YWwgPSB7J3RpbWVVbml0JzogJ2hvdXInLCAnY291bnQnOiAxfTtcclxuICAgIGF4aXMuZGF0YUZpZWxkcy5kYXRlID0gZGF0ZTtcclxuICAgIGF4aXMucmVuZGVyZXIubGFiZWxzLnRlbXBsYXRlLmxvY2F0aW9uID0gMDsgLy8gMC41IENFTlRFUlMgQkVUV0VFTiBUSUNLU1xyXG4gICAgYXhpcy5yZW5kZXJlci5taW5HcmlkRGlzdGFuY2UgPSA0MDtcclxuICAgIHJldHVybiBheGlzO1xyXG4gIH1cclxuXHJcbiAgYWRkVmFsdWVBeGlzKFxyXG4gICAgY2hhcnQ6IGFtNGNoYXJ0cy5YWUNoYXJ0LFxyXG4gICAgeE9yWTogJ3gnIHwgJ3knLFxyXG4gICAgdGl0bGU6IHN0cmluZyA9ICcnLFxyXG4gICAgd2l0aFRvb2x0aXA6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIHdpdGhHcmlkOiBib29sZWFuID0gdHJ1ZSxcclxuICAgIHdpdGhMYWJlbHM6IGJvb2xlYW4gPSB0cnVlLFxyXG4gICk6IGFtNGNoYXJ0cy5WYWx1ZUF4aXMge1xyXG4gICAgY29uc3QgYXhlcyA9IHhPclkgPT09ICd4JyA/IGNoYXJ0LnhBeGVzIDogY2hhcnQueUF4ZXM7XHJcbiAgICBjb25zdCBheGlzID0gYXhlcy5wdXNoKG5ldyBhbTRjaGFydHMuVmFsdWVBeGlzKCkpO1xyXG4gICAgdGhpcy5zZXRBeGlzVG9vbHRpcChheGlzLCB3aXRoVG9vbHRpcCk7XHJcbiAgICB0aGlzLnNldEdlbmVyaWNBeGlzUHJvcHMoYXhpcywgd2l0aEdyaWQsIHdpdGhMYWJlbHMpO1xyXG4gICAgYXhpcy5leHRyYU1heCA9IC4wO1xyXG4gICAgYXhpcy5leHRyYU1pbiA9IC4wO1xyXG4gICAgYXhpcy50aXRsZS50ZXh0ID0gdGl0bGU7XHJcbiAgICByZXR1cm4gYXhpcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0QXhpc1Rvb2x0aXAoYXhpczogYW55LCB3aXRoVG9vbFRpcDogYm9vbGVhbiwgZHk6IG51bWJlciA9IDUpOiB2b2lkIHtcclxuICAgIGF4aXMudG9vbHRpcC5kaXNhYmxlZCA9ICF3aXRoVG9vbFRpcDtcclxuICAgIGlmICh3aXRoVG9vbFRpcCkge1xyXG4gICAgICBjb25zdCBheGlzVG9vbHRpcCA9IGF4aXMudG9vbHRpcDtcclxuICAgICAgYXhpc1Rvb2x0aXAuYmFja2dyb3VuZC5maWxsID0gYW00Y29yZS5jb2xvcih0aGlzLnRoZW1lPy5nZXRSZ2IoJ3ByaW1hcnknKSk7XHJcbiAgICAgIGF4aXNUb29sdGlwLmxhYmVsLmZpbGwgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignYmcnKSk7XHJcbiAgICAgIGF4aXNUb29sdGlwLmJhY2tncm91bmQuc3Ryb2tlV2lkdGggPSAwO1xyXG4gICAgICBheGlzVG9vbHRpcC5iYWNrZ3JvdW5kLmNvcm5lclJhZGl1cyA9IDQ7XHJcbiAgICAgIGF4aXNUb29sdGlwLmR5ID0gZHk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEdlbmVyaWNBeGlzUHJvcHMoXHJcbiAgICBheGlzOiBhbTRjaGFydHMuQ2F0ZWdvcnlBeGlzIHwgYW00Y2hhcnRzLlZhbHVlQXhpcyB8IGFtNGNoYXJ0cy5EYXRlQXhpcyxcclxuICAgIHdpdGhHcmlkOiBib29sZWFuLFxyXG4gICAgd2l0aExhYmVsczogYm9vbGVhblxyXG4gICk6IHZvaWQge1xyXG4gICAgYXhpcy5jdXJzb3JUb29sdGlwRW5hYmxlZCA9IHRydWU7XHJcbiAgICBheGlzLnJlbmRlcmVyLmZvbnRTaXplID0gJzAuN2VtJztcclxuICAgIGF4aXMucmVuZGVyZXIuZ3JpZC50ZW1wbGF0ZS5kaXNhYmxlZCA9ICF3aXRoR3JpZDtcclxuICAgIGF4aXMucmVuZGVyZXIuZ3JpZC50ZW1wbGF0ZS5sb2NhdGlvbiA9IDE7IC8vIFRISVMgQUxTTyBJTVBBQ1RTIFRPT0xUSVAgTE9DQVRJT04gISFcclxuICAgIGF4aXMucmVuZGVyZXIuZ3JpZC50ZW1wbGF0ZS5zdHJva2UgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignY29sb3InKSk7XHJcbiAgICBheGlzLnJlbmRlcmVyLmxhYmVscy50ZW1wbGF0ZS5kaXNhYmxlZCA9ICF3aXRoTGFiZWxzO1xyXG4gICAgYXhpcy5yZW5kZXJlci5sYWJlbHMudGVtcGxhdGUuZmlsbCA9IGFtNGNvcmUuY29sb3IodGhpcy50aGVtZT8uZ2V0UmdiKCdjb2xvcicpKTtcclxuICAgIGF4aXMucmVuZGVyZXIubWluV2lkdGggPSAxMDsgLy8gSU1QQUNUUyBTUEFDRSBGT1IgWS1BWElTIExBQkVMU1xyXG4gICAgYXhpcy50aXRsZS5maWxsID0gYW00Y29yZS5jb2xvcih0aGlzLnRoZW1lPy5nZXRSZ2IoJ2NvbG9yJykpO1xyXG4gIH1cclxuXHJcbiAgLy8gU0VSSUVTXHJcblxyXG4gIGFkZFNlcmllc1hZKFxyXG4gICAgY2hhcnQ6IGFtNGNoYXJ0cy5YWUNoYXJ0LFxyXG4gICAgdHlwZTogJ2xpbmUnIHwgJ2JhcicgfCAnc3RlcGxpbmUnLFxyXG4gICAgZGF0YVR5cGU6ICdjYXRlZ29yeScgfCAnZGF0ZScgfCAndmFsdWUnLFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgdmFsdWVYOiBzdHJpbmcsXHJcbiAgICB2YWx1ZVk6IHN0cmluZyxcclxuICAgIG9wZW5WYWx1ZVk6IHN0cmluZyxcclxuICAgIHN0YWNrZWQ6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIGNvbG9yOiBzdHJpbmcgPSAnJyxcclxuICAgIGRlZlRvb2xUaXBDb2xvcjogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgdG9vbHRpcFRleHQ6IHN0cmluZyA9ICcnLFxyXG4gICAgc3Ryb2tlV2lkdGg6IG51bWJlciA9IDIsXHJcbiAgKTogYW00Y2hhcnRzLkxpbmVTZXJpZXMgfCBhbTRjaGFydHMuQ29sdW1uU2VyaWVzIHwgYW00Y2hhcnRzLlN0ZXBMaW5lU2VyaWVzIHtcclxuXHJcbiAgICBsZXQgc2VyaWVzO1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2xpbmUnOlxyXG4gICAgICAgIHNlcmllcyA9IG5ldyBhbTRjaGFydHMuTGluZVNlcmllcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdiYXInOlxyXG4gICAgICAgIHNlcmllcyA9IG5ldyBhbTRjaGFydHMuQ29sdW1uU2VyaWVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3N0ZXBsaW5lJzpcclxuICAgICAgICBzZXJpZXMgPSBuZXcgYW00Y2hhcnRzLlN0ZXBMaW5lU2VyaWVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgc2VyaWVzLm5hbWUgPSBuYW1lO1xyXG5cclxuICAgIHN3aXRjaCAoZGF0YVR5cGUpIHtcclxuICAgICAgY2FzZSAnY2F0ZWdvcnknOlxyXG4gICAgICAgIHNlcmllcy5kYXRhRmllbGRzLmNhdGVnb3J5WCA9IHZhbHVlWDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZGF0ZSc6XHJcbiAgICAgICAgc2VyaWVzLmRhdGFGaWVsZHMuZGF0ZVggPSB2YWx1ZVg7XHJcbiAgICAgICAgaWYgKCEoc2VyaWVzIGluc3RhbmNlb2YgYW00Y2hhcnRzLkNvbHVtblNlcmllcykpIHtcclxuICAgICAgICAgIHNlcmllcy5kYXRhSXRlbXMudGVtcGxhdGUubG9jYXRpb25zWydkYXRlWCddID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3ZhbHVlJzpcclxuICAgICAgICBzZXJpZXMuZGF0YUZpZWxkcy52YWx1ZVggPSB2YWx1ZVg7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgc2VyaWVzLmRhdGFGaWVsZHMudmFsdWVZID0gdmFsdWVZO1xyXG4gICAgaWYgKCEoc2VyaWVzIGluc3RhbmNlb2YgYW00Y2hhcnRzLkNvbHVtblNlcmllcykpIHtcclxuICAgICAgc2VyaWVzLmNvbm5lY3QgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHNlcmllcy5zdGFja2VkID0gc3RhY2tlZDtcclxuXHJcbiAgICBpZiAob3BlblZhbHVlWSkge1xyXG5cclxuICAgICAgLy8gUkFOR0UgU0VSSUVTOiBVUFBFUiBBTkQgTE9XRVIgQkFORCBXSVRIIEZJTExcclxuICAgICAgc2VyaWVzLmRhdGFGaWVsZHMub3BlblZhbHVlWSA9IG9wZW5WYWx1ZVk7XHJcbiAgICAgIHNlcmllcy5zdHJva2VXaWR0aCA9IDA7XHJcbiAgICAgIGlmIChjb2xvcikge1xyXG4gICAgICAgIHNlcmllcy5maWxsID0gYW00Y29yZS5jb2xvcihjb2xvcik7XHJcbiAgICAgICAgc2VyaWVzLnN0cm9rZSA9IGFtNGNvcmUuY29sb3IoY29sb3IpO1xyXG4gICAgICB9XHJcbiAgICAgIHNlcmllcy5zZXF1ZW5jZWRJbnRlcnBvbGF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHNlcmllcy5maWxsT3BhY2l0eSA9IDAuMTtcclxuICAgICAgaWYgKCEoc2VyaWVzIGluc3RhbmNlb2YgYW00Y2hhcnRzLkNvbHVtblNlcmllcykpIHtcclxuICAgICAgICBzZXJpZXMudGVuc2lvblggPSA1O1xyXG4gICAgICB9XHJcbiAgICAgIHNlcmllcy50b29sdGlwVGV4dCA9IHRvb2x0aXBUZXh0IHx8ICdbYm9sZF0nICsgbmFtZSArICc6IFsvXXtvcGVuVmFsdWVZLnZhbHVlfSB0byB7dmFsdWVZfSc7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIC8vIE5PUk1BTCBTRVJJRVNcclxuICAgICAgaWYgKGNvbG9yKSB7XHJcbiAgICAgICAgc2VyaWVzLmZpbGwgPSBhbTRjb3JlLmNvbG9yKGNvbG9yKTtcclxuICAgICAgICBzZXJpZXMuc3Ryb2tlID0gYW00Y29yZS5jb2xvcihjb2xvcik7XHJcbiAgICAgIH1cclxuICAgICAgc2VyaWVzLnN0cm9rZVdpZHRoID0gc3Ryb2tlV2lkdGg7XHJcbiAgICAgIGlmIChzZXJpZXMgaW5zdGFuY2VvZiBhbTRjaGFydHMuQ29sdW1uU2VyaWVzKSB7XHJcbiAgICAgICAgc2VyaWVzLmZpbGxPcGFjaXR5ID0gMC40O1xyXG4gICAgICAgIHNlcmllcy5zdHJva2VXaWR0aCA9IDE7IC8vIGtlZXAgdGhpcyBkZWZhdWx0IG9mIDEgPyBVbmRlciBldmFsdWF0aW9uXHJcbiAgICAgIH1cclxuICAgICAgc2VyaWVzLnRvb2x0aXBUZXh0ID0gdG9vbHRpcFRleHQgfHwgJ1tib2xkXScgKyBuYW1lICsgJzpbL10ge3ZhbHVlWX0nO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPT0xUSVAgU1RVRkZcclxuICAgIHNlcmllcy50b29sdGlwID0gbmV3IFRvb2x0aXAoKTtcclxuICAgIHNlcmllcy50b29sdGlwLmJhY2tncm91bmQuZmlsdGVycy5jbGVhcigpOyAvLyBOTyBTSEFET1dcclxuICAgIHNlcmllcy50b29sdGlwLmJhY2tncm91bmQuc3Ryb2tlID0gYW00Y29yZS5jb2xvcih0aGlzLnRoZW1lPy5nZXRSZ2IoJ2JnJykpO1xyXG4gICAgaWYgKGRlZlRvb2xUaXBDb2xvcikge1xyXG4gICAgICBzZXJpZXMudG9vbHRpcC5nZXRGaWxsRnJvbU9iamVjdCA9IGZhbHNlO1xyXG4gICAgICBzZXJpZXMudG9vbHRpcC5iYWNrZ3JvdW5kLmZpbGwgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignY29sb3InKSk7XHJcbiAgICAgIHNlcmllcy50b29sdGlwLmxhYmVsLmZpbGwgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignYmcnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhcnQuc2VyaWVzLnB1c2goc2VyaWVzKTtcclxuICAgIHJldHVybiBzZXJpZXM7XHJcblxyXG4gIH1cclxuXHJcbiAgYWRkU2VyaWVzUGllKFxyXG4gICAgY2hhcnQ6IFBpZUNoYXJ0LFxyXG4gICAgY2F0OiBzdHJpbmcsXHJcbiAgICB2YWx1ZTogc3RyaW5nLFxyXG4gICAgY29sb3JBdHRyOiBzdHJpbmcgPSAnJyxcclxuICAgIGNvbG9yOiBzdHJpbmcgPSAnJyxcclxuICAgIHdpdGhMYWJlbHM6IGJvb2xlYW4gPSB0cnVlLFxyXG4gICAgdG9vbHRpcFRleHQ6IHN0cmluZyA9ICcnLFxyXG4gICk6IGFtNGNoYXJ0cy5QaWVTZXJpZXMge1xyXG4gICAgY29uc3Qgc2VyaWVzID0gbmV3IGFtNGNoYXJ0cy5QaWVTZXJpZXMoKTtcclxuICAgIHNlcmllcy5kYXRhRmllbGRzLmNhdGVnb3J5ID0gY2F0O1xyXG4gICAgc2VyaWVzLmRhdGFGaWVsZHMudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLnN0cm9rZSA9IGFtNGNvcmUuY29sb3IodGhpcy50aGVtZT8uZ2V0UmdiKCdiZycpKTtcclxuICAgIHNlcmllcy5zbGljZXMudGVtcGxhdGUuc3Ryb2tlV2lkdGggPSAyO1xyXG4gICAgc2VyaWVzLnNsaWNlcy50ZW1wbGF0ZS5zdHJva2VPcGFjaXR5ID0gMTtcclxuXHJcbiAgICBzZXJpZXMubGFiZWxzLnRlbXBsYXRlLmRpc2FibGVkID0gIXdpdGhMYWJlbHM7XHJcbiAgICBzZXJpZXMubGFiZWxzLnRlbXBsYXRlLnRleHQgPSB0b29sdGlwVGV4dCB8fCAnW2JvbGRde2NhdGVnb3J5fTpbL10ge3ZhbHVlLnBlcmNlbnQuZm9ybWF0TnVtYmVyKFxcJyNcXCcpfSUgJztcclxuICAgIHNlcmllcy5sYWJlbHMudGVtcGxhdGUuZmlsbCA9IGFtNGNvcmUuY29sb3IodGhpcy50aGVtZT8uZ2V0UmdiKCdjb2xvcicpKTtcclxuICAgIHNlcmllcy50aWNrcy50ZW1wbGF0ZS5zdHJva2UgPSBhbTRjb3JlLmNvbG9yKHRoaXMudGhlbWU/LmdldFJnYignY29sb3InKSk7XHJcbiAgICBzZXJpZXMudGlja3MudGVtcGxhdGUuc3Ryb2tlV2lkdGggPSAyO1xyXG5cclxuICAgIC8vIGRpc2FibGUgc2xpZGluZyBvdXQgb2Ygc2xpY2VzXHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLnN0YXRlcy5nZXRLZXkoJ2hvdmVyJykucHJvcGVydGllcy5zaGlmdFJhZGl1cyA9IDA7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLnN0YXRlcy5nZXRLZXkoJ2hvdmVyJykucHJvcGVydGllcy5zY2FsZSA9IDE7XHJcblxyXG4gICAgaWYgKGNvbG9yQXR0cikge1xyXG4gICAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLnByb3BlcnR5RmllbGRzLmZpbGwgPSBjb2xvckF0dHI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbG9yKSB7XHJcbiAgICAgIHNlcmllcy5zbGljZXMudGVtcGxhdGUuZmlsbCA9IGFtNGNvcmUuY29sb3IoY29sb3IpO1xyXG4gICAgICBjb25zdCBjcyA9IHNlcmllcy5jb2xvcnM7XHJcbiAgICAgIGNzLmxpc3QgPSBbYW00Y29yZS5jb2xvcihuZXcgYW00Y29yZS5Db2xvclNldCgpLmdldEluZGV4KDApKV07XHJcbiAgICAgIGNzLnN0ZXBPcHRpb25zID0ge1xyXG4gICAgICAgIGxpZ2h0bmVzczogLTAuMDUsXHJcbiAgICAgICAgaHVlOiAwXHJcbiAgICAgIH07XHJcbiAgICAgIGNzLndyYXAgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUT09MVElQIFNUVUZGXHJcbiAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLnRvb2x0aXBUZXh0ID0gdG9vbHRpcFRleHQgfHwgJ1tib2xkXXtjYXRlZ29yeX06Wy9dIHt2YWx1ZS5wZXJjZW50LmZvcm1hdE51bWJlcihcXCcjXFwnKX0lICc7XHJcbiAgICBzZXJpZXMudG9vbHRpcCA9IG5ldyBUb29sdGlwKCk7XHJcbiAgICBzZXJpZXMudG9vbHRpcC5iYWNrZ3JvdW5kLmZpbHRlcnMuY2xlYXIoKTsgLy8gTk8gU0hBRE9XXHJcbiAgICBzZXJpZXMudG9vbHRpcC5iYWNrZ3JvdW5kLnN0cm9rZSA9IGFtNGNvcmUuY29sb3IodGhpcy50aGVtZT8uZ2V0UmdiKCdiZycpKTtcclxuXHJcbiAgICBjaGFydC5zZXJpZXMucHVzaChzZXJpZXMpO1xyXG4gICAgcmV0dXJuIHNlcmllcztcclxuICB9XHJcblxyXG59XHJcbiJdfQ==