UNPKG

ng-zorro-antd-mobile

Version:

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

744 lines 58.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, forwardRef, ViewEncapsulation, Input, Output, HostBinding, EventEmitter, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import zhCN from './locale/zh_CN'; import enUS from './locale/en_US'; import { LocaleProviderService } from '../locale-provider/locale-provider.service'; import { mergeDateTime, isSameDate } from './util/index'; import { takeUntil } from 'rxjs/operators'; import { CalendarDatePickerComponent } from './datepicker/datepicker.component'; import { Subject } from 'rxjs'; /** * @record */ export function CalendarStateType() { } if (false) { /** @type {?} */ CalendarStateType.prototype.showTimePicker; /** @type {?|undefined} */ CalendarStateType.prototype.timePickerTitle; /** @type {?|undefined} */ CalendarStateType.prototype.startDate; /** @type {?|undefined} */ CalendarStateType.prototype.endDate; /** @type {?|undefined} */ CalendarStateType.prototype.disConfirmBtn; /** @type {?|undefined} */ CalendarStateType.prototype.clientHight; } var CalendarComponent = /** @class */ (function () { function CalendarComponent(_localeProviderService) { var _this = this; this._localeProviderService = _localeProviderService; this.isShow = false; this.showClear = false; this.isSameDate = isSameDate; 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._dateModelTime = 0; this.onCancel = new EventEmitter(); this.onConfirm = new EventEmitter(); this.onSelectHasDisableDate = new EventEmitter(); this.class = 'am-calendar'; this.selectDate = (/** * @param {?} date * @param {?=} useDateTime * @param {?=} oldState * @param {?=} props * @return {?} */ function (date, useDateTime, oldState, props) { if (useDateTime === void 0) { useDateTime = false; } if (oldState === void 0) { oldState = {}; } if (props === void 0) { props = _this.props; } if (!date) { return (/** @type {?} */ ({})); } /** @type {?} */ var newState = (/** @type {?} */ ({})); var type = props.type, pickTime = props.pickTime, defaultTimeValue = props.defaultTimeValue, _a = props.locale, locale = _a === void 0 ? (/** @type {?} */ ({})) : _a; /** @type {?} */ var newDate = pickTime && !useDateTime ? mergeDateTime(date, defaultTimeValue) : date; var startDate = oldState.startDate, endDate = oldState.endDate; switch (type) { case 'one': newState = tslib_1.__assign({}, newState, { startDate: newDate, disConfirmBtn: false }); if (pickTime) { newState = tslib_1.__assign({}, newState, { timePickerTitle: locale.selectTime, showTimePicker: true }); } break; case 'range': if (!startDate || endDate) { newState = tslib_1.__assign({}, newState, { startDate: newDate, endDate: undefined, disConfirmBtn: true }); if (pickTime) { newState = tslib_1.__assign({}, newState, { timePickerTitle: locale.selectStartTime, showTimePicker: true }); } } else { newState = tslib_1.__assign({}, newState, { timePickerTitle: +newDate >= +startDate || _this.isSameDate(startDate, newDate) ? locale.selectEndTime : locale.selectStartTime, disConfirmBtn: false, endDate: pickTime && !useDateTime && (+newDate >= +startDate || _this.isSameDate(startDate, newDate)) ? new Date(+mergeDateTime(newDate, startDate) + 3600000) : newDate }); } break; } _this.writeModelData(date); return newState; }); this.onSelectedDate = (/** * @param {?} date * @return {?} */ function (date) { var _a = _this.state, startDate = _a.startDate, endDate = _a.endDate; var onSelect = _this.props.onSelect; if (onSelect) { /** @type {?} */ var value = onSelect(date, [startDate, endDate]); if (value) { _this.shortcutSelect(value[0], value[1]); return; } } _this.state = tslib_1.__assign({}, _this.state, _this.selectDate(date, false, { startDate: startDate, endDate: endDate })); _this.showClear = !!_this.state.startDate; }); this.triggerSelectHasDisableDate = (/** * @param {?} date * @return {?} */ function (date) { _this.triggerClear(); if (_this.onSelectHasDisableDate) { _this.onSelectHasDisableDate.emit(date); } }); this.onClose = (/** * @return {?} */ function () { _this.state = (/** @type {?} */ ({ showTimePicker: false, timePickerTitle: '', startDate: undefined, endDate: undefined, disConfirmBtn: true, clientHight: 0 })); _this.showClear = !!_this.state.startDate; }); this.triggerConfirm = (/** * @return {?} */ function () { var _a = _this.state, startDate = _a.startDate, endDate = _a.endDate; if (startDate && endDate && +startDate > +endDate) { _this.onClose(); return _this.onConfirm && _this.onConfirm.emit({ startDate: endDate, endDate: startDate }); } if (_this.onConfirm) { _this.onConfirm.emit({ startDate: startDate, endDate: endDate }); } _this.onClose(); }); this.triggerClear = (/** * @return {?} */ function () { // 清除数据做延迟,否则同步刷新数据导致报错 setTimeout((/** * @return {?} */ function () { _this.state = tslib_1.__assign({}, _this.state, { startDate: undefined, endDate: undefined, showTimePicker: false }); if (_this.props.onClear) { _this.props.onClear(); } _this.showClear = !!_this.state.startDate; }), 0); }); this.onTimeChange = (/** * @param {?} date * @return {?} */ function (date) { var _a = _this.state, startDate = _a.startDate, endDate = _a.endDate; if (endDate) { _this.state.endDate = date; } else if (startDate) { _this.state.startDate = date; } }); this.shortcutSelect = (/** * @param {?} startDate * @param {?} endDate * @param {?=} props * @return {?} */ function (startDate, endDate, props) { if (props === void 0) { props = _this.props; } _this.state = tslib_1.__assign({}, _this.state, { startDate: startDate, showTimePicker: false }, _this.selectDate(endDate, true, { startDate: startDate }, props)); _this.showClear = !!_this.state.startDate; }); this.setClientHeight = (/** * @param {?} height * @return {?} */ function (height) { _this.state.clientHight = height; }); this.onChangeFn = (/** * @return {?} */ function () { }); this.onTouchFn = (/** * @return {?} */ function () { }); } Object.defineProperty(CalendarComponent.prototype, "locale", { set: /** * @param {?} value * @return {?} */ function (value) { if (value === 'enUS') { this.props.locale = enUS; } else if (value === 'zhCN') { this.props.locale = zhCN; } this._unsubscribe$.next(); this._unsubscribe$.complete(); }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "defaultTimeValue", { set: /** * @param {?} value * @return {?} */ function (value) { if (value) { this.props.defaultTimeValue = value; } }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "prefixCls", { set: /** * @param {?} value * @return {?} */ function (value) { if (value) { this.props.prefixCls = value; } }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "enterDirection", { set: /** * @param {?} value * @return {?} */ function (value) { this._enterDirection = value; if (this._enterDirection === 'horizontal') { this.contentAnimateClass = 'slideH-enter slideH-enter-active'; } else { this.contentAnimateClass = 'slideV-enter slideV-enter-active'; } }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "visible", { set: /** * @param {?} value * @return {?} */ function (value) { var _this = this; this.props.visible = value; if (value === true || value === 'true') { this.showAnimation(); this.isShow = true; } else { this.hideAnimation(); setTimeout((/** * @return {?} */ function () { _this.isShow = false; }), 300); } }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "getDateExtra", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.getDateExtra = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "defaultDate", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.defaultDate = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "minDate", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.minDate = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "maxDate", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.maxDate = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "pickTime", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.pickTime = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "type", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.type = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "showShortcut", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.showShortcut = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "rowSize", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.rowSize = value; }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "infinite", { set: /** * @param {?} value * @return {?} */ function (value) { }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "defaultValue", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.defaultValue = value; if (value) { this.receiveProps(this.props); } }, enumerable: true, configurable: true }); Object.defineProperty(CalendarComponent.prototype, "onSelect", { set: /** * @param {?} value * @return {?} */ function (value) { this.props.onSelect = value; }, enumerable: true, configurable: true }); /** * @param {?} value * @return {?} */ CalendarComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { this._dateModelType = null; if (value && value instanceof Array) { if (value.length === 0) { console.error('[ng-zorro-antd-mobile]: calendar ngModel array need params!'); return; } if (this.props.type === 'one' && value.length >= 2) { this._dateModelType = 1; console.error('[ng-zorro-antd-mobile]: type is one, but ngmodel has more than one param, just use first one'); this.onSelectedDate(value[0]); } else if (value.length === 1) { this._dateModelType = 1; this.onSelectedDate(value[0]); } else { this._dateModelType = 2; this.onSelectedDate(value[0]); this.onSelectedDate(value[1]); } } else if (value && value instanceof Date) { this._dateModelType = 3; this.onSelectedDate(value); } }; /** * @param {?} fn * @return {?} */ CalendarComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChangeFn = fn; }; /** * @param {?} fn * @return {?} */ CalendarComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouchFn = fn; }; /** * @param {?} nextProps * @return {?} */ CalendarComponent.prototype.receiveProps = /** * @param {?} nextProps * @return {?} */ function (nextProps) { if (nextProps.visible && nextProps.defaultValue) { this.shortcutSelect(nextProps.defaultValue[0], nextProps.defaultValue[1], nextProps); } }; /** * @return {?} */ CalendarComponent.prototype.showAnimation = /** * @return {?} */ function () { 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 {?} */ CalendarComponent.prototype.hideAnimation = /** * @return {?} */ function () { 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'; }; /** * @param {?} date * @return {?} */ CalendarComponent.prototype.writeModelData = /** * @param {?} date * @return {?} */ function (date) { if (this._dateModelValue instanceof Array) { this._dateModelTime = this._dateModelValue.length; } else { this._dateModelTime = 0; } switch (this._dateModelType) { case 1: this._dateModelValue = [date]; this.onChangeFn(this._dateModelValue); break; case 2: if (this._dateModelTime === 1) { if (+date < +this._dateModelValue[0]) { this._dateModelValue.unshift(date); } else { this._dateModelValue.push(date); } this.onChangeFn(this._dateModelValue); } else { this._dateModelValue = []; this._dateModelValue.push(date); } break; case 3: this._dateModelValue = date; this.onChangeFn(this._dateModelValue); break; default: break; } }; /** * @return {?} */ CalendarComponent.prototype.triggerCancel = /** * @return {?} */ function () { if (this.props.onCancel) { this.props.onCancel(); } this.onClose(); if (this.onCancel) { this.onCancel.emit(); } }; /** * @return {?} */ CalendarComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var defaultValue = this.props.defaultValue; if (defaultValue) { this.state = tslib_1.__assign({}, this.state, this.selectDate(defaultValue[1], true, { startDate: defaultValue[0] }, this.props)); } this._localeProviderService.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe((/** * @param {?} _ * @return {?} */ function (_) { _this.props.locale = (/** @type {?} */ (tslib_1.__assign({}, _this._localeProviderService.getLocaleSubObj('Calendar')))); })); }; /** * @return {?} */ CalendarComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { 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\n [locale]=\"props.locale\"\n [closeIcon]=\"closeIconHtml\"\n [showClear]=\"showClear\"\n (onCancel)=\"triggerCancel()\"\n (onClear)=\"triggerClear()\"\n ></CalendarHeader>\n <CalendarDatePicker\n [propsData]=\"props\"\n [endDate]=\"state.endDate\"\n [startDate]=\"state.startDate\"\n [onCellClick]=\"onSelectedDate\"\n [onSelectHasDisableDate]=\"triggerSelectHasDisableDate\"\n [onLayout]=\"setClientHeight\"\n ></CalendarDatePicker>\n <CalendarTimePicker\n *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\n *ngIf=\"props.showShortcut && !state.showTimePicker\"\n [locale]=\"props.locale\"\n [onSelect]=\"shortcutSelect\"\n ></CalendarShortcutPanel>\n <CalendarConfirmPanel\n *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, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return CalendarComponent; })), multi: true }] }] } ]; /** @nocollapse */ CalendarComponent.ctorParameters = function () { return [ { type: LocaleProviderService } ]; }; CalendarComponent.propDecorators = { datepicker: [{ type: ViewChild, args: [CalendarDatePickerComponent, { static: false },] }], 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',] }] }; return CalendarComponent; }()); export { CalendarComponent }; if (false) { /** @type {?} */ CalendarComponent.prototype.isShow; /** @type {?} */ CalendarComponent.prototype.contentAnimateClass; /** @type {?} */ CalendarComponent.prototype.maskAnimateClass; /** @type {?} */ CalendarComponent.prototype.showClear; /** @type {?} */ CalendarComponent.prototype.isSameDate; /** @type {?} */ CalendarComponent.prototype.props; /** @type {?} */ CalendarComponent.prototype.state; /** * @type {?} * @private */ CalendarComponent.prototype._unsubscribe$; /** * @type {?} * @private */ CalendarComponent.prototype._enterDirection; /** * @type {?} * @private */ CalendarComponent.prototype._dateModelType; /** * @type {?} * @private */ CalendarComponent.prototype._dateModelValue; /** * @type {?} * @private */ CalendarComponent.prototype._dateModelTime; /** @type {?} */ CalendarComponent.prototype.datepicker; /** @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 {?} * @private */ CalendarComponent.prototype.onChangeFn; /** * @type {?} * @private */ CalendarComponent.prototype.onTouchFn; /** * @type {?} * @private */ CalendarComponent.prototype._localeProviderService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvIiwic291cmNlcyI6WyJjYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFHVixpQkFBaUIsRUFDakIsS0FBSyxFQUNMLE1BQU0sRUFDTixXQUFXLEVBQ1gsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsT0FBTyxJQUFJLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEMsT0FBTyxJQUFJLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFJL0IsdUNBT0M7OztJQU5DLDJDQUF3Qjs7SUFDeEIsNENBQXlCOztJQUN6QixzQ0FBaUI7O0lBQ2pCLG9DQUFlOztJQUNmLDBDQUF3Qjs7SUFDeEIsd0NBQXFCOztBQUd2QjtJQWdKRSwyQkFBb0Isc0JBQTZDO1FBQWpFLGlCQUFxRTtRQUFqRCwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXVCO1FBeklqRSxXQUFNLEdBQVksS0FBSyxDQUFDO1FBR3hCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsZUFBVSxHQUFhLFVBQVUsQ0FBQztRQUVsQyxVQUFLLEdBQUcsbUJBQUE7WUFDTixPQUFPLEVBQUUsS0FBSztZ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QUVOLE1BQU07eUNBRU4sTUFBTTt3QkFHTixXQUFXLFNBQUMsT0FBTzs7SUF3UnRCLHdCQUFDO0NBQUEsQUFyYUQsSUFxYUM7U0EvWlksaUJBQWlCOzs7SUFDNUIsbUNBQXdCOztJQUN4QixnREFBNEI7O0lBQzVCLDZDQUF5Qjs7SUFDekIsc0NBQTJCOztJQUMzQix1Q0FBa0M7O0lBRWxDLGtDQVN1Qjs7SUFFdkIsa0NBT3VCOzs7OztJQUV2QiwwQ0FBNEM7Ozs7O0lBQzVDLDRDQUFnQzs7Ozs7SUFDaEMsMkNBQStCOzs7OztJQUMvQiw0Q0FBNkI7Ozs7O0lBQzdCLDJDQUFtQzs7SUFFbkMsdUNBQ3dDOztJQThGeEMscUNBQ3NEOztJQUN0RCxzQ0FDdUQ7O0lBQ3ZELG1EQUNvRTs7SUFFcEUsa0NBQzhCOztJQTZEOUIsdUNBZ0VDOztJQW9DRCwyQ0FrQkM7O0lBRUQsd0RBS0M7O0lBRUQsb0NBVUM7O0lBRUQsMkNBVUM7O0lBWUQseUNBWUM7O0lBRUQseUNBT0M7O0lBRUQsMkNBT0M7O0lBRUQsNENBRUM7Ozs7O0lBcUJELHVDQUFrRTs7Ozs7SUFDbEUsc0NBQWlFOzs7OztJQXBSckQsbURBQXFEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBmb3J3YXJkUmVmLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEhvc3RCaW5kaW5nLFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGVNb2RlbHMgfSBmcm9tICcuL2RhdGUvRGF0YVR5cGVzJztcbmltcG9ydCB6aENOIGZyb20gJy4vbG9jYWxlL3poX0NOJztcbmltcG9ydCBlblVTIGZyb20gJy4vbG9jYWxlL2VuX1VTJztcbmltcG9ydCB7IENhbGVuZGFyUHJvcHNUeXBlIH0gZnJvbSAnLi9jYWxlbmRhci5wcm9wcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9jYWxlUHJvdmlkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vbG9jYWxlLXByb3ZpZGVyL2xvY2FsZS1wcm92aWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IG1lcmdlRGF0ZVRpbWUsIGlzU2FtZURhdGUgfSBmcm9tICcuL3V0aWwvaW5kZXgnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ2FsZW5kYXJEYXRlUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IHsgQ2FsZW5kYXJQcm9wc1R5cGUgfTtcblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhclN0YXRlVHlwZSB7XG4gIHNob3dUaW1lUGlja2VyOiBib29sZWFuO1xuICB0aW1lUGlja2VyVGl0bGU/OiBzdHJpbmc7XG4gIHN0YXJ0RGF0ZT86IERhdGU7XG4gIGVuZERhdGU/OiBEYXRlO1xuICBkaXNDb25maXJtQnRuPzogYm9vbGVhbjtcbiAgY2xpZW50SGlnaHQ/OiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0NhbGVuZGFyLCBuem0tY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDYWxlbmRhckNvbXBvbmVudCksIG11bHRpOiB0cnVlIH1dXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgaXNTaG93OiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnRlbnRBbmltYXRlQ2xhc3M6IHN0cmluZztcbiAgbWFza0FuaW1hdGVDbGFzczogc3RyaW5nO1xuICBzaG93Q2xlYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNTYW1lRGF0ZTogRnVuY3Rpb24gPSBpc1NhbWVEYXRlO1xuXG4gIHByb3BzID0ge1xuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIHNob3dIZWFkZXI6IHRydWUsXG4gICAgbG9jYWxlOiB6aENOLFxuICAgIHBpY2tUaW1lOiBmYWxzZSxcbiAgICBzaG93U2hvcnRjdXQ6IGZhbHNlLFxuICAgIHByZWZpeENsczogJ3JtYy1jYWxlbmRhcicsXG4gICAgdHlwZTogJ3JhbmdlJyxcbiAgICBkZWZhdWx0VGltZVZhbHVlOiBuZXcgRGF0ZSgyMDAwLCAwLCAxLCA4KVxuICB9IGFzIENhbGVuZGFyUHJvcHNUeXBlO1xuXG4gIHN0YXRlID0ge1xuICAgIHNob3dUaW1lUGlja2VyOiBmYWxzZSxcbiAgICB0aW1lUGlja2VyVGl0bGU6ICcnLFxuICAgIHN0YXJ0RGF0ZTogdW5kZWZpbmVkLFxuICAgIGVuZERhdGU6IHVuZGVmaW5lZCxcbiAgICBkaXNDb25maXJtQnRuOiB0cnVlLFxuICAgIGNsaWVudEhpZ2h0OiAwXG4gIH0gYXMgQ2FsZW5kYXJTdGF0ZVR5cGU7XG5cbiAgcHJpdmF0ZSBfdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfZW50ZXJEaXJlY3Rpb246IHN0cmluZztcbiAgcHJpdmF0ZSBfZGF0ZU1vZGVsVHlwZTogbnVtYmVyO1xuICBwcml2YXRlIF9kYXRlTW9kZWxWYWx1ZTogYW55O1xuICBwcml2YXRlIF9kYXRlTW9kZWxUaW1lOiBudW1iZXIgPSAwO1xuXG4gIEBWaWV3Q2hpbGQoQ2FsZW5kYXJEYXRlUGlja2VyQ29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgZGF0ZXBpY2tlcjogQ2FsZW5kYXJEYXRlUGlja2VyQ29tcG9uZW50O1xuXG4gIEBJbnB1dCgpXG4gIHNldCBsb2NhbGUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09ICdlblVTJykge1xuICAgICAgdGhpcy5wcm9wcy5sb2NhbGUgPSBlblVTO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICd6aENOJykge1xuICAgICAgdGhpcy5wcm9wcy5sb2NhbGUgPSB6aENOO1xuICAgIH1cblxuICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRlZmF1bHRUaW1lVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMucHJvcHMuZGVmYXVsdFRpbWVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgcHJlZml4Q2xzKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnByb3BzLnByZWZpeENscyA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZW50ZXJEaXJlY3Rpb24odmFsdWUpIHtcbiAgICB0aGlzLl9lbnRlckRpcmVjdGlvbiA9IHZhbHVlO1xuICAgIGlmICh0aGlzLl9lbnRlckRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICB0aGlzLmNvbnRlbnRBbmltYXRlQ2xhc3MgPSAnc2xpZGVILWVudGVyIHNsaWRlSC1lbnRlci1hY3RpdmUnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRlbnRBbmltYXRlQ2xhc3MgPSAnc2xpZGVWLWVudGVyIHNsaWRlVi1lbnRlci1hY3RpdmUnO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgdmlzaWJsZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMudmlzaWJsZSA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICB0aGlzLnNob3dBbmltYXRpb24oKTtcbiAgICAgIHRoaXMuaXNTaG93ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRlQW5pbWF0aW9uKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc1Nob3cgPSBmYWxzZTtcbiAgICAgIH0sIDMwMCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBnZXREYXRlRXh0cmEodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLmdldERhdGVFeHRyYSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0RGF0ZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMuZGVmYXVsdERhdGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWluRGF0ZSh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMubWluRGF0ZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtYXhEYXRlKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5tYXhEYXRlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHBpY2tUaW1lKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5waWNrVGltZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCB0eXBlKHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy50eXBlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHNob3dTaG9ydGN1dCh2YWx1ZSkge1xuICAgIHRoaXMucHJvcHMuc2hvd1Nob3J0Y3V0ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHJvd1NpemUodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLnJvd1NpemUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgaW5maW5pdGUodmFsdWUpIHt9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWUpIHtcbiAgICB0aGlzLnByb3BzLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnJlY2VpdmVQcm9wcyh0aGlzLnByb3BzKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG9uU2VsZWN0KHZhbHVlKSB7XG4gICAgdGhpcy5wcm9wcy5vblNlbGVjdCA9IHZhbHVlO1xuICB9XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2FuY2VsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25Db25maXJtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25TZWxlY3RIYXNEaXNhYmxlRGF0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgY2xhc3M6IHN0cmluZyA9ICdhbS1jYWxlbmRhcic7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9jYWxlUHJvdmlkZXJTZXJ2aWNlOiBMb2NhbGVQcm92aWRlclNlcnZpY2UpIHt9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZSB8IEFycmF5PERhdGU+IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGVNb2RlbFR5cGUgPSBudWxsO1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tuZy16b3Jyby1hbnRkLW1vYmlsZV06IGNhbGVuZGFyIG5nTW9kZWwgYXJyYXkgbmVlZCBwYXJhbXMhJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnByb3BzLnR5cGUgPT09ICdvbmUnICYmIHZhbHVlLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHRoaXMuX2RhdGVNb2RlbFR5cGUgPSAxO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbbmctem9ycm8tYW50ZC1tb2JpbGVdOiB0eXBlIGlzIG9uZSwgYnV0IG5nbW9kZWwgaGFzIG1vcmUgdGhhbiBvbmUgcGFyYW0sIGp1c3QgdXNlIGZpcnN0IG9uZScpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0ZWREYXRlKHZhbHVlWzBdKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHRoaXMuX2RhdGVNb2RlbFR5cGUgPSAxO1xuICAgICAgICB0aGlzLm9uU2VsZWN0ZWREYXRlKHZhbHVlWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2RhdGVNb2RlbFR5cGUgPSAyO1xuICAgICAgICB0aGlzLm9uU2VsZWN0ZWREYXRlKHZhbHVlWzBdKTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGVkRGF0ZSh2YWx1ZVsxXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHRoaXMuX2RhdGVNb2RlbFR5cGUgPSAzO1xuICAgICAgdGhpcy5vblNlbGVjdGVkRGF0ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKGRhdGU6IERhdGUgfCBBcnJheTxEYXRlPikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2VGbiA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hGbiA9IGZuO1xuICB9XG5cbiAgcmVjZWl2ZVByb3BzKG5leHRQcm9wczogQ2FsZW5kYXJQcm9wc1R5cGUpIHtcbiAgICBpZiAobmV4dFByb3BzLnZpc2libGUgJiYgbmV4dFByb3BzLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgdGhpcy5zaG9ydGN1dFNlbGVjdChuZXh0UHJvcHMuZGVmYXVsdFZhbHVlWzBdLCBuZXh0UHJvcHMuZGVmYXVsdFZhbHVlWzFdLCBuZXh0UHJvcHMpO1xuICAgIH1cbiAgfVxuXG4gIHNob3dBbmltYXRpb24oKSB7XG4gICAgaWYgKHRoaXMuX2VudGVyRGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgIHRoaXMuY29udGVudEFuaW1hdGVDbGFzcyA9ICdzbGlkZUgtZW50ZXIgc2xpZGVILWVudGVyLWFjdGl2ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGVudEFuaW1hdGVDbGFzcyA