UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

437 lines (436 loc) 39.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, ViewEncapsulation, Input, Output, HostBinding, EventEmitter } from '@angular/core'; import zhCN from './locale/zh_CN'; import enUS from './locale/en_US'; import { LocaleProviderService } from '../locale-provider/locale-provider.service'; import { mergeDateTime } from './util/index'; import { takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; /** * @record */ export function StateType() { } /** @type {?} */ StateType.prototype.showTimePicker; /** @type {?|undefined} */ StateType.prototype.timePickerTitle; /** @type {?|undefined} */ StateType.prototype.startDate; /** @type {?|undefined} */ StateType.prototype.endDate; /** @type {?|undefined} */ StateType.prototype.disConfirmBtn; /** @type {?|undefined} */ StateType.prototype.clientHight; export class CalendarComponent { /** * @param {?} _localeProviderService */ constructor(_localeProviderService) { this._localeProviderService = _localeProviderService; this.isShow = false; this.showClear = false; this.props = /** @type {?} */ ({ visible: false, showHeader: true, locale: zhCN, pickTime: false, showShortcut: false, prefixCls: 'rmc-calendar', type: 'range', defaultTimeValue: new Date(2000, 0, 1, 8) }); this.state = /** @type {?} */ ({ showTimePicker: false, timePickerTitle: '', startDate: undefined, endDate: undefined, disConfirmBtn: true, clientHight: 0 }); this._unsubscribe$ = new Subject(); this.onCancel = new EventEmitter(); this.onConfirm = new EventEmitter(); this.onSelectHasDisableDate = new EventEmitter(); this.class = 'am-calendar'; this.selectDate = (date, useDateTime = false, oldState = {}, props = this.props) => { if (!date) { return /** @type {?} */ ({}); } /** @type {?} */ let newState = /** @type {?} */ ({}); const { type, pickTime, defaultTimeValue, locale = /** @type {?} */ ({}) } = props; /** @type {?} */ const newDate = pickTime && !useDateTime ? mergeDateTime(date, defaultTimeValue) : date; const { startDate, endDate } = oldState; switch (type) { case 'one': newState = Object.assign({}, newState, { startDate: newDate, disConfirmBtn: false }); if (pickTime) { newState = Object.assign({}, newState, { timePickerTitle: locale.selectTime, showTimePicker: true }); } break; case 'range': if (!startDate || endDate) { newState = Object.assign({}, newState, { startDate: newDate, endDate: undefined, disConfirmBtn: true }); if (pickTime) { newState = Object.assign({}, newState, { timePickerTitle: locale.selectStartTime, showTimePicker: true }); } } else { newState = Object.assign({}, newState, { timePickerTitle: +newDate >= +startDate ? locale.selectEndTime : locale.selectStartTime, disConfirmBtn: false, endDate: pickTime && !useDateTime && +newDate >= +startDate ? new Date(+mergeDateTime(newDate, startDate) + 3600000) : newDate }); } break; } return newState; }; this.onSelectedDate = (date) => { const { startDate, endDate } = this.state; const { onSelect } = this.props; if (onSelect) { /** @type {?} */ const value = onSelect(date, [startDate, endDate]); if (value) { this.shortcutSelect(value[0], value[1]); return; } } this.state = Object.assign({}, this.state, this.selectDate(date, false, { startDate, endDate })); this.showClear = !!this.state.startDate; }; this.triggerSelectHasDisableDate = (date) => { this.triggerClear(); this.onSelectHasDisableDate && this.onSelectHasDisableDate.emit(date); }; this.onClose = () => { this.state = /** @type {?} */ ({ showTimePicker: false, timePickerTitle: '', startDate: undefined, endDate: undefined, disConfirmBtn: true, clientHight: 0 }); this.showClear = !!this.state.startDate; }; this.triggerConfirm = () => { const { startDate, endDate } = this.state; if (startDate && endDate && +startDate > +endDate) { this.onClose(); return this.onConfirm && this.onConfirm.emit({ startDate: endDate, endDate: startDate }); } this.onConfirm && this.onConfirm.emit({ startDate, endDate }); this.onClose(); }; this.triggerClear = () => { // 清除数据做延迟,否则同步刷新数据导致报错 setTimeout(() => { this.state = Object.assign({}, this.state, { startDate: undefined, endDate: undefined, showTimePicker: false }); this.props.onClear && this.props.onClear(); this.showClear = !!this.state.startDate; }, 0); }; this.onTimeChange = (date) => { const { startDate, endDate } = this.state; if (endDate) { this.state.endDate = date; } else if (startDate) { this.state.startDate = date; } }; this.shortcutSelect = (startDate, endDate, props = this.props) => { this.state = Object.assign({}, this.state, { startDate, showTimePicker: false }, this.selectDate(endDate, true, { startDate }, props)); this.showClear = !!this.state.startDate; }; this.setClientHeight = (height) => { this.state.clientHight = height; }; } /** * @param {?} value * @return {?} */ set locale(value) { if (value === 'enUS') { this.props.locale = enUS; } else if (value === 'zhCN') { this.props.locale = zhCN; } this._unsubscribe$.next(); this._unsubscribe$.complete(); } /** * @param {?} value * @return {?} */ set defaultTimeValue(value) { if (value) { this.props.defaultTimeValue = value; } } /** * @param {?} value * @return {?} */ set prefixCls(value) { if (value) { this.props.prefixCls = value; } } /** * @param {?} value * @return {?} */ set enterDirection(value) { this._enterDirection = value; if (this._enterDirection === 'horizontal') { this.contentAnimateClass = 'slideH-enter slideH-enter-active'; } else { this.contentAnimateClass = 'slideV-enter slideV-enter-active'; } } /** * @param {?} value * @return {?} */ set visible(value) { this.props.visible = value; if (value === true || value === 'true') { this.showAnimation(); this.isShow = true; } else { this.hideAnimation(); setTimeout(() => { this.isShow = false; }, 300); } } /** * @param {?} value * @return {?} */ set getDateExtra(value) { this.props.getDateExtra = value; } /** * @param {?} value * @return {?} */ set defaultDate(value) { this.props.defaultDate = value; } /** * @param {?} value * @return {?} */ set minDate(value) { this.props.minDate = value; } /** * @param {?} value * @return {?} */ set maxDate(value) { this.props.maxDate = value; } /** * @param {?} value * @return {?} */ set pickTime(value) { this.props.pickTime = value; } /** * @param {?} value * @return {?} */ set type(value) { this.props.type = value; } /** * @param {?} value * @return {?} */ set showShortcut(value) { this.props.showShortcut = value; } /** * @param {?} value * @return {?} */ set rowSize(value) { this.props.rowSize = value; } /** * @param {?} value * @return {?} */ set infinite(value) { } /** * @param {?} value * @return {?} */ set defaultValue(value) { this.props.defaultValue = value; if (value) { this.receiveProps(this.props); } } /** * @param {?} value * @return {?} */ set onSelect(value) { this.props.onSelect = value; } /** * @param {?} nextProps * @return {?} */ receiveProps(nextProps) { if (nextProps.visible && nextProps.defaultValue) { this.shortcutSelect(nextProps.defaultValue[0], nextProps.defaultValue[1], nextProps); } } /** * @return {?} */ showAnimation() { if (this._enterDirection === 'horizontal') { this.contentAnimateClass = 'slideH-enter slideH-enter-active'; } else { this.contentAnimateClass = 'slideV-enter slideV-enter-active'; } this.maskAnimateClass = 'fade-enter fade-enter-active'; } /** * @return {?} */ hideAnimation() { if (this._enterDirection === 'horizontal') { this.contentAnimateClass = 'slideH-leave slideH-leave-active'; } else { this.contentAnimateClass = 'slideV-leave slideV-leave-active'; } this.maskAnimateClass = 'fade-leave fade-leave-active'; } /** * @return {?} */ triggerCancel() { this.props.onCancel && this.props.onCancel(); this.onClose(); this.onCancel && this.onCancel.emit(); } /** * @return {?} */ ngOnInit() { /** @type {?} */ const defaultValue = this.props.defaultValue; if (defaultValue) { this.state = Object.assign({}, this.state, this.selectDate(defaultValue[1], true, { startDate: defaultValue[0] }, this.props)); } this._localeProviderService.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe(_ => { this.props.locale = /** @type {?} */ (Object.assign({}, this._localeProviderService.getLocaleSubObj('Calendar'))); }); } /** * @return {?} */ ngOnDestroy() { this._unsubscribe$.next(); this._unsubscribe$.complete(); } } CalendarComponent.decorators = [ { type: Component, args: [{ selector: 'Calendar, nzm-calendar', template: "<span *ngIf=\"isShow\">\n <div class=\"{{'mask ' + maskAnimateClass}}\"></div>\n</span>\n<span *ngIf=\"isShow\">\n <div class=\"{{'content animate ' + contentAnimateClass}}\">\n <CalendarHeader [locale]=\"props.locale\"\n [closeIcon]=\"closeIconHtml\"\n [showClear]=\"showClear\"\n (onCancel)=\"triggerCancel()\"\n (onClear)=\"triggerClear()\"\n ></CalendarHeader>\n <CalendarDatePicker [propsData]=\"props\"\n [endDate]=\"state.endDate\"\n [startDate]=\"state.startDate\"\n [onCellClick]=\"onSelectedDate\"\n [onSelectHasDisableDate]=\"triggerSelectHasDisableDate\"\n [onLayout]=\"setClientHeight\"\n ></CalendarDatePicker>\n <CalendarTimePicker *ngIf=\"state.showTimePicker\"\n [propsData]=\"props\"\n [title]=\"state.timePickerTitle\"\n [clientHeight]=\"state.clientHight\"\n [prefixCls]=\"props.timePickerPrefixCls\"\n [defaultValue]=\"props.defaultTimeValue\"\n [pickerPrefixCls]=\"props.timePickerPickerPrefixCls\"\n [value]=\"state.endDate ? state.endDate : state.startDate\"\n [onValueChange]=\"onTimeChange\"\n ></CalendarTimePicker>\n <CalendarShortcutPanel *ngIf=\"props.showShortcut && !state.showTimePicker\"\n [locale]=\"props.locale\"\n [onSelect]=\"shortcutSelect\"\n ></CalendarShortcutPanel>\n <CalendarConfirmPanel *ngIf=\"state.startDate\"\n [startDateTime]=\"state.startDate\"\n [endDateTime]=\"state.endDate\"\n [propsData]=\"props\"\n [disableBtn]=\"state.disConfirmBtn\"\n [formatStr]=\"props.pickTime ? props.locale.dateTimeFormat : props.locale.dateFormat\"\n [onConfirm]=\"triggerConfirm\"\n ></CalendarConfirmPanel>\n </div>\n</span>\n<ng-template #closeIconHtml>\n <Icon [type]=\"'cross'\"></Icon>\n</ng-template>\n", encapsulation: ViewEncapsulation.None }] } ]; /** @nocollapse */ CalendarComponent.ctorParameters = () => [ { type: LocaleProviderService } ]; CalendarComponent.propDecorators = { locale: [{ type: Input }], defaultTimeValue: [{ type: Input }], prefixCls: [{ type: Input }], enterDirection: [{ type: Input }], visible: [{ type: Input }], getDateExtra: [{ type: Input }], defaultDate: [{ type: Input }], minDate: [{ type: Input }], maxDate: [{ type: Input }], pickTime: [{ type: Input }], type: [{ type: Input }], showShortcut: [{ type: Input }], rowSize: [{ type: Input }], infinite: [{ type: Input }], defaultValue: [{ type: Input }], onSelect: [{ type: Input }], onCancel: [{ type: Output }], onConfirm: [{ type: Output }], onSelectHasDisableDate: [{ type: Output }], class: [{ type: HostBinding, args: ['class',] }] }; if (false) { /** @type {?} */ CalendarComponent.prototype.isShow; /** @type {?} */ CalendarComponent.prototype.contentAnimateClass; /** @type {?} */ CalendarComponent.prototype.maskAnimateClass; /** @type {?} */ CalendarComponent.prototype.showClear; /** @type {?} */ CalendarComponent.prototype.props; /** @type {?} */ CalendarComponent.prototype.state; /** @type {?} */ CalendarComponent.prototype._unsubscribe$; /** @type {?} */ CalendarComponent.prototype._enterDirection; /** @type {?} */ CalendarComponent.prototype.onCancel; /** @type {?} */ CalendarComponent.prototype.onConfirm; /** @type {?} */ CalendarComponent.prototype.onSelectHasDisableDate; /** @type {?} */ CalendarComponent.prototype.class; /** @type {?} */ CalendarComponent.prototype.selectDate; /** @type {?} */ CalendarComponent.prototype.onSelectedDate; /** @type {?} */ CalendarComponent.prototype.triggerSelectHasDisableDate; /** @type {?} */ CalendarComponent.prototype.onClose; /** @type {?} */ CalendarComponent.prototype.triggerConfirm; /** @type {?} */ CalendarComponent.prototype.triggerClear; /** @type {?} */ CalendarComponent.prototype.onTimeChange; /** @type {?} */ CalendarComponent.prototype.shortcutSelect; /** @type {?} */ CalendarComponent.prototype.setClientHeight; /** @type {?} */ CalendarComponent.prototype._localeProviderService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvIiwic291cmNlcyI6WyJjYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLEtBQUssRUFDTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLElBQUksTUFBTSxnQkFBZ0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxnQkFBZ0IsQ0FBQztBQUVsQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWtCL0IsTUFBTTs7OztJQWtJSixZQUFvQixzQkFBNkM7UUFBN0MsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF1QjtzQkFqSS9DLEtBQUs7eUJBR0YsS0FBSzt1Q0FFbEI7WUFDTixPQUFPLEVBQUUsS0FBSztZQUNkLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLE1BQU0sRUFBRSxJQUFJO1lBQ1osUUFBUSxFQUFFLEtBQUs7WUFDZixZQUFZLEVBQUUsS0FBSztZQUNuQixTQUFTLEVBQUUsY0FBYztZQUN6QixJQUFJLEVBQUUsT0FBTztZQUNiLGdCQUFnQixFQUFFLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM3Qjt1Q0FFTjtZQUNOLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLGVBQWUsRUFBRSxFQUFFO1lBQ25CLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLE9BQU8s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QUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTthQUN0Qzs7OztZQXBCUSxxQkFBcUI7OztxQkFrRDNCLEtBQUs7K0JBV0wsS0FBSzt3QkFNTCxLQUFLOzZCQU1MLEtBQUs7c0JBU0wsS0FBSzsyQkFhTCxLQUFLOzBCQUlMLEtBQUs7c0JBSUwsS0FBSztzQkFJTCxLQUFLO3VCQUlMLEtBQUs7bUJBSUwsS0FBSzsyQkFJTCxLQUFLO3NCQUlMLEtBQUs7dUJBSUwsS0FBSzsyQkFFTCxLQUFLO3VCQVFMLEtBQUs7dUJBSUwsTUFBTTt3QkFFTixNQUFNO3FDQUVOLE1BQU07b0JBR04sV0FBVyxTQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgSG9zdEJpbmRpbmcsXG4gIEV2ZW50RW1pdHRlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGVscyB9IGZyb20gJy4vZGF0ZS9EYXRhVHlwZXMnO1xuaW1wb3J0IHpoQ04gZnJvbSAnLi9sb2NhbGUvemhfQ04nO1xuaW1wb3J0IGVuVVMgZnJvbSAnLi9sb2NhbGUvZW5fVVMnO1xuaW1wb3J0IFByb3BzVHlwZSBmcm9tICcuL2NhbGVuZGFyLnByb3BzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2NhbGVQcm92aWRlclNlcnZpY2UgfSBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXIvbG9jYWxlLXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgbWVyZ2VEYXRlVGltZSB9IGZyb20gJy4vdXRpbC9pbmRleCc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCB7IFByb3BzVHlwZSB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlVHlwZSB7XG4gIHNob3dUaW1lUGlja2VyOiBib29sZWFuO1xuICB0aW1lUGlja2VyVGl0bGU/OiBzdHJpbmc7XG4gIHN0YXJ0RGF0ZT86IERhdGU7XG4gIGVuZERhdGU/OiBEYXRlO1xuICBkaXNDb25maXJtQnRuPzogYm9vbGVhbjtcbiAgY2xpZW50SGlnaHQ/OiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0NhbGVuZGFyLCBuem0tY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBpc1Nob3c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29udGVudEFuaW1hdGVDbGFzczogc3RyaW5nO1xuICBtYXNrQW5pbWF0ZUNsYXNzOiBzdHJpbmc7XG4gIHNob3dDbGVhcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByb3BzID0ge1xuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIHNob3dIZWFkZXI6IHRydWUsXG4gICAgbG9jYWxlOiB6aENOLFxuICAgIHBpY2tUaW1lOiBmYWxzZSxcbiAgICBzaG93U2hvcnRjdXQ6IGZhbHNlLFxuICAgIHByZWZpeENsczogJ3JtYy1jYWxlbmRhcicsXG4gICAgdHlwZTogJ3JhbmdlJyxcbiAgICBkZWZhdWx0VGltZVZhbHVlOiBuZXcgRGF0ZSgyMDAwLCAwLCAxLCA4KVxuICB9IGFzIFByb3BzVHlwZTtcblxuICBzdGF0ZSA9IHtcbiAgICBzaG93VGltZVBpY2tlcjogZmFsc2UsXG4gICAgdGltZVBpY2tlclRpdGxlOiAnJyxcbiAgICBzdGFydERhdGU6IHVuZGVmaW5lZCxcbiAgICBlbmREYXRlOiB1bmRlZmluZWQsXG4gICAgZGlzQ29uZmlybUJ0bjogdHJ1ZSxcbiAgICBjbGllbnRIaWdodDogMFxuICB9IGFzIFN0YXRlVHlwZTtcblxuICBwcml2YXRlIF91bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF9lbnRlckRpcmVjdGlvbjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBsb2NhbGUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09ICdlblVTJykge1xuICAgICAgdGhpcy5wcm9wcy5sb2NhbGUgPSBlblVTO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICd6aENOJykge1xuICAgICAgdGhpcy5wcm9wcy5sb2NhbGUgPSB6aENOO1xuICAgIH1cblxuICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRlZmF1bHRUaW1lVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMucHJvcHMuZGVmYXVsdFRpbWVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcHJlZml4Q2xzKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnByb3BzLnByZWZpeENscyA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZW50ZXJEaXJlY3Rpb24odmFsdWUpIHtcbiAgICB0aGlzLl9lbnRlckRpcmVjdGlvbiA9IHZhbHVlO1xuICAgIGlmICh0aGlzLl9lbnRlckRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICB0aGlzLmNvbnRlbnRBbmltYXRlQ2xhc3MgPSAnc2xpZGVILWVudGVyIHNsaWRlSC1lbnRlci1hY3RpdmUnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRlbnRBbmltYXRlQ2xhc3MgPSAnc2xpZGVWLWVudGVyIHNsaWRlVi1lbnRlci1hY3RpdmUnO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgdmlzaWJsZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMudmlzaWJsZSA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICB0aGlzLnNob3dBbmltYXRpb24oKTtcbiAgICAgIHRoaXMuaXNTaG93ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRlQW5pbWF0aW9uKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc1Nob3cgPSBmYWxzZTtcbiAgICAgIH0sIDMwMCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBnZXREYXRlRXh0cmEodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLmdldERhdGVFeHRyYSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0RGF0ZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMuZGVmYXVsdERhdGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWluRGF0ZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMubWluRGF0ZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtYXhEYXRlKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5tYXhEYXRlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHBpY2tUaW1lKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5waWNrVGltZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCB0eXBlKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy50eXBlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHNob3dTaG9ydGN1dCh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMuc2hvd1Nob3J0Y3V0ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHJvd1NpemUodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLnJvd1NpemUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgaW5maW5pdGUodmFsdWUpIHt9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnJlY2VpdmVQcm9wcyh0aGlzLnByb3BzKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG9uU2VsZWN0KHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5vblNlbGVjdCA9IHZhbHVlO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNhbmNlbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQ29uZmlybTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uU2VsZWN0SGFzRGlzYWJsZURhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGNsYXNzOiBzdHJpbmcgPSAnYW0tY2FsZW5kYXInO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvY2FsZVByb3ZpZGVyU2VydmljZTogTG9jYWxlUHJvdmlkZXJTZXJ2aWNlKSB7fVxuXG4gIHJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IFByb3BzVHlwZSkge1xuICAgIGlmIChuZXh0UHJvcHMudmlzaWJsZSAmJiBuZXh0UHJvcHMuZGVmYXVsdFZhbHVlKSB7XG4gICAgICB0aGlzLnNob3J0Y3V0U2VsZWN0KG5leHRQcm9wcy5kZWZhdWx0VmFsdWVbMF0sIG5leHRQcm9wcy5kZWZhdWx0VmFsdWVbMV0sIG5leHRQcm9wcyk7XG4gICAgfVxuICB9XG5cbiAgc2hvd0FuaW1hdGlvbigpIHtcbiAgICBpZiAodGhpcy5fZW50ZXJEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJykge1xuICAgICAgdGhpcy5jb250ZW50QW5pbWF0ZUNsYXNzID0gJ3NsaWRlSC1lbnRlciBzbGlkZUgtZW50ZXItYWN0aXZlJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZW50QW5pbWF0ZUNsYXNzID0gJ3NsaWRlVi1lbnRlciBzbGlkZVYtZW50ZXItYWN0aXZlJztcbiAgICB9XG4gICAgdGhpcy5tYXNrQW5pbWF0ZUNsYXNzID0gJ2ZhZGUtZW50ZXIgZmFkZS1lbnRlci1hY3RpdmUnO1xuICB9XG5cbiAgaGlkZUFuaW1hdGlvbigpIHtcbiAgICBpZiAodGhpcy5fZW50ZXJEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJykge1xuICAgICAgdGhpcy5jb250ZW50QW5pbWF0ZUNsYXNzID0gJ3NsaWRlSC1sZWF2ZSBzbGlkZUgtbGVhdmUtYWN0aXZlJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZW50QW5pbWF0ZUNsYXNzID0gJ3NsaWRlVi1sZWF2ZSBzbGlkZVYtbGVhdmUtYWN0aXZlJztcbiAgICB9XG4gICAgdGhpcy5tYXNrQW5pbWF0ZUNsYXNzID0gJ2ZhZGUtbGVhdmUgZmFkZS1sZWF2ZS1hY3RpdmUnO1xuICB9XG5cbiAgc2VsZWN0RGF0ZSA9IChcbiAgICBkYXRlOiBEYXRlLFxuICAgIHVzZURhdGVUaW1lID0gZmFsc2UsXG4gICAgb2xkU3RhdGU6IHsgc3RhcnREYXRlPzogRGF0ZTsgZW5kRGF0ZT86IERhdGUgfSA9IHt9LFxuICAgIHByb3BzID0gdGhpcy5wcm9wc1xuICApID0+IHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybiB7fSBhcyBTdGF0ZVR5cGU7XG4gICAgfVxuICAgIGxldCBuZXdTdGF0ZSA9IHt9IGFzIFN0YXRlVHlwZTtcbiAgICBjb25zdCB7IHR5cGUsIHBpY2tUaW1lLCBkZWZhdWx0VGltZVZhbHVlLCBsb2NhbGUgPSB7fSBhcyBNb2RlbHMuTG9jYWxlIH0gPSBwcm9wcztcbiAgICBjb25zdCBuZXdEYXRlID0gcGlja1RpbWUgJiYgIXVzZURhdGVUaW1lID8gbWVyZ2VEYXRlVGltZShkYXRlLCBkZWZhdWx0VGltZVZhbHVlKSA6IGRhdGU7XG4gICAgY29uc3QgeyBzdGFydERhdGUsIGVuZERhdGUgfSA9IG9sZFN0YXRlO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdvbmUnOlxuICAgICAgICBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgICAgICBzdGFydERhdGU6IG5ld0RhdGUsXG4gICAgICAgICAgZGlzQ29uZmlybUJ0bjogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBpY2tUaW1lKSB7XG4gICAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgICAgICAgIHRpbWVQaWNrZXJUaXRsZTogbG9jYWxlLnNlbGVjdFRpbWUsXG4gICAgICAgICAgICBzaG93VGltZVBpY2tlcjogdHJ1ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JhbmdlJzpcbiAgICAgICAgaWYgKCFzdGFydERhdGUgfHwgZW5kRGF0ZSkge1xuICAgICAgICAgIG5ld1N0YXRlID0ge1xuICAgICAgICAgICAgLi4ubmV3U3RhdGUsXG4gICAgICAgICAgICBzdGFydERhdGU6IG5ld0RhdGUsXG4gICAgICAgICAgICBlbmREYXRlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkaXNDb25maXJtQnRuOiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAocGlja1RpbWUpIHtcbiAgICAgICAgICAgIG5ld1N0YXRlID0ge1xuICAgICAgICAgICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgICAgICAgICAgdGltZVBpY2tlclRpdGxlOiBsb2NhbGUuc2VsZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgICBzaG93VGltZVBpY2tlcjogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgICAgICAgIHRpbWVQaWNrZXJUaXRsZTogK25ld0RhdGUgPj0gK3N0YXJ0RGF0ZSA/IGxvY2FsZS5zZWxlY3RFbmRUaW1lIDogbG9jYWxlLnNlbGVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgIGRpc0NvbmZpcm1CdG46IGZhbHNlLFxuICAgICAgICAgICAgZW5kRGF0ZTpcbiAgICAgICAgICAgICAgcGlja1RpbWUgJiYgIXVzZURhdGVUaW1lICYmICtuZXdEYXRlID49ICtzdGFydERhdGVcbiAgICAgICAgICAgICAgICA/IG5ldyBEYXRlKCttZXJnZURhdGVUaW1lKG5ld0RhdGUsIHN0YXJ0RGF0ZSkgKyAzNjAwMDAwKVxuICAgICAgICAgICAgICAgIDogbmV3RGF0ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWREYXRlID0gKGRhdGU6IERhdGUpID0+IHtcbiAgICBjb25zdCB7IHN0YXJ0RGF0ZSwgZW5kRGF0ZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7IG9uU2VsZWN0IH0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKG9uU2VsZWN0KSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9uU2VsZWN0KGRhdGUsIFtzdGFydERhdGUsIGVuZERhdGVdKTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnNob3J0Y3V0U2VsZWN0KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgIC4uLnRoaXMuc2VsZWN0RGF0ZShkYXRlLCBmYWxzZSwgeyBzdGFydERhdGUsIGVuZERhdGUgfSlcbiAgICB9O1xuXG4gICAgdGhpcy5zaG93Q2xlYXIgPSAhIXRoaXMuc3RhdGUuc3RhcnREYXRlO1xuICB9XG5cbiAgdHJpZ2dlclNlbGVjdEhhc0Rpc2FibGVEYXRlID0gKGRhdGU6IERhdGVbXSkgPT4ge1xuICAgIHRoaXMudHJpZ2dlckNsZWFyKCk7XG4gICAgdGhpcy5vblNlbGVjdEhhc0Rpc2FibGVEYXRlICYmIHRoaXMub25TZWxlY3RIYXNEaXNhYmxlRGF0ZS5lbWl0KGRhdGUpO1xuICB9XG5cbiAgb25DbG9zZSA9ICgpID0+IHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgc2hvd1RpbWVQaWNrZXI6IGZhbHNlLFxuICAgICAgdGltZVBpY2tlclRpdGxlOiAnJyxcbiAgICAgIHN0YXJ0RGF0ZTogdW5kZWZpbmVkLFxuICAgICAgZW5kRGF0ZTogdW5kZWZpbmVkLFxuICAgICAgZGlzQ29uZmlybUJ0bjogdHJ1ZSxcbiAgICAgIGNsaWVudEhpZ2h0OiAwXG4gICAgfSBhcyBTdGF0ZVR5cGU7XG4gICAgdGhpcy5zaG93Q2xlYXIgPSAhIXRoaXMuc3RhdGUuc3RhcnREYXRlO1xuICB9XG5cbiAgdHJpZ2dlckNvbmZpcm0gPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFydERhdGUsIGVuZERhdGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgaWYgKHN0YXJ0RGF0ZSAmJiBlbmREYXRlICYmICtzdGFydERhdGUgPiArZW5kRGF0ZSkge1xuICAgICAgdGhpcy5vbkNsb3NlKCk7XG4gICAgICByZXR1cm4gdGhpcy5vbkNvbmZpcm0gJiYgdGhpcy5vbkNvbmZpcm0uZW1pdCh7IHN0YXJ0RGF0ZTogZW5kRGF0ZSwgZW5kRGF0ZTogc3RhcnREYXRlIH0pO1xuICAgIH1cbiAgICB0aGlzLm9uQ29uZmlybSAmJiB0aGlzLm9uQ29uZmlybS5lbWl0KHsgc3RhcnREYXRlLCBlbmREYXRlIH0pO1xuICAgIHRoaXMub25DbG9zZSgpO1xuICB9XG5cbiAgdHJpZ2dlckNhbmNlbCgpIHtcbiAgICB0aGlzLnByb3BzLm9uQ2FuY2VsICYmIHRoaXMucHJvcHMub25DYW5jZWwoKTtcbiAgICB0aGlzLm9uQ2xvc2UoKTtcbiAgICB0aGlzLm9uQ2FuY2VsICYmIHRoaXMub25DYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgdHJpZ2dlckNsZWFyID0gKCkgPT4ge1xuICAgIC8vIOa4hemZpOaVsOaNruWBmuW7tui/n++8jOWQpuWImeWQjOatpeWIt+aWsOaVsOaNruWvvOiHtOaKpemUmVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgLi4ueyBzdGFydERhdGU6IHVuZGVmaW5lZCwgZW5kRGF0ZTogdW5kZWZpbmVkLCBzaG93VGltZVBpY2tlcjogZmFsc2UgfVxuICAgICAgfTtcbiAgICAgIHRoaXMucHJvcHMub25DbGVhciAmJiB0aGlzLnByb3BzLm9uQ2xlYXIoKTtcbiAgICAgIHRoaXMuc2hvd0NsZWFyID0gISF0aGlzLnN0YXRlLnN0YXJ0RGF0ZTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIG9uVGltZUNoYW5nZSA9IChkYXRlOiBEYXRlKSA9PiB7XG4gICAgY29uc3QgeyBzdGFydERhdGUsIGVuZERhdGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgaWYgKGVuZERhdGUpIHtcbiAgICAgIHRoaXMuc3RhdGUuZW5kRGF0ZSA9IGRhdGU7XG4gICAgfSBlbHNlIGlmIChzdGFydERhdGUpIHtcbiAgICAgIHRoaXMuc3RhdGUuc3RhcnREYXRlID0gZGF0ZTtcbiAgICB9XG4gIH1cblxuICBzaG9ydGN1dFNlbGVjdCA9IChzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUsIHByb3BzID0gdGhpcy5wcm9wcykgPT4ge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgLi4ueyBzdGFydERhdGUsIHNob3dUaW1lUGlja2VyOiBmYWxzZSB9LFxuICAgICAgLi4udGhpcy5zZWxlY3REYXRlKGVuZERhdGUsIHRydWUsIHsgc3RhcnREYXRlIH0sIHByb3BzKVxuICAgIH07XG4gICAgdGhpcy5zaG93Q2xlYXIgPSAhIXRoaXMuc3RhdGUuc3RhcnREYXRlO1xuICB9XG5cbiAgc2V0Q2xpZW50SGVpZ2h0ID0gKGhlaWdodDogbnVtYmVyKSA9PiB7XG4gICAgdGhpcy5zdGF0ZS5jbGllbnRIaWdodCA9IGhlaWdodDtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMucHJvcHMuZGVmYXVsdFZhbHVlO1xuICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgIC4uLnRoaXMuc2VsZWN0RGF0ZShkZWZhdWx0VmFsdWVbMV0sIHRydWUsIHsgc3RhcnREYXRlOiBkZWZhdWx0VmFsdWVbMF0gfSwgdGhpcy5wcm9wcylcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9jYWxlUHJvdmlkZXJTZXJ2aWNlLmxvY2FsZUNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICB0aGlzLnByb3BzLmxvY2FsZSA9IHsgLi4udGhpcy5fbG9jYWxlUHJvdmlkZXJTZXJ2aWNlLmdldExvY2FsZVN1Yk9iaignQ2FsZW5kYXInKSB9IGFzIE1vZGVscy5Mb2NhbGU7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl91bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=