@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
154 lines • 21.2 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostListener, Inject, Input, NgZone, PLATFORM_ID, } from '@angular/core';
import { ModalController } from '@ionic/angular';
import { NumberCardComponent } from '@swimlane/ngx-charts';
import { MonitoringAppGenComponent } from '../../metadata/decorators';
import { ChartDataModel, } from '../ChartDataModel';
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";
/**
* @deprecated it will probably be removed as it's not very usefull
*/
let TapVariableNumberChartComponent = class TapVariableNumberChartComponent extends NumberCardComponent {
set label(indexOrArray) {
this.chartModel.initLabel(indexOrArray);
}
set variable(variableOrArray) {
this.input = this.chartModel.initVariable(variableOrArray);
}
set input(inputs) {
this.subscription = this.chartModel
.defineInputStreamSingle(inputs, false, 0)
.subscribe((result) => {
let index = 0;
for (const item of result) {
if (!this.results[index]) {
if (item.value !== this.results[index].value) {
this.results = result;
}
}
else {
this.results = result;
}
index++;
}
this.resizeComponent();
this.loaded = true;
});
}
constructor(myChartElement, zone, cd, platformId, modalController) {
super(myChartElement, zone, cd, platformId);
this.modalController = modalController;
this.showDetails = false;
this.cardColor = '#232837';
this.showExportButton = false;
this.colorScheme = {
domain: [
'#5AA454',
'#E44D25',
'#CFC0BB',
'#7aa3e5',
'#a8385d',
'#aae3f5',
'#5DADE2',
'#9B59B6',
'#F39C12',
'#5AA454',
'#A10A28',
'#C7B42C',
'#AAAAAA',
],
};
this.results = [
{
name: '---',
value: 0,
extra: 0,
},
];
this.loaded = false;
this.chartModel = new ChartDataModel();
}
onSelect(event) {
if (typeof event === 'object') {
if (this.showDetails) {
this.chartModel
.showDetail(event, this.modalController, TapVariableDataPopupComponent)
.catch((err) => {
console.warn('Failed to show value detail', err);
});
}
}
}
ngAfterViewInit() {
this.innerWidth = window.innerWidth;
this.resizeComponent();
}
resizeComponent() {
if (this.innerWidth <= 400) {
this.innerWidth = 400;
}
this.innerHeight = (150 * this.results.length) / (this.innerWidth / 300);
if (this.results.length === 1) {
this.innerHeight = 150;
}
else {
if (this.innerHeight <= 210) {
this.innerHeight = 210;
}
}
this.cd.detectChanges();
}
onResize(event) {
this.innerWidth = window.innerWidth;
this.resizeComponent();
}
ngOnDestroy() {
this.subscription?.unsubscribe();
this.chartModel.destroyCurrentSub();
}
};
/** @nocollapse */ TapVariableNumberChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapVariableNumberChartComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: PLATFORM_ID }, { token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TapVariableNumberChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TapVariableNumberChartComponent, selector: "tap-variable-number-chart", inputs: { showDetails: "showDetails", cardColor: "cardColor", showExportButton: "showExportButton", exportedFileName: "exportedFileName", label: "label", colorScheme: "colorScheme", variable: "variable", input: "input" }, host: { listeners: { "window:resize": "onResize($event)" } }, usesInheritance: true, ngImport: i0, template: "<div #containerRef style=\"width: 100%; overflow: auto; position: relative\">\n <ngx-charts-number-card\n #charts\n [view]=\"[containerRef.offsetWidth, innerHeight]\"\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [cardColor]=\"cardColor\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-number-card>\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n *ngIf=\"showExportButton\"\n [exportedFileName]=\"exportedFileName\"\n [dataToExport]=\"results\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n</div>\n", styles: [":host ::ng-deep rect.card{min-height:250!important;min-width:250!important;margin:500px!important}@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}}#exportFabButton{position:absolute;top:10px;right:10px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.NumberCardComponent, selector: "ngx-charts-number-card", inputs: ["cardColor", "bandColor", "emptyColor", "innerPadding", "textColor", "valueFormatting", "labelFormatting", "designatedTotal"] }, { kind: "directive", type: i4.ExportDataDirective, selector: "[tapExportData]", inputs: ["exportedFileName", "dataToExport", "format"], outputs: ["exportDataError"] }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
TapVariableNumberChartComponent = __decorate([
MonitoringAppGenComponent({
constraints: {
isNumber: 'YES',
},
}),
__metadata("design:paramtypes", [ElementRef,
NgZone,
ChangeDetectorRef, String, ModalController])
], TapVariableNumberChartComponent);
export { TapVariableNumberChartComponent };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapVariableNumberChartComponent, decorators: [{
type: Component,
args: [{ selector: 'tap-variable-number-chart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #containerRef style=\"width: 100%; overflow: auto; position: relative\">\n <ngx-charts-number-card\n #charts\n [view]=\"[containerRef.offsetWidth, innerHeight]\"\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [cardColor]=\"cardColor\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-number-card>\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n *ngIf=\"showExportButton\"\n [exportedFileName]=\"exportedFileName\"\n [dataToExport]=\"results\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n</div>\n", styles: [":host ::ng-deep rect.card{min-height:250!important;min-width:250!important;margin:500px!important}@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}}#exportFabButton{position:absolute;top:10px;right:10px}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }, { type: i1.ModalController }]; }, propDecorators: { showDetails: [{
type: Input
}], cardColor: [{
type: Input
}], showExportButton: [{
type: Input
}], exportedFileName: [{
type: Input
}], label: [{
type: Input
}], colorScheme: [{
type: Input
}], variable: [{
type: Input
}], input: [{
type: Input
}], onResize: [{
type: HostListener,
args: ['window:resize', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLXZhcmlhYmxlLW51bWJlci1jaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvbW9uaXRvcmluZy9zcmMvbGliL3VpLWNvbXBvbmVudHMvdGFwLXZhcmlhYmxlLW51bWJlci1jaGFydC90YXAtdmFyaWFibGUtbnVtYmVyLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy90YXAtdmFyaWFibGUtbnVtYmVyLWNoYXJ0L3RhcC12YXJpYWJsZS1udW1iZXItY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUVOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFM0QsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEUsT0FBTyxFQUNMLGNBQWMsR0FHZixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDOzs7Ozs7QUFFN0c7O0dBRUc7QUFZSSxJQUFNLCtCQUErQixHQUFyQyxNQUFNLCtCQUNYLFNBQVEsbUJBQW1CO0lBZTNCLElBQ0ksS0FBSyxDQUFDLFlBQXNEO1FBQzlELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzFD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QUFnQjtzQkFEZixLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlGLEtBQUs7c0JBRFIsS0FBSztnQkFNTixXQUFXO3NCQURWLEtBQUs7Z0JBb0JGLFFBQVE7c0JBRFgsS0FBSztnQkFRRixLQUFLO3NCQURSLEtBQUs7Z0JBb0ZOLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgUExBVEZPUk1fSUQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgQWJzdHJhY3RWYXJpYWJsZSB9IGZyb20gJ0Bpb3RpemUvdGFwL2RhdGEnO1xuaW1wb3J0IHsgTnVtYmVyQ2FyZENvbXBvbmVudCB9IGZyb20gJ0Bzd2ltbGFuZS9uZ3gtY2hhcnRzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTW9uaXRvcmluZ0FwcEdlbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL21ldGFkYXRhL2RlY29yYXRvcnMnO1xuaW1wb3J0IHtcbiAgQ2hhcnREYXRhTW9kZWwsXG4gIENoYXJ0SW5wdXRTaW5nbGUsXG4gIENoYXJ0SW5wdXRTdHJlYW1WYXIsXG59IGZyb20gJy4uL0NoYXJ0RGF0YU1vZGVsJztcbmltcG9ydCB7IE9uQ2hhcnRTZWxlY3RFdmVudCB9IGZyb20gJy4uL3NoYXJlZC10eXBlcyc7XG5pbXBvcnQgeyBUYXBWYXJpYWJsZURhdGFQb3B1cENvbXBvbmVudCB9IGZyb20gJy4uL3RhcC12YXJpYWJsZS1kYXRhLXBvcHVwL3RhcC12YXJpYWJsZS1kYXRhLXBvcHVwLmNvbXBvbmVudCc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgaXQgd2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIGFzIGl0J3Mgbm90IHZlcnkgdXNlZnVsbFxuICovXG5ATW9uaXRvcmluZ0FwcEdlbkNvbXBvbmVudCh7XG4gIGNvbnN0cmFpbnRzOiB7XG4gICAgaXNOdW1iZXI6ICdZRVMnLFxuICB9LFxufSlcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RhcC12YXJpYWJsZS1udW1iZXItY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFwLXZhcmlhYmxlLW51bWJlci1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhcC12YXJpYWJsZS1udW1iZXItY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRhcFZhcmlhYmxlTnVtYmVyQ2hhcnRDb21wb25lbnRcbiAgZXh0ZW5kcyBOdW1iZXJDYXJkQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIEBJbnB1dCgpXG4gIHNob3dEZXRhaWxzID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgY2FyZENvbG9yID0gJyMyMzI4MzcnO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dFeHBvcnRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBleHBvcnRlZEZpbGVOYW1lPzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBsYWJlbChpbmRleE9yQXJyYXk6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHwgRnVuY3Rpb24pIHtcbiAgICB0aGlzLmNoYXJ0TW9kZWwuaW5pdExhYmVsKGluZGV4T3JBcnJheSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBjb2xvclNjaGVtZSA9IHtcbiAgICBkb21haW46IFtcbiAgICAgICcjNUFBNDU0JyxcbiAgICAgICcjRTQ0RDI1JyxcbiAgICAgICcjQ0ZDMEJCJyxcbiAgICAgICcjN2FhM2U1JyxcbiAgICAgICcjYTgzODVkJyxcbiAgICAgICcjYWFlM2Y1JyxcbiAgICAgICcjNURBREUyJyxcbiAgICAgICcjOUI1OUI2JyxcbiAgICAgICcjRjM5QzEyJyxcbiAgICAgICcjNUFBNDU0JyxcbiAgICAgICcjQTEwQTI4JyxcbiAgICAgICcjQzdCNDJDJyxcbiAgICAgICcjQUFBQUFBJyxcbiAgICBdLFxuICB9O1xuXG4gIEBJbnB1dCgpXG4gIHNldCB2YXJpYWJsZShcbiAgICB2YXJpYWJsZU9yQXJyYXk6IEFic3RyYWN0VmFyaWFibGU8bnVtYmVyIHwgbnVtYmVyW10+IHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuaW5wdXQgPSB0aGlzLmNoYXJ0TW9kZWwuaW5pdFZhcmlhYmxlKHZhcmlhYmxlT3JBcnJheSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgaW5wdXQoaW5wdXRzOiBDaGFydElucHV0U3RyZWFtVmFyW10pIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuY2hhcnRNb2RlbFxuICAgICAgLmRlZmluZUlucHV0U3RyZWFtU2luZ2xlKGlucHV0cywgZmFsc2UsIDApXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IENoYXJ0SW5wdXRTaW5nbGVbXSkgPT4ge1xuICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcmVzdWx0IGFzIENoYXJ0SW5wdXRTaW5nbGVbXSkge1xuICAgICAgICAgIGlmICghdGhpcy5yZXN1bHRzW2luZGV4XSkge1xuICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgIT09IHRoaXMucmVzdWx0c1tpbmRleF0udmFsdWUpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzID0gcmVzdWx0IGFzIENoYXJ0SW5wdXRTaW5nbGVbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXN1bHRzID0gcmVzdWx0IGFzIENoYXJ0SW5wdXRTaW5nbGVbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2l6ZUNvbXBvbmVudCgpO1xuICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICB9KTtcbiAgfVxuXG4gIHJlc3VsdHM6IENoYXJ0SW5wdXRTaW5nbGVbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiAnLS0tJyxcbiAgICAgIHZhbHVlOiAwLFxuICAgICAgZXh0cmE6IDAsXG4gICAgfSxcbiAgXTtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICBpbm5lcldpZHRoITogbnVtYmVyO1xuICBpbm5lckhlaWdodD86IG51bWJlcjtcbiAgbG9hZGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBjaGFydE1vZGVsOiBDaGFydERhdGFNb2RlbCA9IG5ldyBDaGFydERhdGFNb2RlbCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG15Q2hhcnRFbGVtZW50OiBFbGVtZW50UmVmPGFueT4sXG4gICAgem9uZTogTmdab25lLFxuICAgIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwbGF0Zm9ybUlkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBtb2RhbENvbnRyb2xsZXI6IE1vZGFsQ29udHJvbGxlclxuICApIHtcbiAgICBzdXBlcihteUNoYXJ0RWxlbWVudCwgem9uZSwgY2QsIHBsYXRmb3JtSWQpO1xuICB9XG5cbiAgb25TZWxlY3QoZXZlbnQ6IE9uQ2hhcnRTZWxlY3RFdmVudCkge1xuICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodGhpcy5zaG93RGV0YWlscykge1xuICAgICAgICB0aGlzLmNoYXJ0TW9kZWxcbiAgICAgICAgICAuc2hvd0RldGFpbChcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgdGhpcy5tb2RhbENvbnRyb2xsZXIsXG4gICAgICAgICAgICBUYXBWYXJpYWJsZURhdGFQb3B1cENvbXBvbmVudFxuICAgICAgICAgIClcbiAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2hvdyB2YWx1ZSBkZXRhaWwnLCBlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmlubmVyV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICB0aGlzLnJlc2l6ZUNvbXBvbmVudCgpO1xuICB9XG5cbiAgcmVzaXplQ29tcG9uZW50KCkge1xuICAgIGlmICh0aGlzLmlubmVyV2lkdGggPD0gNDAwKSB7XG4gICAgICB0aGlzLmlubmVyV2lkdGggPSA0MDA7XG4gICAgfVxuICAgIHRoaXMuaW5uZXJIZWlnaHQgPSAoMTUwICogdGhpcy5yZXN1bHRzLmxlbmd0aCkgLyAodGhpcy5pbm5lcldpZHRoIC8gMzAwKTtcbiAgICBpZiAodGhpcy5yZXN1bHRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy5pbm5lckhlaWdodCA9IDE1MDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuaW5uZXJIZWlnaHQgPD0gMjEwKSB7XG4gICAgICAgIHRoaXMuaW5uZXJIZWlnaHQgPSAyMTA7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gIG9uUmVzaXplKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmlubmVyV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICB0aGlzLnJlc2l6ZUNvbXBvbmVudCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jaGFydE1vZGVsLmRlc3Ryb3lDdXJyZW50U3ViKCk7XG4gIH1cbn1cbiIsIjxkaXYgI2NvbnRhaW5lclJlZiBzdHlsZT1cIndpZHRoOiAxMDAlOyBvdmVyZmxvdzogYXV0bzsgcG9zaXRpb246IHJlbGF0aXZlXCI+XG4gIDxuZ3gtY2hhcnRzLW51bWJlci1jYXJkXG4gICAgI2NoYXJ0c1xuICAgIFt2aWV3XT1cIltjb250YWluZXJSZWYub2Zmc2V0V2lkdGgsIGlubmVySGVpZ2h0XVwiXG4gICAgW3NjaGVtZV09XCJjb2xvclNjaGVtZVwiXG4gICAgW3Jlc3VsdHNdPVwicmVzdWx0c1wiXG4gICAgW2NhcmRDb2xvcl09XCJjYXJkQ29sb3JcIlxuICAgIChzZWxlY3QpPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gID5cbiAgPC9uZ3gtY2hhcnRzLW51bWJlci1jYXJkPlxuICA8aW9uLWZhYi1idXR0b25cbiAgICBpZD1cImV4cG9ydEZhYkJ1dHRvblwiXG4gICAgc2l6ZT1cInNtYWxsXCJcbiAgICB0YXBFeHBvcnREYXRhXG4gICAgKm5nSWY9XCJzaG93RXhwb3J0QnV0dG9uXCJcbiAgICBbZXhwb3J0ZWRGaWxlTmFtZV09XCJleHBvcnRlZEZpbGVOYW1lXCJcbiAgICBbZGF0YVRvRXhwb3J0XT1cInJlc3VsdHNcIlxuICA+XG4gICAgPGlvbi1pY29uIG5hbWU9XCJkb3dubG9hZFwiPjwvaW9uLWljb24+XG4gIDwvaW9uLWZhYi1idXR0b24+XG48L2Rpdj5cbiJdfQ==