UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

739 lines 57.6 kB
/** * @fileoverview added by tsickle * Generated from: datepicker.directive.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, Input, ElementRef, forwardRef, ViewContainerRef, Output, EventEmitter, ComponentFactoryResolver, Renderer2, Injector, HostListener, TemplateRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { DatepickerComponent } from './datepicker.component'; import { SelectDateChangeReason } from './date-change-event-args.model'; import { DatePickerConfigService as DatePickerConfig } from './date-picker.config.service'; import { DefaultDateConverter } from '@duoduo-oba/ng-devui/utils'; import { I18nService } from '@duoduo-oba/ng-devui/i18n'; import { animate, AnimationBuilder, style } from '@angular/animations'; import { fromEvent } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; /** @type {?} */ var easeInQuint = 'cubic-bezier(0.755, 0.05, 0.855, 0.06)'; /** @type {?} */ var easeOutQuint = 'cubic-bezier(0.23, 1, 0.32, 1)'; /** @type {?} */ var animationDuration = '200ms'; var DatepickerDirective = /** @class */ (function () { function DatepickerDirective(elementRef, viewContainerRef, componentFactoryResolver, renderer2, injector, datePickerConfig, i18n, builder) { var _this = this; this.elementRef = elementRef; this.viewContainerRef = viewContainerRef; this.componentFactoryResolver = componentFactoryResolver; this.renderer2 = renderer2; this.injector = injector; this.datePickerConfig = datePickerConfig; this.i18n = i18n; this.builder = builder; this.direction = 'down'; this.autoOpen = false; this.selectedDateChange = new EventEmitter(); this.isOpen = false; this.onChange = (/** * @param {?} _ * @return {?} */ function (_) { return null; }); this.onTouched = (/** * @return {?} */ function () { return null; }); this._dateConfig = datePickerConfig['dateConfig']; this.dateConverter = datePickerConfig['dateConfig'].dateConverter || new DefaultDateConverter(); this.selectedDate = null; /** @type {?} */ var factory = this.componentFactoryResolver.resolveComponentFactory(DatepickerComponent); this.cmpRef = this.viewContainerRef.createComponent(factory, this.viewContainerRef.length, this.injector); this.inputSub = fromEvent(this.elementRef.nativeElement, 'input') .pipe(debounceTime(300)).subscribe((/** * @param {?} event * @return {?} */ function (event) { _this.transUserInputToDatepicker(event); })); } Object.defineProperty(DatepickerDirective.prototype, "dateConfig", { get: /** * @return {?} */ function () { return this._dateConfig; }, set: /** * @param {?} dateConfig * @return {?} */ function (dateConfig) { if (dateConfig) { this._dateConfig = dateConfig; this._dateFormat = this.showTime ? dateConfig.format.time : dateConfig.format.date; } else { this._dateConfig = this.datePickerConfig.dateConfig; } }, enumerable: true, configurable: true }); Object.defineProperty(DatepickerDirective.prototype, "dateFormat", { get: /** * @return {?} */ function () { return this._dateFormat; }, set: /** * @param {?} dateFormat * @return {?} */ function (dateFormat) { if (this._dateFormat !== dateFormat) { this._dateFormat = dateFormat; this.writeModelValue({ selectedDate: this.selectedDate, reason: SelectDateChangeReason.format }); } }, enumerable: true, configurable: true }); Object.defineProperty(DatepickerDirective.prototype, "maxDate", { get: /** * @return {?} */ function () { return this._maxDate; }, set: /** * @param {?} date * @return {?} */ function (date) { /** @type {?} */ var parseDate = this.dateConverter.parse(date, this.dateFormat, this.locale || this.i18nLocale); if (parseDate) { this._maxDate = parseDate; } }, enumerable: true, configurable: true }); Object.defineProperty(DatepickerDirective.prototype, "minDate", { get: /** * @return {?} */ function () { return this._minDate; }, set: /** * @param {?} date * @return {?} */ function (date) { /** @type {?} */ var parseDate = this.dateConverter.parse(date, this.dateFormat, this.locale || this.i18nLocale); if (parseDate) { this._minDate = parseDate; } }, enumerable: true, configurable: true }); /** * @return {?} */ DatepickerDirective.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.showTime = this.showTime || this.dateConfig.timePicker; this._minDate = this.minDate ? new Date(this.minDate) : new Date(this.dateConfig.min, 0, 1, 0, 0, 0); this._maxDate = this.maxDate ? new Date(this.maxDate) : new Date(this.dateConfig.max, 11, 31, 23, 59, 59); /** @type {?} */ var target = this.cmpRef.location.nativeElement; this.applyPopupStyling(target); /** @type {?} */ var component = this.cmpRef.instance; this.renderer2.setStyle(target, 'display', 'none'); component.writeValue(this.selectedDate); this.fillPopupData(); component.ngOnInit(); component.registerOnChange((/** * @param {?} selectedDate * @return {?} */ function (selectedDate) { _this.writeValue(selectedDate); _this.onChange(selectedDate); })); component.selectedDateChange.subscribe((/** * @param {?} arg * @return {?} */ function (arg) { if (arg.reason === SelectDateChangeReason.date && !_this.showTime || arg.reason === SelectDateChangeReason.button) { _this.hide(); } })); if (this.autoOpen) { this.show(); } this.setI18nText(); }; /** * @param {?} obj * @return {?} */ DatepickerDirective.prototype.writeValue = /** * @param {?} obj * @return {?} */ function (obj) { /** @type {?} */ var curDate; if (obj && typeof obj === 'object' && obj.hasOwnProperty('selectedDate')) { curDate = obj.selectedDate; } else { curDate = obj; } this.selectedDate = curDate ? this.dateConverter.parse(curDate, this.dateFormat, this.locale || this.i18nLocale) : null; this.writeModelValue(obj); }; /** * @param {?} fn * @return {?} */ DatepickerDirective.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChange = fn; }; /** * @param {?} fn * @return {?} */ DatepickerDirective.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouched = fn; }; /** * @private * @return {?} */ DatepickerDirective.prototype.setI18nText = /** * @private * @return {?} */ function () { var _this = this; this.i18nLocale = this.i18n.getI18nText().locale; this.i18nSubscription = this.i18n.langChange().subscribe((/** * @param {?} data * @return {?} */ function (data) { _this.i18nLocale = data.locale; })); }; /** * @private * @param {?} date * @param {?} direction * @return {?} */ DatepickerDirective.prototype.parseDateFunc = /** * @private * @param {?} date * @param {?} direction * @return {?} */ function (date, direction) { /** @type {?} */ var parseDate = this.dateConverter.parse(date, this.dateFormat, this.locale || this.i18nLocale); if (parseDate) { this[direction] = date; } }; /** * @private * @param {?} nativeElement * @return {?} */ DatepickerDirective.prototype.applyPopupStyling = /** * @private * @param {?} nativeElement * @return {?} */ function (nativeElement) { this.renderer2.addClass(nativeElement, 'devui-dropdown-menu'); this.renderer2.setStyle(nativeElement, 'padding', '0px'); if (this.direction === 'up') { this.renderer2.setStyle(nativeElement, 'top', 'auto'); this.renderer2.setStyle(nativeElement, 'bottom', '100%'); } }; /** * @return {?} */ DatepickerDirective.prototype.hide = /** * @return {?} */ function () { /** @type {?} */ var playAnimation = this.isOpen !== false; this.isOpen = false; if (playAnimation) { this.playAnimation(); } }; /** * @private * @param {?} selectDateObj * @return {?} */ DatepickerDirective.prototype.writeModelValue = /** * @private * @param {?} selectDateObj * @return {?} */ function (selectDateObj) { /** @type {?} */ var selectDate; /** @type {?} */ var dateReason = SelectDateChangeReason.time; if (selectDateObj && typeof selectDateObj === 'object' && selectDateObj.hasOwnProperty('selectedDate')) { selectDate = selectDateObj.selectedDate; dateReason = selectDateObj.reason; } else { selectDate = selectDateObj; } if (selectDate) { selectDate = new Date(selectDate); } else { selectDate = null; } /** @type {?} */ var value = selectDate ? this.dateConverter.format(selectDate, this.dateFormat, this.locale || this.i18nLocale) : ''; this.renderer2.setProperty(this.elementRef.nativeElement, 'value', value); if (this.isOpen) { this.cmpRef.instance.writeValue(this.selectedDate); } this.selectedDateChange.emit({ reason: dateReason, selectedDate: this.selectedDate }); }; /** * @return {?} */ DatepickerDirective.prototype.show = /** * @return {?} */ function () { /** @type {?} */ var component = this.cmpRef.instance; component.writeValue(this.selectedDate); this.fillPopupData(); /** @type {?} */ var playAnimation = this.isOpen !== true; this.isOpen = true; if (playAnimation) { this.playAnimation(); } }; /** * @param {?} $event * @return {?} */ DatepickerDirective.prototype.toggle = /** * @param {?} $event * @return {?} */ function ($event) { if ($event) { $event.stopPropagation(); } if (this.isOpen) { this.hide(); return; } this.show(); }; /** * @private * @return {?} */ DatepickerDirective.prototype.fillPopupData = /** * @private * @return {?} */ function () { var _this = this; ['showTime', 'maxDate', 'minDate', 'cssClass', 'disabled', 'dateConverter', 'locale', 'dateFormat', 'yearNumber', 'dateConfig', 'customViewTemplate'] .forEach((/** * @param {?} key * @return {?} */ function (key) { if (_this[key] !== undefined) { _this.cmpRef.instance[key] = _this[key]; } })); }; /** * @param {?} $event * @return {?} */ DatepickerDirective.prototype.onBlur = /** * @param {?} $event * @return {?} */ function ($event) { this.onTouched(); }; /** * @param {?} $event * @return {?} */ DatepickerDirective.prototype.onDocumentClick = /** * @param {?} $event * @return {?} */ function ($event) { if (this.elementRef.nativeElement !== $event.target) { this.hide(); } }; /** * @return {?} */ DatepickerDirective.prototype.clearAll = /** * @return {?} */ function () { this.cmpRef.instance.clearAll(); }; /** * @private * @param {?} direction * @return {?} */ DatepickerDirective.prototype.popIn = /** * @private * @param {?} direction * @return {?} */ function (direction) { switch (direction) { case 'top': return [ style({ transform: 'perspective(1px) scale(0.9)', opacity: 0, transformOrigin: '0% 100%', display: 'inline-block' }), animate(animationDuration + " " + easeOutQuint, style({ transform: 'perspective(1px) scale(1)', opacity: 1, transformOrigin: '0% 100%' })), ]; case 'bottom': default: return [ style({ transform: 'perspective(1px) scale(0.9)', opacity: 0, transformOrigin: '0% 0%', display: 'inline-block' }), animate(animationDuration + " " + easeOutQuint, style({ transform: 'perspective(1px) scale(1)', opacity: 1, transformOrigin: '0% 0%' })), ]; } }; /** * @private * @param {?} direction * @return {?} */ DatepickerDirective.prototype.popOut = /** * @private * @param {?} direction * @return {?} */ function (direction) { switch (direction) { case 'top': return [ style({ transform: 'perspective(1px) scale(1)', opacity: 1, transformOrigin: '0% 100%' }), animate(animationDuration + " " + easeInQuint, style({ transform: 'perspective(1px) scale(0.9)', opacity: 0, transformOrigin: '0% 100%' })) ]; case 'bottom': default: return [ style({ transform: 'perspective(1px) scale(1)', opacity: 1, transformOrigin: '0% 0%' }), animate(animationDuration + " " + easeInQuint, style({ transform: 'perspective(1px) scale(0.9)', opacity: 0, transformOrigin: '0% 0%' })) ]; } }; /** * @private * @return {?} */ DatepickerDirective.prototype.playAnimation = /** * @private * @return {?} */ function () { var _this = this; if (this.player) { this.player.destroy(); } /** @type {?} */ var direction = ''; switch (this.direction) { case 'down': direction = 'bottom'; break; case 'up': direction = 'top'; break; default: direction = 'bottom'; } /** @type {?} */ var metadata = this.isOpen ? this.popIn(direction) : this.popOut(direction); /** @type {?} */ var factory = this.builder.build(metadata); this.renderer2.setStyle(this.cmpRef.location.nativeElement, 'display', 'inline-block'); this.player = factory.create(this.cmpRef.location.nativeElement); this.player.onDone((/** * @return {?} */ function () { if (!_this.isOpen) { /** @type {?} */ var targetElement = _this.cmpRef.location.nativeElement; _this.renderer2.setStyle(targetElement, 'display', 'none'); } })); this.player.play(); }; /** * @private * @param {?} event * @return {?} */ DatepickerDirective.prototype.transUserInputToDatepicker = /** * @private * @param {?} event * @return {?} */ function (event) { if (!this.showTime && !this.disabled) { /** @type {?} */ var value = event.target.value; /** @type {?} */ var valueDate = new Date(value); /** @type {?} */ var valueFormat = this.dateConverter.format(valueDate, this.dateFormat, this.locale || this.i18nLocale); if (value && value === valueFormat) { if (valueDate.getTime() < this.minDate.getTime() || valueDate.getTime() > this.maxDate.getTime()) { this.elementRef.nativeElement.value = this.dateConverter.format(this.selectedDate, this.dateFormat, this.locale || this.i18nLocale); } else { this.cmpRef.instance.chooseDate(value); } } else if (!value) { this.clearAll(); } } else { this.elementRef.nativeElement.value = this.dateConverter.format(this.selectedDate, this.dateFormat, this.locale || this.i18nLocale); } }; /** * @return {?} */ DatepickerDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { if (this.inputSub) { this.inputSub.unsubscribe(); } if (this.i18nSubscription) { this.i18nSubscription.unsubscribe(); } }; DatepickerDirective.decorators = [ { type: Directive, args: [{ selector: '[dDatepicker]:not([appendToBody])', exportAs: 'datepicker', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return DatepickerDirective; })), multi: true }] },] } ]; /** @nocollapse */ DatepickerDirective.ctorParameters = function () { return [ { type: ElementRef }, { type: ViewContainerRef }, { type: ComponentFactoryResolver }, { type: Renderer2 }, { type: Injector }, { type: DatePickerConfig }, { type: I18nService }, { type: AnimationBuilder } ]; }; DatepickerDirective.propDecorators = { dateConfig: [{ type: Input }], dateFormat: [{ type: Input }], maxDate: [{ type: Input }], minDate: [{ type: Input }], locale: [{ type: Input }], showTime: [{ type: Input }], cssClass: [{ type: Input }], disabled: [{ type: Input }], dateConverter: [{ type: Input }], yearNumber: [{ type: Input }], direction: [{ type: Input }], customViewTemplate: [{ type: Input }], autoOpen: [{ type: Input }], selectedDateChange: [{ type: Output }], onBlur: [{ type: HostListener, args: ['blur', ['$event'],] }], onDocumentClick: [{ type: HostListener, args: ['document:click', ['$event'],] }] }; return DatepickerDirective; }()); export { DatepickerDirective }; if (false) { /** @type {?} */ DatepickerDirective.prototype.locale; /** @type {?} */ DatepickerDirective.prototype.showTime; /** @type {?} */ DatepickerDirective.prototype.cssClass; /** @type {?} */ DatepickerDirective.prototype.disabled; /** @type {?} */ DatepickerDirective.prototype.dateConverter; /** @type {?} */ DatepickerDirective.prototype.yearNumber; /** @type {?} */ DatepickerDirective.prototype.direction; /** @type {?} */ DatepickerDirective.prototype.customViewTemplate; /** @type {?} */ DatepickerDirective.prototype.autoOpen; /** @type {?} */ DatepickerDirective.prototype.selectedDateChange; /** @type {?} */ DatepickerDirective.prototype.selectedDate; /** @type {?} */ DatepickerDirective.prototype.isOpen; /** @type {?} */ DatepickerDirective.prototype._dateConfig; /** * @type {?} * @private */ DatepickerDirective.prototype._dateFormat; /** * @type {?} * @private */ DatepickerDirective.prototype._maxDate; /** * @type {?} * @private */ DatepickerDirective.prototype._minDate; /** * @type {?} * @private */ DatepickerDirective.prototype.cmpRef; /** * @type {?} * @private */ DatepickerDirective.prototype.player; /** * @type {?} * @private */ DatepickerDirective.prototype.inputSub; /** * @type {?} * @private */ DatepickerDirective.prototype.i18nSubscription; /** * @type {?} * @private */ DatepickerDirective.prototype.i18nLocale; /** * @type {?} * @private */ DatepickerDirective.prototype.onChange; /** * @type {?} * @private */ DatepickerDirective.prototype.onTouched; /** * @type {?} * @private */ DatepickerDirective.prototype.elementRef; /** * @type {?} * @private */ DatepickerDirective.prototype.viewContainerRef; /** * @type {?} * @private */ DatepickerDirective.prototype.componentFactoryResolver; /** * @type {?} * @private */ DatepickerDirective.prototype.renderer2; /** * @type {?} * @private */ DatepickerDirective.prototype.injector; /** * @type {?} * @private */ DatepickerDirective.prototype.datePickerConfig; /** * @type {?} * @private */ DatepickerDirective.prototype.i18n; /** * @type {?} * @private */ DatepickerDirective.prototype.builder; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9kYXRlcGlja2VyLyIsInNvdXJjZXMiOlsiZGF0ZXBpY2tlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUFVLEtBQUssRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFnQixnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUN0Ryx3QkFBd0IsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQ3pFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQTZCLHNCQUFzQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkcsT0FBTyxFQUFFLHVCQUF1QixJQUFJLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUNMLE9BQU8sRUFDUCxnQkFBZ0IsRUFHaEIsS0FBSyxFQUNOLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFNBQVMsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDOztJQUV4QyxXQUFXLEdBQUcsd0NBQXdDOztJQUN0RCxZQUFZLEdBQUcsZ0NBQWdDOztJQUMvQyxpQkFBaUIsR0FBRyxPQUFPO0FBRWpDO0lBaUZFLDZCQUFvQixVQUFzQixFQUFVLGdCQUFrQyxFQUNsRSx3QkFBa0QsRUFBVSxTQUFvQixFQUNoRixRQUFrQixFQUFVLGdCQUFrQyxF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e1xyXG4gIERpcmVjdGl2ZSwgT25Jbml0LCBJbnB1dCwgRWxlbWVudFJlZiwgZm9yd2FyZFJlZiwgQ29tcG9uZW50UmVmLCBWaWV3Q29udGFpbmVyUmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlcixcclxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIFJlbmRlcmVyMiwgSW5qZWN0b3IsIEhvc3RMaXN0ZW5lciwgVGVtcGxhdGVSZWYsIE9uRGVzdHJveVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERhdGVDb252ZXJ0ZXIgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IERhdGVwaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGVwaWNrZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2VsZWN0RGF0ZUNoYW5nZUV2ZW50QXJncywgU2VsZWN0RGF0ZUNoYW5nZVJlYXNvbiB9IGZyb20gJy4vZGF0ZS1jaGFuZ2UtZXZlbnQtYXJncy5tb2RlbCc7XHJcbmltcG9ydCB7IERhdGVQaWNrZXJDb25maWdTZXJ2aWNlIGFzIERhdGVQaWNrZXJDb25maWcgfSBmcm9tICcuL2RhdGUtcGlja2VyLmNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGVmYXVsdERhdGVDb252ZXJ0ZXIgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IEkxOG5TZXJ2aWNlLCBJMThuSW50ZXJmYWNlIH0gZnJvbSAnbmctZGV2dWkvaTE4bic7XHJcbmltcG9ydCB7XHJcbiAgYW5pbWF0ZSxcclxuICBBbmltYXRpb25CdWlsZGVyLFxyXG4gIEFuaW1hdGlvbk1ldGFkYXRhLFxyXG4gIEFuaW1hdGlvblBsYXllcixcclxuICBzdHlsZVxyXG59IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5jb25zdCBlYXNlSW5RdWludCA9ICdjdWJpYy1iZXppZXIoMC43NTUsIDAuMDUsIDAuODU1LCAwLjA2KSc7XHJcbmNvbnN0IGVhc2VPdXRRdWludCA9ICdjdWJpYy1iZXppZXIoMC4yMywgMSwgMC4zMiwgMSknO1xyXG5jb25zdCBhbmltYXRpb25EdXJhdGlvbiA9ICcyMDBtcyc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkRGF0ZXBpY2tlcl06bm90KFthcHBlbmRUb0JvZHldKScsXHJcbiAgZXhwb3J0QXM6ICdkYXRlcGlja2VyJyxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVwaWNrZXJEaXJlY3RpdmUpLFxyXG4gICAgbXVsdGk6IHRydWVcclxuICB9XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblxyXG5cclxuICBASW5wdXQoKSBzZXQgZGF0ZUNvbmZpZyhkYXRlQ29uZmlnOiBhbnkpIHtcclxuICAgIGlmIChkYXRlQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMuX2RhdGVDb25maWcgPSBkYXRlQ29uZmlnO1xyXG4gICAgICB0aGlzLl9kYXRlRm9ybWF0ID0gdGhpcy5zaG93VGltZSA/IGRhdGVDb25maWcuZm9ybWF0LnRpbWUgOiBkYXRlQ29uZmlnLmZvcm1hdC5kYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZGF0ZUNvbmZpZyA9IHRoaXMuZGF0ZVBpY2tlckNvbmZpZy5kYXRlQ29uZmlnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGVDb25maWcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0ZUNvbmZpZztcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBkYXRlRm9ybWF0KGRhdGVGb3JtYXQ6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuX2RhdGVGb3JtYXQgIT09IGRhdGVGb3JtYXQpIHtcclxuICAgICAgdGhpcy5fZGF0ZUZvcm1hdCA9IGRhdGVGb3JtYXQ7XHJcbiAgICAgIHRoaXMud3JpdGVNb2RlbFZhbHVlKHtzZWxlY3RlZERhdGU6IHRoaXMuc2VsZWN0ZWREYXRlLCByZWFzb246IFNlbGVjdERhdGVDaGFuZ2VSZWFzb24uZm9ybWF0fSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0ZUZvcm1hdCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlRm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG1heERhdGUoZGF0ZTogRGF0ZSB8IGFueSkge1xyXG4gICAgY29uc3QgcGFyc2VEYXRlID0gdGhpcy5kYXRlQ29udmVydGVyLnBhcnNlKGRhdGUsIHRoaXMuZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUgfHwgdGhpcy5pMThuTG9jYWxlKTtcclxuICAgIGlmIChwYXJzZURhdGUpIHtcclxuICAgICAgdGhpcy5fbWF4RGF0ZSA9IHBhcnNlRGF0ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBtYXhEYXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX21heERhdGU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgbWluRGF0ZShkYXRlOiBEYXRlIHwgYW55KSB7XHJcbiAgICBjb25zdCBwYXJzZURhdGUgPSB0aGlzLmRhdGVDb252ZXJ0ZXIucGFyc2UoZGF0ZSwgdGhpcy5kYXRlRm9ybWF0LCB0aGlzLmxvY2FsZSB8fCB0aGlzLmkxOG5Mb2NhbGUpO1xyXG4gICAgaWYgKHBhcnNlRGF0ZSkge1xyXG4gICAgICB0aGlzLl9taW5EYXRlID0gcGFyc2VEYXRlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IG1pbkRhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcclxuICB9XHJcbiAgQElucHV0KCkgbG9jYWxlOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2hvd1RpbWU6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgY3NzQ2xhc3M6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBkYXRlQ29udmVydGVyOiBEYXRlQ29udmVydGVyO1xyXG4gIEBJbnB1dCgpIHllYXJOdW1iZXI6IG51bWJlcjtcclxuICBASW5wdXQoKSBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicgPSAnZG93bic7XHJcbiAgQElucHV0KCkgY3VzdG9tVmlld1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIGF1dG9PcGVuID0gZmFsc2U7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkRGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0RGF0ZUNoYW5nZUV2ZW50QXJncz4oKTtcclxuICBzZWxlY3RlZERhdGU6IERhdGU7XHJcbiAgaXNPcGVuID0gZmFsc2U7XHJcbiAgX2RhdGVDb25maWc6IGFueTtcclxuICBwcml2YXRlIF9kYXRlRm9ybWF0OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfbWF4RGF0ZTogRGF0ZTtcclxuICBwcml2YXRlIF9taW5EYXRlOiBEYXRlO1xyXG4gIHByaXZhdGUgY21wUmVmOiBDb21wb25lbnRSZWY8RGF0ZXBpY2tlckNvbXBvbmVudD47XHJcbiAgcHJpdmF0ZSBwbGF5ZXI6IEFuaW1hdGlvblBsYXllcjtcclxuICBwcml2YXRlIGlucHV0U3ViOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBpMThuU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBpMThuTG9jYWxlOiBJMThuSW50ZXJmYWNlWydsb2NhbGUnXTtcclxuICBwcml2YXRlIG9uQ2hhbmdlID0gKF86IGFueSkgPT4gbnVsbDtcclxuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIHByaXZhdGUgcmVuZGVyZXIyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsIHByaXZhdGUgZGF0ZVBpY2tlckNvbmZpZzogRGF0ZVBpY2tlckNvbmZpZywgcHJpdmF0ZSBpMThuOiBJMThuU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIGJ1aWxkZXI6IEFuaW1hdGlvbkJ1aWxkZXIpIHtcclxuICAgIHRoaXMuX2RhdGVDb25maWcgPSBkYXRlUGlja2VyQ29uZmlnWydkYXRlQ29uZmlnJ107XHJcbiAgICB0aGlzLmRhdGVDb252ZXJ0ZXIgPSBkYXRlUGlja2VyQ29uZmlnWydkYXRlQ29uZmlnJ10uZGF0ZUNvbnZlcnRlciB8fCBuZXcgRGVmYXVsdERhdGVDb252ZXJ0ZXIoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcclxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShEYXRlcGlja2VyQ29tcG9uZW50KTtcclxuICAgIHRoaXMuY21wUmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChmYWN0b3J5LCB0aGlzLnZpZXdDb250YWluZXJSZWYubGVuZ3RoLCB0aGlzLmluamVjdG9yKTtcclxuXHJcbiAgICB0aGlzLmlucHV0U3ViID0gZnJvbUV2ZW50KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnaW5wdXQnKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKVxyXG4gICAgICApLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgdGhpcy50cmFuc1VzZXJJbnB1dFRvRGF0ZXBpY2tlcihldmVudCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNob3dUaW1lID0gdGhpcy5zaG93VGltZSB8fCB0aGlzLmRhdGVDb25maWcudGltZVBpY2tlcjtcclxuICAgIHRoaXMuX21pbkRhdGUgPSB0aGlzLm1pbkRhdGUgPyBuZXcgRGF0ZSh0aGlzLm1pbkRhdGUpIDogbmV3IERhdGUodGhpcy5kYXRlQ29uZmlnLm1pbiwgMCwgMSwgMCwgMCwgMCk7XHJcbiAgICB0aGlzLl9tYXhEYXRlID0gdGhpcy5tYXhEYXRlID8gbmV3IERhdGUodGhpcy5tYXhEYXRlKSA6IG5ldyBEYXRlKHRoaXMuZGF0ZUNvbmZpZy5tYXgsIDExLCAzMSwgMjMsIDU5LCA1OSk7XHJcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNtcFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5hcHBseVBvcHVwU3R5bGluZyh0YXJnZXQpO1xyXG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jbXBSZWYuaW5zdGFuY2U7XHJcbiAgICB0aGlzLnJlbmRlcmVyMi5zZXRTdHlsZSh0YXJnZXQsICdkaXNwbGF5JywgJ25vbmUnKTtcclxuICAgIGNvbXBvbmVudC53cml0ZVZhbHVlKHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICAgIHRoaXMuZmlsbFBvcHVwRGF0YSgpO1xyXG4gICAgY29tcG9uZW50Lm5nT25Jbml0KCk7XHJcblxyXG4gICAgY29tcG9uZW50LnJlZ2lzdGVyT25DaGFuZ2Uoc2VsZWN0ZWREYXRlID0+IHtcclxuICAgICAgdGhpcy53cml0ZVZhbHVlKHNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgIHRoaXMub25DaGFuZ2Uoc2VsZWN0ZWREYXRlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbXBvbmVudC5zZWxlY3RlZERhdGVDaGFuZ2Uuc3Vic2NyaWJlKChhcmc6IFNlbGVjdERhdGVDaGFuZ2VFdmVudEFyZ3MpID0+IHtcclxuICAgICAgaWYgKGFyZy5yZWFzb24gPT09IFNlbGVjdERhdGVDaGFuZ2VSZWFzb24uZGF0ZSAmJiAhdGhpcy5zaG93VGltZSB8fFxyXG4gICAgICAgYXJnLnJlYXNvbiA9PT0gU2VsZWN0RGF0ZUNoYW5nZVJlYXNvbi5idXR0b24pIHtcclxuICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYXV0b09wZW4pIHtcclxuICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEkxOG5UZXh0KCk7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgY3VyRGF0ZTtcclxuICAgIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqLmhhc093blByb3BlcnR5KCdzZWxlY3RlZERhdGUnKSkge1xyXG4gICAgICBjdXJEYXRlID0gb2JqLnNlbGVjdGVkRGF0ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGN1ckRhdGUgPSBvYmo7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGN1ckRhdGUgP1xyXG4gICAgICB0aGlzLmRhdGVDb252ZXJ0ZXIucGFyc2UoY3VyRGF0ZSwgdGhpcy5kYXRlRm9ybWF0LCB0aGlzLmxvY2FsZSB8fCB0aGlzLmkxOG5Mb2NhbGUpIDogbnVsbDtcclxuICAgIHRoaXMud3JpdGVNb2RlbFZhbHVlKG9iaik7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEkxOG5UZXh0KCkge1xyXG4gICAgdGhpcy5pMThuTG9jYWxlID0gdGhpcy5pMThuLmdldEkxOG5UZXh0KCkubG9jYWxlO1xyXG4gICAgdGhpcy5pMThuU3Vic2NyaXB0aW9uID0gdGhpcy5pMThuLmxhbmdDaGFuZ2UoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5pMThuTG9jYWxlID0gZGF0YS5sb2NhbGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFyc2VEYXRlRnVuYyhkYXRlLCBkaXJlY3Rpb24pIHtcclxuICAgIGNvbnN0IHBhcnNlRGF0ZSA9IHRoaXMuZGF0ZUNvbnZlcnRlci5wYXJzZShkYXRlLCB0aGlzLmRhdGVGb3JtYXQsIHRoaXMubG9jYWxlIHx8IHRoaXMuaTE4bkxvY2FsZSlcclxuICAgICAgO1xyXG4gICAgaWYgKHBhcnNlRGF0ZSkge1xyXG4gICAgICB0aGlzW2RpcmVjdGlvbl0gPSBkYXRlXHJcbiAgICAgIDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlQb3B1cFN0eWxpbmcobmF0aXZlRWxlbWVudDogYW55KSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyMi5hZGRDbGFzcyhuYXRpdmVFbGVtZW50LCAnZGV2dWktZHJvcGRvd24tbWVudScpO1xyXG4gICAgdGhpcy5yZW5kZXJlcjIuc2V0U3R5bGUobmF0aXZlRWxlbWVudCwgJ3BhZGRpbmcnLCAnMHB4Jyk7XHJcbiAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICd1cCcpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlcjIuc2V0U3R5bGUobmF0aXZlRWxlbWVudCwgJ3RvcCcsICdhdXRvJyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKG5hdGl2ZUVsZW1lbnQsICdib3R0b20nLCAnMTAwJScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIGNvbnN0IHBsYXlBbmltYXRpb24gPSB0aGlzLmlzT3BlbiAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgaWYgKHBsYXlBbmltYXRpb24pIHtcclxuICAgICAgdGhpcy5wbGF5QW5pbWF0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHdyaXRlTW9kZWxWYWx1ZShzZWxlY3REYXRlT2JqOiBhbnkpIHtcclxuICAgIGxldCBzZWxlY3REYXRlO1xyXG4gICAgbGV0IGRhdGVSZWFzb24gPSBTZWxlY3REYXRlQ2hhbmdlUmVhc29uLnRpbWU7XHJcbiAgICBpZiAoc2VsZWN0RGF0Z