@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
149 lines • 24.2 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, Input, ViewChild, } from '@angular/core';
import { IonModal } from '@ionic/angular';
import { CurrentDeviceService, PendingCallManager, TapValueEditorContainerComponent, } from '@iotize/ionic';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { MonitoringAppGenComponent, } from '../../metadata/decorators';
import * as i0 from "@angular/core";
import * as i1 from "@iotize/ionic";
import * as i2 from "@angular/common";
import * as i3 from "@ionic/angular";
let TapVariableDateTimePickerComponent = class TapVariableDateTimePickerComponent {
ctx;
dateTimeModal;
pendingCallManager;
pendingSubmitValue;
destroyed = new Subject();
error;
// loaded = false;
set fieldError(err) {
this.error = err;
}
get pending() {
return this.pendingCallManager.pendingCall !== undefined;
}
format = 'medium';
showCalendarPickerTitle = true;
editable = true;
color = 'primary';
showCalendarIcon = true;
iconCalendarColor = 'primary';
set encodingType(type) {
if (type in DATE_TIME_PICKER_ENCODING) {
const converter = DATE_TIME_PICKER_ENCODING[type];
this.formatDataRead = converter.decode.bind(converter);
this.formatDataWrite = converter.encode.bind(converter);
}
else {
this.formatDataRead = undefined;
this.formatDataWrite = undefined;
}
}
formatDataRead;
formatDataWrite;
_variable;
set variable(variable) {
this._variable = variable;
}
dateTimeValue = '2023-01-01T00:00:00';
constructor(tapService) {
this.pendingCallManager = PendingCallManager.create(tapService);
}
ngOnDestroy() {
this.destroyed.next();
this.pendingCallManager.destroy();
}
ngAfterViewInit() {
this.ctx?.valueToDisplay
?.pipe(takeUntil(this.destroyed))
.subscribe((newValue) => {
this.dateTimeValue = this.formatDataRead
? this.formatDataRead(newValue)
: newValue;
});
}
async onPendingChange(event) {
const value = event.detail.value;
const timeStamp = this.formatDataWrite
? this.formatDataWrite(value)
: value;
await this.ctx.notifyValueChange(timeStamp);
}
onValueClick() {
if (this.editable) {
this.pendingSubmitValue = this.dateTimeValue;
this.dateTimeModal.present();
}
}
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapVariableDateTimePickerComponent, deps: [{ token: i1.CurrentDeviceService }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TapVariableDateTimePickerComponent, selector: "tap-variable-date-time-picker", inputs: { fieldError: "fieldError", format: "format", showCalendarPickerTitle: "showCalendarPickerTitle", editable: "editable", color: "color", showCalendarIcon: "showCalendarIcon", iconCalendarColor: "iconCalendarColor", encodingType: "encodingType", formatDataRead: "formatDataRead", formatDataWrite: "formatDataWrite", variable: "variable" }, viewQueries: [{ propertyName: "ctx", first: true, predicate: ["ctx"], descendants: true }, { propertyName: "dateTimeModal", first: true, predicate: ["dateTimeModal"], descendants: true }], ngImport: i0, template: "<tap-value-editor-container\n #ctx\n [button]=\"editable\"\n [variable]=\"_variable\"\n (click)=\"onValueClick()\"\n>\n <!-- <ion-spinner *ngIf=\"!loaded\" name=\"crescent\" color=\"primary\"></ion-spinner> -->\n\n <ion-modal #dateTimeModal>\n <ng-template>\n <ion-content>\n <ion-datetime\n #ionDateTime\n [showDefaultTitle]=\"showCalendarPickerTitle\"\n [showDefaultButtons]=\"true\"\n [color]=\"color\"\n size=\"cover\"\n [value]=\"pendingSubmitValue\"\n (ionChange)=\"onPendingChange($event)\"\n >\n <!-- <ion-buttons slot=\"buttons\">\n <ion-button\n fill=\"clear\"\n [color]=\"color\"\n (click)=\"ionDateTime.confirm(); onConfirm()\"\n >Confirm</ion-button\n >\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n (click)=\"ionDateTime.cancel(); dateTimeModal.dismiss()\"\n >Cancel</ion-button\n >\n </ion-buttons> -->\n </ion-datetime>\n </ion-content>\n </ng-template>\n </ion-modal>\n <ion-icon\n [color]=\"iconCalendarColor\"\n slot=\"start\"\n name=\"calendar\"\n *ngIf=\"showCalendarIcon\"\n ></ion-icon>\n <ion-label>\n {{ dateTimeValue | date: (format ? format : 'MMM d, y, h:mm:ss a') }}\n </ion-label>\n <!--\n <ion-datetime\n *ngIf=\"loaded\"\n \n [displayFormat]=\"format\"\n [value]=\"dateTimeValue\"\n (ionChange)=\n ></ion-datetime>\n -->\n</tap-value-editor-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonDatetime, selector: "ion-datetime", inputs: ["cancelText", "clearText", "color", "dayValues", "disabled", "doneText", "firstDayOfWeek", "formatOptions", "highlightedDates", "hourCycle", "hourValues", "isDateEnabled", "locale", "max", "min", "minuteValues", "mode", "monthValues", "multiple", "name", "preferWheel", "presentation", "readonly", "showAdjacentDays", "showClearButton", "showDefaultButtons", "showDefaultTimeLabel", "showDefaultTitle", "size", "titleSelectedDatesFormatter", "value", "yearValues"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonModal, selector: "ion-modal" }, { kind: "directive", type: i3.SelectValueAccessor, selector: "ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "component", type: i1.TapValueEditorContainerComponent, selector: "tap-value-editor-container", inputs: ["button", "variable", "inputOptions", "showRefreshButton", "showSubmitButton", "showEditButton", "error", "lines", "modalEdition", "value"], outputs: ["submit", "refresh"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
};
TapVariableDateTimePickerComponent = __decorate([
MonitoringAppGenComponent({
constraints: {
isArray: 'NO',
},
}),
__metadata("design:paramtypes", [CurrentDeviceService])
], TapVariableDateTimePickerComponent);
export { TapVariableDateTimePickerComponent };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapVariableDateTimePickerComponent, decorators: [{
type: Component,
args: [{ selector: 'tap-variable-date-time-picker', template: "<tap-value-editor-container\n #ctx\n [button]=\"editable\"\n [variable]=\"_variable\"\n (click)=\"onValueClick()\"\n>\n <!-- <ion-spinner *ngIf=\"!loaded\" name=\"crescent\" color=\"primary\"></ion-spinner> -->\n\n <ion-modal #dateTimeModal>\n <ng-template>\n <ion-content>\n <ion-datetime\n #ionDateTime\n [showDefaultTitle]=\"showCalendarPickerTitle\"\n [showDefaultButtons]=\"true\"\n [color]=\"color\"\n size=\"cover\"\n [value]=\"pendingSubmitValue\"\n (ionChange)=\"onPendingChange($event)\"\n >\n <!-- <ion-buttons slot=\"buttons\">\n <ion-button\n fill=\"clear\"\n [color]=\"color\"\n (click)=\"ionDateTime.confirm(); onConfirm()\"\n >Confirm</ion-button\n >\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n (click)=\"ionDateTime.cancel(); dateTimeModal.dismiss()\"\n >Cancel</ion-button\n >\n </ion-buttons> -->\n </ion-datetime>\n </ion-content>\n </ng-template>\n </ion-modal>\n <ion-icon\n [color]=\"iconCalendarColor\"\n slot=\"start\"\n name=\"calendar\"\n *ngIf=\"showCalendarIcon\"\n ></ion-icon>\n <ion-label>\n {{ dateTimeValue | date: (format ? format : 'MMM d, y, h:mm:ss a') }}\n </ion-label>\n <!--\n <ion-datetime\n *ngIf=\"loaded\"\n \n [displayFormat]=\"format\"\n [value]=\"dateTimeValue\"\n (ionChange)=\n ></ion-datetime>\n -->\n</tap-value-editor-container>\n" }]
}], ctorParameters: () => [{ type: i1.CurrentDeviceService }], propDecorators: { ctx: [{
type: ViewChild,
args: ['ctx']
}], dateTimeModal: [{
type: ViewChild,
args: ['dateTimeModal']
}], fieldError: [{
type: Input
}], format: [{
type: Input
}], showCalendarPickerTitle: [{
type: Input
}], editable: [{
type: Input
}], color: [{
type: Input
}], showCalendarIcon: [{
type: Input
}], iconCalendarColor: [{
type: Input
}], encodingType: [{
type: Input
}], formatDataRead: [{
type: Input
}], formatDataWrite: [{
type: Input
}], variable: [{
type: Input
}] } });
const DATE_TIME_PICKER_ENCODING = {
timestamp_ms: createTimestampEncoder(1),
timestamp_s: createTimestampEncoder(1000),
};
function createTimestampEncoder(multiplier = 1) {
return {
decode: (timestampInSeconds) => {
timestampInSeconds =
typeof timestampInSeconds === 'string'
? parseInt(timestampInSeconds)
: timestampInSeconds;
if (timestampInSeconds === undefined || isNaN(timestampInSeconds)) {
timestampInSeconds = 0;
}
const date = new Date(timestampInSeconds * multiplier);
return date.toISOString().slice(0, -1);
},
encode: (value) => {
if (!value) {
return 0;
}
const date = Date.parse(value);
return new Date(date).getTime() / multiplier;
},
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLXZhcmlhYmxlLWRhdGUtdGltZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW90aXplLWlvbmljL21vbml0b3Jpbmcvc3JjL2xpYi91aS1jb21wb25lbnRzL3RhcC12YXJpYWJsZS1kYXRlLXRpbWUtcGlja2VyL3RhcC12YXJpYWJsZS1kYXRlLXRpbWUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy90YXAtdmFyaWFibGUtZGF0ZS10aW1lLXBpY2tlci90YXAtdmFyaWFibGUtZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxLQUFLLEVBRUwsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixnQ0FBZ0MsR0FDakMsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUVMLHlCQUF5QixHQUMxQixNQUFNLDJCQUEyQixDQUFDOzs7OztBQWlCNUIsSUFBTSxrQ0FBa0MsR0FBeEMsTUFBTSxrQ0FBa0M7SUFHM0IsR0FBRyxDQUFvQztJQUM3QixhQUFhLENBQVk7SUFFckQsa0JBQWtCLENBQXFCO0lBQ3ZDLGtCQUFrQixDQUFNO0lBQ2hCLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRWpDLEtBQUssQ0FBUztJQUVyQixr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a0IsR0FBRyxVQUFVLENBQUMsQ0FBQztZQUN2RCxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELE1BQU0sRUFBRSxDQUFDLEtBQWEsRUFBVSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWCxPQUFPLENBQUMsQ0FBQztZQUNYLENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsVUFBVSxDQUFDO1FBQy9DLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElvbk1vZGFsIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgRW5jb2RlckRlY29kZXIgfSBmcm9tICdAaW90aXplL2NvbW1vbi9jb252ZXJ0ZXIvYXBpJztcbmltcG9ydCB7XG4gIEN1cnJlbnREZXZpY2VTZXJ2aWNlLFxuICBQZW5kaW5nQ2FsbE1hbmFnZXIsXG4gIFRhcFZhbHVlRWRpdG9yQ29udGFpbmVyQ29tcG9uZW50LFxufSBmcm9tICdAaW90aXplL2lvbmljJztcbmltcG9ydCB7IEFic3RyYWN0VmFyaWFibGUgfSBmcm9tICdAaW90aXplL3RhcC9kYXRhJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEFwcEdlbkZpZWxkLFxuICBNb25pdG9yaW5nQXBwR2VuQ29tcG9uZW50LFxufSBmcm9tICcuLi8uLi9tZXRhZGF0YS9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIEVESVRBQkxFX1NDSEVNQSxcbiAgSU9OSUNfQ09MT1JfU0NIRU1BLFxuICBUQVBfVkFSSUFCTEVfU0NIRU1BLFxufSBmcm9tICcuLi9zaGFyZWQtc2NoZW1hJztcblxuQE1vbml0b3JpbmdBcHBHZW5Db21wb25lbnQoe1xuICBjb25zdHJhaW50czoge1xuICAgIGlzQXJyYXk6ICdOTycsXG4gIH0sXG59KVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFwLXZhcmlhYmxlLWRhdGUtdGltZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFwLXZhcmlhYmxlLWRhdGUtdGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YXAtdmFyaWFibGUtZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYXBWYXJpYWJsZURhdGVUaW1lUGlja2VyQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIEBWaWV3Q2hpbGQoJ2N0eCcpIGN0eCE6IFRhcFZhbHVlRWRpdG9yQ29udGFpbmVyQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdkYXRlVGltZU1vZGFsJykgZGF0ZVRpbWVNb2RhbCE6IElvbk1vZGFsO1xuXG4gIHBlbmRpbmdDYWxsTWFuYWdlcjogUGVuZGluZ0NhbGxNYW5hZ2VyO1xuICBwZW5kaW5nU3VibWl0VmFsdWU6IGFueTtcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHB1YmxpYyBlcnJvcj86IEVycm9yO1xuXG4gIC8vIGxvYWRlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNldCBmaWVsZEVycm9yKGVycjogRXJyb3IpIHtcbiAgICB0aGlzLmVycm9yID0gZXJyO1xuICB9XG5cbiAgZ2V0IHBlbmRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0NhbGxNYW5hZ2VyLnBlbmRpbmdDYWxsICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBmb3JtYXQ6IHN0cmluZyA9ICdtZWRpdW0nO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dDYWxlbmRhclBpY2tlclRpdGxlOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBlZGl0YWJsZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgY29sb3IgPSAncHJpbWFyeSc7XG5cbiAgQElucHV0KClcbiAgc2hvd0NhbGVuZGFySWNvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgaWNvbkNhbGVuZGFyQ29sb3IgPSAncHJpbWFyeSc7XG5cbiAgQElucHV0KCkgc2V0IGVuY29kaW5nVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZSBpbiBEQVRFX1RJTUVfUElDS0VSX0VOQ09ESU5HKSB7XG4gICAgICBjb25zdCBjb252ZXJ0ZXIgPVxuICAgICAgICBEQVRFX1RJTUVfUElDS0VSX0VOQ09ESU5HW1xuICAgICAgICAgIHR5cGUgYXMga2V5b2YgdHlwZW9mIERBVEVfVElNRV9QSUNLRVJfRU5DT0RJTkdcbiAgICAgICAgXTtcbiAgICAgIHRoaXMuZm9ybWF0RGF0YVJlYWQgPSBjb252ZXJ0ZXIuZGVjb2RlLmJpbmQoY29udmVydGVyKTtcbiAgICAgIHRoaXMuZm9ybWF0RGF0YVdyaXRlID0gY29udmVydGVyLmVuY29kZS5iaW5kKGNvbnZlcnRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybWF0RGF0YVJlYWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmZvcm1hdERhdGFXcml0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBmb3JtYXREYXRhUmVhZDogKChkYXRlOiBudW1iZXIpID0+IHN0cmluZykgfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgZm9ybWF0RGF0YVdyaXRlOiAoKGRhdGU6IHN0cmluZykgPT4gbnVtYmVyKSB8IHVuZGVmaW5lZDtcblxuICBfdmFyaWFibGU/OiBBYnN0cmFjdFZhcmlhYmxlPGFueT47XG5cbiAgQElucHV0KClcbiAgc2V0IHZhcmlhYmxlKHZhcmlhYmxlOiBBYnN0cmFjdFZhcmlhYmxlPGFueT4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl92YXJpYWJsZSA9IHZhcmlhYmxlO1xuICB9XG5cbiAgZGF0ZVRpbWVWYWx1ZTogc3RyaW5nID0gJzIwMjMtMDEtMDFUMDA6MDA6MDAnO1xuXG4gIGNvbnN0cnVjdG9yKHRhcFNlcnZpY2U6IEN1cnJlbnREZXZpY2VTZXJ2aWNlKSB7XG4gICAgdGhpcy5wZW5kaW5nQ2FsbE1hbmFnZXIgPSBQZW5kaW5nQ2FsbE1hbmFnZXIuY3JlYXRlKHRhcFNlcnZpY2UpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgIHRoaXMucGVuZGluZ0NhbGxNYW5hZ2VyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmN0eD8udmFsdWVUb0Rpc3BsYXlcbiAgICAgID8ucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZSgobmV3VmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5kYXRlVGltZVZhbHVlID0gdGhpcy5mb3JtYXREYXRhUmVhZFxuICAgICAgICAgID8gdGhpcy5mb3JtYXREYXRhUmVhZChuZXdWYWx1ZSlcbiAgICAgICAgICA6IG5ld1ZhbHVlO1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBvblBlbmRpbmdDaGFuZ2UoZXZlbnQ6IEN1c3RvbUV2ZW50PHsgdmFsdWU6IHN0cmluZyB9Pikge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlO1xuICAgIGNvbnN0IHRpbWVTdGFtcCA9IHRoaXMuZm9ybWF0RGF0YVdyaXRlXG4gICAgICA/IHRoaXMuZm9ybWF0RGF0YVdyaXRlKHZhbHVlKVxuICAgICAgOiB2YWx1ZTtcbiAgICBhd2FpdCB0aGlzLmN0eC5ub3RpZnlWYWx1ZUNoYW5nZSh0aW1lU3RhbXApO1xuICB9XG5cbiAgb25WYWx1ZUNsaWNrKCkge1xuICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XG4gICAgICB0aGlzLnBlbmRpbmdTdWJtaXRWYWx1ZSA9IHRoaXMuZGF0ZVRpbWVWYWx1ZTtcbiAgICAgIHRoaXMuZGF0ZVRpbWVNb2RhbC5wcmVzZW50KCk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IERBVEVfVElNRV9QSUNLRVJfRU5DT0RJTkcgPSB7XG4gIHRpbWVzdGFtcF9tczogY3JlYXRlVGltZXN0YW1wRW5jb2RlcigxKSxcbiAgdGltZXN0YW1wX3M6IGNyZWF0ZVRpbWVzdGFtcEVuY29kZXIoMTAwMCksXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVUaW1lc3RhbXBFbmNvZGVyKFxuICBtdWx0aXBsaWVyID0gMVxuKTogRW5jb2RlckRlY29kZXI8c3RyaW5nLCBudW1iZXI+IHtcbiAgcmV0dXJuIHtcbiAgICBkZWNvZGU6ICh0aW1lc3RhbXBJblNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZCB8IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICB0aW1lc3RhbXBJblNlY29uZHMgPVxuICAgICAgICB0eXBlb2YgdGltZXN0YW1wSW5TZWNvbmRzID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gcGFyc2VJbnQodGltZXN0YW1wSW5TZWNvbmRzKVxuICAgICAgICAgIDogdGltZXN0YW1wSW5TZWNvbmRzO1xuICAgICAgaWYgKHRpbWVzdGFtcEluU2Vjb25kcyA9PT0gdW5kZWZpbmVkIHx8IGlzTmFOKHRpbWVzdGFtcEluU2Vjb25kcykpIHtcbiAgICAgICAgdGltZXN0YW1wSW5TZWNvbmRzID0gMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aW1lc3RhbXBJblNlY29uZHMgKiBtdWx0aXBsaWVyKTtcbiAgICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgLTEpO1xuICAgIH0sXG4gICAgZW5jb2RlOiAodmFsdWU6IHN0cmluZyk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0ZSA9IERhdGUucGFyc2UodmFsdWUpO1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUpLmdldFRpbWUoKSAvIG11bHRpcGxpZXI7XG4gICAgfSxcbiAgfTtcbn1cbiIsIjx0YXAtdmFsdWUtZWRpdG9yLWNvbnRhaW5lclxuICAjY3R4XG4gIFtidXR0b25dPVwiZWRpdGFibGVcIlxuICBbdmFyaWFibGVdPVwiX3ZhcmlhYmxlXCJcbiAgKGNsaWNrKT1cIm9uVmFsdWVDbGljaygpXCJcbj5cbiAgPCEtLSA8aW9uLXNwaW5uZXIgKm5nSWY9XCIhbG9hZGVkXCIgbmFtZT1cImNyZXNjZW50XCIgY29sb3I9XCJwcmltYXJ5XCI+PC9pb24tc3Bpbm5lcj4gLS0+XG5cbiAgPGlvbi1tb2RhbCAjZGF0ZVRpbWVNb2RhbD5cbiAgICA8bmctdGVtcGxhdGU+XG4gICAgICA8aW9uLWNvbnRlbnQ+XG4gICAgICAgIDxpb24tZGF0ZXRpbWVcbiAgICAgICAgICAjaW9uRGF0ZVRpbWVcbiAgICAgICAgICBbc2hvd0RlZmF1bHRUaXRsZV09XCJzaG93Q2FsZW5kYXJQaWNrZXJUaXRsZVwiXG4gICAgICAgICAgW3Nob3dEZWZhdWx0QnV0dG9uc109XCJ0cnVlXCJcbiAgICAgICAgICBbY29sb3JdPVwiY29sb3JcIlxuICAgICAgICAgIHNpemU9XCJjb3ZlclwiXG4gICAgICAgICAgW3ZhbHVlXT1cInBlbmRpbmdTdWJtaXRWYWx1ZVwiXG4gICAgICAgICAgKGlvbkNoYW5nZSk9XCJvblBlbmRpbmdDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8IS0tIDxpb24tYnV0dG9ucyBzbG90PVwiYnV0dG9uc1wiPlxuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImlvbkRhdGVUaW1lLmNvbmZpcm0oKTsgb25Db25maXJtKClcIlxuICAgICAgICAgICAgICA+Q29uZmlybTwvaW9uLWJ1dHRvblxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImlvbkRhdGVUaW1lLmNhbmNlbCgpOyBkYXRlVGltZU1vZGFsLmRpc21pc3MoKVwiXG4gICAgICAgICAgICAgID5DYW5jZWw8L2lvbi1idXR0b25cbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L2lvbi1idXR0b25zPiAtLT5cbiAgICAgICAgPC9pb24tZGF0ZXRpbWU+XG4gICAgICA8L2lvbi1jb250ZW50PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvaW9uLW1vZGFsPlxuICA8aW9uLWljb25cbiAgICBbY29sb3JdPVwiaWNvbkNhbGVuZGFyQ29sb3JcIlxuICAgIHNsb3Q9XCJzdGFydFwiXG4gICAgbmFtZT1cImNhbGVuZGFyXCJcbiAgICAqbmdJZj1cInNob3dDYWxlbmRhckljb25cIlxuICA+PC9pb24taWNvbj5cbiAgPGlvbi1sYWJlbD5cbiAgICB7eyBkYXRlVGltZVZhbHVlIHwgZGF0ZTogKGZvcm1hdCA/IGZvcm1hdCA6ICdNTU0gZCwgeSwgaDptbTpzcyBhJykgfX1cbiAgPC9pb24tbGFiZWw+XG4gIDwhLS1cbiAgICA8aW9uLWRhdGV0aW1lXG4gICAgICAqbmdJZj1cImxvYWRlZFwiXG4gICAgIFxuICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwiZm9ybWF0XCJcbiAgICAgIFt2YWx1ZV09XCJkYXRlVGltZVZhbHVlXCJcbiAgICAgIChpb25DaGFuZ2UpPVxuICAgID48L2lvbi1kYXRldGltZT5cbiAgLS0+XG48L3RhcC12YWx1ZS1lZGl0b3ItY29udGFpbmVyPlxuIl19