@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
162 lines • 26.1 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, } from '@angular/core';
import { ModalController } from '@ionic/angular';
import { ColumnMode } from '@swimlane/ngx-datatable';
import { BehaviorSubject, Subject, combineLatest } from 'rxjs';
import { switchMap, takeUntil } from 'rxjs/operators';
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-datatable";
import * as i4 from "../../ui-directive/export-data.directive";
const TABLE_LIMIT = 10;
let TapVariableTableComponent = class TapVariableTableComponent {
set history(enable) {
this._history.next(enable);
}
set valueCountLimit(limit) {
if (limit === undefined) {
limit = 30;
}
this._valueCountLimit.next(limit);
}
set label(indexOrArray) {
this.chartModel.initLabel(indexOrArray);
}
set variable(variableOrArray) {
this.multiple = !!Array.isArray(variableOrArray);
this.input = this.chartModel.initVariable(variableOrArray);
}
set input(inputs) {
this._input.next(inputs);
}
columnsPushForEachKey(key) {
console.log('DEBUG columnsPushForEachKey', key, this.columns);
if (this.history && key === 'name') {
this.columns.push({
prop: key,
name: !this.nameLabel
? this.history
? 'Time'
: 'Name'
: this.nameLabel,
sortable: true,
});
}
else if (key === 'value') {
this.columns.push({ prop: key, name: this.valueLabel, sortable: true });
}
else if (key !== 'extra') {
this.columns.push({ prop: key, name: key, sortable: true });
}
}
constructor(modalController, cdr) {
this.modalController = modalController;
this.cdr = cdr;
this.rows = [];
this.chartModel = new ChartDataModel();
this.loadingIndicator = true;
this.reorderable = false;
this.columnMode = ColumnMode.force;
this.limit = TABLE_LIMIT;
this.valueLabel = 'Value';
this.showExportButton = false;
this._history = new BehaviorSubject(true);
this._valueCountLimit = new BehaviorSubject(30);
this.destroyed = new Subject();
this._input = new BehaviorSubject([]);
this.multiple = false;
}
createExportedData() {
return this.rows;
}
ngAfterViewInit() {
this.darkModeStatus =
window.matchMedia &&
window.matchMedia('(prefers-color-scheme: dark)').matches;
combineLatest([this._valueCountLimit, this._input, this._history])
.pipe(takeUntil(this.destroyed), switchMap(([valueCountLimit, input, history]) => {
this.chartModel.destroyCurrentSub();
if (this.multiple) {
return this.chartModel.defineMultiInputStream(input);
}
else {
return this.chartModel.defineInputStreamSingle(input, history, valueCountLimit, true);
}
}))
.subscribe((result) => {
this.resultToTableData(result);
});
}
resultToTableData(result) {
this.rows = result;
this.columns = [];
const jsonData = JSON.parse(JSON.stringify(this.rows[0]));
for (const key of Object.keys(jsonData)) {
if (key === 'series') {
jsonData['series'].forEach((k) => this.columnsPushForEachKey(k.name));
}
else {
this.columnsPushForEachKey(key);
}
}
this.loadingIndicator = false;
this.cdr.detectChanges();
}
onSelect(event) {
if (typeof event === 'object') {
this.chartModel
.showDetail(event, this.modalController, TapVariableDataPopupComponent)
.catch((err) => {
console.warn(err);
});
}
}
ngOnDestroy() {
this.chartModel.destroyCurrentSub();
this.destroyed.next();
this.destroyed.complete();
}
};
/** @nocollapse */ TapVariableTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapVariableTableComponent, deps: [{ token: i1.ModalController }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TapVariableTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TapVariableTableComponent, selector: "tap-variable-table", inputs: { loadingIndicator: "loadingIndicator", reorderable: "reorderable", columnMode: "columnMode", limit: "limit", valueLabel: "valueLabel", nameLabel: "nameLabel", history: "history", valueCountLimit: "valueCountLimit", showExportButton: "showExportButton", exportedFileName: "exportedFileName", label: "label", variable: "variable", input: "input" }, ngImport: i0, template: "<div style=\"position: relative\">\n <ngx-datatable\n [ngClass]=\"darkModeStatus ? 'dark' : 'material'\"\n [rows]=\"rows\"\n [loadingIndicator]=\"loadingIndicator\"\n [columns]=\"columns\"\n [columnMode]=\"columnMode\"\n [headerHeight]=\"50\"\n [footerHeight]=\"50\"\n [rowHeight]=\"50\"\n [reorderable]=\"reorderable\"\n [scrollbarH]=\"true\"\n [limit]=\"limit\"\n >\n </ngx-datatable>\n <!--\n [targetMarkerTemplate]=\"targetMarkerTemplate\"\n <ng-template #targetMarkerTemplate let-class=\"class\">\n <div [ngClass]=\"class\">\n <div class=\"icon datatable-icon-down\"></div>\n <div class=\"icon datatable-icon-up\"></div>\n </div>\n </ng-template>\n -->\n\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n [dataToExport]=\"createExportedData.bind(this)\"\n [exportedFileName]=\"exportedFileName\"\n *ngIf=\"showExportButton\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n</div>\n", styles: [":host ::ng-deep .datatable-scroll{width:100%!important}:host ::ng-deep datatable-pager{width:85%!important}#exportFabButton{position:absolute;top:0;right:2px}:host ::ng-deep .page-count{white-space:nowrap!important}:host ::ng-deep .datatable-pager{max-width:85%!important}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.DatatableComponent, selector: "ngx-datatable", inputs: ["targetMarkerTemplate", "rows", "groupRowsBy", "groupedRows", "columns", "selected", "scrollbarV", "scrollbarH", "rowHeight", "columnMode", "headerHeight", "footerHeight", "externalPaging", "externalSorting", "limit", "count", "offset", "loadingIndicator", "selectionType", "reorderable", "swapColumns", "sortType", "sorts", "cssClasses", "messages", "rowClass", "selectCheck", "displayCheck", "groupExpansionDefault", "trackByProp", "selectAllRowsOnPage", "virtualization", "treeFromRelation", "treeToRelation", "summaryRow", "summaryHeight", "summaryPosition", "rowIdentity"], outputs: ["scroll", "activate", "select", "sort", "page", "reorder", "resize", "tableContextmenu", "treeAction"] }, { 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 });
TapVariableTableComponent = __decorate([
MonitoringAppGenComponent({}),
__metadata("design:paramtypes", [ModalController,
ChangeDetectorRef])
], TapVariableTableComponent);
export { TapVariableTableComponent };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapVariableTableComponent, decorators: [{
type: Component,
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'tap-variable-table', template: "<div style=\"position: relative\">\n <ngx-datatable\n [ngClass]=\"darkModeStatus ? 'dark' : 'material'\"\n [rows]=\"rows\"\n [loadingIndicator]=\"loadingIndicator\"\n [columns]=\"columns\"\n [columnMode]=\"columnMode\"\n [headerHeight]=\"50\"\n [footerHeight]=\"50\"\n [rowHeight]=\"50\"\n [reorderable]=\"reorderable\"\n [scrollbarH]=\"true\"\n [limit]=\"limit\"\n >\n </ngx-datatable>\n <!--\n [targetMarkerTemplate]=\"targetMarkerTemplate\"\n <ng-template #targetMarkerTemplate let-class=\"class\">\n <div [ngClass]=\"class\">\n <div class=\"icon datatable-icon-down\"></div>\n <div class=\"icon datatable-icon-up\"></div>\n </div>\n </ng-template>\n -->\n\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n [dataToExport]=\"createExportedData.bind(this)\"\n [exportedFileName]=\"exportedFileName\"\n *ngIf=\"showExportButton\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n</div>\n", styles: [":host ::ng-deep .datatable-scroll{width:100%!important}:host ::ng-deep datatable-pager{width:85%!important}#exportFabButton{position:absolute;top:0;right:2px}:host ::ng-deep .page-count{white-space:nowrap!important}:host ::ng-deep .datatable-pager{max-width:85%!important}\n"] }]
}], ctorParameters: function () { return [{ type: i1.ModalController }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { loadingIndicator: [{
type: Input
}], reorderable: [{
type: Input
}], columnMode: [{
type: Input
}], limit: [{
type: Input
}], valueLabel: [{
type: Input
}], nameLabel: [{
type: Input
}], history: [{
type: Input
}], valueCountLimit: [{
type: Input
}], showExportButton: [{
type: Input
}], exportedFileName: [{
type: Input
}], label: [{
type: Input
}], variable: [{
type: Input
}], input: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy90YXAtdmFyaWFibGUtdGFibGUvdGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy90YXAtdmFyaWFibGUtdGFibGUvdGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEUsT0FBTyxFQUNMLGNBQWMsR0FJZixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDOzs7Ozs7QUFFN0csTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBU2hCLElBQU0seUJBQXlCLEdBQS9CLE1BQU0seUJBQXlCO0lBMEJwQyxJQUNJLE9BQU8sQ0FBQyxNQUFlO1FBQ3pCLElBQUksQ0FBQyxRQUFR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ckM7U0FsS1kseUJBQXlCOzRGQUF6Qix5QkFBeUI7a0JBTnJDLFNBQVM7c0NBQ1MsdUJBQXVCLENBQUMsTUFBTSxZQUNyQyxvQkFBb0I7c0lBYTlCLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLFdBQVc7c0JBRFYsS0FBSztnQkFJTixVQUFVO3NCQURULEtBQUs7Z0JBSU4sS0FBSztzQkFESixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSUYsT0FBTztzQkFEVixLQUFLO2dCQU1GLGVBQWU7c0JBRGxCLEtBQUs7Z0JBU04sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSUYsS0FBSztzQkFEUixLQUFLO2dCQWdCRixRQUFRO3NCQURYLEtBQUs7Z0JBWUYsS0FBSztzQkFEUixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgQWJzdHJhY3RWYXJpYWJsZSB9IGZyb20gJ0Bpb3RpemUvdGFwL2RhdGEnO1xuaW1wb3J0IHsgQ29sdW1uTW9kZSB9IGZyb20gJ0Bzd2ltbGFuZS9uZ3gtZGF0YXRhYmxlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNb25pdG9yaW5nQXBwR2VuQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbWV0YWRhdGEvZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBDaGFydERhdGFNb2RlbCxcbiAgQ2hhcnRJbnB1dFNpbmdsZSxcbiAgQ2hhcnRJbnB1dFN0cmVhbVZhcixcbiAgQ2hhcnRJbnB1dFRhYmxlLFxufSBmcm9tICcuLi9DaGFydERhdGFNb2RlbCc7XG5pbXBvcnQgeyBPbkNoYXJ0U2VsZWN0RXZlbnQgfSBmcm9tICcuLi9zaGFyZWQtdHlwZXMnO1xuaW1wb3J0IHsgVGFwVmFyaWFibGVEYXRhUG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi90YXAtdmFyaWFibGUtZGF0YS1wb3B1cC90YXAtdmFyaWFibGUtZGF0YS1wb3B1cC5jb21wb25lbnQnO1xuXG5jb25zdCBUQUJMRV9MSU1JVCA9IDEwO1xuXG5ATW9uaXRvcmluZ0FwcEdlbkNvbXBvbmVudCh7fSlcbkBDb21wb25lbnQoe1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc2VsZWN0b3I6ICd0YXAtdmFyaWFibGUtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhcFZhcmlhYmxlVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICByb3dzOiBDaGFydElucHV0U2luZ2xlW10gfCBDaGFydElucHV0VGFibGVbXSA9IFtdO1xuXG4gIGNvbHVtbnMhOiBhbnlbXTtcbiAgZGFya01vZGVTdGF0dXM/OiBib29sZWFuO1xuXG4gIHByaXZhdGUgY2hhcnRNb2RlbDogQ2hhcnREYXRhTW9kZWwgPSBuZXcgQ2hhcnREYXRhTW9kZWwoKTtcblxuICBASW5wdXQoKVxuICBsb2FkaW5nSW5kaWNhdG9yID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICByZW9yZGVyYWJsZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGNvbHVtbk1vZGUgPSBDb2x1bW5Nb2RlLmZvcmNlO1xuXG4gIEBJbnB1dCgpXG4gIGxpbWl0OiBudW1iZXIgPSBUQUJMRV9MSU1JVDtcblxuICBASW5wdXQoKVxuICB2YWx1ZUxhYmVsID0gJ1ZhbHVlJztcblxuICBASW5wdXQoKVxuICBuYW1lTGFiZWw/OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgc2V0IGhpc3RvcnkoZW5hYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faGlzdG9yeS5uZXh0KGVuYWJsZSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgdmFsdWVDb3VudExpbWl0KGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobGltaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGltaXQgPSAzMDtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWVDb3VudExpbWl0Lm5leHQobGltaXQpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2hvd0V4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGV4cG9ydGVkRmlsZU5hbWU/OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgc2V0IGxhYmVsKGluZGV4T3JBcnJheTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQgfCBGdW5jdGlvbikge1xuICAgIHRoaXMuY2hhcnRNb2RlbC5pbml0TGFiZWwoaW5kZXhPckFycmF5KTtcbiAgfVxuXG4gIHByaXZhdGUgX2hpc3RvcnkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuXG4gIHByaXZhdGUgX3ZhbHVlQ291bnRMaW1pdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigzMCk7XG5cbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgX2lucHV0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFydElucHV0U3RyZWFtVmFyW10+KFtdKTtcblxuICBwcml2YXRlIG11bHRpcGxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IHZhcmlhYmxlKFxuICAgIHZhcmlhYmxlT3JBcnJheTpcbiAgICAgIHwgQWJzdHJhY3RWYXJpYWJsZTxudW1iZXIgfCBudW1iZXJbXT5cbiAgICAgIHwgQWJzdHJhY3RWYXJpYWJsZTxudW1iZXIgfCBudW1iZXJbXT5bXVxuICAgICAgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5tdWx0aXBsZSA9ICEhQXJyYXkuaXNBcnJheSh2YXJpYWJsZU9yQXJyYXkpO1xuICAgIHRoaXMuaW5wdXQgPSB0aGlzLmNoYXJ0TW9kZWwuaW5pdFZhcmlhYmxlKHZhcmlhYmxlT3JBcnJheSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgaW5wdXQoaW5wdXRzOiBDaGFydElucHV0U3RyZWFtVmFyW10pIHtcbiAgICB0aGlzLl9pbnB1dC5uZXh0KGlucHV0cyk7XG4gIH1cblxuICBjb2x1bW5zUHVzaEZvckVhY2hLZXkoa2V5OiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmxvZygnREVCVUcgY29sdW1uc1B1c2hGb3JFYWNoS2V5Jywga2V5LCB0aGlzLmNvbHVtbnMpO1xuICAgIGlmICh0aGlzLmhpc3RvcnkgJiYga2V5ID09PSAnbmFtZScpIHtcbiAgICAgIHRoaXMuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgcHJvcDoga2V5LFxuICAgICAgICBuYW1lOiAhdGhpcy5uYW1lTGFiZWxcbiAgICAgICAgICA/IHRoaXMuaGlzdG9yeVxuICAgICAgICAgICAgPyAnVGltZSdcbiAgICAgICAgICAgIDogJ05hbWUnXG4gICAgICAgICAgOiB0aGlzLm5hbWVMYWJlbCxcbiAgICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3ZhbHVlJykge1xuICAgICAgdGhpcy5jb2x1bW5zLnB1c2goeyBwcm9wOiBrZXksIG5hbWU6IHRoaXMudmFsdWVMYWJlbCwgc29ydGFibGU6IHRydWUgfSk7XG4gICAgfSBlbHNlIGlmIChrZXkgIT09ICdleHRyYScpIHtcbiAgICAgIHRoaXMuY29sdW1ucy5wdXNoKHsgcHJvcDoga2V5LCBuYW1lOiBrZXksIHNvcnRhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtb2RhbENvbnRyb2xsZXI6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIGNyZWF0ZUV4cG9ydGVkRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGFya01vZGVTdGF0dXMgPVxuICAgICAgd2luZG93Lm1hdGNoTWVkaWEgJiZcbiAgICAgIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcztcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLl92YWx1ZUNvdW50TGltaXQsIHRoaXMuX2lucHV0LCB0aGlzLl9oaXN0b3J5XSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpLFxuICAgICAgICBzd2l0Y2hNYXAoKFt2YWx1ZUNvdW50TGltaXQsIGlucHV0LCBoaXN0b3J5XSkgPT4ge1xuICAgICAgICAgIHRoaXMuY2hhcnRNb2RlbC5kZXN0cm95Q3VycmVudFN1YigpO1xuICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFydE1vZGVsLmRlZmluZU11bHRpSW5wdXRTdHJlYW0oaW5wdXQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFydE1vZGVsLmRlZmluZUlucHV0U3RyZWFtU2luZ2xlKFxuICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgICAgICAgdmFsdWVDb3VudExpbWl0LFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICB0aGlzLnJlc3VsdFRvVGFibGVEYXRhKHJlc3VsdCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHJlc3VsdFRvVGFibGVEYXRhKHJlc3VsdDogYW55KSB7XG4gICAgdGhpcy5yb3dzID0gcmVzdWx0O1xuICAgIHRoaXMuY29sdW1ucyA9IFtdO1xuICAgIGNvbnN0IGpzb25EYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnJvd3NbMF0pKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhqc29uRGF0YSkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdzZXJpZXMnKSB7XG4gICAgICAgIGpzb25EYXRhWydzZXJpZXMnXS5mb3JFYWNoKChrOiB7IG5hbWU6IHN0cmluZyB9KSA9PlxuICAgICAgICAgIHRoaXMuY29sdW1uc1B1c2hGb3JFYWNoS2V5KGsubmFtZSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29sdW1uc1B1c2hGb3JFYWNoS2V5KGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubG9hZGluZ0luZGljYXRvciA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG9uU2VsZWN0KGV2ZW50OiBPbkNoYXJ0U2VsZWN0RXZlbnQpIHtcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5jaGFydE1vZGVsXG4gICAgICAgIC5zaG93RGV0YWlsKGV2ZW50LCB0aGlzLm1vZGFsQ29udHJvbGxlciwgVGFwVmFyaWFibGVEYXRhUG9wdXBDb21wb25lbnQpXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnRNb2RlbC5kZXN0cm95Q3VycmVudFN1YigpO1xuICAgIHRoaXMuZGVzdHJveWVkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCI8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlXCI+XG4gIDxuZ3gtZGF0YXRhYmxlXG4gICAgW25nQ2xhc3NdPVwiZGFya01vZGVTdGF0dXMgPyAnZGFyaycgOiAnbWF0ZXJpYWwnXCJcbiAgICBbcm93c109XCJyb3dzXCJcbiAgICBbbG9hZGluZ0luZGljYXRvcl09XCJsb2FkaW5nSW5kaWNhdG9yXCJcbiAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcbiAgICBbY29sdW1uTW9kZV09XCJjb2x1bW5Nb2RlXCJcbiAgICBbaGVhZGVySGVpZ2h0XT1cIjUwXCJcbiAgICBbZm9vdGVySGVpZ2h0XT1cIjUwXCJcbiAgICBbcm93SGVpZ2h0XT1cIjUwXCJcbiAgICBbcmVvcmRlcmFibGVdPVwicmVvcmRlcmFibGVcIlxuICAgIFtzY3JvbGxiYXJIXT1cInRydWVcIlxuICAgIFtsaW1pdF09XCJsaW1pdFwiXG4gID5cbiAgPC9uZ3gtZGF0YXRhYmxlPlxuICA8IS0tXG4gICAgICAgIFt0YXJnZXRNYXJrZXJUZW1wbGF0ZV09XCJ0YXJnZXRNYXJrZXJUZW1wbGF0ZVwiXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjdGFyZ2V0TWFya2VyVGVtcGxhdGUgbGV0LWNsYXNzPVwiY2xhc3NcIj5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cImNsYXNzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvbiBkYXRhdGFibGUtaWNvbi1kb3duXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvbiBkYXRhdGFibGUtaWNvbi11cFwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIC0tPlxuXG4gIDxpb24tZmFiLWJ1dHRvblxuICAgIGlkPVwiZXhwb3J0RmFiQnV0dG9uXCJcbiAgICBzaXplPVwic21hbGxcIlxuICAgIHRhcEV4cG9ydERhdGFcbiAgICBbZGF0YVRvRXhwb3J0XT1cImNyZWF0ZUV4cG9ydGVkRGF0YS5iaW5kKHRoaXMpXCJcbiAgICBbZXhwb3J0ZWRGaWxlTmFtZV09XCJleHBvcnRlZEZpbGVOYW1lXCJcbiAgICAqbmdJZj1cInNob3dFeHBvcnRCdXR0b25cIlxuICA+XG4gICAgPGlvbi1pY29uIG5hbWU9XCJkb3dubG9hZFwiPjwvaW9uLWljb24+XG4gIDwvaW9uLWZhYi1idXR0b24+XG48L2Rpdj5cbiJdfQ==