ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
744 lines • 58.7 kB
JavaScript
/**
* @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