UNPKG

ngx-materialize

Version:

An Angular wrap around Materialize library

283 lines (282 loc) 27.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { ChangeDetectorRef, Directive, ElementRef, HostBinding, Input, Optional, Renderer } from '@angular/core'; import { NgControl } from '@angular/forms'; import { HandlePropChanges } from '../shared/index'; export class MzDatepickerDirective extends HandlePropChanges { /** * @param {?} ngControl * @param {?} changeDetectorRef * @param {?} elementRef * @param {?} renderer */ constructor(ngControl, changeDetectorRef, elementRef, renderer) { super(); this.ngControl = ngControl; this.changeDetectorRef = changeDetectorRef; this.elementRef = elementRef; this.renderer = renderer; // materialize uses pickadate.js to create the datepicker // complete list of options is available at the following address // http://amsul.ca/pickadate.js/date/#options this.options = {}; this.isInitRound = true; this.stopChangePropagation = false; } /** * @return {?} */ get format() { return this.options.format || this.options.formatSubmit || null; } /** * @return {?} */ get formatSubmit() { return this.options.formatSubmit || this.options.format || null; } /** * @return {?} */ get ngControlValue() { return this.ngControl.value === '' ? null : this.ngControl.value; } /** * @return {?} */ get picker() { return this.inputElement.pickadate('picker'); } /** * @return {?} */ ngOnInit() { this.initHandlers(); this.initElements(); this.initDatepicker(); this.initInputSubscription(); this.handleProperties(); this.isInitRound = false; } /** * @return {?} */ ngOnDestroy() { if (this.inputValueSubscription) { this.inputValueSubscription.unsubscribe(); } } /** * @return {?} */ initHandlers() { this.handlers = { label: () => this.handleLabel(), options: () => this.handleOptions(), placeholder: () => this.handlePlaceholder(), }; } /** * @return {?} */ initElements() { this.inputContainerElement = $(this.elementRef.nativeElement).parent('.input-field'); this.inputElement = $(this.elementRef.nativeElement); this.labelElement = this.createLabelElement(); } /** * @return {?} */ initDatepicker() { // set default format/formatSubmit options if (this.format) { this.options.format = this.format; } if (this.formatSubmit) { this.options.formatSubmit = this.formatSubmit; } // extends onClose function to fix datepicker focus issue // https://github.com/Dogfalo/materialize/issues/2067#issuecomment-142107599 const /** @type {?} */ onCloseFn = this.options && this.options.onClose || (() => { }); this.options = Object.assign({}, this.options, { onClose: (event) => { onCloseFn(event); this.renderer.invokeElementMethod(document.activeElement, 'blur'); }, }); this.renderer.invokeElementMethod(this.inputElement, 'pickadate', [this.options]); if (this.ngControl) { // set datepicker initial value according to ngControl this.picker.set('select', this.ngControlValue, { format: this.formatSubmit }); // set ngControl value according to selected date in datepicker this.picker.on('set', () => { // handle stop propagation if (this.stopChangePropagation) { this.stopChangePropagation = false; return; } else { this.stopChangePropagation = true; } // apply options.formatSubmit to ngControl value const /** @type {?} */ submitValue = this.formatSubmit ? this.picker.get('select', this.formatSubmit) : this.picker.get('value'); this.ngControl.control.setValue(submitValue); // apply options.format to input text const /** @type {?} */ formatValue = this.format ? this.picker.get('select', this.format) : this.picker.get('value'); this.inputElement.val(formatValue); // set label active status this.setLabelActive(); // mark for change detection // fix form validation with ChangeDetectionStrategy.OnPush this.changeDetectorRef.markForCheck(); }); } } /** * @return {?} */ initInputSubscription() { if (this.ngControl) { this.inputValueSubscription = this.ngControl.valueChanges.subscribe(() => { // handle stop propagation if (this.stopChangePropagation) { this.stopChangePropagation = false; return; } else { this.stopChangePropagation = true; } // set selected date in datepicker according to ngControl value this.picker.set('select', this.ngControlValue, { format: this.formatSubmit }); // set label active status this.setLabelActive(); }); } } /** * @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-datepicker directive must be placed inside an [mz-datepicker-container] tag', this.inputElement); return; } super.executePropHandlers(); } /** * @return {?} */ handleLabel() { this.renderer.invokeElementMethod(this.labelElement, 'text', [this.label]); } /** * @return {?} */ handleOptions() { if (!this.isInitRound) { this.picker.set(this.options); } } /** * @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) { setTimeout(() => this.ngControl.control.markAsPristine()); } this.setLabelActive(); } /** * @return {?} */ setLabelActive() { // need setTimeout otherwise it wont make label float in some circonstances (forcing validation for example) setTimeout(() => { const /** @type {?} */ inputValue = (/** @type {?} */ (this.inputElement[0])).value; const /** @type {?} */ isActive = !!this.placeholder || !!inputValue; this.renderer.setElementClass(this.labelElement[0], 'active', isActive); }); } } MzDatepickerDirective.decorators = [ { type: Directive, args: [{ selector: 'input[mzDatepicker], input[mz-datepicker]', },] }, ]; /** @nocollapse */ MzDatepickerDirective.ctorParameters = () => [ { type: NgControl, decorators: [{ type: Optional },] }, { type: ChangeDetectorRef, }, { type: ElementRef, }, { type: Renderer, }, ]; MzDatepickerDirective.propDecorators = { "true": [{ type: HostBinding, args: ['class.datepicker',] },], "id": [{ type: Input },], "placeholder": [{ type: Input },], "label": [{ type: Input },], "options": [{ type: Input },], }; function MzDatepickerDirective_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ MzDatepickerDirective.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ MzDatepickerDirective.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ MzDatepickerDirective.propDecorators; /** @type {?} */ MzDatepickerDirective.prototype.true; /** @type {?} */ MzDatepickerDirective.prototype.id; /** @type {?} */ MzDatepickerDirective.prototype.placeholder; /** @type {?} */ MzDatepickerDirective.prototype.label; /** @type {?} */ MzDatepickerDirective.prototype.options; /** @type {?} */ MzDatepickerDirective.prototype.inputElement; /** @type {?} */ MzDatepickerDirective.prototype.inputContainerElement; /** @type {?} */ MzDatepickerDirective.prototype.inputValueSubscription; /** @type {?} */ MzDatepickerDirective.prototype.isInitRound; /** @type {?} */ MzDatepickerDirective.prototype.labelElement; /** @type {?} */ MzDatepickerDirective.prototype.stopChangePropagation; /** @type {?} */ MzDatepickerDirective.prototype.ngControl; /** @type {?} */ MzDatepickerDirective.prototype.changeDetectorRef; /** @type {?} */ MzDatepickerDirective.prototype.elementRef; /** @type {?} */ MzDatepickerDirective.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtbWF0ZXJpYWxpemUvIiwic291cmNlcyI6WyJzcmMvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFLcEQsTUFBTSw0QkFBNkIsU0FBUSxpQkFBaUI7Ozs7Ozs7SUFzQzFELFlBQ3NCLFdBQ1osbUJBQ0EsWUFDQTtRQUVSLEtBQUssRUFBRSxDQUFDO1FBTFksY0FBUyxHQUFULFNBQVM7UUFDckIsc0JBQWlCLEdBQWpCLGlCQUFpQjtRQUNqQixlQUFVLEdBQVYsVUFBVTtRQUNWLGFBQVEsR0FBUixRQUFROzs7O3VCQTdCd0IsRUFBRTsyQkFLOUIsSUFBSTtxQ0FFTSxLQUFLO0tBeUI1Qjs7OztJQXZCRCxJQUFJLE1BQU07UUFDUixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDO0tBQ2pFOzs7O0lBRUQsSUFBSSxZQUFZO1FBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQztLQUNqRTs7OztJQUVELElBQUksY0FBYztRQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUks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LFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsMkNBQTJDO2FBQ3REOzs7O1lBUFEsU0FBUyx1QkErQ2IsUUFBUTtZQWhESixpQkFBaUI7WUFBYSxVQUFVO1lBQW1ELFFBQVE7OztxQkFVekcsV0FBVyxTQUFDLGtCQUFrQjttQkFHOUIsS0FBSzs0QkFDTCxLQUFLO3NCQUdMLEtBQUs7d0JBS0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBSZW5kZXJlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgSGFuZGxlUHJvcENoYW5nZXMgfSBmcm9tICcuLi9zaGFyZWQvaW5kZXgnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdpbnB1dFttekRhdGVwaWNrZXJdLCBpbnB1dFttei1kYXRlcGlja2VyXScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNekRhdGVwaWNrZXJEaXJlY3RpdmUgZXh0ZW5kcyBIYW5kbGVQcm9wQ2hhbmdlcyBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRhdGVwaWNrZXInKSB0cnVlO1xyXG5cclxuICAvLyBuYXRpdmUgcHJvcGVydGllc1xyXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuXHJcbiAgLy8gZGlyZWN0aXZlIHByb3BlcnRpZXNcclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xyXG5cclxuICAvLyBtYXRlcmlhbGl6ZSB1c2VzIHBpY2thZGF0ZS5qcyB0byBjcmVhdGUgdGhlIGRhdGVwaWNrZXJcclxuICAvLyBjb21wbGV0ZSBsaXN0IG9mIG9wdGlvbnMgaXMgYXZhaWxhYmxlIGF0IHRoZSBmb2xsb3dpbmcgYWRkcmVzc1xyXG4gIC8vIGh0dHA6Ly9hbXN1bC5jYS9waWNrYWRhdGUuanMvZGF0ZS8jb3B0aW9uc1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IFBpY2thZGF0ZS5EYXRlT3B0aW9ucyA9IHt9O1xyXG5cclxuICBpbnB1dEVsZW1lbnQ6IEpRdWVyeTtcclxuICBpbnB1dENvbnRhaW5lckVsZW1lbnQ6IEpRdWVyeTtcclxuICBpbnB1dFZhbHVlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgaXNJbml0Um91bmQgPSB0cnVlO1xyXG4gIGxhYmVsRWxlbWVudDogSlF1ZXJ5O1xyXG4gIHN0b3BDaGFuZ2VQcm9wYWdhdGlvbiA9IGZhbHNlO1xyXG5cclxuICBnZXQgZm9ybWF0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZvcm1hdCB8fCB0aGlzLm9wdGlvbnMuZm9ybWF0U3VibWl0IHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9ybWF0U3VibWl0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZvcm1hdFN1Ym1pdCB8fCB0aGlzLm9wdGlvbnMuZm9ybWF0IHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXQgbmdDb250cm9sVmFsdWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLm5nQ29udHJvbC52YWx1ZSA9PT0gJycgPyBudWxsIDogdGhpcy5uZ0NvbnRyb2wudmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgcGlja2VyKCk6IFBpY2thZGF0ZS5EYXRlUGlja2VyIHtcclxuICAgIHJldHVybiB0aGlzLmlucHV0RWxlbWVudC5waWNrYWRhdGUoJ3BpY2tlcicpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIG5nQ29udHJvbDogTmdDb250cm9sLFxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcixcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuaW5pdEhhbmRsZXJzKCk7XHJcbiAgICB0aGlzLmluaXRFbGVtZW50cygpO1xyXG4gICAgdGhpcy5pbml0RGF0ZXBpY2tlcigpO1xyXG4gICAgdGhpcy5pbml0SW5wdXRTdWJzY3JpcHRpb24oKTtcclxuICAgIHRoaXMuaGFuZGxlUHJvcGVydGllcygpO1xyXG4gICAgdGhpcy5pc0luaXRSb3VuZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5pbnB1dFZhbHVlU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdEhhbmRsZXJzKCkge1xyXG4gICAgdGhpcy5oYW5kbGVycyA9IHtcclxuICAgICAgbGFiZWw6ICgpID0+IHRoaXMuaGFuZGxlTGFiZWwoKSxcclxuICAgICAgb3B0aW9uczogKCkgPT4gdGhpcy5oYW5kbGVPcHRpb25zKCksXHJcbiAgICAgIHBsYWNlaG9sZGVyOiAoKSA9PiB0aGlzLmhhbmRsZVBsYWNlaG9sZGVyKCksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgaW5pdEVsZW1lbnRzKCkge1xyXG4gICAgdGhpcy5pbnB1dENvbnRhaW5lckVsZW1lbnQgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5wYXJlbnQoJy5pbnB1dC1maWVsZCcpO1xyXG4gICAgdGhpcy5pbnB1dEVsZW1lbnQgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgIHRoaXMubGFiZWxFbGVtZW50ID0gdGhpcy5jcmVhdGVMYWJlbEVsZW1lbnQoKTtcclxuICB9XHJcblxyXG4gIGluaXREYXRlcGlja2VyKCkge1xyXG4gICAgLy8gc2V0IGRlZmF1bHQgZm9ybWF0L2Zvcm1hdFN1Ym1pdCBvcHRpb25zXHJcbiAgICBpZiAodGhpcy5mb3JtYXQpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmZvcm1hdCA9IHRoaXMuZm9ybWF0O1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZm9ybWF0U3VibWl0KSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5mb3JtYXRTdWJtaXQgPSB0aGlzLmZvcm1hdFN1Ym1pdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBleHRlbmRzIG9uQ2xvc2UgZnVuY3Rpb24gdG8gZml4IGRhdGVwaWNrZXIgZm9jdXMgaXNzdWVcclxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2dmYWxvL21hdGVyaWFsaXplL2lzc3Vlcy8yMDY3I2lzc3VlY29tbWVudC0xNDIxMDc1OTlcclxuICAgIGNvbnN0IG9uQ2xvc2VGbiA9IHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMub25DbG9zZSB8fCAoKCkgPT4ge30pO1xyXG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zLCB7XHJcbiAgICAgIG9uQ2xvc2U6IChldmVudCkgPT4ge1xyXG4gICAgICAgIG9uQ2xvc2VGbihldmVudCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsICdibHVyJyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5pbnB1dEVsZW1lbnQsICdwaWNrYWRhdGUnLCBbdGhpcy5vcHRpb25zXSk7XHJcblxyXG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XHJcbiAgICAgIC8vIHNldCBkYXRlcGlja2VyIGluaXRpYWwgdmFsdWUgYWNjb3JkaW5nIHRvIG5nQ29udHJvbFxyXG4gICAgICB0aGlzLnBpY2tlci5zZXQoJ3NlbGVjdCcsIHRoaXMubmdDb250cm9sVmFsdWUsIHsgZm9ybWF0OiB0aGlzLmZvcm1hdFN1Ym1pdCB9KTtcclxuXHJcbiAgICAgIC8vIHNldCBuZ0NvbnRyb2wgdmFsdWUgYWNjb3JkaW5nIHRvIHNlbGVjdGVkIGRhdGUgaW4gZGF0ZXBpY2tlclxyXG4gICAgICB0aGlzLnBpY2tlci5vbignc2V0JywgKCkgPT4ge1xyXG4gICAgICAgIC8vIGhhbmRsZSBzdG9wIHByb3BhZ2F0aW9uXHJcbiAgICAgICAgaWYgKHRoaXMuc3RvcENoYW5nZVByb3BhZ2F0aW9uKSB7XHJcbiAgICAgICAgICB0aGlzLnN0b3BDaGFuZ2VQcm9wYWdhdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnN0b3BDaGFuZ2VQcm9wYWdhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhcHBseSBvcHRpb25zLmZvcm1hdFN1Ym1pdCB0byBuZ0NvbnRyb2wgdmFsdWVcclxuICAgICAgICBjb25zdCBzdWJtaXRWYWx1ZSA9IHRoaXMuZm9ybWF0U3VibWl0XHJcbiAgICAgICAgICA/IHRoaXMucGlja2VyLmdldCgnc2VsZWN0JywgdGhpcy5mb3JtYXRTdWJtaXQpXHJcbiAgICAgICAgICA6IHRoaXMucGlja2VyLmdldCgndmFsdWUnKTtcclxuICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnNldFZhbHVlKHN1Ym1pdFZhbHVlKTtcclxuXHJcbiAgICAgICAgLy8gYXBwbHkgb3B0aW9ucy5mb3JtYXQgdG8gaW5wdXQgdGV4dFxyXG4gICAgICAgIGNvbnN0IGZvcm1hdFZhbHVlID0gdGhpcy5mb3JtYXRcclxuICAgICAgICAgID8gdGhpcy5waWNrZXIuZ2V0KCdzZWxlY3QnLCB0aGlzLmZvcm1hdClcclxuICAgICAgICAgIDogdGhpcy5waWNrZXIuZ2V0KCd2YWx1ZScpO1xyXG4gICAgICAgIHRoaXMuaW5wdXRFbGVtZW50LnZhbChmb3JtYXRWYWx1ZSk7XHJcblxyXG4gICAgICAgIC8vIHNldCBsYWJlbCBhY3RpdmUgc3RhdHVzXHJcbiAgICAgICAgdGhpcy5zZXRMYWJlbEFjdGl2ZSgpO1xyXG5cclxuICAgICAgICAvLyBtYXJrIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXHJcbiAgICAgICAgLy8gZml4IGZvcm0gdmFsaWRhdGlvbiB3aXRoIENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdElucHV0U3Vic2NyaXB0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XHJcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZVN1YnNjcmlwdGlvbiA9IHRoaXMubmdDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIC8vIGhhbmRsZSBzdG9wIHByb3BhZ2F0aW9uXHJcbiAgICAgICAgaWYgKHRoaXMuc3RvcENoYW5nZVByb3BhZ2F0aW9uKSB7XHJcbiAgICAgICAgICB0aGlzLnN0b3BDaGFuZ2VQcm9wYWdhdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnN0b3BDaGFuZ2VQcm9wYWdhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzZXQgc2VsZWN0ZWQgZGF0ZSBpbiBkYXRlcGlja2VyIGFjY29yZGluZyB0byBuZ0NvbnRyb2wgdmFsdWVcclxuICAgICAgICB0aGlzLnBpY2tlci5zZXQoJ3NlbGVjdCcsIHRoaXMubmdDb250cm9sVmFsdWUsIHsgZm9ybWF0OiB0aGlzLmZvcm1hdFN1Ym1pdCB9KTtcclxuXHJcbiAgICAgICAgLy8gc2V0IGxhYmVsIGFjdGl2ZSBzdGF0dXNcclxuICAgICAgICB0aGlzLnNldExhYmVsQWN0aXZlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlTGFiZWxFbGVtZW50KCkge1xyXG4gICAgY29uc3QgbGFiZWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcclxuICAgIGxhYmVsRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2ZvcicsIHRoaXMuaWQpO1xyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuaW52b2tlRWxlbWVudE1ldGhvZCh0aGlzLmlucHV0RWxlbWVudCwgJ2FmdGVyJywgW2xhYmVsRWxlbWVudF0pO1xyXG5cclxuICAgIHJldHVybiAkKGxhYmVsRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQcm9wZXJ0aWVzKCkge1xyXG4gICAgaWYgKHRoaXMuaW5wdXRDb250YWluZXJFbGVtZW50Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdJbnB1dCB3aXRoIG16LWRhdGVwaWNrZXIgZGlyZWN0aXZlIG11c3QgYmUgcGxhY2VkIGluc2lkZSBhbiBbbXotZGF0ZXBpY2tlci1jb250YWluZXJdIHRhZycsIHRoaXMuaW5wdXRFbGVtZW50KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHN1cGVyLmV4ZWN1dGVQcm9wSGFuZGxlcnMoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUxhYmVsKCkge1xyXG4gICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHRoaXMubGFiZWxFbGVtZW50LCAndGV4dCcsIFt0aGlzLmxhYmVsXSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVPcHRpb25zKCkge1xyXG4gICAgaWYgKCF0aGlzLmlzSW5pdFJvdW5kKSB7XHJcbiAgICAgIHRoaXMucGlja2VyLnNldCh0aGlzLm9wdGlvbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlUGxhY2Vob2xkZXIoKSB7XHJcbiAgICBjb25zdCBwbGFjZWhvbGRlciA9ICEhdGhpcy5wbGFjZWhvbGRlciA/IHRoaXMucGxhY2Vob2xkZXIgOiBudWxsO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50QXR0cmlidXRlKHRoaXMuaW5wdXRFbGVtZW50WzBdLCAncGxhY2Vob2xkZXInLCBwbGFjZWhvbGRlcik7XHJcblxyXG4gICAgLy8gZml4IGlzc3VlIGluIElFIHdoZXJlIGhhdmluZyBhIHBsYWNlaG9sZGVyIG9uIGlucHV0IG1ha2UgY29udHJvbCBkaXJ0eSBhbmQgdHJpZ2dlciB2YWxpZGF0aW9uXHJcbiAgICAvLyBvbiBwYWdlIGxvYWQuLi4gbm90ZSB0aGF0IGl0IHN0aWxsIHRyaWdnZXIgdmFsaWRhdGlvbiBvbiBmb2N1cyBhbmQgd291bGQgbmVlZCBhIGJldHRlciBmaXhcclxuICAgIC8vIGlzc3VlIDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTUyOTlcclxuICAgIC8vIHdvcmthcm91bmQgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDQ5NjcyNDUvNTU4MzI4M1xyXG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5tYXJrQXNQcmlzdGluZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldExhYmVsQWN0aXZlKCk7XHJcbiAgfVxyXG5cclxuICBzZXRMYWJlbEFjdGl2ZSgpIHtcclxuICAgIC8vIG5lZWQgc2V0VGltZW91dCBvdGhlcndpc2UgaXQgd29udCBtYWtlIGxhYmVsIGZsb2F0IGluIHNvbWUgY2lyY29uc3RhbmNlcyAoZm9yY2luZyB2YWxpZGF0aW9uIGZvciBleGFtcGxlKVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSAoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5pbnB1dEVsZW1lbnRbMF0pLnZhbHVlO1xyXG4gICAgICBjb25zdCBpc0FjdGl2ZSA9ICEhdGhpcy5wbGFjZWhvbGRlciB8fCAhIWlucHV0VmFsdWU7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKHRoaXMubGFiZWxFbGVtZW50WzBdLCAnYWN0aXZlJywgaXNBY3RpdmUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==