UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

262 lines 39.8 kB
import { __decorate, __metadata } from "tslib"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, Input, NgZone, PLATFORM_ID, ViewChild, } from '@angular/core'; import { ModalController } from '@ionic/angular'; import { BarHorizontal2DComponent, BarVertical2DComponent, BaseChartComponent, LegendPosition, } from '@swimlane/ngx-charts'; import { MonitoringAppGenComponent } from '../../metadata/decorators'; import { ChartDataModel, } from '../ChartDataModel'; import { dataWithSeriesToCsv } from '../ExportDataFormat'; import { TapVariableDataPopupComponent } from '../tap-variable-data-popup/tap-variable-data-popup.component'; import * as i0 from "@angular/core"; import * as i1 from "@ionic/angular"; import * as i2 from "@angular/common"; import * as i3 from "@swimlane/ngx-charts"; import * as i4 from "../../ui-directive/export-data.directive"; let TapVariableBarChartGroupComponent = class TapVariableBarChartGroupComponent extends BaseChartComponent { modalController; divContainer; barChartHor; barChartVer; constructor(myChartElement, zone, cd, platformId, modalController) { super(myChartElement, zone, cd, platformId); this.modalController = modalController; } legendPosition = LegendPosition.Below; showExportButton = false; exportedFileName; legend = true; legendTitle; colorScheme = { domain: [ '#5DADE2', '#9B59B6', '#F39C12', '#5AA454', '#A10A28', '#C7B42C', '#AAAAAA', ], }; orientation = 'vertical'; showDetails = false; noBarWhenZero = false; trimXAxisTicks; maxXAxisTickLength; trimYAxisTicks; maxYAxisTickLength; animations = true; roundDomains; roundEdges = true; barPadding; showYAxisLabel; yAxisLabel; showXAxisLabel; xAxisLabel; showGridLines; scaleMax; /** * @deprecated use xAxis */ set showXAxis(v) { this.xAxis = v; } xAxis = true; /** * @deprecated use yAxis */ set showYAxis(v) { this.yAxis = v; } yAxis = true; history = false; valueCountLimit = 10; set label(indexOrArray) { this.chartModel.initLabel(indexOrArray); } set variable(variableOrArray) { this.mutlipleVar = variableOrArray.length > 1; this.input = this.chartModel.initVariable(variableOrArray); } set input(inputs) { if (this.mutlipleVar) { this.subscription = this.chartModel .defineMultiInputStream(inputs) .subscribe((result) => { if (this.scrollableChart) { this.resizeToScroll(result.length, result[0].series.length); } this.results = result; }); } else { this.subscription = this.chartModel .defineInputStreamMulti(inputs, this.history, this.valueCountLimit) .subscribe((result) => { if (this.scrollableChart) { this.resizeToScroll(result.length, result[0].series.length); } this.results = result; }); } this.cd.detectChanges(); } set data(results) { this.results = results; } results = [ { name: '---', series: [ { name: '---', value: 0, extra: 0, }, ], }, ]; scrollableChart = false; widthChart; heightChart; chartModel = new ChartDataModel(); subscription; mutlipleVar; createExportedData() { return dataWithSeriesToCsv(this.results); } onSelect(event) { if (typeof event === 'object') { if (this.showDetails) { this.chartModel .showDetail(event, this.modalController, TapVariableDataPopupComponent) .catch((err) => { console.log(err); }); } } } ngAfterViewChecked() { if (!this.scrollableChart) { this.widthChart = this.divContainer.nativeElement.offsetWidth; this.heightChart = this.divContainer.nativeElement.offsetHeight; } this.cd.detectChanges(); } resizeToScroll(size, seriesSize) { if (this.orientation === 'vertical') { if (this.divContainer.nativeElement.offsetWidth <= size * 50 * seriesSize) { this.barChartVer.view = [ size * 50 * seriesSize, this.divContainer.nativeElement.offsetHeight, ]; } } else if (this.orientation === 'horizontal') { if (this.divContainer.nativeElement.offsetHeight <= size * 50 * seriesSize) { this.barChartHor.view = [ this.divContainer.nativeElement.offsetWidth, size * 50 * seriesSize, ]; } } } ngOnDestroy() { this.subscription?.unsubscribe(); this.chartModel.destroyCurrentSub(); } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapVariableBarChartGroupComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: PLATFORM_ID }, { token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TapVariableBarChartGroupComponent, selector: "tap-variable-bar-chart-group", inputs: { legendPosition: "legendPosition", showExportButton: "showExportButton", exportedFileName: "exportedFileName", legend: "legend", legendTitle: "legendTitle", colorScheme: "colorScheme", orientation: "orientation", showDetails: "showDetails", noBarWhenZero: "noBarWhenZero", trimXAxisTicks: "trimXAxisTicks", maxXAxisTickLength: "maxXAxisTickLength", trimYAxisTicks: "trimYAxisTicks", maxYAxisTickLength: "maxYAxisTickLength", animations: "animations", roundDomains: "roundDomains", roundEdges: "roundEdges", barPadding: "barPadding", showYAxisLabel: "showYAxisLabel", yAxisLabel: "yAxisLabel", showXAxisLabel: "showXAxisLabel", xAxisLabel: "xAxisLabel", showGridLines: "showGridLines", scaleMax: "scaleMax", showXAxis: "showXAxis", xAxis: "xAxis", showYAxis: "showYAxis", yAxis: "yAxis", history: "history", valueCountLimit: "valueCountLimit", label: "label", variable: "variable", input: "input", data: "data", scrollableChart: "scrollableChart" }, viewQueries: [{ propertyName: "divContainer", first: true, predicate: ["containerRef"], descendants: true }, { propertyName: "barChartHor", first: true, predicate: ["barChartHor"], descendants: true }, { propertyName: "barChartVer", first: true, predicate: ["barChartVer"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div\n [ngClass]=\"\n scrollableChart\n ? orientation === 'vertical'\n ? 'verticalContainer'\n : 'horizontalContainer'\n : {}\n \"\n>\n <div\n #containerRef\n [ngClass]=\"\n legendPosition === 'below' && legend ? 'belowLegend' : 'rightLegend'\n \"\n [ngSwitch]=\"orientation\"\n style=\"position: relative\"\n >\n <ngx-charts-bar-horizontal-2d\n *ngSwitchCase=\"'horizontal'\"\n #barChartHor\n [view]=\"[containerRef.offsetWidth, containerRef.offsetHeight]\"\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [legend]=\"legend\"\n [legendTitle]=\"legendTitle\"\n [legendPosition]=\"legendPosition\"\n [noBarWhenZero]=\"noBarWhenZero\"\n [xAxis]=\"xAxis\"\n [showYAxisLabel]=\"showYAxisLabel\"\n [yAxisLabel]=\"yAxisLabel\"\n [yAxis]=\"yAxis\"\n [showXAxisLabel]=\"showXAxisLabel\"\n [xAxisLabel]=\"xAxisLabel\"\n [showGridLines]=\"showGridLines\"\n [trimXAxisTicks]=\"trimXAxisTicks\"\n [maxXAxisTickLength]=\"maxXAxisTickLength\"\n [trimYAxisTicks]=\"trimYAxisTicks\"\n [maxYAxisTickLength]=\"maxYAxisTickLength\"\n [animations]=\"animations\"\n [roundDomains]=\"roundDomains\"\n [roundEdges]=\"roundEdges\"\n [barPadding]=\"barPadding\"\n [xScaleMax]=\"scaleMax\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-bar-horizontal-2d>\n <ngx-charts-bar-vertical-2d\n *ngSwitchCase=\"'vertical'\"\n #barChartVer\n [view]=\"[containerRef.offsetWidth, containerRef.offsetHeight]\"\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [roundEdges]=\"roundEdges\"\n [legend]=\"legend\"\n [legendTitle]=\"legendTitle\"\n [legendPosition]=\"legendPosition\"\n [noBarWhenZero]=\"noBarWhenZero\"\n [xAxis]=\"xAxis\"\n [showYAxisLabel]=\"showYAxisLabel\"\n [yAxisLabel]=\"yAxisLabel\"\n [yAxis]=\"yAxis\"\n [showXAxisLabel]=\"showXAxisLabel\"\n [xAxisLabel]=\"xAxisLabel\"\n [showGridLines]=\"showGridLines\"\n [trimXAxisTicks]=\"trimXAxisTicks\"\n [maxXAxisTickLength]=\"maxXAxisTickLength\"\n [trimYAxisTicks]=\"trimYAxisTicks\"\n [maxYAxisTickLength]=\"maxYAxisTickLength\"\n [animations]=\"animations\"\n [roundDomains]=\"roundDomains\"\n [roundEdges]=\"roundEdges\"\n [barPadding]=\"barPadding\"\n [yScaleMax]=\"scaleMax\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-bar-vertical-2d>\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n *ngIf=\"showExportButton\"\n [dataToExport]=\"createExportedData.bind(this)\"\n [exportedFileName]=\"exportedFileName\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n </div>\n</div>\n", styles: ["::ng-deep .horizontal-legend{overflow:auto!important}.belowLegend{max-height:50vh;width:100%;min-width:100%;margin-bottom:60px}.rightLegend{max-height:50vh;width:100%}#exportFabButton{position:absolute;top:10px;right:10px}@media (prefers-color-scheme: dark){::ng-deep span.legend-label-text{color:#ccc!important}::ng-deep span.legend-label-text:hover{color:#fff!important}::ng-deep .ngx-charts text{fill:#fff!important}}.verticalContainer{overflow-y:hidden;overflow-x:auto;max-height:60vh}.horizontalContainer{overflow-x:hidden;overflow-y:auto;max-height:60vh}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i3.BarHorizontal2DComponent, selector: "ngx-charts-bar-horizontal-2d", inputs: ["legend", "legendTitle", "legendPosition", "xAxis", "yAxis", "showXAxisLabel", "showYAxisLabel", "xAxisLabel", "yAxisLabel", "tooltipDisabled", "gradient", "showGridLines", "activeEntries", "schemeType", "trimXAxisTicks", "trimYAxisTicks", "rotateXAxisTicks", "maxXAxisTickLength", "maxYAxisTickLength", "xAxisTickFormatting", "yAxisTickFormatting", "xAxisTicks", "yAxisTicks", "groupPadding", "barPadding", "roundDomains", "roundEdges", "xScaleMax", "showDataLabel", "dataLabelFormatting", "noBarWhenZero", "wrapTicks"], outputs: ["activate", "deactivate"] }, { kind: "component", type: i3.BarVertical2DComponent, selector: "ngx-charts-bar-vertical-2d", inputs: ["legend", "legendTitle", "legendPosition", "xAxis", "yAxis", "showXAxisLabel", "showYAxisLabel", "xAxisLabel", "yAxisLabel", "tooltipDisabled", "scaleType", "gradient", "showGridLines", "activeEntries", "schemeType", "trimXAxisTicks", "trimYAxisTicks", "rotateXAxisTicks", "maxXAxisTickLength", "maxYAxisTickLength", "xAxisTickFormatting", "yAxisTickFormatting", "xAxisTicks", "yAxisTicks", "groupPadding", "barPadding", "roundDomains", "roundEdges", "yScaleMax", "showDataLabel", "dataLabelFormatting", "noBarWhenZero", "wrapTicks"], outputs: ["activate", "deactivate"] }, { kind: "component", type: i1.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "directive", type: i4.ExportDataDirective, selector: "[tapExportData]", inputs: ["exportedFileName", "dataToExport", "format"], outputs: ["exportDataError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }; TapVariableBarChartGroupComponent = __decorate([ MonitoringAppGenComponent({}), __metadata("design:paramtypes", [ElementRef, NgZone, ChangeDetectorRef, String, ModalController]) ], TapVariableBarChartGroupComponent); export { TapVariableBarChartGroupComponent }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapVariableBarChartGroupComponent, decorators: [{ type: Component, args: [{ selector: 'tap-variable-bar-chart-group', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n [ngClass]=\"\n scrollableChart\n ? orientation === 'vertical'\n ? 'verticalContainer'\n : 'horizontalContainer'\n : {}\n \"\n>\n <div\n #containerRef\n [ngClass]=\"\n legendPosition === 'below' && legend ? 'belowLegend' : 'rightLegend'\n \"\n [ngSwitch]=\"orientation\"\n style=\"position: relative\"\n >\n <ngx-charts-bar-horizontal-2d\n *ngSwitchCase=\"'horizontal'\"\n #barChartHor\n [view]=\"[containerRef.offsetWidth, containerRef.offsetHeight]\"\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [legend]=\"legend\"\n [legendTitle]=\"legendTitle\"\n [legendPosition]=\"legendPosition\"\n [noBarWhenZero]=\"noBarWhenZero\"\n [xAxis]=\"xAxis\"\n [showYAxisLabel]=\"showYAxisLabel\"\n [yAxisLabel]=\"yAxisLabel\"\n [yAxis]=\"yAxis\"\n [showXAxisLabel]=\"showXAxisLabel\"\n [xAxisLabel]=\"xAxisLabel\"\n [showGridLines]=\"showGridLines\"\n [trimXAxisTicks]=\"trimXAxisTicks\"\n [maxXAxisTickLength]=\"maxXAxisTickLength\"\n [trimYAxisTicks]=\"trimYAxisTicks\"\n [maxYAxisTickLength]=\"maxYAxisTickLength\"\n [animations]=\"animations\"\n [roundDomains]=\"roundDomains\"\n [roundEdges]=\"roundEdges\"\n [barPadding]=\"barPadding\"\n [xScaleMax]=\"scaleMax\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-bar-horizontal-2d>\n <ngx-charts-bar-vertical-2d\n *ngSwitchCase=\"'vertical'\"\n #barChartVer\n [view]=\"[containerRef.offsetWidth, containerRef.offsetHeight]\"\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [roundEdges]=\"roundEdges\"\n [legend]=\"legend\"\n [legendTitle]=\"legendTitle\"\n [legendPosition]=\"legendPosition\"\n [noBarWhenZero]=\"noBarWhenZero\"\n [xAxis]=\"xAxis\"\n [showYAxisLabel]=\"showYAxisLabel\"\n [yAxisLabel]=\"yAxisLabel\"\n [yAxis]=\"yAxis\"\n [showXAxisLabel]=\"showXAxisLabel\"\n [xAxisLabel]=\"xAxisLabel\"\n [showGridLines]=\"showGridLines\"\n [trimXAxisTicks]=\"trimXAxisTicks\"\n [maxXAxisTickLength]=\"maxXAxisTickLength\"\n [trimYAxisTicks]=\"trimYAxisTicks\"\n [maxYAxisTickLength]=\"maxYAxisTickLength\"\n [animations]=\"animations\"\n [roundDomains]=\"roundDomains\"\n [roundEdges]=\"roundEdges\"\n [barPadding]=\"barPadding\"\n [yScaleMax]=\"scaleMax\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-bar-vertical-2d>\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n *ngIf=\"showExportButton\"\n [dataToExport]=\"createExportedData.bind(this)\"\n [exportedFileName]=\"exportedFileName\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n </div>\n</div>\n", styles: ["::ng-deep .horizontal-legend{overflow:auto!important}.belowLegend{max-height:50vh;width:100%;min-width:100%;margin-bottom:60px}.rightLegend{max-height:50vh;width:100%}#exportFabButton{position:absolute;top:10px;right:10px}@media (prefers-color-scheme: dark){::ng-deep span.legend-label-text{color:#ccc!important}::ng-deep span.legend-label-text:hover{color:#fff!important}::ng-deep .ngx-charts text{fill:#fff!important}}.verticalContainer{overflow-y:hidden;overflow-x:auto;max-height:60vh}.horizontalContainer{overflow-x:hidden;overflow-y:auto;max-height:60vh}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }, { type: i1.ModalController }], propDecorators: { divContainer: [{ type: ViewChild, args: ['containerRef'] }], barChartHor: [{ type: ViewChild, args: ['barChartHor'] }], barChartVer: [{ type: ViewChild, args: ['barChartVer'] }], legendPosition: [{ type: Input }], showExportButton: [{ type: Input }], exportedFileName: [{ type: Input }], legend: [{ type: Input }], legendTitle: [{ type: Input }], colorScheme: [{ type: Input }], orientation: [{ type: Input }], showDetails: [{ type: Input }], noBarWhenZero: [{ type: Input }], trimXAxisTicks: [{ type: Input }], maxXAxisTickLength: [{ type: Input }], trimYAxisTicks: [{ type: Input }], maxYAxisTickLength: [{ type: Input }], animations: [{ type: Input }], roundDomains: [{ type: Input }], roundEdges: [{ type: Input }], barPadding: [{ type: Input }], showYAxisLabel: [{ type: Input }], yAxisLabel: [{ type: Input }], showXAxisLabel: [{ type: Input }], xAxisLabel: [{ type: Input }], showGridLines: [{ type: Input }], scaleMax: [{ type: Input }], showXAxis: [{ type: Input }], xAxis: [{ type: Input }], showYAxis: [{ type: Input }], yAxis: [{ type: Input }], history: [{ type: Input }], valueCountLimit: [{ type: Input }], label: [{ type: Input }], variable: [{ type: Input }], input: [{ type: Input }], data: [{ type: Input }], scrollableChart: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLXZhcmlhYmxlLWJhci1jaGFydC1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvbW9uaXRvcmluZy9zcmMvbGliL3VpLWNvbXBvbmVudHMvdGFwLXZhcmlhYmxlLWJhci1jaGFydC1ncm91cC90YXAtdmFyaWFibGUtYmFyLWNoYXJ0LWdyb3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy90YXAtdmFyaWFibGUtYmFyLWNoYXJ0LWdyb3VwL3RhcC12YXJpYWJsZS1iYXItY2hhcnQtZ3JvdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLGNBQWMsR0FDZixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RFLE9BQU8sRUFDTCxjQUFjLEdBR2YsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQzs7Ozs7O0FBU3RHLElBQU0saUNBQWlDLEdBQXZDLE1BQU0saUNBQ1gsU0FBUSxrQkFB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QUFsQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUYsU0FBUztzQkFEWixLQUFLO2dCQU1OLEtBQUs7c0JBREosS0FBSztnQkFPRixTQUFTO3NCQURaLEtBQUs7Z0JBTU4sS0FBSztzQkFESixLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJTixlQUFlO3NCQURkLEtBQUs7Z0JBSUYsS0FBSztzQkFEUixLQUFLO2dCQU1GLFFBQVE7c0JBRFgsS0FBSztnQkFPRixLQUFLO3NCQURSLEtBQUs7Z0JBd0JPLElBQUk7c0JBQWhCLEtBQUs7Z0JBaUJHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdDaGVja2VkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIFBMQVRGT1JNX0lELFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgQWJzdHJhY3RWYXJpYWJsZSB9IGZyb20gJ0Bpb3RpemUvdGFwL2RhdGEnO1xuaW1wb3J0IHtcbiAgQmFySG9yaXpvbnRhbDJEQ29tcG9uZW50LFxuICBCYXJWZXJ0aWNhbDJEQ29tcG9uZW50LFxuICBCYXNlQ2hhcnRDb21wb25lbnQsXG4gIExlZ2VuZFBvc2l0aW9uLFxufSBmcm9tICdAc3dpbWxhbmUvbmd4LWNoYXJ0cyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1vbml0b3JpbmdBcHBHZW5Db21wb25lbnQgfSBmcm9tICcuLi8uLi9tZXRhZGF0YS9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIENoYXJ0RGF0YU1vZGVsLFxuICBDaGFydElucHV0TXV0bGksXG4gIENoYXJ0SW5wdXRTdHJlYW1WYXIsXG59IGZyb20gJy4uL0NoYXJ0RGF0YU1vZGVsJztcbmltcG9ydCB7IGRhdGFXaXRoU2VyaWVzVG9Dc3YgfSBmcm9tICcuLi9FeHBvcnREYXRhRm9ybWF0JztcbmltcG9ydCB7IE9uQ2hhcnRTZWxlY3RFdmVudCB9IGZyb20gJy4uL3NoYXJlZC10eXBlcyc7XG5pbXBvcnQgeyBUYXBWYXJpYWJsZURhdGFQb3B1cENvbXBvbmVudCB9IGZyb20gJy4uL3RhcC12YXJpYWJsZS1kYXRhLXBvcHVwL3RhcC12YXJpYWJsZS1kYXRhLXBvcHVwLmNvbXBvbmVudCc7XG5cbkBNb25pdG9yaW5nQXBwR2VuQ29tcG9uZW50KHt9KVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFwLXZhcmlhYmxlLWJhci1jaGFydC1ncm91cCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90YXAtdmFyaWFibGUtYmFyLWNoYXJ0LWdyb3VwLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFwLXZhcmlhYmxlLWJhci1jaGFydC1ncm91cC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGFwVmFyaWFibGVCYXJDaGFydEdyb3VwQ29tcG9uZW50XG4gIGV4dGVuZHMgQmFzZUNoYXJ0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95XG57XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lclJlZicpIGRpdkNvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2JhckNoYXJ0SG9yJykgYmFyQ2hhcnRIb3IhOiBCYXJIb3Jpem9udGFsMkRDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2JhckNoYXJ0VmVyJykgYmFyQ2hhcnRWZXIhOiBCYXJWZXJ0aWNhbDJEQ29tcG9uZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG15Q2hhcnRFbGVtZW50OiBFbGVtZW50UmVmPGFueT4sXG4gICAgem9uZTogTmdab25lLFxuICAgIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwbGF0Zm9ybUlkOiBzdHJpbmcsXG4gICAgcHVibGljIG1vZGFsQ29udHJvbGxlcjogTW9kYWxDb250cm9sbGVyXG4gICkge1xuICAgIHN1cGVyKG15Q2hhcnRFbGVtZW50LCB6b25lLCBjZCwgcGxhdGZvcm1JZCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBsZWdlbmRQb3NpdGlvbjogTGVnZW5kUG9zaXRpb24gPSBMZWdlbmRQb3NpdGlvbi5CZWxvdztcblxuICBASW5wdXQoKVxuICBzaG93RXhwb3J0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgZXhwb3J0ZWRGaWxlTmFtZT86IHN0cmluZztcblxuICBASW5wdXQoKVxuICBsZWdlbmQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGxlZ2VuZFRpdGxlPzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGNvbG9yU2NoZW1lID0ge1xuICAgIGRvbWFpbjogW1xuICAgICAgJyM1REFERTInLFxuICAgICAgJyM5QjU5QjYnLFxuICAgICAgJyNGMzlDMTInLFxuICAgICAgJyM1QUE0NTQnLFxuICAgICAgJyNBMTBBMjgnLFxuICAgICAgJyNDN0I0MkMnLFxuICAgICAgJyNBQUFBQUEnLFxuICAgIF0sXG4gIH07XG5cbiAgQElucHV0KClcbiAgb3JpZW50YXRpb246IHN0cmluZyA9ICd2ZXJ0aWNhbCc7XG5cbiAgQElucHV0KClcbiAgc2hvd0RldGFpbHM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBub0JhcldoZW5aZXJvOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgdHJpbVhBeGlzVGlja3M/OiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIG1heFhBeGlzVGlja0xlbmd0aD86IGJvb2xlYW47XG5cbiAgQElucHV0KCkgdHJpbVlBeGlzVGlja3M/OiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIG1heFlBeGlzVGlja0xlbmd0aD86IGJvb2xlYW47XG5cbiAgQElucHV0KCkgYW5pbWF0aW9uczogYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KCkgcm91bmREb21haW5zPzogYm9vbGVhbjtcblxuICBASW5wdXQoKSByb3VuZEVkZ2VzID0gdHJ1ZTtcblxuICBASW5wdXQoKSBiYXJQYWRkaW5nPzogbnVtYmVyO1xuXG4gIEBJbnB1dCgpIHNob3dZQXhpc0xhYmVsPzogYm9vbGVhbjtcblxuICBASW5wdXQoKSB5QXhpc0xhYmVsPzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHNob3dYQXhpc0xhYmVsPzogYm9vbGVhbjtcblxuICBASW5wdXQoKSB4QXhpc0xhYmVsPzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHNob3dHcmlkTGluZXM/OiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIHNjYWxlTWF4PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgeEF4aXNcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBzaG93WEF4aXModjogYm9vbGVhbikge1xuICAgIHRoaXMueEF4aXMgPSB2O1xuICB9XG5cbiAgQElucHV0KClcbiAgeEF4aXM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgeUF4aXNcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBzaG93WUF4aXModjogYm9vbGVhbikge1xuICAgIHRoaXMueUF4aXMgPSB2O1xuICB9XG5cbiAgQElucHV0KClcbiAgeUF4aXM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGhpc3Rvcnk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICB2YWx1ZUNvdW50TGltaXQgPSAxMDtcblxuICBASW5wdXQoKVxuICBzZXQgbGFiZWwoaW5kZXhPckFycmF5OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB8IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5jaGFydE1vZGVsLmluaXRMYWJlbChpbmRleE9yQXJyYXkpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHZhcmlhYmxlKHZhcmlhYmxlT3JBcnJheTogQWJzdHJhY3RWYXJpYWJsZTxudW1iZXIgfCBudW1iZXJbXT5bXSkge1xuICAgIHRoaXMubXV0bGlwbGVWYXIgPSB2YXJpYWJsZU9yQXJyYXkubGVuZ3RoID4gMTtcbiAgICB0aGlzLmlucHV0ID0gdGhpcy5jaGFydE1vZGVsLmluaXRWYXJpYWJsZSh2YXJpYWJsZU9yQXJyYXkpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGlucHV0KGlucHV0czogQ2hhcnRJbnB1dFN0cmVhbVZhcltdKSB7XG4gICAgaWYgKHRoaXMubXV0bGlwbGVWYXIpIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5jaGFydE1vZGVsXG4gICAgICAgIC5kZWZpbmVNdWx0aUlucHV0U3RyZWFtKGlucHV0cylcbiAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuc2Nyb2xsYWJsZUNoYXJ0KSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVRvU2Nyb2xsKHJlc3VsdC5sZW5ndGgsIHJlc3VsdFswXS5zZXJpZXMubGVuZ3RoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5yZXN1bHRzID0gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmNoYXJ0TW9kZWxcbiAgICAgICAgLmRlZmluZUlucHV0U3RyZWFtTXVsdGkoaW5wdXRzLCB0aGlzLmhpc3RvcnksIHRoaXMudmFsdWVDb3VudExpbWl0KVxuICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5zY3JvbGxhYmxlQ2hhcnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplVG9TY3JvbGwocmVzdWx0Lmxlbmd0aCwgcmVzdWx0WzBdLnNlcmllcy5sZW5ndGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlc3VsdHMgPSByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkYXRhKHJlc3VsdHM6IENoYXJ0SW5wdXRNdXRsaVtdKSB7XG4gICAgdGhpcy5yZXN1bHRzID0gcmVzdWx0cztcbiAgfVxuXG4gIHJlc3VsdHM6IENoYXJ0SW5wdXRNdXRsaVtdID0gW1xuICAgIHtcbiAgICAgIG5hbWU6ICctLS0nLFxuICAgICAgc2VyaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnLS0tJyxcbiAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICBleHRyYTogMCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXTtcblxuICBASW5wdXQoKSBzY3JvbGxhYmxlQ2hhcnQgPSBmYWxzZTtcblxuICB3aWR0aENoYXJ0PzogbnVtYmVyO1xuICBoZWlnaHRDaGFydD86IG51bWJlcjtcblxuICBwcml2YXRlIGNoYXJ0TW9kZWw6IENoYXJ0RGF0YU1vZGVsID0gbmV3IENoYXJ0RGF0YU1vZGVsKCk7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSBtdXRsaXBsZVZhcj86IGJvb2xlYW47XG5cbiAgY3JlYXRlRXhwb3J0ZWREYXRhKCkge1xuICAgIHJldHVybiBkYXRhV2l0aFNlcmllc1RvQ3N2KHRoaXMucmVzdWx0cyk7XG4gIH1cblxuICBvblNlbGVjdChldmVudDogT25DaGFydFNlbGVjdEV2ZW50KSB7XG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh0aGlzLnNob3dEZXRhaWxzKSB7XG4gICAgICAgIHRoaXMuY2hhcnRNb2RlbFxuICAgICAgICAgIC5zaG93RGV0YWlsKFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICB0aGlzLm1vZGFsQ29udHJvbGxlcixcbiAgICAgICAgICAgIFRhcFZhcmlhYmxlRGF0YVBvcHVwQ29tcG9uZW50XG4gICAgICAgICAgKVxuICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2Nyb2xsYWJsZUNoYXJ0KSB7XG4gICAgICB0aGlzLndpZHRoQ2hhcnQgPSB0aGlzLmRpdkNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgdGhpcy5oZWlnaHRDaGFydCA9IHRoaXMuZGl2Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH1cbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHJlc2l6ZVRvU2Nyb2xsKHNpemU6IG51bWJlciwgc2VyaWVzU2l6ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5kaXZDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCA8PVxuICAgICAgICBzaXplICogNTAgKiBzZXJpZXNTaXplXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5iYXJDaGFydFZlci52aWV3ID0gW1xuICAgICAgICAgIHNpemUgKiA1MCAqIHNlcmllc1NpemUsXG4gICAgICAgICAgdGhpcy5kaXZDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQsXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5kaXZDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPD1cbiAgICAgICAgc2l6ZSAqIDUwICogc2VyaWVzU2l6ZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYmFyQ2hhcnRIb3IudmlldyA9IFtcbiAgICAgICAgICB0aGlzLmRpdkNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoLFxuICAgICAgICAgIHNpemUgKiA1MCAqIHNlcmllc1NpemUsXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jaGFydE1vZGVsLmRlc3Ryb3lDdXJyZW50U3ViKCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgW25nQ2xhc3NdPVwiXG4gICAgc2Nyb2xsYWJsZUNoYXJ0XG4gICAgICA/IG9yaWVudGF0aW9uID09PSAndmVydGljYWwnXG4gICAgICAgID8gJ3ZlcnRpY2FsQ29udGFpbmVyJ1xuICAgICAgICA6ICdob3Jpem9udGFsQ29udGFpbmVyJ1xuICAgICAgOiB7fVxuICBcIlxuPlxuICA8ZGl2XG4gICAgI2NvbnRhaW5lclJlZlxuICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgbGVnZW5kUG9zaXRpb24gPT09ICdiZWxvdycgJiYgbGVnZW5kID8gJ2JlbG93TGVnZW5kJyA6ICdyaWdodExlZ2VuZCdcbiAgICBcIlxuICAgIFtuZ1N3aXRjaF09XCJvcmllbnRhdGlvblwiXG4gICAgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmVcIlxuICA+XG4gICAgPG5neC1jaGFydHMtYmFyLWhvcml6b250YWwtMmRcbiAgICAgICpuZ1N3aXRjaENhc2U9XCInaG9yaXpvbnRhbCdcIlxuICAgICAgI2JhckNoYXJ0SG9yXG4gICAgICBbdmlld109XCJbY29udGFpbmVyUmVmLm9mZnNldFdpZHRoLCBjb250YWluZXJSZWYub2Zmc2V0SGVpZ2h0XVwiXG4gICAgICBbc2NoZW1lXT1cImNvbG9yU2NoZW1lXCJcbiAgICAgIFtyZXN1bHRzXT1cInJlc3VsdHNcIlxuICAgICAgW2xlZ2VuZF09XCJsZWdlbmRcIlxuICAgICAgW2xlZ2VuZFRpdGxlXT1cImxlZ2VuZFRpdGxlXCJcbiAgICAgIFtsZWdlbmRQb3NpdGlvbl09XCJsZWdlbmRQb3NpdGlvblwiXG4gICAgICBbbm9CYXJXaGVuWmVyb109XCJub0JhcldoZW5aZXJvXCJcbiAgICAgIFt4QXhpc109XCJ4QXhpc1wiXG4gICAgICBbc2hvd1lBeGlzTGFiZWxdPVwic2hvd1lBeGlzTGFiZWxcIlxuICAgICAgW3lBeGlzTGFiZWxdPVwieUF4aXNMYWJlbFwiXG4gICAgICBbeUF4aXNdPVwieUF4aXNcIlxuICAgICAgW3Nob3dYQXhpc0xhYmVsXT1cInNob3dYQXhpc0xhYmVsXCJcbiAgICAgIFt4QXhpc0xhYmVsXT1cInhBeGlzTGFiZWxcIlxuICAgICAgW3Nob3dHcmlkTGluZXNdPVwic2hvd0dyaWRMaW5lc1wiXG4gICAgICBbdHJpbVhBeGlzVGlja3NdPVwidHJpbVhBeGlzVGlja3NcIlxuICAgICAgW21heFhBeGlzVGlja0xlbmd0aF09XCJtYXhYQXhpc1RpY2tMZW5ndGhcIlxuICAgICAgW3RyaW1ZQXhpc1RpY2tzXT1cInRyaW1ZQXhpc1RpY2tzXCJcbiAgICAgIFttYXhZQXhpc1RpY2tMZW5ndGhdPVwibWF4WUF4aXNUaWNrTGVuZ3RoXCJcbiAgICAgIFthbmltYXRpb25zXT1cImFuaW1hdGlvbnNcIlxuICAgICAgW3JvdW5kRG9tYWluc109XCJyb3VuZERvbWFpbnNcIlxuICAgICAgW3JvdW5kRWRnZXNdPVwicm91bmRFZGdlc1wiXG4gICAgICBbYmFyUGFkZGluZ109XCJiYXJQYWRkaW5nXCJcbiAgICAgIFt4U2NhbGVNYXhdPVwic2NhbGVNYXhcIlxuICAgICAgKHNlbGVjdCk9XCJvblNlbGVjdCgkZXZlbnQpXCJcbiAgICA+XG4gICAgPC9uZ3gtY2hhcnRzLWJhci1ob3Jpem9udGFsLTJkPlxuICAgIDxuZ3gtY2hhcnRzLWJhci12ZXJ0aWNhbC0yZFxuICAgICAgKm5nU3dpdGNoQ2FzZT1cIid2ZXJ0aWNhbCdcIlxuICAgICAgI2JhckNoYXJ0VmVyXG4gICAgICBbdmlld109XCJbY29udGFpbmVyUmVmLm9mZnNldFdpZHRoLCBjb250YWluZXJSZWYub2Zmc2V0SGVpZ2h0XVwiXG4gICAgICBbc2NoZW1lXT1cImNvbG9yU2NoZW1lXCJcbiAgICAgIFtyZXN1bHRzXT1cInJlc3VsdHNcIlxuICAgICAgW3JvdW5kRWRnZXNdPVwicm91bmRFZGdlc1wiXG4gICAgICBbbGVnZW5kXT1cImxlZ2VuZFwiXG4gICAgICBbbGVnZW5kVGl0bGVdPVwibGVnZW5kVGl0bGVcIlxuICAgICAgW2xlZ2VuZFBvc2l0aW9uXT1cImxlZ2VuZFBvc2l0aW9uXCJcbiAgICAgIFtub0JhcldoZW5aZXJvXT1cIm5vQmFyV2hlblplcm9cIlxuICAgICAgW3hBeGlzXT1cInhBeGlzXCJcbiAgICAgIFtzaG93WUF4aXNMYWJlbF09XCJzaG93WUF4aXNMYWJlbFwiXG4gICAgICBbeUF4aXNMYWJlbF09XCJ5QXhpc0xhYmVsXCJcbiAgICAgIFt5QXhpc109XCJ5QXhpc1wiXG4gICAgICBbc2hvd1hBeGlzTGFiZWxdPVwic2hvd1hBeGlzTGFiZWxcIlxuICAgICAgW3hBeGlzTGFiZWxdPVwieEF4aXNMYWJlbFwiXG4gICAgICBbc2hvd0dyaWRMaW5lc109XCJzaG93R3JpZExpbmVzXCJcbiAgICAgIFt0cmltWEF4aXNUaWNrc109XCJ0cmltWEF4aXNUaWNrc1wiXG4gICAgICBbbWF4WEF4aXNUaWNrTGVuZ3RoXT1cIm1heFhBeGlzVGlja0xlbmd0aFwiXG4gICAgICBbdHJpbVlBeGlzVGlja3NdPVwidHJpbVlBeGlzVGlja3NcIlxuICAgICAgW21heFlBeGlzVGlja0xlbmd0aF09XCJtYXhZQXhpc1RpY2tMZW5ndGhcIlxuICAgICAgW2FuaW1hdGlvbnNdPVwiYW5pbWF0aW9uc1wiXG4gICAgICBbcm91bmREb21haW5zXT1cInJvdW5kRG9tYWluc1wiXG4gICAgICBbcm91bmRFZGdlc109XCJyb3VuZEVkZ2VzXCJcbiAgICAgIFtiYXJQYWRkaW5nXT1cImJhclBhZGRpbmdcIlxuICAgICAgW3lTY2FsZU1heF09XCJzY2FsZU1heFwiXG4gICAgICAoc2VsZWN0KT1cIm9uU2VsZWN0KCRldmVudClcIlxuICAgID5cbiAgICA8L25neC1jaGFydHMtYmFyLXZlcnRpY2FsLTJkPlxuICAgIDxpb24tZmFiLWJ1dHRvblxuICAgICAgaWQ9XCJleHBvcnRGYWJCdXR0b25cIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIHRhcEV4cG9ydERhdGFcbiAgICAgICpuZ0lmPVwic2hvd0V4cG9ydEJ1dHRvblwiXG4gICAgICBbZGF0YVRvRXhwb3J0XT1cImNyZWF0ZUV4cG9ydGVkRGF0YS5iaW5kKHRoaXMpXCJcbiAgICAgIFtleHBvcnRlZEZpbGVOYW1lXT1cImV4cG9ydGVkRmlsZU5hbWVcIlxuICAgID5cbiAgICAgIDxpb24taWNvbiBuYW1lPVwiZG93bmxvYWRcIj48L2lvbi1pY29uPlxuICAgIDwvaW9uLWZhYi1idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=