@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
150 lines • 25.9 kB
JavaScript
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 { 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";
export class BarChartStackedComponent 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;
colorScheme = {
domain: [
'#5DADE2',
'#9B59B6',
'#F39C12',
'#5AA454',
'#A10A28',
'#C7B42C',
'#AAAAAA',
],
};
orientation = 'vertical';
showDetails = false;
noBarWhenZero = false;
showXAxis = true;
showYAxis = true;
history = false;
valueCountLimit = 10;
set label(indexOrArray) {
this.chartModel.initLabel(indexOrArray);
}
set data(results) {
this.results = results;
}
results = [
{
name: '---',
series: [
{
name: '---',
value: 0,
extra: 0,
},
],
},
];
scrollableChart = false;
widthChart;
heightChart;
chartModel = new ChartDataModel();
subscription;
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: BarChartStackedComponent, 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: BarChartStackedComponent, selector: "iotize-dashboard-bar-chart-stacked", inputs: { orientation: "orientation", showDetails: "showDetails", noBarWhenZero: "noBarWhenZero", showXAxis: "showXAxis", showYAxis: "showYAxis", history: "history", valueCountLimit: "valueCountLimit", label: "label", 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-stacked\n *ngSwitchCase=\"'horizontal'\"\n #barChartHor\n [view]=\"[containerRef.offsetWidth, containerRef.offsetHeight]\"\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [legend]=\"legend\"\n [legendPosition]=\"legendPosition\"\n [xAxis]=\"showXAxis\"\n [noBarWhenZero]=\"noBarWhenZero\"\n [yAxis]=\"showYAxis\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-bar-horizontal-stacked>\n <ngx-charts-bar-vertical-stacked\n *ngSwitchCase=\"'vertical'\"\n #barChartVer\n [view]=\"[containerRef.offsetWidth, containerRef.offsetHeight]\"\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [legend]=\"legend\"\n [legendPosition]=\"legendPosition\"\n [noBarWhenZero]=\"noBarWhenZero\"\n [xAxis]=\"showXAxis\"\n [yAxis]=\"showYAxis\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-bar-vertical-stacked>\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.BarHorizontalStackedComponent, selector: "ngx-charts-bar-horizontal-stacked", inputs: ["legend", "legendTitle", "legendPosition", "xAxis", "yAxis", "showXAxisLabel", "showYAxisLabel", "xAxisLabel", "yAxisLabel", "tooltipDisabled", "gradient", "showGridLines", "activeEntries", "schemeType", "trimXAxisTicks", "trimYAxisTicks", "rotateXAxisTicks", "maxXAxisTickLength", "maxYAxisTickLength", "xAxisTickFormatting", "yAxisTickFormatting", "xAxisTicks", "yAxisTicks", "barPadding", "roundDomains", "xScaleMax", "showDataLabel", "dataLabelFormatting", "noBarWhenZero", "wrapTicks"], outputs: ["activate", "deactivate"] }, { kind: "component", type: i3.BarVerticalStackedComponent, selector: "ngx-charts-bar-vertical-stacked", inputs: ["legend", "legendTitle", "legendPosition", "xAxis", "yAxis", "showXAxisLabel", "showYAxisLabel", "xAxisLabel", "yAxisLabel", "tooltipDisabled", "gradient", "showGridLines", "activeEntries", "schemeType", "trimXAxisTicks", "trimYAxisTicks", "rotateXAxisTicks", "maxXAxisTickLength", "maxYAxisTickLength", "xAxisTickFormatting", "yAxisTickFormatting", "xAxisTicks", "yAxisTicks", "barPadding", "roundDomains", "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 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BarChartStackedComponent, decorators: [{
type: Component,
args: [{ selector: 'iotize-dashboard-bar-chart-stacked', 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-stacked\n *ngSwitchCase=\"'horizontal'\"\n #barChartHor\n [view]=\"[containerRef.offsetWidth, containerRef.offsetHeight]\"\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [legend]=\"legend\"\n [legendPosition]=\"legendPosition\"\n [xAxis]=\"showXAxis\"\n [noBarWhenZero]=\"noBarWhenZero\"\n [yAxis]=\"showYAxis\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-bar-horizontal-stacked>\n <ngx-charts-bar-vertical-stacked\n *ngSwitchCase=\"'vertical'\"\n #barChartVer\n [view]=\"[containerRef.offsetWidth, containerRef.offsetHeight]\"\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [legend]=\"legend\"\n [legendPosition]=\"legendPosition\"\n [noBarWhenZero]=\"noBarWhenZero\"\n [xAxis]=\"showXAxis\"\n [yAxis]=\"showYAxis\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-bar-vertical-stacked>\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']
}], orientation: [{
type: Input
}], showDetails: [{
type: Input
}], noBarWhenZero: [{
type: Input
}], showXAxis: [{
type: Input
}], showYAxis: [{
type: Input
}], history: [{
type: Input
}], valueCountLimit: [{
type: Input
}], label: [{
type: Input
}], data: [{
type: Input
}], scrollableChart: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LXN0YWNrZWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW90aXplLWlvbmljL21vbml0b3Jpbmcvc3JjL2xpYi91aS1jb21wb25lbnRzL2Jhci1jaGFydC1zdGFja2VkL2Jhci1jaGFydC1zdGFja2VkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy9iYXItY2hhcnQtc3RhY2tlZC9iYXItY2hhcnQtc3RhY2tlZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUVOLFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsY0FBYyxFQUFtQixNQUFNLG1CQUFtQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTFELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDOzs7Ozs7QUFRN0csTUFBTSxPQUFPLHdCQUNYLFNBQVEsa0JBQWtCO0lBWWpCO0lBVGtCLFlBQVksQ0FBYztJQUMzQixXQUFXLENBQTRCO0lBQ3ZDLFdBQVcsQ0FBMEI7SUFFL0QsWUFDRSxjQUErQixFQUMvQixJQUFZLEVBQ1osRUFBcUIsRUFDQSxVQUFrQixFQUNo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QUFoQixLQUFLO2dCQWlCRyxlQUFlO3NCQUF2QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBQTEFURk9STV9JRCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGFsQ29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7XG4gIEJhckhvcml6b250YWwyRENvbXBvbmVudCxcbiAgQmFyVmVydGljYWwyRENvbXBvbmVudCxcbiAgQmFzZUNoYXJ0Q29tcG9uZW50LFxuICBMZWdlbmRQb3NpdGlvbixcbn0gZnJvbSAnQHN3aW1sYW5lL25neC1jaGFydHMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGFydERhdGFNb2RlbCwgQ2hhcnRJbnB1dE11dGxpIH0gZnJvbSAnLi4vQ2hhcnREYXRhTW9kZWwnO1xuaW1wb3J0IHsgZGF0YVdpdGhTZXJpZXNUb0NzdiB9IGZyb20gJy4uL0V4cG9ydERhdGFGb3JtYXQnO1xuaW1wb3J0IHsgT25DaGFydFNlbGVjdEV2ZW50IH0gZnJvbSAnLi4vc2hhcmVkLXR5cGVzJztcbmltcG9ydCB7IFRhcFZhcmlhYmxlRGF0YVBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFwLXZhcmlhYmxlLWRhdGEtcG9wdXAvdGFwLXZhcmlhYmxlLWRhdGEtcG9wdXAuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaW90aXplLWRhc2hib2FyZC1iYXItY2hhcnQtc3RhY2tlZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9iYXItY2hhcnQtc3RhY2tlZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Jhci1jaGFydC1zdGFja2VkLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBCYXJDaGFydFN0YWNrZWRDb21wb25lbnRcbiAgZXh0ZW5kcyBCYXNlQ2hhcnRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3lcbntcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyUmVmJykgZGl2Q29udGFpbmVyITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnYmFyQ2hhcnRIb3InKSBiYXJDaGFydEhvciE6IEJhckhvcml6b250YWwyRENvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnYmFyQ2hhcnRWZXInKSBiYXJDaGFydFZlciE6IEJhclZlcnRpY2FsMkRDb21wb25lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbXlDaGFydEVsZW1lbnQ6IEVsZW1lbnRSZWY8YW55PixcbiAgICB6b25lOiBOZ1pvbmUsXG4gICAgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgbW9kYWxDb250cm9sbGVyOiBNb2RhbENvbnRyb2xsZXJcbiAgKSB7XG4gICAgc3VwZXIobXlDaGFydEVsZW1lbnQsIHpvbmUsIGNkLCBwbGF0Zm9ybUlkKTtcbiAgfVxuXG4gIGxlZ2VuZFBvc2l0aW9uOiBMZWdlbmRQb3NpdGlvbiA9IExlZ2VuZFBvc2l0aW9uLkJlbG93O1xuXG4gIHNob3dFeHBvcnRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBleHBvcnRlZEZpbGVOYW1lPzogc3RyaW5nO1xuXG4gIGxlZ2VuZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29sb3JTY2hlbWUgPSB7XG4gICAgZG9tYWluOiBbXG4gICAgICAnIzVEQURFMicsXG4gICAgICAnIzlCNTlCNicsXG4gICAgICAnI0YzOUMxMicsXG4gICAgICAnIzVBQTQ1NCcsXG4gICAgICAnI0ExMEEyOCcsXG4gICAgICAnI0M3QjQyQycsXG4gICAgICAnI0FBQUFBQScsXG4gICAgXSxcbiAgfTtcblxuICBASW5wdXQoKVxuICBvcmllbnRhdGlvbjogc3RyaW5nID0gJ3ZlcnRpY2FsJztcblxuICBASW5wdXQoKVxuICBzaG93RGV0YWlsczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIG5vQmFyV2hlblplcm86IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzaG93WEF4aXMgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dZQXhpcyA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgaGlzdG9yeTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHZhbHVlQ291bnRMaW1pdCA9IDEwO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBsYWJlbChpbmRleE9yQXJyYXk6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHwgRnVuY3Rpb24pIHtcbiAgICB0aGlzLmNoYXJ0TW9kZWwuaW5pdExhYmVsKGluZGV4T3JBcnJheSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGF0YShyZXN1bHRzOiBDaGFydElucHV0TXV0bGlbXSkge1xuICAgIHRoaXMucmVzdWx0cyA9IHJlc3VsdHM7XG4gIH1cblxuICByZXN1bHRzOiBDaGFydElucHV0TXV0bGlbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiAnLS0tJyxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJy0tLScsXG4gICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgZXh0cmE6IDAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIF07XG5cbiAgQElucHV0KCkgc2Nyb2xsYWJsZUNoYXJ0ID0gZmFsc2U7XG5cbiAgd2lkdGhDaGFydD86IG51bWJlcjtcbiAgaGVpZ2h0Q2hhcnQ/OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBjaGFydE1vZGVsOiBDaGFydERhdGFNb2RlbCA9IG5ldyBDaGFydERhdGFNb2RlbCgpO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gIGNyZWF0ZUV4cG9ydGVkRGF0YSgpIHtcbiAgICByZXR1cm4gZGF0YVdpdGhTZXJpZXNUb0Nzdih0aGlzLnJlc3VsdHMpO1xuICB9XG5cbiAgb25TZWxlY3QoZXZlbnQ6IE9uQ2hhcnRTZWxlY3RFdmVudCkge1xuICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodGhpcy5zaG93RGV0YWlscykge1xuICAgICAgICB0aGlzLmNoYXJ0TW9kZWxcbiAgICAgICAgICAuc2hvd0RldGFpbChcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgdGhpcy5tb2RhbENvbnRyb2xsZXIsXG4gICAgICAgICAgICBUYXBWYXJpYWJsZURhdGFQb3B1cENvbXBvbmVudFxuICAgICAgICAgIClcbiAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNjcm9sbGFibGVDaGFydCkge1xuICAgICAgdGhpcy53aWR0aENoYXJ0ID0gdGhpcy5kaXZDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgIHRoaXMuaGVpZ2h0Q2hhcnQgPSB0aGlzLmRpdkNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICB9XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICByZXNpemVUb1Njcm9sbChzaXplOiBudW1iZXIsIHNlcmllc1NpemU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZGl2Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggPD1cbiAgICAgICAgc2l6ZSAqIDUwICogc2VyaWVzU2l6ZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYmFyQ2hhcnRWZXIudmlldyA9IFtcbiAgICAgICAgICBzaXplICogNTAgKiBzZXJpZXNTaXplLFxuICAgICAgICAgIHRoaXMuZGl2Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0LFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZGl2Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IDw9XG4gICAgICAgIHNpemUgKiA1MCAqIHNlcmllc1NpemVcbiAgICAgICkge1xuICAgICAgICB0aGlzLmJhckNoYXJ0SG9yLnZpZXcgPSBbXG4gICAgICAgICAgdGhpcy5kaXZDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCxcbiAgICAgICAgICBzaXplICogNTAgKiBzZXJpZXNTaXplLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2hhcnRNb2RlbC5kZXN0cm95Q3VycmVudFN1YigpO1xuICB9XG59XG4iLCI8ZGl2XG4gIFtuZ0NsYXNzXT1cIlxuICAgIHNjcm9sbGFibGVDaGFydFxuICAgICAgPyBvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJ1xuICAgICAgICA/ICd2ZXJ0aWNhbENvbnRhaW5lcidcbiAgICAgICAgOiAnaG9yaXpvbnRhbENvbnRhaW5lcidcbiAgICAgIDoge31cbiAgXCJcbj5cbiAgPGRpdlxuICAgICNjb250YWluZXJSZWZcbiAgICBbbmdDbGFzc109XCJcbiAgICAgIGxlZ2VuZFBvc2l0aW9uID09PSAnYmVsb3cnICYmIGxlZ2VuZCA/ICdiZWxvd0xlZ2VuZCcgOiAncmlnaHRMZWdlbmQnXG4gICAgXCJcbiAgICBbbmdTd2l0Y2hdPVwib3JpZW50YXRpb25cIlxuICAgIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlXCJcbiAgPlxuICAgIDxuZ3gtY2hhcnRzLWJhci1ob3Jpem9udGFsLXN0YWNrZWRcbiAgICAgICpuZ1N3aXRjaENhc2U9XCInaG9yaXpvbnRhbCdcIlxuICAgICAgI2JhckNoYXJ0SG9yXG4gICAgICBbdmlld109XCJbY29udGFpbmVyUmVmLm9mZnNldFdpZHRoLCBjb250YWluZXJSZWYub2Zmc2V0SGVpZ2h0XVwiXG4gICAgICBbc2NoZW1lXT1cImNvbG9yU2NoZW1lXCJcbiAgICAgIFtyZXN1bHRzXT1cInJlc3VsdHNcIlxuICAgICAgW2xlZ2VuZF09XCJsZWdlbmRcIlxuICAgICAgW2xlZ2VuZFBvc2l0aW9uXT1cImxlZ2VuZFBvc2l0aW9uXCJcbiAgICAgIFt4QXhpc109XCJzaG93WEF4aXNcIlxuICAgICAgW25vQmFyV2hlblplcm9dPVwibm9CYXJXaGVuWmVyb1wiXG4gICAgICBbeUF4aXNdPVwic2hvd1lBeGlzXCJcbiAgICAgIChzZWxlY3QpPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gICAgPlxuICAgIDwvbmd4LWNoYXJ0cy1iYXItaG9yaXpvbnRhbC1zdGFja2VkPlxuICAgIDxuZ3gtY2hhcnRzLWJhci12ZXJ0aWNhbC1zdGFja2VkXG4gICAgICAqbmdTd2l0Y2hDYXNlPVwiJ3ZlcnRpY2FsJ1wiXG4gICAgICAjYmFyQ2hhcnRWZXJcbiAgICAgIFt2aWV3XT1cIltjb250YWluZXJSZWYub2Zmc2V0V2lkdGgsIGNvbnRhaW5lclJlZi5vZmZzZXRIZWlnaHRdXCJcbiAgICAgIFtzY2hlbWVdPVwiY29sb3JTY2hlbWVcIlxuICAgICAgW3Jlc3VsdHNdPVwicmVzdWx0c1wiXG4gICAgICBbbGVnZW5kXT1cImxlZ2VuZFwiXG4gICAgICBbbGVnZW5kUG9zaXRpb25dPVwibGVnZW5kUG9zaXRpb25cIlxuICAgICAgW25vQmFyV2hlblplcm9dPVwibm9CYXJXaGVuWmVyb1wiXG4gICAgICBbeEF4aXNdPVwic2hvd1hBeGlzXCJcbiAgICAgIFt5QXhpc109XCJzaG93WUF4aXNcIlxuICAgICAgKHNlbGVjdCk9XCJvblNlbGVjdCgkZXZlbnQpXCJcbiAgICA+XG4gICAgPC9uZ3gtY2hhcnRzLWJhci12ZXJ0aWNhbC1zdGFja2VkPlxuICAgIDxpb24tZmFiLWJ1dHRvblxuICAgICAgaWQ9XCJleHBvcnRGYWJCdXR0b25cIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIHRhcEV4cG9ydERhdGFcbiAgICAgICpuZ0lmPVwic2hvd0V4cG9ydEJ1dHRvblwiXG4gICAgICBbZGF0YVRvRXhwb3J0XT1cImNyZWF0ZUV4cG9ydGVkRGF0YS5iaW5kKHRoaXMpXCJcbiAgICAgIFtleHBvcnRlZEZpbGVOYW1lXT1cImV4cG9ydGVkRmlsZU5hbWVcIlxuICAgID5cbiAgICAgIDxpb24taWNvbiBuYW1lPVwiZG93bmxvYWRcIj48L2lvbi1pY29uPlxuICAgIDwvaW9uLWZhYi1idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=