@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
578 lines • 47.1 kB
JavaScript
import { __decorate, __metadata, __param } from "tslib";
/**
* This file contains all the directives used by the @link IgxTimePickerComponent.
* You should generally not use them directly.
* @preferred
*/
import { Directive, ElementRef, HostBinding, HostListener, Inject, Input, TemplateRef } from '@angular/core';
import { IGX_TIME_PICKER_COMPONENT } from './time-picker.common';
import { InteractionMode } from '../core/enums';
/** @hidden */
let IgxItemListDirective = class IgxItemListDirective {
constructor(timePicker, elementRef) {
this.timePicker = timePicker;
this.elementRef = elementRef;
this.tabindex = 0;
}
get defaultCSS() {
return true;
}
get hourCSS() {
return this.type === 'hourList';
}
get minuteCSS() {
return this.type === 'minuteList';
}
get secondsCSS() {
return this.type === 'secondsList';
}
get ampmCSS() {
return this.type === 'ampmList';
}
onFocus() {
this.isActive = true;
}
onBlur() {
this.isActive = false;
}
nextItem() {
switch (this.type) {
case 'hourList': {
this.timePicker.nextHour();
break;
}
case 'minuteList': {
this.timePicker.nextMinute();
break;
}
case 'secondsList': {
this.timePicker.nextSeconds();
break;
}
case 'ampmList': {
this.timePicker.nextAmPm();
break;
}
}
}
prevItem() {
switch (this.type) {
case 'hourList': {
this.timePicker.prevHour();
break;
}
case 'minuteList': {
this.timePicker.prevMinute();
break;
}
case 'secondsList': {
this.timePicker.prevSeconds();
break;
}
case 'ampmList': {
this.timePicker.prevAmPm();
break;
}
}
}
/**
* @hidden
*/
onKeydownArrowDown(event) {
event.preventDefault();
this.nextItem();
}
/**
* @hidden
*/
onKeydownArrowUp(event) {
event.preventDefault();
this.prevItem();
}
/**
* @hidden
*/
onKeydownArrowRight(event) {
event.preventDefault();
const listName = event.target.className;
if (listName.indexOf('hourList') !== -1 && this.timePicker.minuteList) {
this.timePicker.minuteList.nativeElement.focus();
}
else if ((listName.indexOf('hourList') !== -1 || listName.indexOf('minuteList') !== -1) && this.timePicker.secondsList) {
this.timePicker.secondsList.nativeElement.focus();
}
else if ((listName.indexOf('hourList') !== -1 || listName.indexOf('minuteList') !== -1 ||
listName.indexOf('secondsList') !== -1) && this.timePicker.ampmList) {
this.timePicker.ampmList.nativeElement.focus();
}
}
/**
* @hidden
*/
onKeydownArrowLeft(event) {
event.preventDefault();
const listName = event.target.className;
if (listName.indexOf('ampmList') !== -1 && this.timePicker.secondsList) {
this.timePicker.secondsList.nativeElement.focus();
}
else if (listName.indexOf('secondsList') !== -1 && this.timePicker.secondsList
&& listName.indexOf('minutesList') && this.timePicker.minuteList) {
this.timePicker.minuteList.nativeElement.focus();
}
else if (listName.indexOf('ampmList') !== -1 && this.timePicker.minuteList) {
this.timePicker.minuteList.nativeElement.focus();
}
else if ((listName.indexOf('ampmList') !== -1 || listName.indexOf('secondsList') !== -1 ||
listName.indexOf('minuteList') !== -1) && this.timePicker.hourList) {
this.timePicker.hourList.nativeElement.focus();
}
}
/**
* @hidden
*/
onKeydownEnter(event) {
event.preventDefault();
if (this.timePicker.mode === InteractionMode.DropDown) {
this.timePicker.close();
return;
}
this.timePicker.okButtonClick();
}
/**
* @hidden
*/
onKeydownEscape(event) {
event.preventDefault();
this.timePicker.cancelButtonClick();
}
/**
* @hidden
*/
onHover() {
this.elementRef.nativeElement.focus();
}
/**
* @hidden
*/
onScroll(event) {
event.preventDefault();
event.stopPropagation();
if (event.deltaY > 0) {
this.nextItem();
}
else if (event.deltaY < 0) {
this.prevItem();
}
}
/**
* @hidden
*/
onPanMove(event) {
if (event.deltaY < 0) {
this.nextItem();
}
else if (event.deltaY > 0) {
this.prevItem();
}
}
};
IgxItemListDirective.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] },
{ type: ElementRef }
];
__decorate([
Input('igxItemList'),
__metadata("design:type", String)
], IgxItemListDirective.prototype, "type", void 0);
__decorate([
HostBinding('attr.tabindex'),
__metadata("design:type", Object)
], IgxItemListDirective.prototype, "tabindex", void 0);
__decorate([
HostBinding('class.igx-time-picker__column'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxItemListDirective.prototype, "defaultCSS", null);
__decorate([
HostBinding('class.igx-time-picker__hourList'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxItemListDirective.prototype, "hourCSS", null);
__decorate([
HostBinding('class.igx-time-picker__minuteList'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxItemListDirective.prototype, "minuteCSS", null);
__decorate([
HostBinding('class.igx-time-picker__secondsList'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxItemListDirective.prototype, "secondsCSS", null);
__decorate([
HostBinding('class.igx-time-picker__ampmList'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxItemListDirective.prototype, "ampmCSS", null);
__decorate([
HostListener('focus'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], IgxItemListDirective.prototype, "onFocus", null);
__decorate([
HostListener('blur'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], IgxItemListDirective.prototype, "onBlur", null);
__decorate([
HostListener('keydown.arrowdown', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxItemListDirective.prototype, "onKeydownArrowDown", null);
__decorate([
HostListener('keydown.arrowup', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxItemListDirective.prototype, "onKeydownArrowUp", null);
__decorate([
HostListener('keydown.arrowright', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxItemListDirective.prototype, "onKeydownArrowRight", null);
__decorate([
HostListener('keydown.arrowleft', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxItemListDirective.prototype, "onKeydownArrowLeft", null);
__decorate([
HostListener('keydown.enter', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxItemListDirective.prototype, "onKeydownEnter", null);
__decorate([
HostListener('keydown.escape', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxItemListDirective.prototype, "onKeydownEscape", null);
__decorate([
HostListener('mouseover'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], IgxItemListDirective.prototype, "onHover", null);
__decorate([
HostListener('wheel', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxItemListDirective.prototype, "onScroll", null);
__decorate([
HostListener('panmove', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxItemListDirective.prototype, "onPanMove", null);
IgxItemListDirective = __decorate([
Directive({
selector: '[igxItemList]'
}),
__param(0, Inject(IGX_TIME_PICKER_COMPONENT)),
__metadata("design:paramtypes", [Object, ElementRef])
], IgxItemListDirective);
export { IgxItemListDirective };
/**
* @hidden
*/
let IgxHourItemDirective = class IgxHourItemDirective {
constructor(timePicker, itemList) {
this.timePicker = timePicker;
this.itemList = itemList;
}
get defaultCSS() {
return true;
}
get selectedCSS() {
return this.isSelectedHour;
}
get activeCSS() {
return this.isSelectedHour && this.itemList.isActive;
}
get isSelectedHour() {
return this.timePicker.selectedHour === this.value;
}
onClick(item) {
if (item !== '') {
this.timePicker.scrollHourIntoView(item);
}
}
};
IgxHourItemDirective.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] },
{ type: IgxItemListDirective }
];
__decorate([
Input('igxHourItem'),
__metadata("design:type", String)
], IgxHourItemDirective.prototype, "value", void 0);
__decorate([
HostBinding('class.igx-time-picker__item'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxHourItemDirective.prototype, "defaultCSS", null);
__decorate([
HostBinding('class.igx-time-picker__item--selected'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxHourItemDirective.prototype, "selectedCSS", null);
__decorate([
HostBinding('class.igx-time-picker__item--active'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxHourItemDirective.prototype, "activeCSS", null);
__decorate([
HostListener('click', ['value']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxHourItemDirective.prototype, "onClick", null);
IgxHourItemDirective = __decorate([
Directive({
selector: '[igxHourItem]'
}),
__param(0, Inject(IGX_TIME_PICKER_COMPONENT)),
__metadata("design:paramtypes", [Object, IgxItemListDirective])
], IgxHourItemDirective);
export { IgxHourItemDirective };
/**
* @hidden
*/
let IgxMinuteItemDirective = class IgxMinuteItemDirective {
constructor(timePicker, itemList) {
this.timePicker = timePicker;
this.itemList = itemList;
}
get defaultCSS() {
return true;
}
get selectedCSS() {
return this.isSelectedMinute;
}
get activeCSS() {
return this.isSelectedMinute && this.itemList.isActive;
}
get isSelectedMinute() {
return this.timePicker.selectedMinute === this.value;
}
onClick(item) {
if (item !== '') {
this.timePicker.scrollMinuteIntoView(item);
}
}
};
IgxMinuteItemDirective.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] },
{ type: IgxItemListDirective }
];
__decorate([
Input('igxMinuteItem'),
__metadata("design:type", String)
], IgxMinuteItemDirective.prototype, "value", void 0);
__decorate([
HostBinding('class.igx-time-picker__item'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxMinuteItemDirective.prototype, "defaultCSS", null);
__decorate([
HostBinding('class.igx-time-picker__item--selected'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxMinuteItemDirective.prototype, "selectedCSS", null);
__decorate([
HostBinding('class.igx-time-picker__item--active'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxMinuteItemDirective.prototype, "activeCSS", null);
__decorate([
HostListener('click', ['value']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxMinuteItemDirective.prototype, "onClick", null);
IgxMinuteItemDirective = __decorate([
Directive({
selector: '[igxMinuteItem]'
}),
__param(0, Inject(IGX_TIME_PICKER_COMPONENT)),
__metadata("design:paramtypes", [Object, IgxItemListDirective])
], IgxMinuteItemDirective);
export { IgxMinuteItemDirective };
/**
* @hidden
*/
let IgxSecondsItemDirective = class IgxSecondsItemDirective {
constructor(timePicker, itemList) {
this.timePicker = timePicker;
this.itemList = itemList;
}
get defaultCSS() {
return true;
}
get selectedCSS() {
return this.isSelectedSeconds;
}
get activeCSS() {
return this.isSelectedSeconds && this.itemList.isActive;
}
get isSelectedSeconds() {
return this.timePicker.selectedSeconds === this.value;
}
onClick(item) {
if (item !== '') {
this.timePicker.scrollSecondsIntoView(item);
}
}
};
IgxSecondsItemDirective.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] },
{ type: IgxItemListDirective }
];
__decorate([
Input('igxSecondsItem'),
__metadata("design:type", String)
], IgxSecondsItemDirective.prototype, "value", void 0);
__decorate([
HostBinding('class.igx-time-picker__item'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxSecondsItemDirective.prototype, "defaultCSS", null);
__decorate([
HostBinding('class.igx-time-picker__item--selected'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxSecondsItemDirective.prototype, "selectedCSS", null);
__decorate([
HostBinding('class.igx-time-picker__item--active'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxSecondsItemDirective.prototype, "activeCSS", null);
__decorate([
HostListener('click', ['value']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxSecondsItemDirective.prototype, "onClick", null);
IgxSecondsItemDirective = __decorate([
Directive({
selector: '[igxSecondsItem]'
}),
__param(0, Inject(IGX_TIME_PICKER_COMPONENT)),
__metadata("design:paramtypes", [Object, IgxItemListDirective])
], IgxSecondsItemDirective);
export { IgxSecondsItemDirective };
/**
* @hidden
*/
let IgxAmPmItemDirective = class IgxAmPmItemDirective {
constructor(timePicker, itemList) {
this.timePicker = timePicker;
this.itemList = itemList;
}
get defaultCSS() {
return true;
}
get selectedCSS() {
return this.isSelectedAmPm;
}
get activeCSS() {
return this.isSelectedAmPm && this.itemList.isActive;
}
get isSelectedAmPm() {
return this.timePicker.selectedAmPm === this.value;
}
onClick(item) {
if (item !== '') {
this.timePicker.scrollAmPmIntoView(item);
}
}
};
IgxAmPmItemDirective.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] },
{ type: IgxItemListDirective }
];
__decorate([
Input('igxAmPmItem'),
__metadata("design:type", String)
], IgxAmPmItemDirective.prototype, "value", void 0);
__decorate([
HostBinding('class.igx-time-picker__item'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxAmPmItemDirective.prototype, "defaultCSS", null);
__decorate([
HostBinding('class.igx-time-picker__item--selected'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxAmPmItemDirective.prototype, "selectedCSS", null);
__decorate([
HostBinding('class.igx-time-picker__item--active'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxAmPmItemDirective.prototype, "activeCSS", null);
__decorate([
HostListener('click', ['value']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxAmPmItemDirective.prototype, "onClick", null);
IgxAmPmItemDirective = __decorate([
Directive({
selector: '[igxAmPmItem]'
}),
__param(0, Inject(IGX_TIME_PICKER_COMPONENT)),
__metadata("design:paramtypes", [Object, IgxItemListDirective])
], IgxAmPmItemDirective);
export { IgxAmPmItemDirective };
/**
* This directive should be used to mark which ng-template will be used from IgxTimePicker when re-templating its input group.
*/
let IgxTimePickerTemplateDirective = class IgxTimePickerTemplateDirective {
constructor(template) {
this.template = template;
}
};
IgxTimePickerTemplateDirective.ctorParameters = () => [
{ type: TemplateRef }
];
IgxTimePickerTemplateDirective = __decorate([
Directive({
selector: '[igxTimePickerTemplate]'
}),
__metadata("design:paramtypes", [TemplateRef])
], IgxTimePickerTemplateDirective);
export { IgxTimePickerTemplateDirective };
/**
* This directive can be used to add custom action buttons to the dropdownb/dialog.
*/
let IgxTimePickerActionsDirective = class IgxTimePickerActionsDirective {
constructor(template) {
this.template = template;
}
};
IgxTimePickerActionsDirective.ctorParameters = () => [
{ type: TemplateRef }
];
IgxTimePickerActionsDirective = __decorate([
Directive({
selector: '[igxTimePickerActions]'
}),
__metadata("design:paramtypes", [TemplateRef])
], IgxTimePickerActionsDirective);
export { IgxTimePickerActionsDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIuZGlyZWN0aXZlcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvdGltZS1waWNrZXIvdGltZS1waWNrZXIuZGlyZWN0aXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRztBQUNILE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxXQUFXLEVBQ2QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHlCQUF5QixFQUFxQixNQUFNLHNCQUFzQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEQsY0FBYztBQUlkLElBQWEsb0JBQW9CLEdBQWpDLE1BQWEsb0JBQW9CO0lBTzdCLFlBQzhDLFVBQTZCLEVBQy9ELFVBQXNCO1FBRFksZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDL0QsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUkzQixhQUFRLEdBQUcsQ0FBQyxDQUFDO0lBSGhCLENBQUM7SUFNTCxJQUFJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBR0QsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBR0QsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQztJQUN0QyxDQUFDO0lBR0QsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQztJQUN2QyxDQUFDO0lBR0QsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBR00sT0FBTztRQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFH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QUFRLEVBQUUsd0JBQXdCO0tBQ3JDLENBQUM7cUNBRStCLFdBQVc7R0FEL0IsNkJBQTZCLENBRXpDO1NBRlksNkJBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBkaXJlY3RpdmVzIHVzZWQgYnkgdGhlIEBsaW5rIElneFRpbWVQaWNrZXJDb21wb25lbnQuXG4gKiBZb3Ugc2hvdWxkIGdlbmVyYWxseSBub3QgdXNlIHRoZW0gZGlyZWN0bHkuXG4gKiBAcHJlZmVycmVkXG4gKi9cbmltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElHWF9USU1FX1BJQ0tFUl9DT01QT05FTlQsIElneFRpbWVQaWNrZXJCYXNlIH0gZnJvbSAnLi90aW1lLXBpY2tlci5jb21tb24nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25Nb2RlIH0gZnJvbSAnLi4vY29yZS9lbnVtcyc7XG5cbi8qKiBAaGlkZGVuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hJdGVtTGlzdF0nXG59KVxuZXhwb3J0IGNsYXNzIElneEl0ZW1MaXN0RGlyZWN0aXZlIHtcblxuICAgIEBJbnB1dCgnaWd4SXRlbUxpc3QnKVxuICAgIHB1YmxpYyB0eXBlOiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgaXNBY3RpdmU6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChJR1hfVElNRV9QSUNLRVJfQ09NUE9ORU5UKSBwdWJsaWMgdGltZVBpY2tlcjogSWd4VGltZVBpY2tlckJhc2UsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZlxuICAgICkgeyB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICAgIHB1YmxpYyB0YWJpbmRleCA9IDA7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9fY29sdW1uJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2hvdXJMaXN0JylcbiAgICBnZXQgaG91ckNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ2hvdXJMaXN0JztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9fbWludXRlTGlzdCcpXG4gICAgZ2V0IG1pbnV0ZUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ21pbnV0ZUxpc3QnO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19zZWNvbmRzTGlzdCcpXG4gICAgZ2V0IHNlY29uZHNDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdzZWNvbmRzTGlzdCc7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2FtcG1MaXN0JylcbiAgICBnZXQgYW1wbUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ2FtcG1MaXN0JztcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdmb2N1cycpXG4gICAgcHVibGljIG9uRm9jdXMoKSB7XG4gICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICAgIHB1YmxpYyBvbkJsdXIoKSB7XG4gICAgICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5leHRJdGVtKCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnaG91ckxpc3QnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLm5leHRIb3VyKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdtaW51dGVMaXN0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5uZXh0TWludXRlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdzZWNvbmRzTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIubmV4dFNlY29uZHMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2FtcG1MaXN0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5uZXh0QW1QbSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmV2SXRlbSgpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXJMaXN0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5wcmV2SG91cigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbWludXRlTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIucHJldk1pbnV0ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnc2Vjb25kc0xpc3QnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnByZXZTZWNvbmRzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdhbXBtTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIucHJldkFtUG0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkFycm93RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMubmV4dEl0ZW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd3VwJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duQXJyb3dVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMucHJldkl0ZW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd3JpZ2h0JywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duQXJyb3dSaWdodChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IGxpc3ROYW1lID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NOYW1lO1xuXG4gICAgICAgIGlmIChsaXN0TmFtZS5pbmRleE9mKCdob3VyTGlzdCcpICE9PSAtMSAmJiB0aGlzLnRpbWVQaWNrZXIubWludXRlTGlzdCkge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLm1pbnV0ZUxpc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKChsaXN0TmFtZS5pbmRleE9mKCdob3VyTGlzdCcpICE9PSAtMSB8fCBsaXN0TmFtZS5pbmRleE9mKCdtaW51dGVMaXN0JykgIT09IC0xKSAmJiB0aGlzLnRpbWVQaWNrZXIuc2Vjb25kc0xpc3QpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5zZWNvbmRzTGlzdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoKGxpc3ROYW1lLmluZGV4T2YoJ2hvdXJMaXN0JykgIT09IC0xIHx8IGxpc3ROYW1lLmluZGV4T2YoJ21pbnV0ZUxpc3QnKSAhPT0gLTEgfHxcbiAgICAgICAgICAgIGxpc3ROYW1lLmluZGV4T2YoJ3NlY29uZHNMaXN0JykgIT09IC0xKSAmJiB0aGlzLnRpbWVQaWNrZXIuYW1wbUxpc3QpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5hbXBtTGlzdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd2xlZnQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25BcnJvd0xlZnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgbGlzdE5hbWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbGFzc05hbWU7XG5cbiAgICAgICAgaWYgKGxpc3ROYW1lLmluZGV4T2YoJ2FtcG1MaXN0JykgIT09IC0xICYmIHRoaXMudGltZVBpY2tlci5zZWNvbmRzTGlzdCkge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnNlY29uZHNMaXN0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaXN0TmFtZS5pbmRleE9mKCdzZWNvbmRzTGlzdCcpICE9PSAtMSAmJiB0aGlzLnRpbWVQaWNrZXIuc2Vjb25kc0xpc3RcbiAgICAgICAgICAgICYmIGxpc3ROYW1lLmluZGV4T2YoJ21pbnV0ZXNMaXN0JykgJiYgdGhpcy50aW1lUGlja2VyLm1pbnV0ZUxpc3QpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5taW51dGVMaXN0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaXN0TmFtZS5pbmRleE9mKCdhbXBtTGlzdCcpICE9PSAtMSAmJiB0aGlzLnRpbWVQaWNrZXIubWludXRlTGlzdCkge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLm1pbnV0ZUxpc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKChsaXN0TmFtZS5pbmRleE9mKCdhbXBtTGlzdCcpICE9PSAtMSB8fCBsaXN0TmFtZS5pbmRleE9mKCdzZWNvbmRzTGlzdCcpICE9PSAtMSB8fFxuICAgICAgICAgICAgbGlzdE5hbWUuaW5kZXhPZignbWludXRlTGlzdCcpICE9PSAtMSkgJiYgdGhpcy50aW1lUGlja2VyLmhvdXJMaXN0KSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuaG91ckxpc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uZW50ZXInLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25FbnRlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnRpbWVQaWNrZXIubW9kZSA9PT0gSW50ZXJhY3Rpb25Nb2RlLkRyb3BEb3duKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpbWVQaWNrZXIub2tCdXR0b25DbGljaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmVzY2FwZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkVzY2FwZShldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMudGltZVBpY2tlci5jYW5jZWxCdXR0b25DbGljaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZW92ZXInKVxuICAgIHB1YmxpYyBvbkhvdmVyKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCd3aGVlbCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uU2Nyb2xsKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGlmIChldmVudC5kZWx0YVkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRJdGVtKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZGVsdGFZIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5wcmV2SXRlbSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3Bhbm1vdmUnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblBhbk1vdmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMubmV4dEl0ZW0oKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5kZWx0YVkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZJdGVtKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hIb3VySXRlbV0nXG59KVxuZXhwb3J0IGNsYXNzIElneEhvdXJJdGVtRGlyZWN0aXZlIHtcblxuICAgIEBJbnB1dCgnaWd4SG91ckl0ZW0nKVxuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0nKVxuICAgIGdldCBkZWZhdWx0Q1NTKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9faXRlbS0tc2VsZWN0ZWQnKVxuICAgIGdldCBzZWxlY3RlZENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZEhvdXI7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLWFjdGl2ZScpXG4gICAgZ2V0IGFjdGl2ZUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZEhvdXIgJiYgdGhpcy5pdGVtTGlzdC5pc0FjdGl2ZTtcbiAgICB9XG5cbiAgICBnZXQgaXNTZWxlY3RlZEhvdXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbWVQaWNrZXIuc2VsZWN0ZWRIb3VyID09PSB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSUdYX1RJTUVfUElDS0VSX0NPTVBPTkVOVClcbiAgICBwdWJsaWMgdGltZVBpY2tlcjogSWd4VGltZVBpY2tlckJhc2UsXG4gICAgICAgIHByaXZhdGUgaXRlbUxpc3Q6IElneEl0ZW1MaXN0RGlyZWN0aXZlKSB7IH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyd2YWx1ZSddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0gIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuc2Nyb2xsSG91ckludG9WaWV3KGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4TWludXRlSXRlbV0nXG59KVxuZXhwb3J0IGNsYXNzIElneE1pbnV0ZUl0ZW1EaXJlY3RpdmUge1xuXG4gICAgQElucHV0KCdpZ3hNaW51dGVJdGVtJylcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLXNlbGVjdGVkJylcbiAgICBnZXQgc2VsZWN0ZWRDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRNaW51dGU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLWFjdGl2ZScpXG4gICAgZ2V0IGFjdGl2ZUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZE1pbnV0ZSAmJiB0aGlzLml0ZW1MaXN0LmlzQWN0aXZlO1xuICAgIH1cblxuICAgIGdldCBpc1NlbGVjdGVkTWludXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lUGlja2VyLnNlbGVjdGVkTWludXRlID09PSB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSUdYX1RJTUVfUElDS0VSX0NPTVBPTkVOVClcbiAgICBwdWJsaWMgdGltZVBpY2tlcjogSWd4VGltZVBpY2tlckJhc2UsXG4gICAgICAgIHByaXZhdGUgaXRlbUxpc3Q6IElneEl0ZW1MaXN0RGlyZWN0aXZlKSB7IH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyd2YWx1ZSddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0gIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuc2Nyb2xsTWludXRlSW50b1ZpZXcoaXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hTZWNvbmRzSXRlbV0nXG59KVxuZXhwb3J0IGNsYXNzIElneFNlY29uZHNJdGVtRGlyZWN0aXZlIHtcblxuICAgIEBJbnB1dCgnaWd4U2Vjb25kc0l0ZW0nKVxuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0nKVxuICAgIGdldCBkZWZhdWx0Q1NTKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9faXRlbS0tc2VsZWN0ZWQnKVxuICAgIGdldCBzZWxlY3RlZENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZFNlY29uZHM7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLWFjdGl2ZScpXG4gICAgZ2V0IGFjdGl2ZUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZFNlY29uZHMgJiYgdGhpcy5pdGVtTGlzdC5pc0FjdGl2ZTtcbiAgICB9XG5cbiAgICBnZXQgaXNTZWxlY3RlZFNlY29uZHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbWVQaWNrZXIuc2VsZWN0ZWRTZWNvbmRzID09PSB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSUdYX1RJTUVfUElDS0VSX0NPTVBPTkVOVClcbiAgICBwdWJsaWMgdGltZVBpY2tlcjogSWd4VGltZVBpY2tlckJhc2UsXG4gICAgICAgIHByaXZhdGUgaXRlbUxpc3Q6IElneEl0ZW1MaXN0RGlyZWN0aXZlKSB7IH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyd2YWx1ZSddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0gIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuc2Nyb2xsU2Vjb25kc0ludG9WaWV3KGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4QW1QbUl0ZW1dJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hBbVBtSXRlbURpcmVjdGl2ZSB7XG5cbiAgICBASW5wdXQoJ2lneEFtUG1JdGVtJylcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLXNlbGVjdGVkJylcbiAgICBnZXQgc2VsZWN0ZWRDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRBbVBtO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtLS1hY3RpdmUnKVxuICAgIGdldCBhY3RpdmVDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRBbVBtICYmIHRoaXMuaXRlbUxpc3QuaXNBY3RpdmU7XG4gICAgfVxuXG4gICAgZ2V0IGlzU2VsZWN0ZWRBbVBtKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lUGlja2VyLnNlbGVjdGVkQW1QbSA9PT0gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KElHWF9USU1FX1BJQ0tFUl9DT01QT05FTlQpXG4gICAgcHVibGljIHRpbWVQaWNrZXI6IElneFRpbWVQaWNrZXJCYXNlLFxuICAgICAgICBwcml2YXRlIGl0ZW1MaXN0OiBJZ3hJdGVtTGlzdERpcmVjdGl2ZSkgeyB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsndmFsdWUnXSlcbiAgICBwdWJsaWMgb25DbGljayhpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnNjcm9sbEFtUG1JbnRvVmlldyhpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBUaGlzIGRpcmVjdGl2ZSBzaG91bGQgYmUgdXNlZCB0byBtYXJrIHdoaWNoIG5nLXRlbXBsYXRlIHdpbGwgYmUgdXNlZCBmcm9tIElneFRpbWVQaWNrZXIgd2hlbiByZS10ZW1wbGF0aW5nIGl0cyBpbnB1dCBncm91cC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4VGltZVBpY2tlclRlbXBsYXRlXSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4VGltZVBpY2tlclRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHsgfVxufVxuXG4vKipcbiAqIFRoaXMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGFkZCBjdXN0b20gYWN0aW9uIGJ1dHRvbnMgdG8gdGhlIGRyb3Bkb3duYi9kaWFsb2cuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2lneFRpbWVQaWNrZXJBY3Rpb25zXSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4VGltZVBpY2tlckFjdGlvbnNEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PikgeyB9XG59XG4iXX0=