ngx-materialize
Version:
An Angular wrap around Materialize library
215 lines (214 loc) • 19.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { ChangeDetectorRef, Directive, ElementRef, HostBinding, Input, NgZone, Optional, Renderer } from '@angular/core';
import { NgControl } from '@angular/forms';
import { first } from 'rxjs/operators';
import { HandlePropChanges } from '../shared/index';
export class MzTimepickerDirective extends HandlePropChanges {
/**
* @param {?} ngControl
* @param {?} changeDetectorRef
* @param {?} elementRef
* @param {?} renderer
* @param {?} zone
*/
constructor(ngControl, changeDetectorRef, elementRef, renderer, zone) {
super();
this.ngControl = ngControl;
this.changeDetectorRef = changeDetectorRef;
this.elementRef = elementRef;
this.renderer = renderer;
this.zone = zone;
// materialize uses ClockPicker to create the timepicker
// complete list of options is available at the following address
// https://github.com/weareoutman/clockpicker#options
this.options = {};
this.stopChangePropagation = false;
}
/**
* @return {?}
*/
get clockpicker() {
return $('.clockpicker');
}
/**
* @return {?}
*/
ngOnInit() {
this.initHandlers();
this.initElements();
this.initTimepicker();
this.handleProperties();
}
/**
* @return {?}
*/
ngOnDestroy() {
// remove event handlers
this.inputElement.off();
// remove clockpicker added to body by default
this.clockpicker.remove();
}
/**
* @return {?}
*/
initHandlers() {
this.handlers = {
label: () => this.handleLabel(),
placeholder: () => this.handlePlaceholder(),
};
}
/**
* @return {?}
*/
initElements() {
this.inputContainerElement = /** @type {?} */ ($(this.elementRef.nativeElement).parent('.input-field'));
this.inputElement = /** @type {?} */ ($(this.elementRef.nativeElement));
this.labelElement = /** @type {?} */ (this.createLabelElement());
}
/**
* @return {?}
*/
initTimepicker() {
// append clockpicker to body by default
if (!this.options.container) {
this.options.container = 'body';
}
// extend afterHide callback to set label active
const /** @type {?} */ afterHide = this.options && this.options.afterHide || (() => { });
this.options = Object.assign({}, this.options, {
afterHide: () => {
afterHide();
this.setLabelActive();
},
});
this.renderer.invokeElementMethod(this.inputElement, 'pickatime', [this.options]);
if (this.ngControl) {
// set ngControl value according to selected time in timepicker
this.inputElement.on('change', (event) => {
this.ngControl.control.setValue(event.target.value);
// mark for change detection
// fix form validation with ChangeDetectionStrategy.OnPush
this.changeDetectorRef.markForCheck();
});
}
}
/**
* @return {?}
*/
createLabelElement() {
const /** @type {?} */ labelElement = document.createElement('label');
labelElement.setAttribute('for', this.id);
this.renderer.invokeElementMethod(this.inputElement, 'after', [labelElement]);
return $(labelElement);
}
/**
* @return {?}
*/
handleProperties() {
if (this.inputContainerElement.length === 0) {
console.error('Input with mz-timepicker directive must be placed inside an [mz-timepicker-container] tag', this.inputElement);
return;
}
super.executePropHandlers();
}
/**
* @return {?}
*/
handleLabel() {
this.renderer.invokeElementMethod(this.labelElement, 'text', [this.label]);
}
/**
* @return {?}
*/
handlePlaceholder() {
const /** @type {?} */ placeholder = !!this.placeholder ? this.placeholder : null;
this.renderer.setElementAttribute(this.inputElement[0], 'placeholder', placeholder);
// fix issue in IE where having a placeholder on input make control dirty and trigger validation
// on page load... note that it still trigger validation on focus and would need a better fix
// issue : https://github.com/angular/angular/issues/15299
// workaround : https://stackoverflow.com/a/44967245/5583283
if (this.ngControl) {
this.zone.runOutsideAngular(() => {
setTimeout(() => this.ngControl.control.markAsPristine());
});
}
this.setLabelActive();
}
/**
* @return {?}
*/
setLabelActive() {
// need wait for zone to be stable otherwise it wont make label
// float in some circonstances (clearing value programmatically for example)
this.zone.onStable
.pipe(first())
.subscribe(() => {
const /** @type {?} */ inputValue = this.inputElement[0].value;
const /** @type {?} */ isActive = !!this.placeholder || !!inputValue;
this.renderer.setElementClass(this.labelElement[0], 'active', isActive);
});
}
}
MzTimepickerDirective.decorators = [
{ type: Directive, args: [{
selector: 'input[mzTimepicker], input[mz-timepicker]',
},] },
];
/** @nocollapse */
MzTimepickerDirective.ctorParameters = () => [
{ type: NgControl, decorators: [{ type: Optional },] },
{ type: ChangeDetectorRef, },
{ type: ElementRef, },
{ type: Renderer, },
{ type: NgZone, },
];
MzTimepickerDirective.propDecorators = {
"true": [{ type: HostBinding, args: ['class.timepicker',] },],
"id": [{ type: Input },],
"placeholder": [{ type: Input },],
"label": [{ type: Input },],
"options": [{ type: Input },],
};
function MzTimepickerDirective_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
MzTimepickerDirective.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
MzTimepickerDirective.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
MzTimepickerDirective.propDecorators;
/** @type {?} */
MzTimepickerDirective.prototype.true;
/** @type {?} */
MzTimepickerDirective.prototype.id;
/** @type {?} */
MzTimepickerDirective.prototype.placeholder;
/** @type {?} */
MzTimepickerDirective.prototype.label;
/** @type {?} */
MzTimepickerDirective.prototype.options;
/** @type {?} */
MzTimepickerDirective.prototype.inputElement;
/** @type {?} */
MzTimepickerDirective.prototype.inputContainerElement;
/** @type {?} */
MzTimepickerDirective.prototype.labelElement;
/** @type {?} */
MzTimepickerDirective.prototype.stopChangePropagation;
/** @type {?} */
MzTimepickerDirective.prototype.ngControl;
/** @type {?} */
MzTimepickerDirective.prototype.changeDetectorRef;
/** @type {?} */
MzTimepickerDirective.prototype.elementRef;
/** @type {?} */
MzTimepickerDirective.prototype.renderer;
/** @type {?} */
MzTimepickerDirective.prototype.zone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtbWF0ZXJpYWxpemUvIiwic291cmNlcyI6WyJzcmMvdGltZXBpY2tlci90aW1lcGlja2VyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQXFCLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUksT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUtwRCxNQUFNLDRCQUE2QixTQUFRLGlCQUFpQjs7Ozs7Ozs7SUF3QjFELFlBQ3NCLFdBQ1osbUJBQ0EsWUFDQSxVQUNBO1FBRVIsS0FBSyxFQUFFLENBQUM7UUFOWSxjQUFTLEdBQVQsU0FBUztRQUNyQixzQkFBaUIsR0FBakIsaUJBQWlCO1FBQ2pCLGVBQVUsR0FBVixVQUFVO1FBQ1YsYUFBUSxHQUFSLFFBQVE7UUFDUixTQUFJLEdBQUosSUFBSTs7Ozt1QkFoQlUsRUFBRTtxQ0FLRixLQUFLO0tBYzVCOzs7O0lBWkQsSUFBSSxXQUFXO1FBQ2IsTUFBTSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztLQUMxQjs7OztJQVlELFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztLQUN6Qjs7OztJQUVELFdBQVc7O1FBRVQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7UUFFeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztLQUMzQjs7OztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ2QsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDL0IsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtTQUM1QyxDQUFDO0tBQ0g7Ozs7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLHFCQUFxQixxQkFBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUF3QixDQUFBLENBQUM7UUFDNUcsSUFBSSxDQUFDLFlBQVkscUJBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUE2QixDQUFBLENBQUM7UUFDakYsSUFBSSxDQUFDLFlBQVkscUJBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUE4QixDQUFBLENBQUM7S0FDM0U7Ozs7SUFFRCxjQUFjOztRQUVaLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztTQUNqQzs7UUFHRCx1QkFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFHLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDN0MsU0FBUyxFQUFFLEdBQUcsRUFBRTtnQkFDZCxTQUFTLEVBQUUsQ0FBQztnQkFDWixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDdkI7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFbEYsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7O1lBRW5CLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQXFDLEVBQUUsRUFBRTtnQkFDdkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7OztnQkFJcEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3ZDLENBQUMsQ0FBQztTQUNKO0tBQ0Y7Ozs7SUFFRCxrQkFBa0I7UUFDaEIsdUJBQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckQsWUFBWSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTFDLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRTlFLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7S0FDeEI7Ozs7SUFFRCxnQkFBZ0I7UUFDZCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsT0FBTyxDQUFDLEtBQUssQ0FBQywyRkFBMkYsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDOUgsTUFBTSxDQUFDO1NBQ1I7UUFFRCxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztLQUM3Qjs7OztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDNUU7Ozs7SUFFRCxpQkFBaUI7UUFDZix1QkFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDOzs7OztRQU1wRixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtnQkFDL0IsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7YUFDM0QsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7S0FDdkI7Ozs7SUFFRCxjQUFjOzs7UUFHWixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7YUFDZixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDYixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsdUJBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQzlDLHVCQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3pFLENBQUMsQ0FBQztLQUNOOzs7WUE5SUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSwyQ0FBMkM7YUFDdEQ7Ozs7WUFSUSxTQUFTLHVCQWtDYixRQUFRO1lBbkNKLGlCQUFpQjtZQUFhLFVBQVU7WUFBMkQsUUFBUTtZQUE3QyxNQUFNOzs7cUJBVzFFLFdBQVcsU0FBQyxrQkFBa0I7bUJBRzlCLEtBQUs7NEJBQ0wsS0FBSztzQkFHTCxLQUFLO3dCQUtMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE5nWm9uZSwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBSZW5kZXJlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IEhhbmRsZVByb3BDaGFuZ2VzIH0gZnJvbSAnLi4vc2hhcmVkL2luZGV4JztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnaW5wdXRbbXpUaW1lcGlja2VyXSwgaW5wdXRbbXotdGltZXBpY2tlcl0nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTXpUaW1lcGlja2VyRGlyZWN0aXZlIGV4dGVuZHMgSGFuZGxlUHJvcENoYW5nZXMgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy50aW1lcGlja2VyJykgdHJ1ZTtcclxuXHJcbiAgLy8gbmF0aXZlIHByb3BlcnRpZXNcclxuICBASW5wdXQoKSBpZDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XHJcblxyXG4gIC8vIGRpcmVjdGl2ZSBwcm9wZXJ0aWVzXHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcclxuXHJcbiAgLy8gbWF0ZXJpYWxpemUgdXNlcyBDbG9ja1BpY2tlciB0byBjcmVhdGUgdGhlIHRpbWVwaWNrZXJcclxuICAvLyBjb21wbGV0ZSBsaXN0IG9mIG9wdGlvbnMgaXMgYXZhaWxhYmxlIGF0IHRoZSBmb2xsb3dpbmcgYWRkcmVzc1xyXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWFyZW91dG1hbi9jbG9ja3BpY2tlciNvcHRpb25zXHJcbiAgQElucHV0KCkgb3B0aW9uczogYW55ID0ge307XHJcblxyXG4gIGlucHV0RWxlbWVudDogSlF1ZXJ5PEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG4gIGlucHV0Q29udGFpbmVyRWxlbWVudDogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcclxuICBsYWJlbEVsZW1lbnQ6IEpRdWVyeTxIVE1MTGFiZWxFbGVtZW50PjtcclxuICBzdG9wQ2hhbmdlUHJvcGFnYXRpb24gPSBmYWxzZTtcclxuXHJcbiAgZ2V0IGNsb2NrcGlja2VyKCk6IEpRdWVyeTxIVE1MRWxlbWVudD4ge1xyXG4gICAgcmV0dXJuICQoJy5jbG9ja3BpY2tlcicpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIG5nQ29udHJvbDogTmdDb250cm9sLFxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcixcclxuICAgIHByaXZhdGUgem9uZTogTmdab25lLFxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0SGFuZGxlcnMoKTtcclxuICAgIHRoaXMuaW5pdEVsZW1lbnRzKCk7XHJcbiAgICB0aGlzLmluaXRUaW1lcGlja2VyKCk7XHJcbiAgICB0aGlzLmhhbmRsZVByb3BlcnRpZXMoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgLy8gcmVtb3ZlIGV2ZW50IGhhbmRsZXJzXHJcbiAgICB0aGlzLmlucHV0RWxlbWVudC5vZmYoKTtcclxuICAgIC8vIHJlbW92ZSBjbG9ja3BpY2tlciBhZGRlZCB0byBib2R5IGJ5IGRlZmF1bHRcclxuICAgIHRoaXMuY2xvY2twaWNrZXIucmVtb3ZlKCk7XHJcbiAgfVxyXG5cclxuICBpbml0SGFuZGxlcnMoKSB7XHJcbiAgICB0aGlzLmhhbmRsZXJzID0ge1xyXG4gICAgICBsYWJlbDogKCkgPT4gdGhpcy5oYW5kbGVMYWJlbCgpLFxyXG4gICAgICBwbGFjZWhvbGRlcjogKCkgPT4gdGhpcy5oYW5kbGVQbGFjZWhvbGRlcigpLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGluaXRFbGVtZW50cygpIHtcclxuICAgIHRoaXMuaW5wdXRDb250YWluZXJFbGVtZW50ID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkucGFyZW50KCcuaW5wdXQtZmllbGQnKSBhcyBKUXVlcnk8SFRNTEVsZW1lbnQ+O1xyXG4gICAgdGhpcy5pbnB1dEVsZW1lbnQgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSBhcyBKUXVlcnk8SFRNTElucHV0RWxlbWVudD47XHJcbiAgICB0aGlzLmxhYmVsRWxlbWVudCA9IHRoaXMuY3JlYXRlTGFiZWxFbGVtZW50KCkgYXMgSlF1ZXJ5PEhUTUxMYWJlbEVsZW1lbnQ+O1xyXG4gIH1cclxuXHJcbiAgaW5pdFRpbWVwaWNrZXIoKSB7XHJcbiAgICAvLyBhcHBlbmQgY2xvY2twaWNrZXIgdG8gYm9keSBieSBkZWZhdWx0XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5jb250YWluZXIpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmNvbnRhaW5lciA9ICdib2R5JztcclxuICAgIH1cclxuXHJcbiAgICAvLyBleHRlbmQgYWZ0ZXJIaWRlIGNhbGxiYWNrIHRvIHNldCBsYWJlbCBhY3RpdmVcclxuICAgIGNvbnN0IGFmdGVySGlkZSA9IHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuYWZ0ZXJIaWRlIHx8ICgoKSA9PiB7fSk7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMsIHtcclxuICAgICAgYWZ0ZXJIaWRlOiAoKSA9PiB7XHJcbiAgICAgICAgYWZ0ZXJIaWRlKCk7XHJcbiAgICAgICAgdGhpcy5zZXRMYWJlbEFjdGl2ZSgpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHRoaXMuaW5wdXRFbGVtZW50LCAncGlja2F0aW1lJywgW3RoaXMub3B0aW9uc10pO1xyXG5cclxuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xyXG4gICAgICAvLyBzZXQgbmdDb250cm9sIHZhbHVlIGFjY29yZGluZyB0byBzZWxlY3RlZCB0aW1lIGluIHRpbWVwaWNrZXJcclxuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQub24oJ2NoYW5nZScsIChldmVudDogSlF1ZXJ5LkV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XHJcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5zZXRWYWx1ZShldmVudC50YXJnZXQudmFsdWUpO1xyXG5cclxuICAgICAgICAvLyBtYXJrIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXHJcbiAgICAgICAgLy8gZml4IGZvcm0gdmFsaWRhdGlvbiB3aXRoIENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlTGFiZWxFbGVtZW50KCkge1xyXG4gICAgY29uc3QgbGFiZWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcclxuICAgIGxhYmVsRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2ZvcicsIHRoaXMuaWQpO1xyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuaW52b2tlRWxlbWVudE1ldGhvZCh0aGlzLmlucHV0RWxlbWVudCwgJ2FmdGVyJywgW2xhYmVsRWxlbWVudF0pO1xyXG5cclxuICAgIHJldHVybiAkKGxhYmVsRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQcm9wZXJ0aWVzKCkge1xyXG4gICAgaWYgKHRoaXMuaW5wdXRDb250YWluZXJFbGVtZW50Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdJbnB1dCB3aXRoIG16LXRpbWVwaWNrZXIgZGlyZWN0aXZlIG11c3QgYmUgcGxhY2VkIGluc2lkZSBhbiBbbXotdGltZXBpY2tlci1jb250YWluZXJdIHRhZycsIHRoaXMuaW5wdXRFbGVtZW50KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHN1cGVyLmV4ZWN1dGVQcm9wSGFuZGxlcnMoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUxhYmVsKCkge1xyXG4gICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHRoaXMubGFiZWxFbGVtZW50LCAndGV4dCcsIFt0aGlzLmxhYmVsXSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQbGFjZWhvbGRlcigpIHtcclxuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gISF0aGlzLnBsYWNlaG9sZGVyID8gdGhpcy5wbGFjZWhvbGRlciA6IG51bGw7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRBdHRyaWJ1dGUodGhpcy5pbnB1dEVsZW1lbnRbMF0sICdwbGFjZWhvbGRlcicsIHBsYWNlaG9sZGVyKTtcclxuXHJcbiAgICAvLyBmaXggaXNzdWUgaW4gSUUgd2hlcmUgaGF2aW5nIGEgcGxhY2Vob2xkZXIgb24gaW5wdXQgbWFrZSBjb250cm9sIGRpcnR5IGFuZCB0cmlnZ2VyIHZhbGlkYXRpb25cclxuICAgIC8vIG9uIHBhZ2UgbG9hZC4uLiBub3RlIHRoYXQgaXQgc3RpbGwgdHJpZ2dlciB2YWxpZGF0aW9uIG9uIGZvY3VzIGFuZCB3b3VsZCBuZWVkIGEgYmV0dGVyIGZpeFxyXG4gICAgLy8gaXNzdWUgOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xNTI5OVxyXG4gICAgLy8gd29ya2Fyb3VuZCA6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NDk2NzI0NS81NTgzMjgzXHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcclxuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubmdDb250cm9sLmNvbnRyb2wubWFya0FzUHJpc3RpbmUoKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0TGFiZWxBY3RpdmUoKTtcclxuICB9XHJcblxyXG4gIHNldExhYmVsQWN0aXZlKCkge1xyXG4gICAgLy8gbmVlZCB3YWl0IGZvciB6b25lIHRvIGJlIHN0YWJsZSBvdGhlcndpc2UgaXQgd29udCBtYWtlIGxhYmVsXHJcbiAgICAvLyBmbG9hdCBpbiBzb21lIGNpcmNvbnN0YW5jZXMgKGNsZWFyaW5nIHZhbHVlIHByb2dyYW1tYXRpY2FsbHkgZm9yIGV4YW1wbGUpXHJcbiAgICB0aGlzLnpvbmUub25TdGFibGVcclxuICAgICAgLnBpcGUoZmlyc3QoKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IHRoaXMuaW5wdXRFbGVtZW50WzBdLnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGlzQWN0aXZlID0gISF0aGlzLnBsYWNlaG9sZGVyIHx8ICEhaW5wdXRWYWx1ZTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyh0aGlzLmxhYmVsRWxlbWVudFswXSwgJ2FjdGl2ZScsIGlzQWN0aXZlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==