UNPKG

igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

500 lines • 33.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * 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 */ export class IgxItemListDirective { /** * @param {?} timePicker * @param {?} elementRef */ constructor(timePicker, elementRef) { this.timePicker = timePicker; this.elementRef = elementRef; this.tabindex = 0; } /** * @return {?} */ get defaultCSS() { return true; } /** * @return {?} */ get hourCSS() { return this.type === 'hourList'; } /** * @return {?} */ get minuteCSS() { return this.type === 'minuteList'; } /** * @return {?} */ get ampmCSS() { return this.type === 'ampmList'; } /** * @return {?} */ onFocus() { this.isActive = true; } /** * @return {?} */ onBlur() { this.isActive = false; } /** * @private * @return {?} */ nextItem() { switch (this.type) { case 'hourList': { this.timePicker.nextHour(); break; } case 'minuteList': { this.timePicker.nextMinute(); break; } case 'ampmList': { this.timePicker.nextAmPm(); break; } } } /** * @private * @return {?} */ prevItem() { switch (this.type) { case 'hourList': { this.timePicker.prevHour(); break; } case 'minuteList': { this.timePicker.prevMinute(); break; } case 'ampmList': { this.timePicker.prevAmPm(); break; } } } /** * @hidden * @param {?} event * @return {?} */ onKeydownArrowDown(event) { event.preventDefault(); this.nextItem(); } /** * @hidden * @param {?} event * @return {?} */ onKeydownArrowUp(event) { event.preventDefault(); this.prevItem(); } /** * @hidden * @param {?} event * @return {?} */ onKeydownArrowRight(event) { event.preventDefault(); /** @type {?} */ const listName = ((/** @type {?} */ (event.target))).className; if (listName.indexOf('hourList') !== -1) { this.timePicker.minuteList.nativeElement.focus(); } else if (listName.indexOf('minuteList') !== -1 && this.timePicker._ampmItems.length !== 0) { this.timePicker.ampmList.nativeElement.focus(); } } /** * @hidden * @param {?} event * @return {?} */ onKeydownArrowLeft(event) { event.preventDefault(); /** @type {?} */ const listName = ((/** @type {?} */ (event.target))).className; if (listName.indexOf('minuteList') !== -1) { this.timePicker.hourList.nativeElement.focus(); } else if (listName.indexOf('ampmList') !== -1) { this.timePicker.minuteList.nativeElement.focus(); } } /** * @hidden * @param {?} event * @return {?} */ onKeydownEnter(event) { event.preventDefault(); if (this.timePicker.mode === InteractionMode.DropDown) { this.timePicker.hideOverlay(); return; } this.timePicker.okButtonClick(); } /** * @hidden * @param {?} event * @return {?} */ onKeydownEscape(event) { event.preventDefault(); this.timePicker.cancelButtonClick(); } /** * @hidden * @return {?} */ onHover() { this.elementRef.nativeElement.focus(); } /** * @hidden * @param {?} event * @return {?} */ onScroll(event) { event.preventDefault(); event.stopPropagation(); if (event.deltaY > 0) { this.nextItem(); } else if (event.deltaY < 0) { this.prevItem(); } } /** * @hidden * @param {?} event * @return {?} */ onPanMove(event) { if (event.deltaY < 0) { this.nextItem(); } else if (event.deltaY > 0) { this.prevItem(); } } } IgxItemListDirective.decorators = [ { type: Directive, args: [{ selector: '[igxItemList]' },] } ]; /** @nocollapse */ IgxItemListDirective.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] }, { type: ElementRef } ]; IgxItemListDirective.propDecorators = { type: [{ type: Input, args: ['igxItemList',] }], tabindex: [{ type: HostBinding, args: ['attr.tabindex',] }], defaultCSS: [{ type: HostBinding, args: ['class.igx-time-picker__column',] }], hourCSS: [{ type: HostBinding, args: ['class.igx-time-picker__hourList',] }], minuteCSS: [{ type: HostBinding, args: ['class.igx-time-picker__minuteList',] }], ampmCSS: [{ type: HostBinding, args: ['class.igx-time-picker__ampmList',] }], onFocus: [{ type: HostListener, args: ['focus',] }], onBlur: [{ type: HostListener, args: ['blur',] }], onKeydownArrowDown: [{ type: HostListener, args: ['keydown.arrowdown', ['$event'],] }], onKeydownArrowUp: [{ type: HostListener, args: ['keydown.arrowup', ['$event'],] }], onKeydownArrowRight: [{ type: HostListener, args: ['keydown.arrowright', ['$event'],] }], onKeydownArrowLeft: [{ type: HostListener, args: ['keydown.arrowleft', ['$event'],] }], onKeydownEnter: [{ type: HostListener, args: ['keydown.enter', ['$event'],] }], onKeydownEscape: [{ type: HostListener, args: ['keydown.escape', ['$event'],] }], onHover: [{ type: HostListener, args: ['mouseover',] }], onScroll: [{ type: HostListener, args: ['wheel', ['$event'],] }], onPanMove: [{ type: HostListener, args: ['panmove', ['$event'],] }] }; if (false) { /** @type {?} */ IgxItemListDirective.prototype.type; /** @type {?} */ IgxItemListDirective.prototype.isActive; /** @type {?} */ IgxItemListDirective.prototype.tabindex; /** @type {?} */ IgxItemListDirective.prototype.timePicker; /** * @type {?} * @private */ IgxItemListDirective.prototype.elementRef; } /** * @hidden */ export class IgxHourItemDirective { /** * @param {?} timePicker * @param {?} itemList */ constructor(timePicker, itemList) { this.timePicker = timePicker; this.itemList = itemList; } /** * @return {?} */ get defaultCSS() { return true; } /** * @return {?} */ get selectedCSS() { return this.isSelectedHour; } /** * @return {?} */ get activeCSS() { return this.isSelectedHour && this.itemList.isActive; } /** * @return {?} */ get isSelectedHour() { return this.timePicker.selectedHour === this.value; } /** * @param {?} item * @return {?} */ onClick(item) { if (item !== '') { this.timePicker.scrollHourIntoView(item); } } } IgxHourItemDirective.decorators = [ { type: Directive, args: [{ selector: '[igxHourItem]' },] } ]; /** @nocollapse */ IgxHourItemDirective.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] }, { type: IgxItemListDirective } ]; IgxHourItemDirective.propDecorators = { value: [{ type: Input, args: ['igxHourItem',] }], defaultCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item',] }], selectedCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--selected',] }], activeCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--active',] }], onClick: [{ type: HostListener, args: ['click', ['value'],] }] }; if (false) { /** @type {?} */ IgxHourItemDirective.prototype.value; /** @type {?} */ IgxHourItemDirective.prototype.timePicker; /** * @type {?} * @private */ IgxHourItemDirective.prototype.itemList; } /** * @hidden */ export class IgxMinuteItemDirective { /** * @param {?} timePicker * @param {?} itemList */ constructor(timePicker, itemList) { this.timePicker = timePicker; this.itemList = itemList; } /** * @return {?} */ get defaultCSS() { return true; } /** * @return {?} */ get selectedCSS() { return this.isSelectedMinute; } /** * @return {?} */ get activeCSS() { return this.isSelectedMinute && this.itemList.isActive; } /** * @return {?} */ get isSelectedMinute() { return this.timePicker.selectedMinute === this.value; } /** * @param {?} item * @return {?} */ onClick(item) { if (item !== '') { this.timePicker.scrollMinuteIntoView(item); } } } IgxMinuteItemDirective.decorators = [ { type: Directive, args: [{ selector: '[igxMinuteItem]' },] } ]; /** @nocollapse */ IgxMinuteItemDirective.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] }, { type: IgxItemListDirective } ]; IgxMinuteItemDirective.propDecorators = { value: [{ type: Input, args: ['igxMinuteItem',] }], defaultCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item',] }], selectedCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--selected',] }], activeCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--active',] }], onClick: [{ type: HostListener, args: ['click', ['value'],] }] }; if (false) { /** @type {?} */ IgxMinuteItemDirective.prototype.value; /** @type {?} */ IgxMinuteItemDirective.prototype.timePicker; /** * @type {?} * @private */ IgxMinuteItemDirective.prototype.itemList; } /** * @hidden */ export class IgxAmPmItemDirective { /** * @param {?} timePicker * @param {?} itemList */ constructor(timePicker, itemList) { this.timePicker = timePicker; this.itemList = itemList; } /** * @return {?} */ get defaultCSS() { return true; } /** * @return {?} */ get selectedCSS() { return this.isSelectedAmPm; } /** * @return {?} */ get activeCSS() { return this.isSelectedAmPm && this.itemList.isActive; } /** * @return {?} */ get isSelectedAmPm() { return this.timePicker.selectedAmPm === this.value; } /** * @param {?} item * @return {?} */ onClick(item) { if (item !== '') { this.timePicker.scrollAmPmIntoView(item); } } } IgxAmPmItemDirective.decorators = [ { type: Directive, args: [{ selector: '[igxAmPmItem]' },] } ]; /** @nocollapse */ IgxAmPmItemDirective.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [IGX_TIME_PICKER_COMPONENT,] }] }, { type: IgxItemListDirective } ]; IgxAmPmItemDirective.propDecorators = { value: [{ type: Input, args: ['igxAmPmItem',] }], defaultCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item',] }], selectedCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--selected',] }], activeCSS: [{ type: HostBinding, args: ['class.igx-time-picker__item--active',] }], onClick: [{ type: HostListener, args: ['click', ['value'],] }] }; if (false) { /** @type {?} */ IgxAmPmItemDirective.prototype.value; /** @type {?} */ IgxAmPmItemDirective.prototype.timePicker; /** * @type {?} * @private */ IgxAmPmItemDirective.prototype.itemList; } /** * This directive should be used to mark which ng-template will be used from IgxTimePicker when re-templating its input group. */ export class IgxTimePickerTemplateDirective { /** * @param {?} template */ constructor(template) { this.template = template; } } IgxTimePickerTemplateDirective.decorators = [ { type: Directive, args: [{ selector: '[igxTimePickerTemplate]' },] } ]; /** @nocollapse */ IgxTimePickerTemplateDirective.ctorParameters = () => [ { type: TemplateRef } ]; if (false) { /** @type {?} */ IgxTimePickerTemplateDirective.prototype.template; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIuZGlyZWN0aXZlcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvdGltZS1waWNrZXIvdGltZS1waWNrZXIuZGlyZWN0aXZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFLQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsV0FBVyxFQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx5QkFBeUIsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBTWhELE1BQU0sT0FBTyxvQkFBb0I7Ozs7O0lBTzdCLFlBQ08sVUFBNkIsRUFDeEIsVUFBc0I7UUFEM0IsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDeEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUczQixhQUFRLEdBQUcsQ0FBQyxDQUFDO0lBSGtCLENBQUM7Ozs7SUFLdkMsSUFDSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQzs7OztJQUVELElBQ0ksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7SUFDcEMsQ0FBQzs7OztJQUVELElBQ0ksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUM7SUFDdEMsQ0FBQzs7OztJQUVELElBQ0ksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7SUFDcEMsQ0FBQzs7OztJQUdNLE9BQU87UUFDVixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDOzs7O0lBR00sTUFBTTtRQUNULElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7Ozs7O0lBRU8sUUFBUTtR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QUM1Qjs7Ozs0Q0F5QmdCLE1BQU0sU0FBQyx5QkFBeUI7WUFFdkIsb0JBQW9COzs7b0JBeEJ6QyxLQUFLLFNBQUMsYUFBYTt5QkFHbkIsV0FBVyxTQUFDLDZCQUE2QjswQkFLekMsV0FBVyxTQUFDLHVDQUF1Qzt3QkFLbkQsV0FBVyxTQUFDLHFDQUFxQztzQkFhakQsWUFBWSxTQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQzs7OztJQTFCaEMscUNBQ3FCOztJQXFCVCwwQ0FDd0I7Ozs7O0lBQ2hDLHdDQUFzQzs7Ozs7QUFnQjlDLE1BQU0sT0FBTyw4QkFBOEI7Ozs7SUFDdkMsWUFBbUIsUUFBMEI7UUFBMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7SUFBSSxDQUFDOzs7WUFKckQsU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSx5QkFBeUI7YUFDdEM7Ozs7WUExVUcsV0FBVzs7OztJQTRVQyxrREFBaUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGRpcmVjdGl2ZXMgdXNlZCBieSB0aGUgQGxpbmsgSWd4VGltZVBpY2tlckNvbXBvbmVudC5cbiAqIFlvdSBzaG91bGQgZ2VuZXJhbGx5IG5vdCB1c2UgdGhlbSBkaXJlY3RseS5cbiAqIEBwcmVmZXJyZWRcbiAqL1xuaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUdYX1RJTUVfUElDS0VSX0NPTVBPTkVOVCwgSWd4VGltZVBpY2tlckJhc2UgfSBmcm9tICcuL3RpbWUtcGlja2VyLmNvbW1vbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbk1vZGUgfSBmcm9tICcuLi9jb3JlL2VudW1zJztcblxuLyoqIEBoaWRkZW4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2lneEl0ZW1MaXN0XSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4SXRlbUxpc3REaXJlY3RpdmUge1xuXG4gICAgQElucHV0KCdpZ3hJdGVtTGlzdCcpXG4gICAgcHVibGljIHR5cGU6IHN0cmluZztcblxuICAgIHB1YmxpYyBpc0FjdGl2ZTogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSUdYX1RJTUVfUElDS0VSX0NPTVBPTkVOVClcbiAgICBwdWJsaWMgdGltZVBpY2tlcjogSWd4VGltZVBpY2tlckJhc2UsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikgeyB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICAgIHB1YmxpYyB0YWJpbmRleCA9IDA7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9fY29sdW1uJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2hvdXJMaXN0JylcbiAgICBnZXQgaG91ckNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ2hvdXJMaXN0JztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9fbWludXRlTGlzdCcpXG4gICAgZ2V0IG1pbnV0ZUNTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ21pbnV0ZUxpc3QnO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19hbXBtTGlzdCcpXG4gICAgZ2V0IGFtcG1DU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdhbXBtTGlzdCc7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZm9jdXMnKVxuICAgIHB1YmxpYyBvbkZvY3VzKCkge1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgICBwdWJsaWMgb25CbHVyKCkge1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuZXh0SXRlbSgpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXJMaXN0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5uZXh0SG91cigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbWludXRlTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIubmV4dE1pbnV0ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnYW1wbUxpc3QnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLm5leHRBbVBtKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXZJdGVtKCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnaG91ckxpc3QnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnByZXZIb3VyKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdtaW51dGVMaXN0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5wcmV2TWludXRlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdhbXBtTGlzdCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIucHJldkFtUG0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkFycm93RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMubmV4dEl0ZW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd3VwJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duQXJyb3dVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMucHJldkl0ZW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd3JpZ2h0JywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duQXJyb3dSaWdodChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IGxpc3ROYW1lID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NOYW1lO1xuXG4gICAgICAgIGlmIChsaXN0TmFtZS5pbmRleE9mKCdob3VyTGlzdCcpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLm1pbnV0ZUxpc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKGxpc3ROYW1lLmluZGV4T2YoJ21pbnV0ZUxpc3QnKSAhPT0gLTEgJiYgdGhpcy50aW1lUGlja2VyLl9hbXBtSXRlbXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVQaWNrZXIuYW1wbUxpc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uYXJyb3dsZWZ0JywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duQXJyb3dMZWZ0KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3QgbGlzdE5hbWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbGFzc05hbWU7XG5cbiAgICAgICAgaWYgKGxpc3ROYW1lLmluZGV4T2YoJ21pbnV0ZUxpc3QnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5ob3VyTGlzdC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAobGlzdE5hbWUuaW5kZXhPZignYW1wbUxpc3QnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVBpY2tlci5taW51dGVMaXN0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmVudGVyJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duRW50ZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAodGhpcy50aW1lUGlja2VyLm1vZGUgPT09IEludGVyYWN0aW9uTW9kZS5Ecm9wRG93bikge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLmhpZGVPdmVybGF5KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aW1lUGlja2VyLm9rQnV0dG9uQ2xpY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lc2NhcGUnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25Fc2NhcGUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB0aGlzLnRpbWVQaWNrZXIuY2FuY2VsQnV0dG9uQ2xpY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VvdmVyJylcbiAgICBwdWJsaWMgb25Ib3ZlcigpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignd2hlZWwnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvblNjcm9sbChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBpZiAoZXZlbnQuZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgdGhpcy5uZXh0SXRlbSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMucHJldkl0ZW0oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW5tb3ZlJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25QYW5Nb3ZlKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5kZWx0YVkgPCAwKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRJdGVtKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wcmV2SXRlbSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4SG91ckl0ZW1dJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hIb3VySXRlbURpcmVjdGl2ZSB7XG5cbiAgICBASW5wdXQoJ2lneEhvdXJJdGVtJylcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLXNlbGVjdGVkJylcbiAgICBnZXQgc2VsZWN0ZWRDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRIb3VyO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtLS1hY3RpdmUnKVxuICAgIGdldCBhY3RpdmVDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRIb3VyICYmIHRoaXMuaXRlbUxpc3QuaXNBY3RpdmU7XG4gICAgfVxuXG4gICAgZ2V0IGlzU2VsZWN0ZWRIb3VyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lUGlja2VyLnNlbGVjdGVkSG91ciA9PT0gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KElHWF9USU1FX1BJQ0tFUl9DT01QT05FTlQpXG4gICAgcHVibGljIHRpbWVQaWNrZXI6IElneFRpbWVQaWNrZXJCYXNlLFxuICAgICAgICBwcml2YXRlIGl0ZW1MaXN0OiBJZ3hJdGVtTGlzdERpcmVjdGl2ZSkgeyB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsndmFsdWUnXSlcbiAgICBwdWJsaWMgb25DbGljayhpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnNjcm9sbEhvdXJJbnRvVmlldyhpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2lneE1pbnV0ZUl0ZW1dJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hNaW51dGVJdGVtRGlyZWN0aXZlIHtcblxuICAgIEBJbnB1dCgnaWd4TWludXRlSXRlbScpXG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmc7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10aW1lLXBpY2tlcl9faXRlbScpXG4gICAgZ2V0IGRlZmF1bHRDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtLS1zZWxlY3RlZCcpXG4gICAgZ2V0IHNlbGVjdGVkQ1NTKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NlbGVjdGVkTWludXRlO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtLS1hY3RpdmUnKVxuICAgIGdldCBhY3RpdmVDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRNaW51dGUgJiYgdGhpcy5pdGVtTGlzdC5pc0FjdGl2ZTtcbiAgICB9XG5cbiAgICBnZXQgaXNTZWxlY3RlZE1pbnV0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZVBpY2tlci5zZWxlY3RlZE1pbnV0ZSA9PT0gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KElHWF9USU1FX1BJQ0tFUl9DT01QT05FTlQpXG4gICAgcHVibGljIHRpbWVQaWNrZXI6IElneFRpbWVQaWNrZXJCYXNlLFxuICAgICAgICBwcml2YXRlIGl0ZW1MaXN0OiBJZ3hJdGVtTGlzdERpcmVjdGl2ZSkgeyB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsndmFsdWUnXSlcbiAgICBwdWJsaWMgb25DbGljayhpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnNjcm9sbE1pbnV0ZUludG9WaWV3KGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4QW1QbUl0ZW1dJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hBbVBtSXRlbURpcmVjdGl2ZSB7XG5cbiAgICBASW5wdXQoJ2lneEFtUG1JdGVtJylcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtJylcbiAgICBnZXQgZGVmYXVsdENTUygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGltZS1waWNrZXJfX2l0ZW0tLXNlbGVjdGVkJylcbiAgICBnZXQgc2VsZWN0ZWRDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRBbVBtO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXRpbWUtcGlja2VyX19pdGVtLS1hY3RpdmUnKVxuICAgIGdldCBhY3RpdmVDU1MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRBbVBtICYmIHRoaXMuaXRlbUxpc3QuaXNBY3RpdmU7XG4gICAgfVxuXG4gICAgZ2V0IGlzU2VsZWN0ZWRBbVBtKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aW1lUGlja2VyLnNlbGVjdGVkQW1QbSA9PT0gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KElHWF9USU1FX1BJQ0tFUl9DT01QT05FTlQpXG4gICAgcHVibGljIHRpbWVQaWNrZXI6IElneFRpbWVQaWNrZXJCYXNlLFxuICAgICAgICBwcml2YXRlIGl0ZW1MaXN0OiBJZ3hJdGVtTGlzdERpcmVjdGl2ZSkgeyB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsndmFsdWUnXSlcbiAgICBwdWJsaWMgb25DbGljayhpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy50aW1lUGlja2VyLnNjcm9sbEFtUG1JbnRvVmlldyhpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBUaGlzIGRpcmVjdGl2ZSBzaG91bGQgYmUgdXNlZCB0byBtYXJrIHdoaWNoIG5nLXRlbXBsYXRlIHdpbGwgYmUgdXNlZCBmcm9tIElneFRpbWVQaWNrZXIgd2hlbiByZS10ZW1wbGF0aW5nIGl0cyBpbnB1dCBncm91cC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4VGltZVBpY2tlclRlbXBsYXRlXSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4VGltZVBpY2tlclRlbXBsYXRlRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHsgfVxufVxuXG4iXX0=