UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

118 lines 20.4 kB
import { Component, Input, Optional } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { BehaviorSubject } from 'rxjs'; import { distinctUntilChanged, filter, map, shareReplay, switchMap } from 'rxjs/operators'; import { DynamicComponentAlert, DynamicComponentComponent, MeasurementRealtimeService, RangeDisplayModule, gettext } from '@c8y/ngx-components'; import { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions'; import { AsyncPipe, NgClass, NgIf } from '@angular/common'; import { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/ngx-components"; import * as i2 from "@c8y/ngx-components/context-dashboard"; export class LinearGaugeWidgetViewComponent { constructor(measurementRealtime, dashboard, dynamicComponent) { this.measurementRealtime = measurementRealtime; this.dashboard = dashboard; this.dynamicComponent = dynamicComponent; this.activeDatapoint$ = new BehaviorSubject(null); const activeDatapoint = this.activeDatapoint$.pipe(filter(dp => !!dp), map(dp => this.assignContextFromContextDashboard(dp)), distinctUntilChanged()); this.rangeDisplayConfig$ = activeDatapoint.pipe(switchMap(dp => this.getRangeDisplayConfig$(dp)), shareReplay({ refCount: true, bufferSize: 1 })); this.rangeDisplayConfig$ .pipe(map(data => this.getErrorType(data)), distinctUntilChanged(), takeUntilDestroyed()) .subscribe(inRange => this.updateAlertStatus(inRange)); } ngOnChanges() { const activeDp = this.config.datapoints.find(dp => dp.__active); this.activeDatapoint$.next(activeDp); } getRangeDisplayConfig$(dp) { return this.measurementRealtime .latestValueOfSpecificMeasurement$(dp.fragment, dp.series, dp.__target, 1, true) .pipe(map(m => { if (!m) { return null; } const date = m.time; const measurement = m[dp.fragment][dp.series]; return { current: measurement.value, fractionSize: this.config.fractionSize || 1, max: dp.max, min: dp.min, redRangeMax: dp.redRangeMax, redRangeMin: dp.redRangeMin, target: dp.target, time: date, yellowRangeMax: dp.yellowRangeMax, yellowRangeMin: dp.yellowRangeMin, unit: measurement.unit || dp.unit, orientation: this.getOrientation() }; })); } assignContextFromContextDashboard(datapoint) { if (!this.dashboard?.isDeviceTypeDashboard) { return datapoint; } const context = this.dashboard?.context; if (context?.id) { const { name, id } = context; datapoint.__target = { name, id }; } return datapoint; } getOrientation() { return this.dynamicComponent?.componentId === defaultWidgetIds.LINEAR_GAUGE ? 'horizontal' : 'vertical'; } getErrorType(data) { if (!data) { return 'NOT_FOUND'; } if (!this.isInRange(data)) { return 'OUT_OF_RANGE'; } return 'NONE'; } isInRange(data) { if (!Number.isFinite(data.max) || !Number.isFinite(data.min)) { // default range is 0-100 return data.current <= 100 && data.current >= 0; } return data.current <= data.max && data.current >= data.min; } updateAlertStatus(errorType) { if (!this.alerts) { return; } this.alerts.clear(); let msg; if (errorType === 'OUT_OF_RANGE') { msg = gettext('Current value out of defined range.'); } else if (errorType === 'NOT_FOUND') { msg = gettext('Configured data point not available on the selected device.'); } if (!msg) { return; } this.alerts.addAlerts(new DynamicComponentAlert({ type: 'warning', text: msg })); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LinearGaugeWidgetViewComponent, deps: [{ token: i1.MeasurementRealtimeService }, { token: i2.ContextDashboardComponent, optional: true }, { token: i1.DynamicComponentComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LinearGaugeWidgetViewComponent, isStandalone: true, selector: "c8y-linear-gauge-widget-view", inputs: { config: "config" }, providers: [MeasurementRealtimeService], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"p-l-16 p-r-16 p-b-16 fit-h d-flex d-col flex-center\"\n *ngIf=\"rangeDisplayConfig$ | async as rangeDisplayConfig\"\n [ngClass]=\"{\n 'p-t-40 j-c-center': rangeDisplayConfig.orientation === 'horizontal',\n }\"\n>\n <c8y-range-display [config]=\"rangeDisplayConfig\" [ngClass]=\"{'flex-grow': rangeDisplayConfig.orientation == 'vertical'}\"></c8y-range-display>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: RangeDisplayModule }, { kind: "component", type: i1.RangeDisplayComponent, selector: "c8y-range-display", inputs: ["config", "display"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LinearGaugeWidgetViewComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-linear-gauge-widget-view', providers: [MeasurementRealtimeService], standalone: true, imports: [NgIf, NgClass, AsyncPipe, RangeDisplayModule], template: "<div\n class=\"p-l-16 p-r-16 p-b-16 fit-h d-flex d-col flex-center\"\n *ngIf=\"rangeDisplayConfig$ | async as rangeDisplayConfig\"\n [ngClass]=\"{\n 'p-t-40 j-c-center': rangeDisplayConfig.orientation === 'horizontal',\n }\"\n>\n <c8y-range-display [config]=\"rangeDisplayConfig\" [ngClass]=\"{'flex-grow': rangeDisplayConfig.orientation == 'vertical'}\"></c8y-range-display>\n</div>\n" }] }], ctorParameters: () => [{ type: i1.MeasurementRealtimeService }, { type: i2.ContextDashboardComponent, decorators: [{ type: Optional }] }, { type: i1.DynamicComponentComponent, decorators: [{ type: Optional }] }], propDecorators: { config: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZWFyLWdhdWdlLXdpZGdldC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2xpbmVhci1nYXVnZS9saW5lYXItZ2F1Z2Utd2lkZ2V0LXZpZXcvbGluZWFyLWdhdWdlLXdpZGdldC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2xpbmVhci1nYXVnZS9saW5lYXItZ2F1Z2Utd2lkZ2V0LXZpZXcvbGluZWFyLWdhdWdlLXdpZGdldC12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQWMsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRixPQUFPLEVBRUwscUJBQXFCLEVBRXJCLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFFMUIsa0JBQWtCLEVBQ2xCLE9BQU8sRUFDUixNQUFNLHFCQUFxQixDQUFDO0FBRzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7O0FBVWxGLE1BQU0sT0FBTyw4QkFBOEI7SUFPekMsWUFDVSxtQkFBK0MsRUFDbkMsU0FBb0MsRUFDcEMsZ0JBQTRD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bnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBEeW5hbWljQ29tcG9uZW50LFxuICBEeW5hbWljQ29tcG9uZW50QWxlcnQsXG4gIER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3IsXG4gIER5bmFtaWNDb21wb25lbnRDb21wb25lbnQsXG4gIE1lYXN1cmVtZW50UmVhbHRpbWVTZXJ2aWNlLFxuICBSYW5nZURpc3BsYXksXG4gIFJhbmdlRGlzcGxheU1vZHVsZSxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB0eXBlIHsgS1BJRGV0YWlscyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZGF0YXBvaW50LXNlbGVjdG9yJztcbmltcG9ydCB7IElNZWFzdXJlbWVudFZhbHVlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgZGVmYXVsdFdpZGdldElkcyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvd2lkZ2V0cy9kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udGV4dERhc2hib2FyZENvbXBvbmVudCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvY29udGV4dC1kYXNoYm9hcmQnO1xuaW1wb3J0IHsgTGluZWFyR2F1Z2VXaWRnZXRDb25maWcgfSBmcm9tICcuLi9saW5lYXItZ2F1Z2UubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktbGluZWFyLWdhdWdlLXdpZGdldC12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpbmVhci1nYXVnZS13aWRnZXQtdmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW01lYXN1cmVtZW50UmVhbHRpbWVTZXJ2aWNlXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nSWYsIE5nQ2xhc3MsIEFzeW5jUGlwZSwgUmFuZ2VEaXNwbGF5TW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBMaW5lYXJHYXVnZVdpZGdldFZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIER5bmFtaWNDb21wb25lbnQge1xuICBASW5wdXQoKSBjb25maWc6IExpbmVhckdhdWdlV2lkZ2V0Q29uZmlnO1xuXG4gIHJhbmdlRGlzcGxheUNvbmZpZyQ6IE9ic2VydmFibGU8UmFuZ2VEaXNwbGF5PjtcbiAgYWxlcnRzOiBEeW5hbWljQ29tcG9uZW50QWxlcnRBZ2dyZWdhdG9yO1xuICBwcml2YXRlIGFjdGl2ZURhdGFwb2ludCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEtQSURldGFpbHM+KG51bGwpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbWVhc3VyZW1lbnRSZWFsdGltZTogTWVhc3VyZW1lbnRSZWFsdGltZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkYXNoYm9hcmQ6IENvbnRleHREYXNoYm9hcmRDb21wb25lbnQsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50PzogRHluYW1pY0NvbXBvbmVudENvbXBvbmVudFxuICApIHtcbiAgICBjb25zdCBhY3RpdmVEYXRhcG9pbnQgPSB0aGlzLmFjdGl2ZURhdGFwb2ludCQucGlwZShcbiAgICAgIGZpbHRlcihkcCA9PiAhIWRwKSxcbiAgICAgIG1hcChkcCA9PiB0aGlzLmFzc2lnbkNvbnRleHRGcm9tQ29udGV4dERhc2hib2FyZChkcCkpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICk7XG4gICAgdGhpcy5yYW5nZURpc3BsYXlDb25maWckID0gYWN0aXZlRGF0YXBvaW50LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoZHAgPT4gdGhpcy5nZXRSYW5nZURpc3BsYXlDb25maWckKGRwKSksXG4gICAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pXG4gICAgKTtcbiAgICB0aGlzLnJhbmdlRGlzcGxheUNvbmZpZyRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoZGF0YSA9PiB0aGlzLmdldEVycm9yVHlwZShkYXRhKSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkPFJldHVyblR5cGU8TGluZWFyR2F1Z2VXaWRnZXRWaWV3Q29tcG9uZW50WydnZXRFcnJvclR5cGUnXT4+KCksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZDxSZXR1cm5UeXBlPExpbmVhckdhdWdlV2lkZ2V0Vmlld0NvbXBvbmVudFsnZ2V0RXJyb3JUeXBlJ10+PigpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGluUmFuZ2UgPT4gdGhpcy51cGRhdGVBbGVydFN0YXR1cyhpblJhbmdlKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVEcCA9IHRoaXMuY29uZmlnLmRhdGFwb2ludHMuZmluZChkcCA9PiBkcC5fX2FjdGl2ZSk7XG4gICAgdGhpcy5hY3RpdmVEYXRhcG9pbnQkLm5leHQoYWN0aXZlRHApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSYW5nZURpc3BsYXlDb25maWckKGRwOiBLUElEZXRhaWxzKTogT2JzZXJ2YWJsZTxSYW5nZURpc3BsYXk+IHtcbiAgICByZXR1cm4gdGhpcy5tZWFzdXJlbWVudFJlYWx0aW1lXG4gICAgICAubGF0ZXN0VmFsdWVPZlNwZWNpZmljTWVhc3VyZW1lbnQkKGRwLmZyYWdtZW50LCBkcC5zZXJpZXMsIGRwLl9fdGFyZ2V0LCAxLCB0cnVlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChtID0+IHtcbiAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkYXRlID0gbS50aW1lO1xuICAgICAgICAgIGNvbnN0IG1lYXN1cmVtZW50OiBJTWVhc3VyZW1lbnRWYWx1ZSA9IG1bZHAuZnJhZ21lbnRdW2RwLnNlcmllc107XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IG1lYXN1cmVtZW50LnZhbHVlLFxuICAgICAgICAgICAgZnJhY3Rpb25TaXplOiB0aGlzLmNvbmZpZy5mcmFjdGlvblNpemUgfHwgMSxcbiAgICAgICAgICAgIG1heDogZHAubWF4LFxuICAgICAgICAgICAgbWluOiBkcC5taW4sXG4gICAgICAgICAgICByZWRSYW5nZU1heDogZHAucmVkUmFuZ2VNYXgsXG4gICAgICAgICAgICByZWRSYW5nZU1pbjogZHAucmVkUmFuZ2VNaW4sXG4gICAgICAgICAgICB0YXJnZXQ6IGRwLnRhcmdldCxcbiAgICAgICAgICAgIHRpbWU6IGRhdGUsXG4gICAgICAgICAgICB5ZWxsb3dSYW5nZU1heDogZHAueWVsbG93UmFuZ2VNYXgsXG4gICAgICAgICAgICB5ZWxsb3dSYW5nZU1pbjogZHAueWVsbG93UmFuZ2VNaW4sXG4gICAgICAgICAgICB1bml0OiBtZWFzdXJlbWVudC51bml0IHx8IGRwLnVuaXQsXG4gICAgICAgICAgICBvcmllbnRhdGlvbjogdGhpcy5nZXRPcmllbnRhdGlvbigpXG4gICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzc2lnbkNvbnRleHRGcm9tQ29udGV4dERhc2hib2FyZChkYXRhcG9pbnQ6IEtQSURldGFpbHMpOiBLUElEZXRhaWxzIHtcbiAgICBpZiAoIXRoaXMuZGFzaGJvYXJkPy5pc0RldmljZVR5cGVEYXNoYm9hcmQpIHtcbiAgICAgIHJldHVybiBkYXRhcG9pbnQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmRhc2hib2FyZD8uY29udGV4dDtcbiAgICBpZiAoY29udGV4dD8uaWQpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgaWQgfSA9IGNvbnRleHQ7XG4gICAgICBkYXRhcG9pbnQuX190YXJnZXQgPSB7IG5hbWUsIGlkIH07XG4gICAgfVxuICAgIHJldHVybiBkYXRhcG9pbnQ7XG4gIH1cblxuICBwcml2YXRlIGdldE9yaWVudGF0aW9uKCk6ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCcge1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNDb21wb25lbnQ/LmNvbXBvbmVudElkID09PSBkZWZhdWx0V2lkZ2V0SWRzLkxJTkVBUl9HQVVHRVxuICAgICAgPyAnaG9yaXpvbnRhbCdcbiAgICAgIDogJ3ZlcnRpY2FsJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXJyb3JUeXBlKGRhdGE6IFJhbmdlRGlzcGxheSB8IG51bGwpIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiAnTk9UX0ZPVU5EJztcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNJblJhbmdlKGRhdGEpKSB7XG4gICAgICByZXR1cm4gJ09VVF9PRl9SQU5HRSc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdOT05FJztcbiAgfVxuXG4gIHByaXZhdGUgaXNJblJhbmdlKGRhdGE6IFJhbmdlRGlzcGxheSk6IGJvb2xlYW4ge1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGRhdGEubWF4KSB8fCAhTnVtYmVyLmlzRmluaXRlKGRhdGEubWluKSkge1xuICAgICAgLy8gZGVmYXVsdCByYW5nZSBpcyAwLTEwMFxuICAgICAgcmV0dXJuIGRhdGEuY3VycmVudCA8PSAxMDAgJiYgZGF0YS5jdXJyZW50ID49IDA7XG4gICAgfVxuICAgIHJldHVybiBkYXRhLmN1cnJlbnQgPD0gZGF0YS5tYXggJiYgZGF0YS5jdXJyZW50ID49IGRhdGEubWluO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBbGVydFN0YXR1cyhcbiAgICBlcnJvclR5cGU6IFJldHVyblR5cGU8TGluZWFyR2F1Z2VXaWRnZXRWaWV3Q29tcG9uZW50WydnZXRFcnJvclR5cGUnXT5cbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFsZXJ0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFsZXJ0cy5jbGVhcigpO1xuICAgIGxldCBtc2c6IHN0cmluZztcbiAgICBpZiAoZXJyb3JUeXBlID09PSAnT1VUX09GX1JBTkdFJykge1xuICAgICAgbXNnID0gZ2V0dGV4dCgnQ3VycmVudCB2YWx1ZSBvdXQgb2YgZGVmaW5lZCByYW5nZS4nKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yVHlwZSA9PT0gJ05PVF9GT1VORCcpIHtcbiAgICAgIG1zZyA9IGdldHRleHQoJ0NvbmZpZ3VyZWQgZGF0YSBwb2ludCBub3QgYXZhaWxhYmxlIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFtc2cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFsZXJ0cy5hZGRBbGVydHMoXG4gICAgICBuZXcgRHluYW1pY0NvbXBvbmVudEFsZXJ0KHtcbiAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxuICAgICAgICB0ZXh0OiBtc2dcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInAtbC0xNiBwLXItMTYgcC1iLTE2IGZpdC1oIGQtZmxleCBkLWNvbCBmbGV4LWNlbnRlclwiXG4gICpuZ0lmPVwicmFuZ2VEaXNwbGF5Q29uZmlnJCB8IGFzeW5jIGFzIHJhbmdlRGlzcGxheUNvbmZpZ1wiXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAncC10LTQwIGotYy1jZW50ZXInOiByYW5nZURpc3BsYXlDb25maWcub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyxcbiAgfVwiXG4+XG4gIDxjOHktcmFuZ2UtZGlzcGxheSBbY29uZmlnXT1cInJhbmdlRGlzcGxheUNvbmZpZ1wiIFtuZ0NsYXNzXT1cInsnZmxleC1ncm93JzogcmFuZ2VEaXNwbGF5Q29uZmlnLm9yaWVudGF0aW9uID09ICd2ZXJ0aWNhbCd9XCI+PC9jOHktcmFuZ2UtZGlzcGxheT5cbjwvZGl2PlxuIl19