ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
447 lines • 44.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { DateModels } from '../date/DataTypes';
import { formatDate } from '../util';
import defaultLocale from '../locale/zh_CN';
/**
* @record
*/
export function DatepickerStateType() { }
if (false) {
/** @type {?} */
DatepickerStateType.prototype.months;
}
export class CalendarDatePickerBaseComponent {
constructor() {
this.props = (/** @type {?} */ ({
prefixCls: 'rmc-calendar',
infinite: false,
infiniteOpt: false,
defaultDate: new Date(),
initalMonths: 6,
locale: defaultLocale
}));
this.state = {
months: []
};
this.visibleMonth = [];
this.getDateWithoutTime = (/**
* @param {?=} date
* @return {?}
*/
(date) => {
if (!date) {
return 0;
}
return +new Date(date.getFullYear(), date.getMonth(), date.getDate());
});
this.genWeekData = (/**
* @param {?} firstDate
* @return {?}
*/
(firstDate) => {
/** @type {?} */
const minDateTime = this.getDateWithoutTime(this.props.minDate);
/** @type {?} */
const maxDateTime = this.getDateWithoutTime(this.props.maxDate) || Number.POSITIVE_INFINITY;
/** @type {?} */
const weeks = [];
/** @type {?} */
const nextMonth = this.getMonthDate(firstDate, 1).firstDate;
/** @type {?} */
let currentDay = firstDate;
/** @type {?} */
let currentWeek = [];
weeks.push(currentWeek);
/** @type {?} */
let startWeekday = currentDay.getDay();
if (startWeekday > 0) {
for (let i = 0; i < startWeekday; i++) {
currentWeek.push((/** @type {?} */ ({})));
}
}
while (currentDay < nextMonth) {
if (currentWeek.length === 7) {
currentWeek = [];
weeks.push(currentWeek);
}
/** @type {?} */
const dayOfMonth = currentDay.getDate();
/** @type {?} */
const tick = +currentDay;
currentWeek.push({
tick,
dayOfMonth,
selected: DateModels.SelectType.None,
isFirstOfMonth: dayOfMonth === 1,
isLastOfMonth: false,
outOfDate: tick < minDateTime || tick > maxDateTime
});
currentDay = new Date(currentDay.getTime() + 3600 * 24 * 1000);
}
currentWeek[currentWeek.length - 1].isLastOfMonth = true;
return weeks;
});
this.selectDateRange = (/**
* @param {?} startDate
* @param {?=} endDate
* @param {?=} clear
* @return {?}
*/
(startDate, endDate, clear = false) => {
const { getDateExtra, type, onSelectHasDisableDate } = this.props;
if (type === 'one') {
endDate = undefined;
}
/** @type {?} */
const time1 = this.getDateWithoutTime(startDate);
/** @type {?} */
const time2 = this.getDateWithoutTime(endDate);
/** @type {?} */
const startDateTick = !time2 || time1 < time2 ? time1 : time2;
/** @type {?} */
const endDateTick = time2 && time1 > time2 ? time1 : time2;
/** @type {?} */
const startMonthDate = this.getMonthDate(new Date(startDateTick)).firstDate;
/** @type {?} */
const endMonthDate = endDateTick ? new Date(endDateTick) : this.getMonthDate(new Date(startDateTick)).lastDate;
/** @type {?} */
let unuseable = [];
/** @type {?} */
let needUpdate = false;
this.state.months
.filter((/**
* @param {?} m
* @return {?}
*/
m => {
return m.firstDate >= startMonthDate && m.firstDate <= endMonthDate;
}))
.forEach((/**
* @param {?} m
* @return {?}
*/
m => {
m.weeks.forEach((/**
* @param {?} w
* @return {?}
*/
w => w
.filter((/**
* @param {?} d
* @return {?}
*/
d => {
if (!endDateTick) {
return d.tick && this.inDate(startDateTick, d.tick);
}
else {
return d.tick && d.tick >= startDateTick && d.tick <= endDateTick;
}
}))
.forEach((/**
* @param {?} d
* @return {?}
*/
d => {
/** @type {?} */
const oldValue = d.selected;
if (clear) {
d.selected = DateModels.SelectType.None;
}
else {
/** @type {?} */
const info = (getDateExtra && getDateExtra(new Date(d.tick))) || {};
if (d.outOfDate || info.disable) {
unuseable.push(d.tick);
}
if (this.inDate(startDateTick, d.tick)) {
if (type === 'one') {
d.selected = DateModels.SelectType.Single;
}
else if (!endDateTick) {
d.selected = DateModels.SelectType.Only;
}
else if (startDateTick !== endDateTick) {
d.selected = DateModels.SelectType.Start;
}
else {
d.selected = DateModels.SelectType.All;
}
}
else if (this.inDate(endDateTick, d.tick)) {
d.selected = DateModels.SelectType.End;
}
else {
d.selected = DateModels.SelectType.Middle;
}
}
needUpdate = needUpdate || d.selected !== oldValue;
}))));
if (needUpdate && m.componentRef) {
m.componentRef.updateWeeks();
}
}));
if (unuseable.length > 0) {
if (onSelectHasDisableDate) {
onSelectHasDisableDate(unuseable.map((/**
* @param {?} tick
* @return {?}
*/
tick => new Date(tick))));
}
else {
console.warn('Unusable date. You can handle by onSelectHasDisableDate.', unuseable);
}
}
});
this.computeVisible = (/**
* @param {?} clientHeight
* @param {?} scrollTop
* @return {?}
*/
(clientHeight, scrollTop) => {
/** @type {?} */
let needUpdate = false;
/** @type {?} */
const MAX_VIEW_PORT = clientHeight * 2;
/** @type {?} */
const MIN_VIEW_PORT = clientHeight;
// 大缓冲区外过滤规则
/** @type {?} */
const filterFunc = (/**
* @param {?} vm
* @return {?}
*/
(vm) => vm.y &&
vm.height &&
(vm.y + vm.height > scrollTop - MAX_VIEW_PORT && vm.y < scrollTop + clientHeight + MAX_VIEW_PORT));
if (this.props.infiniteOpt && this.visibleMonth.length > 12) {
this.visibleMonth = this.visibleMonth.filter(filterFunc).sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => +a.firstDate - +b.firstDate));
}
// 当小缓冲区不满时填充
if (this.visibleMonth.length > 0) {
/** @type {?} */
const last = this.visibleMonth[this.visibleMonth.length - 1];
if (last.y !== undefined && last.height && last.y + last.height < scrollTop + clientHeight + MIN_VIEW_PORT) {
/** @type {?} */
const lastIndex = this.state.months.indexOf(last);
for (let i = 1; i <= 2; i++) {
/** @type {?} */
const index = lastIndex + i;
if (index < this.state.months.length && this.visibleMonth.indexOf(this.state.months[index]) < 0) {
this.visibleMonth.push(this.state.months[index]);
}
else {
if (this.canLoadNext()) {
this.genMonthData(undefined, 1);
}
}
}
needUpdate = true;
}
/** @type {?} */
const first = this.visibleMonth[0];
if (first.y !== undefined && first.height && first.y > scrollTop - MIN_VIEW_PORT) {
/** @type {?} */
const firstIndex = this.state.months.indexOf(first);
for (let i = 1; i <= 2; i++) {
/** @type {?} */
const index = firstIndex - i;
if (index >= 0 && this.visibleMonth.indexOf(this.state.months[index]) < 0) {
this.visibleMonth.unshift(this.state.months[index]);
needUpdate = true;
}
}
}
}
else if (this.state.months.length > 0) {
this.visibleMonth = this.state.months.filter(filterFunc);
needUpdate = true;
}
return needUpdate;
});
this.createOnScroll = (/**
* @return {?}
*/
() => {
// let timer: any;
/** @type {?} */
let clientHeight = 0;
/** @type {?} */
let scrollTop = 0;
return (/**
* @param {?} data
* @return {?}
*/
(data) => {
const { client, top } = data;
clientHeight = client;
scrollTop = top;
this.computeVisible(clientHeight, scrollTop);
// 以上方法目前无问题,如果后续有性能问题,改用如下方法,但以下方法会导致刷新稍微延迟现象
// if (timer) {
// return;
// }
//
// timer = setTimeout(() => {
// timer = undefined;
//
// if (this.computeVisible(clientHeight, scrollTop)) {
// console.log('update dom');
// }
// }, 50);
});
});
this.baseOnCellClick = (/**
* @param {?} day
* @return {?}
*/
(day) => {
if (!day.tick) {
return;
}
if (this.props.onCellClick) {
this.props.onCellClick(new Date(day.tick));
}
});
}
/**
* @return {?}
*/
init() {
const { initalMonths = 6, defaultDate } = this.props;
for (let i = 0; i < initalMonths; i++) {
if (this.canLoadNext()) {
this.genMonthData(defaultDate, i);
}
}
this.visibleMonth = [...this.state.months];
}
/**
* @param {?} oldValue
* @param {?} newValue
* @return {?}
*/
receiveProps(oldValue, newValue) {
if (oldValue && newValue) {
if (oldValue.startDate !== newValue.startDate || oldValue.endDate !== newValue.endDate) {
if (oldValue.startDate) {
this.selectDateRange(oldValue.startDate, oldValue.endDate, true);
}
if (newValue.startDate) {
this.selectDateRange(newValue.startDate, newValue.endDate);
}
}
}
}
/**
* @param {?=} date
* @param {?=} addMonth
* @return {?}
*/
getMonthDate(date = new Date(), addMonth = 0) {
/** @type {?} */
const y = date.getFullYear();
/** @type {?} */
const m = date.getMonth();
return {
firstDate: new Date(y, m + addMonth, 1),
lastDate: new Date(y, m + 1 + addMonth, 0)
};
}
/**
* @return {?}
*/
canLoadPrev() {
const { minDate } = this.props;
return (!minDate ||
this.state.months.length <= 0 ||
+this.getMonthDate(minDate).firstDate < +this.state.months[0].firstDate);
}
/**
* @return {?}
*/
canLoadNext() {
const { maxDate } = this.props;
return (!maxDate ||
this.state.months.length <= 0 ||
+this.getMonthDate(maxDate).firstDate > +this.state.months[this.state.months.length - 1].firstDate);
}
/**
* @param {?=} date
* @param {?=} addMonth
* @return {?}
*/
genMonthData(date, addMonth = 0) {
if (!date) {
date = addMonth >= 0 ? this.state.months[this.state.months.length - 1].firstDate : this.state.months[0].firstDate;
}
if (!date) {
date = new Date();
}
const { locale } = this.props;
const { firstDate, lastDate } = this.getMonthDate(date, addMonth);
/** @type {?} */
const weeks = this.genWeekData(firstDate);
/** @type {?} */
const title = formatDate(firstDate, locale ? locale.monthTitle : 'yyyy/MM', this.props.locale);
/** @type {?} */
const data = (/** @type {?} */ ({
title,
firstDate,
lastDate,
weeks
}));
data.component = this.genMonthComponent(data);
if (addMonth >= 0) {
this.state.months.push(data);
}
else {
this.state.months.unshift(data);
}
const { startDate, endDate } = this.props;
if (startDate) {
this.selectDateRange(startDate, endDate);
}
return data;
}
/**
* @param {?} date
* @param {?} tick
* @return {?}
*/
inDate(date, tick) {
return date <= tick && tick < date + 24 * 3600000;
}
}
if (false) {
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.props;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.state;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.visibleMonth;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.genMonthComponent;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.getDateWithoutTime;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.genWeekData;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.selectDateRange;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.computeVisible;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.createOnScroll;
/** @type {?} */
CalendarDatePickerBaseComponent.prototype.baseOnCellClick;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiY2FsZW5kYXIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLGFBQWEsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQUU1Qyx5Q0FFQzs7O0lBREMscUNBQStCOztBQUdqQyxNQUFNLE9BQU8sK0JBQStCO0lBaUIxQztRQWhCQSxVQUFLLEdBQUcsbUJBQUE7WUFDTixTQUFTLEVBQUUsY0FBYztZQUN6QixRQUFRLEVBQUUsS0FBSztZQUNmLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTtZQUN2QixZQUFZLEVBQUUsQ0FBQztZQUNmLE1BQU0sRUFBRSxhQUFhO1NBQ3RCLEVBQXVCLENBQUM7UUFFekIsVUFBSyxHQUFRO1lBQ1gsTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDO1FBRUYsaUJBQVksR0FBMkIsRUFBRSxDQUFDO1FBdUQxQyx1QkFBa0I7Ozs7UUFBRyxDQUFDLElBQVcsRUFBRSxFQUFFO1lBQ25DLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsT0FBTyxDQUFDLENBQUM7YUFDVjtZQUNELE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsRUFBQTtRQUVELGdCQUFXOzs7O1FBQUcsQ0FBQyxTQUFlLEVBQUUsRUFBRTs7a0JBQzFCLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENB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LENBQUMsTUFBTSxDQUFDOztjQUN4RixJQUFJLEdBQUcsbUJBQUE7WUFDWCxLQUFLO1lBQ0wsU0FBUztZQUNULFFBQVE7WUFDUixLQUFLO1NBQ04sRUFBd0I7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjthQUFNO1lBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDO2NBQ0ssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUs7UUFDekMsSUFBSSxTQUFTLEVBQUU7WUFDYixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUMxQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7O0lBRUQsTUFBTSxDQUFDLElBQVksRUFBRSxJQUFZO1FBQy9CLE9BQU8sSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDcEQsQ0FBQztDQWdLRjs7O0lBaFRDLGdEQU95Qjs7SUFFekIsZ0RBRUU7O0lBRUYsdURBQTBDOztJQUMxQyw0REFBZ0M7O0lBc0RoQyw2REFLQzs7SUFFRCxzREFtQ0M7O0lBb0NELDBEQW9FQzs7SUFFRCx5REFrREM7O0lBRUQseURBMEJDOztJQUVELDBEQU9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZU1vZGVscyB9IGZyb20gJy4uL2RhdGUvRGF0YVR5cGVzJztcbmltcG9ydCB7IERhdGVwaWNrZXJQcm9wc1R5cGUgfSBmcm9tICcuL2RhdGVwaWNrZXIucHJvcHMuY29tcG9uZW50JztcbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCBkZWZhdWx0TG9jYWxlIGZyb20gJy4uL2xvY2FsZS96aF9DTic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZXBpY2tlclN0YXRlVHlwZSB7XG4gIG1vbnRoczogRGF0ZU1vZGVscy5Nb250aERhdGFbXTtcbn1cblxuZXhwb3J0IGNsYXNzIENhbGVuZGFyRGF0ZVBpY2tlckJhc2VDb21wb25lbnQge1xuICBwcm9wcyA9IHtcbiAgICBwcmVmaXhDbHM6ICdybWMtY2FsZW5kYXInLFxuICAgIGluZmluaXRlOiBmYWxzZSxcbiAgICBpbmZpbml0ZU9wdDogZmFsc2UsXG4gICAgZGVmYXVsdERhdGU6IG5ldyBEYXRlKCksXG4gICAgaW5pdGFsTW9udGhzOiA2LFxuICAgIGxvY2FsZTogZGVmYXVsdExvY2FsZVxuICB9IGFzIERhdGVwaWNrZXJQcm9wc1R5cGU7XG5cbiAgc3RhdGU6IGFueSA9IHtcbiAgICBtb250aHM6IFtdXG4gIH07XG5cbiAgdmlzaWJsZU1vbnRoOiBEYXRlTW9kZWxzLk1vbnRoRGF0YVtdID0gW107XG4gIGdlbk1vbnRoQ29tcG9uZW50OiAoZGF0YSkgPT4ge307XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGluaXQoKSB7XG4gICAgY29uc3QgeyBpbml0YWxNb250aHMgPSA2LCBkZWZhdWx0RGF0ZSB9ID0gdGhpcy5wcm9wcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluaXRhbE1vbnRoczsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jYW5Mb2FkTmV4dCgpKSB7XG4gICAgICAgIHRoaXMuZ2VuTW9udGhEYXRhKGRlZmF1bHREYXRlLCBpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52aXNpYmxlTW9udGggPSBbLi4udGhpcy5zdGF0ZS5tb250aHNdO1xuICB9XG5cbiAgcmVjZWl2ZVByb3BzKG9sZFZhbHVlOiBEYXRlcGlja2VyUHJvcHNUeXBlLCBuZXdWYWx1ZTogRGF0ZXBpY2tlclByb3BzVHlwZSkge1xuICAgIGlmIChvbGRWYWx1ZSAmJiBuZXdWYWx1ZSkge1xuICAgICAgaWYgKG9sZFZhbHVlLnN0YXJ0RGF0ZSAhPT0gbmV3VmFsdWUuc3RhcnREYXRlIHx8IG9sZFZhbHVlLmVuZERhdGUgIT09IG5ld1ZhbHVlLmVuZERhdGUpIHtcbiAgICAgICAgaWYgKG9sZFZhbHVlLnN0YXJ0RGF0ZSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZVJhbmdlKG9sZFZhbHVlLnN0YXJ0RGF0ZSwgb2xkVmFsdWUuZW5kRGF0ZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld1ZhbHVlLnN0YXJ0RGF0ZSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZVJhbmdlKG5ld1ZhbHVlLnN0YXJ0RGF0ZSwgbmV3VmFsdWUuZW5kRGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRNb250aERhdGUoZGF0ZSA9IG5ldyBEYXRlKCksIGFkZE1vbnRoID0gMCkge1xuICAgIGNvbnN0IHkgPSBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBtID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIHJldHVybiB7XG4gICAgICBmaXJzdERhdGU6IG5ldyBEYXRlKHksIG0gKyBhZGRNb250aCwgMSksXG4gICAgICBsYXN0RGF0ZTogbmV3IERhdGUoeSwgbSArIDEgKyBhZGRNb250aCwgMClcbiAgICB9O1xuICB9XG5cbiAgY2FuTG9hZFByZXYoKSB7XG4gICAgY29uc3QgeyBtaW5EYXRlIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAoXG4gICAgICAhbWluRGF0ZSB8fFxuICAgICAgdGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoIDw9IDAgfHxcbiAgICAgICt0aGlzLmdldE1vbnRoRGF0ZShtaW5EYXRlKS5maXJzdERhdGUgPCArdGhpcy5zdGF0ZS5tb250aHNbMF0uZmlyc3REYXRlXG4gICAgKTtcbiAgfVxuXG4gIGNhbkxvYWROZXh0KCkge1xuICAgIGNvbnN0IHsgbWF4RGF0ZSB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgIW1heERhdGUgfHxcbiAgICAgIHRoaXMuc3RhdGUubW9udGhzLmxlbmd0aCA8PSAwIHx8XG4gICAgICArdGhpcy5nZXRNb250aERhdGUobWF4RGF0ZSkuZmlyc3REYXRlID4gK3RoaXMuc3RhdGUubW9udGhzW3RoaXMuc3RhdGUubW9udGhzLmxlbmd0aCAtIDFdLmZpcnN0RGF0ZVxuICAgICk7XG4gIH1cblxuICBnZXREYXRlV2l0aG91dFRpbWUgPSAoZGF0ZT86IERhdGUpID0+IHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gK25ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XG4gIH1cblxuICBnZW5XZWVrRGF0YSA9IChmaXJzdERhdGU6IERhdGUpID0+IHtcbiAgICBjb25zdCBtaW5EYXRlVGltZSA9IHRoaXMuZ2V0RGF0ZVdpdGhvdXRUaW1lKHRoaXMucHJvcHMubWluRGF0ZSk7XG4gICAgY29uc3QgbWF4RGF0ZVRpbWUgPSB0aGlzLmdldERhdGVXaXRob3V0VGltZSh0aGlzLnByb3BzLm1heERhdGUpIHx8IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICAgIGNvbnN0IHdlZWtzOiBEYXRlTW9kZWxzLkNlbGxEYXRhW11bXSA9IFtdO1xuICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0TW9udGhEYXRlKGZpcnN0RGF0ZSwgMSkuZmlyc3REYXRlO1xuICAgIGxldCBjdXJyZW50RGF5ID0gZmlyc3REYXRlO1xuICAgIGxldCBjdXJyZW50V2VlazogRGF0ZU1vZGVscy5DZWxsRGF0YVtdID0gW107XG4gICAgd2Vla3MucHVzaChjdXJyZW50V2Vlayk7XG5cbiAgICBsZXQgc3RhcnRXZWVrZGF5ID0gY3VycmVudERheS5nZXREYXkoKTtcbiAgICBpZiAoc3RhcnRXZWVrZGF5ID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFydFdlZWtkYXk7IGkrKykge1xuICAgICAgICBjdXJyZW50V2Vlay5wdXNoKHt9IGFzIERhdGVNb2RlbHMuQ2VsbERhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAoY3VycmVudERheSA8IG5leHRNb250aCkge1xuICAgICAgaWYgKGN1cnJlbnRXZWVrLmxlbmd0aCA9PT0gNykge1xuICAgICAgICBjdXJyZW50V2VlayA9IFtdO1xuICAgICAgICB3ZWVrcy5wdXNoKGN1cnJlbnRXZWVrKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRheU9mTW9udGggPSBjdXJyZW50RGF5LmdldERhdGUoKTtcbiAgICAgIGNvbnN0IHRpY2sgPSArY3VycmVudERheTtcbiAgICAgIGN1cnJlbnRXZWVrLnB1c2goe1xuICAgICAgICB0aWNrLFxuICAgICAgICBkYXlPZk1vbnRoLFxuICAgICAgICBzZWxlY3RlZDogRGF0ZU1vZGVscy5TZWxlY3RUeXBlLk5vbmUsXG4gICAgICAgIGlzRmlyc3RPZk1vbnRoOiBkYXlPZk1vbnRoID09PSAxLFxuICAgICAgICBpc0xhc3RPZk1vbnRoOiBmYWxzZSxcbiAgICAgICAgb3V0T2ZEYXRlOiB0aWNrIDwgbWluRGF0ZVRpbWUgfHwgdGljayA+IG1heERhdGVUaW1lXG4gICAgICB9KTtcbiAgICAgIGN1cnJlbnREYXkgPSBuZXcgRGF0ZShjdXJyZW50RGF5LmdldFRpbWUoKSArIDM2MDAgKiAyNCAqIDEwMDApO1xuICAgIH1cbiAgICBjdXJyZW50V2Vla1tjdXJyZW50V2Vlay5sZW5ndGggLSAxXS5pc0xhc3RPZk1vbnRoID0gdHJ1ZTtcbiAgICByZXR1cm4gd2Vla3M7XG4gIH1cblxuICBnZW5Nb250aERhdGEoZGF0ZT86IERhdGUsIGFkZE1vbnRoOiBudW1iZXIgPSAwKSB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICBkYXRlID0gYWRkTW9udGggPj0gMCA/IHRoaXMuc3RhdGUubW9udGhzW3RoaXMuc3RhdGUubW9udGhzLmxlbmd0aCAtIDFdLmZpcnN0RGF0ZSA6IHRoaXMuc3RhdGUubW9udGhzWzBdLmZpcnN0RGF0ZTtcbiAgICB9XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICBkYXRlID0gbmV3IERhdGUoKTtcbiAgICB9XG4gICAgY29uc3QgeyBsb2NhbGUgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBmaXJzdERhdGUsIGxhc3REYXRlIH0gPSB0aGlzLmdldE1vbnRoRGF0ZShkYXRlLCBhZGRNb250aCk7XG4gICAgY29uc3Qgd2Vla3MgPSB0aGlzLmdlbldlZWtEYXRhKGZpcnN0RGF0ZSk7XG4gICAgY29uc3QgdGl0bGUgPSBmb3JtYXREYXRlKGZpcnN0RGF0ZSwgbG9jYWxlID8gbG9jYWxlLm1vbnRoVGl0bGUgOiAneXl5eS9NTScsIHRoaXMucHJvcHMubG9jYWxlKTtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgdGl0bGUsXG4gICAgICBmaXJzdERhdGUsXG4gICAgICBsYXN0RGF0ZSxcbiAgICAgIHdlZWtzXG4gICAgfSBhcyBEYXRlTW9kZWxzLk1vbnRoRGF0YTtcbiAgICBkYXRhLmNvbXBvbmVudCA9IHRoaXMuZ2VuTW9udGhDb21wb25lbnQoZGF0YSk7XG4gICAgaWYgKGFkZE1vbnRoID49IDApIHtcbiAgICAgIHRoaXMuc3RhdGUubW9udGhzLnB1c2goZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGUubW9udGhzLnVuc2hpZnQoZGF0YSk7XG4gICAgfVxuICAgIGNvbnN0IHsgc3RhcnREYXRlLCBlbmREYXRlIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChzdGFydERhdGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0RGF0ZVJhbmdlKHN0YXJ0RGF0ZSwgZW5kRGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgaW5EYXRlKGRhdGU6IG51bWJlciwgdGljazogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGRhdGUgPD0gdGljayAmJiB0aWNrIDwgZGF0ZSArIDI0ICogMzYwMDAwMDtcbiAgfVxuXG4gIHNlbGVjdERhdGVSYW5nZSA9IChzdGFydERhdGU6IERhdGUsIGVuZERhdGU/OiBEYXRlLCBjbGVhciA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgeyBnZXREYXRlRXh0cmEsIHR5cGUsIG9uU2VsZWN0SGFzRGlzYWJsZURhdGUgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKHR5cGUgPT09ICdvbmUnKSB7XG4gICAgICBlbmREYXRlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCB0aW1lMSA9IHRoaXMuZ2V0RGF0ZVdpdGhvdXRUaW1lKHN0YXJ0RGF0ZSksXG4gICAgICB0aW1lMiA9IHRoaXMuZ2V0RGF0ZVdpdGhvdXRUaW1lKGVuZERhdGUpO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZVRpY2sgPSAhdGltZTIgfHwgdGltZTEgPCB0aW1lMiA/IHRpbWUxIDogdGltZTI7XG4gICAgY29uc3QgZW5kRGF0ZVRpY2sgPSB0aW1lMiAmJiB0aW1lMSA+IHRpbWUyID8gdGltZTEgOiB0aW1lMjtcblxuICAgIGNvbnN0IHN0YXJ0TW9udGhEYXRlID0gdGhpcy5nZXRNb250aERhdGUobmV3IERhdGUoc3RhcnREYXRlVGljaykpLmZpcnN0RGF0ZTtcbiAgICBjb25zdCBlbmRNb250aERhdGUgPSBlbmREYXRlVGljayA/IG5ldyBEYXRlKGVuZERhdGVUaWNrKSA6IHRoaXMuZ2V0TW9udGhEYXRlKG5ldyBEYXRlKHN0YXJ0RGF0ZVRpY2spKS5sYXN0RGF0ZTtcblxuICAgIGxldCB1bnVzZWFibGU6IG51bWJlcltdID0gW10sXG4gICAgICBuZWVkVXBkYXRlID0gZmFsc2U7XG4gICAgdGhpcy5zdGF0ZS5tb250aHNcbiAgICAgIC5maWx0ZXIobSA9PiB7XG4gICAgICAgIHJldHVybiBtLmZpcnN0RGF0ZSA+PSBzdGFydE1vbnRoRGF0ZSAmJiBtLmZpcnN0RGF0ZSA8PSBlbmRNb250aERhdGU7XG4gICAgICB9KVxuICAgICAgLmZvckVhY2gobSA9PiB7XG4gICAgICAgIG0ud2Vla3MuZm9yRWFjaCh3ID0+XG4gICAgICAgICAgd1xuICAgICAgICAgICAgLmZpbHRlcihkID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFlbmREYXRlVGljaykge1xuICAgICAgICAgICAgICAgIHJldHVybiBkLnRpY2sgJiYgdGhpcy5pbkRhdGUoc3RhcnREYXRlVGljaywgZC50aWNrKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZC50aWNrICYmIGQudGljayA+PSBzdGFydERhdGVUaWNrICYmIGQudGljayA8PSBlbmREYXRlVGljaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGQgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IGQuc2VsZWN0ZWQ7XG4gICAgICAgICAgICAgIGlmIChjbGVhcikge1xuICAgICAgICAgICAgICAgIGQuc2VsZWN0ZWQgPSBEYXRlTW9kZWxzLlNlbGVjdFR5cGUuTm9uZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmZvID0gKGdldERhdGVFeHRyYSAmJiBnZXREYXRlRXh0cmEobmV3IERhdGUoZC50aWNrKSkpIHx8IHt9O1xuICAgICAgICAgICAgICAgIGlmIChkLm91dE9mRGF0ZSB8fCBpbmZvLmRpc2FibGUpIHtcbiAgICAgICAgICAgICAgICAgIHVudXNlYWJsZS5wdXNoKGQudGljayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluRGF0ZShzdGFydERhdGVUaWNrLCBkLnRpY2spKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ29uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IERhdGVNb2RlbHMuU2VsZWN0VHlwZS5TaW5nbGU7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFlbmREYXRlVGljaykge1xuICAgICAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gRGF0ZU1vZGVscy5TZWxlY3RUeXBlLk9ubHk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0RGF0ZVRpY2sgIT09IGVuZERhdGVUaWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGQuc2VsZWN0ZWQgPSBEYXRlTW9kZWxzLlNlbGVjdFR5cGUuU3RhcnQ7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gRGF0ZU1vZGVscy5TZWxlY3RUeXBlLkFsbDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW5EYXRlKGVuZERhdGVUaWNrLCBkLnRpY2spKSB7XG4gICAgICAgICAgICAgICAgICBkLnNlbGVjdGVkID0gRGF0ZU1vZGVscy5TZWxlY3RUeXBlLkVuZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZC5zZWxlY3RlZCA9IERhdGVNb2RlbHMuU2VsZWN0VHlwZS5NaWRkbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5lZWRVcGRhdGUgPSBuZWVkVXBkYXRlIHx8IGQuc2VsZWN0ZWQgIT09IG9sZFZhbHVlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5lZWRVcGRhdGUgJiYgbS5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICBtLmNvbXBvbmVudFJlZi51cGRhdGVXZWVrcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBpZiAodW51c2VhYmxlLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChvblNlbGVjdEhhc0Rpc2FibGVEYXRlKSB7XG4gICAgICAgIG9uU2VsZWN0SGFzRGlzYWJsZURhdGUodW51c2VhYmxlLm1hcCh0aWNrID0+IG5ldyBEYXRlKHRpY2spKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1VudXNhYmxlIGRhdGUuIFlvdSBjYW4gaGFuZGxlIGJ5IG9uU2VsZWN0SGFzRGlzYWJsZURhdGUuJywgdW51c2VhYmxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb21wdXRlVmlzaWJsZSA9IChjbGllbnRIZWlnaHQ6IG51bWJlciwgc2Nyb2xsVG9wOiBudW1iZXIpID0+IHtcbiAgICBsZXQgbmVlZFVwZGF0ZSA9IGZhbHNlO1xuICAgIGNvbnN0IE1BWF9WSUVXX1BPUlQgPSBjbGllbnRIZWlnaHQgKiAyO1xuICAgIGNvbnN0IE1JTl9WSUVXX1BPUlQgPSBjbGllbnRIZWlnaHQ7XG5cbiAgICAvLyDlpKfnvJPlhrLljLrlpJbov4fmu6Top4TliJlcbiAgICBjb25zdCBmaWx0ZXJGdW5jID0gKHZtOiBEYXRlTW9kZWxzLk1vbnRoRGF0YSkgPT5cbiAgICAgIHZtLnkgJiZcbiAgICAgIHZtLmhlaWdodCAmJlxuICAgICAgKHZtLnkgKyB2bS5oZWlnaHQgPiBzY3JvbGxUb3AgLSBNQVhfVklFV19QT1JUICYmIHZtLnkgPCBzY3JvbGxUb3AgKyBjbGllbnRIZWlnaHQgKyBNQVhfVklFV19QT1JUKTtcblxuICAgIGlmICh0aGlzLnByb3BzLmluZmluaXRlT3B0ICYmIHRoaXMudmlzaWJsZU1vbnRoLmxlbmd0aCA+IDEyKSB7XG4gICAgICB0aGlzLnZpc2libGVNb250aCA9IHRoaXMudmlzaWJsZU1vbnRoLmZpbHRlcihmaWx0ZXJGdW5jKS5zb3J0KChhLCBiKSA9PiArYS5maXJzdERhdGUgLSArYi5maXJzdERhdGUpO1xuICAgIH1cblxuICAgIC8vIOW9k+Wwj+e8k+WGsuWMuuS4jea7oeaXtuWhq+WFhVxuICAgIGlmICh0aGlzLnZpc2libGVNb250aC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0ID0gdGhpcy52aXNpYmxlTW9udGhbdGhpcy52aXNpYmxlTW9udGgubGVuZ3RoIC0gMV07XG4gICAgICBpZiAobGFzdC55ICE9PSB1bmRlZmluZWQgJiYgbGFzdC5oZWlnaHQgJiYgbGFzdC55ICsgbGFzdC5oZWlnaHQgPCBzY3JvbGxUb3AgKyBjbGllbnRIZWlnaHQgKyBNSU5fVklFV19QT1JUKSB7XG4gICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHRoaXMuc3RhdGUubW9udGhzLmluZGV4T2YobGFzdCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDI7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gbGFzdEluZGV4ICsgaTtcbiAgICAgICAgICBpZiAoaW5kZXggPCB0aGlzLnN0YXRlLm1vbnRocy5sZW5ndGggJiYgdGhpcy52aXNpYmxlTW9udGguaW5kZXhPZih0aGlzLnN0YXRlLm1vbnRoc1tpbmRleF0pIDwgMCkge1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlTW9udGgucHVzaCh0aGlzLnN0YXRlLm1vbnRoc1tpbmRleF0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jYW5Mb2FkTmV4dCgpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ2VuTW9udGhEYXRhKHVuZGVmaW5lZCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5lZWRVcGRhdGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXJzdCA9IHRoaXMudmlzaWJsZU1vbnRoWzBdO1xuICAgICAgaWYgKGZpcnN0LnkgIT09IHVuZGVmaW5lZCAmJiBmaXJzdC5oZWlnaHQgJiYgZmlyc3QueSA+IHNjcm9sbFRvcCAtIE1JTl9WSUVXX1BPUlQpIHtcbiAgICAgICAgY29uc3QgZmlyc3RJbmRleCA9IHRoaXMuc3RhdGUubW9udGhzLmluZGV4T2YoZmlyc3QpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAyOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGZpcnN0SW5kZXggLSBpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIHRoaXMudmlzaWJsZU1vbnRoLmluZGV4T2YodGhpcy5zdGF0ZS5tb250aHNbaW5kZXhdKSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZU1vbnRoLnVuc2hpZnQodGhpcy5zdGF0ZS5tb250aHNbaW5kZXhdKTtcbiAgICAgICAgICAgIG5lZWRVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5tb250aHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy52aXNpYmxlTW9udGggPSB0aGlzLnN0YXRlLm1vbnRocy5maWx0ZXIoZmlsdGVyRnVuYyk7XG4gICAgICBuZWVkVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmVlZFVwZGF0ZTtcbiAgfVxuXG4gIGNyZWF0ZU9uU2Nyb2xsID0gKCkgPT4ge1xuICAgIC8vIGxldCB0aW1lcjogYW55O1xuICAgIGxldCBjbGllbnRIZWlnaHQgPSAwLFxuICAgICAgc2Nyb2xsVG9wID0gMDtcblxuICAgIHJldHVybiAoZGF0YTogeyBmdWxsOiBudW1iZXI7IGNsaWVudDogbnVtYmVyOyB0b3A6IG51bWJlciB9KSA9PiB7XG4gICAgICBjb25zdCB7IGNsaWVudCwgdG9wIH0gPSBkYXRhO1xuICAgICAgY2xpZW50SGVpZ2h0ID0gY2xpZW50O1xuICAgICAgc2Nyb2xsVG9wID0gdG9wO1xuXG4gICAgICB0aGlzLmNvbXB1dGVWaXNpYmxlKGNsaWVudEhlaWdodCwgc2Nyb2xsVG9wKTtcblxuICAgICAgLy8g5Lul5LiK5pa55rOV55uu5YmN5peg6Zeu6aKY77yM5aaC5p6c5ZCO57ut5pyJ5oCn6IO96Zeu6aKY77yM5pS555So5aaC5LiL5pa55rOV77yM5L2G5Lul5LiL5pa55rOV5Lya5a+86Ie05Yi35paw56iN5b6u5bu26L+f546w6LGhXG5cbiAgICAgIC8vIGlmICh0aW1lcikge1xuICAgICAgLy8gICByZXR1cm47XG4gICAgICAvLyB9XG4gICAgICAvL1xuICAgICAgLy8gdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vICAgdGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAvL1xuICAgICAgLy8gICBpZiAodGhpcy5jb21wdXRlVmlzaWJsZShjbGllbnRIZWlnaHQsIHNjcm9sbFRvcCkpIHtcbiAgICAgIC8vICAgICBjb25zb2xlLmxvZygndXBkYXRlIGRvbScpO1xuICAgICAgLy8gICB9XG4gICAgICAvLyB9LCA1MCk7XG4gICAgfTtcbiAgfVxuXG4gIGJhc2VPbkNlbGxDbGljayA9IChkYXk6IERhdGVNb2RlbHMuQ2VsbERhdGEpID0+IHtcbiAgICBpZiAoIWRheS50aWNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnByb3BzLm9uQ2VsbENsaWNrKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2VsbENsaWNrKG5ldyBEYXRlKGRheS50aWNrKSk7XG4gICAgfVxuICB9XG59XG4iXX0=