ngx-pluto
Version:
556 lines • 58.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import * as moment_ from 'moment';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/overlay";
/** @type {?} */
const moment = moment_;
import { OverlayPositionBuilder, Overlay } from '@angular/cdk/overlay';
import { DATE_FORMAT, TIME_FORMAT } from './date-picker-const';
export class NpDatePickerService {
/**
* @param {?} overlayPositionBuilder
* @param {?} overlay
*/
constructor(overlayPositionBuilder, overlay) {
this.overlayPositionBuilder = overlayPositionBuilder;
this.overlay = overlay;
}
/**
* @return {?}
*/
get locale() {
return (/** @type {?} */ (moment.locale()));
}
/**
* 根据传入的moment时间及传入的年份生成年份范围数组YearData。
* 例如:year = 2020, 年份范围value示例为
*
* [
*
* 2019, 2020, 2021,
*
* 2022, 2023, 2024,
*
* 2025, 2026, 2027,
*
* 2028, 2029, 2030
*
* ]
* @param {?} date Moment时间
* @param {?} year 年份YYYY, 例:2020
* @param {?} selectedDate 当前选中的日期
* @return {?}
*/
buildYearsPanel(date, year, selectedDate) {
/** @type {?} */
let years = [];
/** @type {?} */
let lastNumOfYear = +year.charAt(3);
/** @type {?} */
let start = lastNumOfYear;
/** @type {?} */
let end = 10 - lastNumOfYear;
/** @type {?} */
let copyDateStart = date.clone();
while (start >= 0) {
/** @type {?} */
const cur = copyDateStart.add(-1, 'year');
years.push({
available: start > 0,
value: cur.format('YYYY'),
isSelected: selectedDate ? selectedDate.format('YYYY') === cur.format('YYYY') : false,
date: cur.clone()
});
start--;
}
years.push({
available: true,
value: date.format('YYYY'),
isSelected: selectedDate ? selectedDate.format('YYYY') === date.format('YYYY') : false,
date: date.clone()
});
/** @type {?} */
let copyDateEnd = date.clone();
while (end <= 10 && end > 0) {
/** @type {?} */
const cur = copyDateEnd.add(1, 'year');
years.push({
available: end > 1,
value: cur.format('YYYY'),
isSelected: selectedDate ? selectedDate.format('YYYY') === cur.format('YYYY') : false,
date: cur.clone()
});
end--;
}
return years.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => { return (+a.value - +b.value); }));
}
/**
* 构建当前年份的全部月份
* @param {?} date
* @param {?} selectedDate 当前选中的日期
* @return {?}
*/
buildMonthsPanel(date, selectedDate) {
/** @type {?} */
let m = moment.monthsShort();
/** @type {?} */
let months = [];
for (let i = 0; i < m.length; i++) {
months.push({
available: true,
value: m[i],
isSelected: selectedDate ? m[i] === selectedDate.format('MMM') : false,
date: moment(date.format('YYYY') + m[i] + date.format('DD'), 'YYYYMMMDD')
});
}
return months;
}
/**
* 根据传入的日期构建当前显示日历面板(当前这个月的天数面板)。
* 例如:传入日期为2020/08/20,则返回一个DayDataPerMonth数组,
* 其中的value示例如下:
*
* ['日', '一', '二', '三', '四', '五', '六',
*
* '26', '27', '28', '29', '30', '31', '1',
*
* '2', '3', '4', '5', '6', '7', '8',
*
* '9', '10', '11', '12', '13', '14', '15',
*
* '16', '17', '18', '19', '20', '21', '22',
*
* '23', '24', '25', '26', '27', '28', '29',
*
* '30', '31', '1', '2', '3', '4', '5']
* @param {?} date 构建日期面板的日期
* @param {?} selectedDate 当前选中的日期
* @return {?}
*/
buildDaysPanel(date, selectedDate) {
/** @type {?} */
const total = 49;
/** @type {?} */
let days = [];
/** @type {?} */
let copyDate = date.clone();
/** @type {?} */
let weekdaysMin = this.getWeekdaysMin();
weekdaysMin.forEach((/**
* @param {?} item
* @return {?}
*/
item => {
days.push({ available: false, value: item, isSelected: false, isWeekDayMin: true, date: null });
}));
/** @type {?} */
let startOfMonth = copyDate.clone().startOf('month');
startOfMonth = moment(startOfMonth.format(DATE_FORMAT) + ' ' + copyDate.format(TIME_FORMAT));
// 获取当月第一天是周几,如2020/08/01是周六,则得到的是“六”
/** @type {?} */
let weekDayMin_startOfMonth = weekdaysMin[+startOfMonth.weekday() + 1];
/** @type {?} */
let index_weekDayMin_startOfMonth = weekdaysMin.indexOf(weekDayMin_startOfMonth);
// 添加上月后几天用以补足当前面板
while (index_weekDayMin_startOfMonth > 0) {
days.push({
available: false,
value: startOfMonth.clone().add(-index_weekDayMin_startOfMonth, 'day').format('D'),
isSelected: false,
isWeekDayMin: false,
date: startOfMonth.clone().add(-index_weekDayMin_startOfMonth, 'day').clone()
});
index_weekDayMin_startOfMonth--;
}
/** @type {?} */
let lastOfMonth = copyDate.clone().endOf('month');
lastOfMonth = moment(lastOfMonth.format(DATE_FORMAT) + ' ' + copyDate.format(TIME_FORMAT));
// 获取当月最后天是周几,如2020/08/31是周一,则得到的是“一”
// 添加当月到当前面板数组
while (startOfMonth <= lastOfMonth) {
days.push({
available: true,
value: startOfMonth.format('D'),
isSelected: selectedDate ? startOfMonth.format(DATE_FORMAT) === selectedDate.format(DATE_FORMAT) : false,
isWeekDayMin: false,
date: startOfMonth.clone()
});
startOfMonth = startOfMonth.add(1, 'day');
}
// 添加下月前几天用以补足当前面板
/** @type {?} */
let i = 1;
while (days.length < total) {
days.push({
available: false,
value: lastOfMonth.clone().add(i, 'day').format('D'),
isSelected: false,
isWeekDayMin: false,
date: lastOfMonth.clone().add(i, 'day').clone()
});
i++;
}
return days;
}
/**
* @param {?} dates
* @param {?=} asc
* @return {?}
*/
sortDates(dates, asc = true) {
return dates.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => asc ? a.diff(b) : b.diff(a)));
}
/**
* @param {?} sDate
* @param {?} eDate
* @return {?}
*/
buildStartAndEndDates(sDate, eDate) {
if (!sDate || !eDate) {
return [];
}
if (moment(sDate) < moment(eDate)) {
return [sDate, eDate];
}
return [eDate, sDate];
}
/**
* @param {?} date
* @return {?}
*/
day(date) {
if (date) {
return moment(date.format(DATE_FORMAT + ' 00:00:00'), 'YYYY-MM-DD');
}
return moment();
}
/**
* @private
* @param {?} currentDate
* @param {?} hoverDate
* @param {?=} dates
* @return {?}
*/
getDayStatus(currentDate, hoverDate, dates = []) {
if (!dates || dates.length === 0) {
return 'normal';
}
/** @type {?} */
const day = (/**
* @param {?} date
* @return {?}
*/
(date) => {
if (date) {
return moment(date.format(DATE_FORMAT + ' 00:00:00'), 'YYYY-MM-DD');
}
return moment();
});
/** @type {?} */
let sortedDates = this.sortDates([hoverDate, ...dates]);
if (currentDate < sortedDates[0] || currentDate > sortedDates[2]) {
return (/** @type {?} */ ('normal'));
}
if (day(hoverDate).diff(dates[0]) < 0) {
if (day(currentDate).diff(day(hoverDate)) < 0) {
return 'normal';
}
else if (day(currentDate).diff(hoverDate) >= 0 && day(currentDate).diff(dates[0]) < 0) {
return 'within-hover';
}
else if (day(currentDate).diff(dates[0]) >= 0 && day(currentDate).diff(dates[1]) <= 0) {
return 'within-selected';
}
else if (day(currentDate).diff(dates[1]) > 0) {
return 'normal';
}
}
if (day(hoverDate).diff(dates[0]) >= 0 && day(hoverDate).diff(dates[1]) <= 0) {
if (day(currentDate).diff(day(dates[0])) < 0) {
return 'normal';
}
else if (day(currentDate).diff(dates[0]) >= 0 && day(currentDate).diff(hoverDate) < 0) {
return 'within-selected-hover';
}
else if (day(currentDate).diff(hoverDate) >= 0 && day(currentDate).diff(dates[1]) <= 0) {
return 'within-selected';
}
else if (day(currentDate).diff(dates[1]) > 0) {
return 'normal';
}
}
if (day(hoverDate).diff(dates[1]) > 0) {
if (day(currentDate).diff(day(dates[0])) < 0) {
return 'normal';
}
else if (day(currentDate).diff(dates[0]) >= 0 && day(currentDate).diff(dates[1]) < 0) {
return 'within-selected';
}
else if (day(currentDate).diff(dates[1]) >= 0 && day(currentDate).diff(hoverDate) <= 0) {
return 'within-hover';
}
else if (day(currentDate).diff(hoverDate) > 0) {
return 'normal';
}
}
return (/** @type {?} */ ('normal'));
}
/**
* 构建时间区间选择当鼠标hover面板时的状态,同buildDaysPanel的功能,
* 增加对象DayDataPerMonth中对字段isWithinDateRangeHover的值的区分。
*
* @param {?} date 构建日期面板的日期
* @param {?} selectedDate 当前选中的日期
* @param {?} hoverDate 当前hover的时间moment值
* @param {?=} dates 需要传入此时间区间字段,代表时间区间已选择的区间值
* @return {?}
*/
buildDaysPanelForRangePicker(date, selectedDate, hoverDate, dates = []) {
/** @type {?} */
const total = 49;
/** @type {?} */
let days = [];
/** @type {?} */
let copyDate = date.clone();
/** @type {?} */
let weekdaysMin = this.getWeekdaysMin();
weekdaysMin.forEach((/**
* @param {?} item
* @return {?}
*/
item => {
days.push({ available: false, value: item, isSelected: false, isWeekDayMin: true, date: null, hoverDateType: 'normal' });
}));
/** @type {?} */
let startOfMonth = copyDate.clone().startOf('month');
startOfMonth = moment(startOfMonth.format(DATE_FORMAT) + ' ' + copyDate.format(TIME_FORMAT));
// 获取当月第一天是周几,如2020/08/01是周六,则得到的是“六”
/** @type {?} */
let weekDayMin_startOfMonth = weekdaysMin[+startOfMonth.weekday() + 1];
/** @type {?} */
let index_weekDayMin_startOfMonth = weekdaysMin.indexOf(weekDayMin_startOfMonth);
// 添加上月后几天用以补足当前面板
while (index_weekDayMin_startOfMonth > 0) {
/** @type {?} */
let cDate = startOfMonth.clone().add(-index_weekDayMin_startOfMonth, 'day').clone();
days.push({
available: false,
value: cDate.format('D'),
isSelected: false,
isWeekDayMin: false,
date: cDate,
hoverDateType: this.getDayStatus(cDate, hoverDate, dates)
});
index_weekDayMin_startOfMonth--;
}
/** @type {?} */
let lastOfMonth = copyDate.clone().endOf('month');
lastOfMonth = moment(lastOfMonth.format(DATE_FORMAT) + ' ' + copyDate.format(TIME_FORMAT));
// 获取当月最后天是周几,如2020/08/31是周一,则得到的是“一”
// 添加当月到当前面板数组
while (startOfMonth <= lastOfMonth) {
days.push({
available: true,
value: startOfMonth.format('D'),
isSelected: selectedDate ? startOfMonth.format(DATE_FORMAT) === selectedDate.format(DATE_FORMAT) : false,
isWeekDayMin: false,
date: startOfMonth.clone(),
hoverDateType: this.getDayStatus(startOfMonth.clone(), hoverDate, dates)
});
startOfMonth = startOfMonth.add(1, 'day');
}
// 添加下月前几天用以补足当前面板
/** @type {?} */
let i = 1;
while (days.length < total) {
/** @type {?} */
let cDate = lastOfMonth.clone().add(i, 'day').clone();
days.push({
available: false,
value: cDate.format('D'),
isSelected: false,
isWeekDayMin: false,
date: cDate.clone(),
hoverDateType: this.getDayStatus(cDate, hoverDate, dates)
});
i++;
}
return days;
}
/**
* @return {?}
*/
getWeekdaysMin() {
return moment.weekdaysMin();
}
/**
* @param {?} elementRef
* @return {?}
*/
getOverlayRef(elementRef) {
/** @type {?} */
const popupPositions = [{
originX: "start",
originY: "bottom",
overlayX: "start",
overlayY: "top",
offsetX: 0,
offsetY: 1
}, {
originX: "start",
originY: "top",
overlayX: "start",
overlayY: "bottom",
offsetX: 0,
offsetY: -1
}];
/** @type {?} */
const positionStrategy = this.overlayPositionBuilder
.flexibleConnectedTo(elementRef)
.withPositions(popupPositions);
return this.overlay.create({
positionStrategy,
hasBackdrop: true,
backdropClass: 'cdk-overlay-transparent-backdrop',
scrollStrategy: this.overlay.scrollStrategies.noop()
});
}
/**
* 获取calendar时间,例如今天,昨天,明天等
* @param {?} date
* @param {?=} locale
* @return {?}
*/
calendar(date, locale = 'zh-cn') {
/** @type {?} */
let calendarDate = '';
switch (locale) {
case 'zh-cn':
calendarDate = date.calendar({
sameDay: '[今天]',
nextDay: '[明天]',
nextWeek: 'dddd',
lastDay: '[昨天]',
lastWeek: '[上] dddd',
sameElse: 'DD/MM/YYYY'
});
break;
case 'en':
calendarDate = date.calendar({
sameDay: '[Today]',
nextDay: '[Tomorrow]',
nextWeek: 'dddd',
lastDay: '[Yesterday]',
lastWeek: '[Last] dddd',
sameElse: 'DD/MM/YYYY'
});
break;
default:
calendarDate = date.calendar({
sameDay: '[今天]',
nextDay: '[明天]',
nextWeek: 'dddd',
lastDay: '[昨天]',
lastWeek: '[上] dddd',
sameElse: 'DD/MM/YYYY'
});
break;
}
return calendarDate;
}
/**
* @param {?} date
* @return {?}
*/
isValid(date) {
return date && moment(date).isValid();
}
}
NpDatePickerService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
NpDatePickerService.ctorParameters = () => [
{ type: OverlayPositionBuilder },
{ type: Overlay }
];
/** @nocollapse */ NpDatePickerService.ngInjectableDef = i0.defineInjectable({ factory: function NpDatePickerService_Factory() { return new NpDatePickerService(i0.inject(i1.OverlayPositionBuilder), i0.inject(i1.Overlay)); }, token: NpDatePickerService, providedIn: "root" });
if (false) {
/**
* @type {?}
* @private
*/
NpDatePickerService.prototype.overlayPositionBuilder;
/**
* @type {?}
* @private
*/
NpDatePickerService.prototype.overlay;
}
/**
* @record
*/
export function DateData() { }
if (false) {
/**
* 是否可选
* @type {?}
*/
DateData.prototype.available;
/**
* 当前值
* @type {?}
*/
DateData.prototype.value;
/**
* 当前是否选中
* @type {?}
*/
DateData.prototype.isSelected;
/**
* 当前日期
* @type {?}
*/
DateData.prototype.date;
}
/**
* @record
*/
export function DayDataPerMonth() { }
if (false) {
/**
* 是否是第一行的周
* @type {?}
*/
DayDataPerMonth.prototype.isWeekDayMin;
/**
* 当datepickertype为date-range-picker的时候,鼠标hover后在候选时间区间的则为true,否则false
* @type {?|undefined}
*/
DayDataPerMonth.prototype.hoverDateType;
}
/**
* @record
*/
export function YearData() { }
/**
* @record
*/
export function MonthData() { }
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1wbHV0by8iLCJzb3VyY2VzIjpbImxpYi9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sS0FBSyxPQUFPLE1BQU0sUUFBUSxDQUFDOzs7O01BQU8sTUFBTSxHQUFHLE9BQU87QUFDekQsT0FBTyxFQUFFLHNCQUFzQixFQUFpQyxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSy9ELE1BQU0sT0FBTyxtQkFBbUI7Ozs7O0lBTTVCLFlBQW9CLHNCQUE4QyxFQUN0RCxPQUFnQjtRQURSLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDdEQsWUFBTyxHQUFQLE9BQU8sQ0FBUztJQUFJLENBQUM7Ozs7SUFMakMsSUFBVyxNQUFNO1FBQ2IsT0FBTyxtQkFBQSxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQW9CLENBQUM7SUFDL0MsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBd0JELGVBQWUsQ0FBQyxJQUFvQixFQUFFLElBQVksRUFBRSxZQUE0Qjs7WUFDeEUsS0FBSyxHQUFvQixFQUFFOztZQUUzQixhQUFhLEdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzs7WUFDdkMsS0FBSyxHQUFHLGFBQWE7O1lBQ3JCLEdBQUcsR0FBRyxFQUFFLEdBQUcsYUFBYTs7WUFFeEIsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDaEMsT0FBTyxLQUFLLElBQUksQ0FBQyxFQUFFOztrQkFDVCxHQUFHLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUM7WUFDekMsS0FBSyxD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LElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDMUMsQ0FBQzs7O1lBL1lKLFVBQVUsU0FBQztnQkFDUixVQUFVLEVBQUUsTUFBTTthQUNyQjs7OztZQU5RLHNCQUFzQjtZQUFpQyxPQUFPOzs7Ozs7OztJQWF2RCxxREFBc0Q7Ozs7O0lBQzlELHNDQUF3Qjs7Ozs7QUF3WWhDLDhCQVNDOzs7Ozs7SUFQRyw2QkFBbUI7Ozs7O0lBRW5CLHlCQUFjOzs7OztJQUVkLDhCQUFvQjs7Ozs7SUFFcEIsd0JBQXFCOzs7OztBQUd6QixxQ0FLQzs7Ozs7O0lBSEcsdUNBQXNCOzs7OztJQUV0Qix3Q0FBd0M7Ozs7O0FBZ0I1Qyw4QkFBOEM7Ozs7QUFFOUMsK0JBQStDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7IGNvbnN0IG1vbWVudCA9IG1vbWVudF9cclxuaW1wb3J0IHsgT3ZlcmxheVBvc2l0aW9uQnVpbGRlciwgQ29ubmVjdGVkUG9zaXRpb24sIE92ZXJsYXlSZWYsIE92ZXJsYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IERhdGVQaWNrZXJMb2NhbGUgfSBmcm9tICcuL3B1YmxpYy1hcGknO1xyXG5pbXBvcnQgeyBEQVRFX0ZPUk1BVCwgVElNRV9GT1JNQVQgfSBmcm9tICcuL2RhdGUtcGlja2VyLWNvbnN0JztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTnBEYXRlUGlja2VyU2VydmljZSB7XHJcblxyXG4gICAgcHVibGljIGdldCBsb2NhbGUoKTogRGF0ZVBpY2tlckxvY2FsZSB7XHJcbiAgICAgICAgcmV0dXJuIG1vbWVudC5sb2NhbGUoKSBhcyBEYXRlUGlja2VyTG9jYWxlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgb3ZlcmxheVBvc2l0aW9uQnVpbGRlcjogT3ZlcmxheVBvc2l0aW9uQnVpbGRlcixcclxuICAgICAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXkpIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5qC55o2u5Lyg5YWl55qEbW9tZW505pe26Ze05Y+K5Lyg5YWl55qE5bm05Lu955Sf5oiQ5bm05Lu96IyD5Zu05pWw57uEWWVhckRhdGHjgIJcclxuICAgICAqIOS+i+Wmgu+8mnllYXIgPSAyMDIw77yMIOW5tOS7veiMg+WbtHZhbHVl56S65L6L5Li6XHJcbiAgICAgKiBcclxuICAgICAqIFtcclxuICAgICAqIFxyXG4gICAgICogICAgICAyMDE5LCAyMDIwLCAyMDIxLCBcclxuICAgICAqIFxyXG4gICAgICogICAgICAyMDIyLCAyMDIzLCAyMDI0LCBcclxuICAgICAqIFxyXG4gICAgICogICAgICAyMDI1LCAyMDI2LCAyMDI3LCBcclxuICAgICAqIFxyXG4gICAgICogICAgICAyMDI4LCAyMDI5LCAyMDMwXHJcbiAgICAgKiBcclxuICAgICAqIF1cclxuICAgICAqIEBwYXJhbSBkYXRlIE1vbWVudOaXtumXtFxyXG4gICAgICogQHBhcmFtIHllYXIg5bm05Lu9WVlZWe+8jCDkvovvvJoyMDIwXHJcbiAgICAgKiBAcGFyYW0gc2VsZWN0ZWREYXRlIOW9k+WJjemAieS4reeahOaXpeacn1xyXG4gICAgICovXHJcbiAgICBidWlsZFllYXJzUGFuZWwoZGF0ZTogbW9tZW50Xy5Nb21lbnQsIHllYXI6IHN0cmluZywgc2VsZWN0ZWREYXRlOiBtb21lbnRfLk1vbWVudCk6IEFycmF5PFllYXJEYXRhPiB7XHJcbiAgICAgICAgbGV0IHllYXJzOiBBcnJheTxZZWFyRGF0YT4gPSBbXTtcclxuXHJcbiAgICAgICAgbGV0IGxhc3ROdW1PZlllYXI6IG51bWJlciA9ICt5ZWFyLmNoYXJBdCgzKTtcclxuICAgICAgICBsZXQgc3RhcnQgPSBsYXN0TnVtT2ZZZWFyO1xyXG4gICAgICAgIGxldCBlbmQgPSAxMCAtIGxhc3ROdW1PZlllYXI7XHJcblxyXG4gICAgICAgIGxldCBjb3B5RGF0ZVN0YXJ0ID0gZGF0ZS5jbG9uZSgpO1xyXG4gICAgICAgIHdoaWxlIChzdGFydCA+PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1ciA9IGNvcHlEYXRlU3RhcnQuYWRkKC0xLCAneWVhcicpO1xyXG4gICAgICAgICAgICB5ZWFycy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZTogc3RhcnQgPiAwLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGN1ci5mb3JtYXQoJ1lZWVknKSxcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IHNlbGVjdGVkRGF0ZSA/IHNlbGVjdGVkRGF0ZS5mb3JtYXQoJ1lZWVknKSA9PT0gY3VyLmZvcm1hdCgnWVlZWScpIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBkYXRlOiBjdXIuY2xvbmUoKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc3RhcnQtLTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHllYXJzLnB1c2goe1xyXG4gICAgICAgICAgICBhdmFpbGFibGU6IHRydWUsXHJcbiAgICAgICAgICAgIHZhbHVlOiBkYXRlLmZvcm1hdCgnWVlZWScpLFxyXG4gICAgICAgICAgICBpc1NlbGVjdGVkOiBzZWxlY3RlZERhdGUgPyBzZWxlY3RlZERhdGUuZm9ybWF0KCdZWVlZJykgPT09IGRhdGUuZm9ybWF0KCdZWVlZJykgOiBmYWxzZSxcclxuICAgICAgICAgICAgZGF0ZTogZGF0ZS5jbG9uZSgpXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBjb3B5RGF0ZUVuZCA9IGRhdGUuY2xvbmUoKTtcclxuICAgICAgICB3aGlsZSAoZW5kIDw9IDEwICYmIGVuZCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgY3VyID0gY29weURhdGVFbmQuYWRkKDEsICd5ZWFyJyk7XHJcbiAgICAgICAgICAgIHllYXJzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlOiBlbmQgPiAxLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGN1ci5mb3JtYXQoJ1lZWVknKSxcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IHNlbGVjdGVkRGF0ZSA/IHNlbGVjdGVkRGF0ZS5mb3JtYXQoJ1lZWVknKSA9PT0gY3VyLmZvcm1hdCgnWVlZWScpIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBkYXRlOiBjdXIuY2xvbmUoKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZW5kLS07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geWVhcnMuc29ydCgoYSwgYikgPT4geyByZXR1cm4gKCthLnZhbHVlIC0gK2IudmFsdWUpOyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaehOW7uuW9k+WJjeW5tOS7veeahOWFqOmDqOaciOS7vVxyXG4gICAgICogQHBhcmFtIHNlbGVjdGVkRGF0ZSDlvZPliY3pgInkuK3nmoTml6XmnJ9cclxuICAgICAqL1xyXG4gICAgYnVpbGRNb250aHNQYW5lbChkYXRlOiBtb21lbnRfLk1vbWVudCwgc2VsZWN0ZWREYXRlOiBtb21lbnRfLk1vbWVudCk6IEFycmF5PE1vbnRoRGF0YT4ge1xyXG4gICAgICAgIGxldCBtID0gbW9tZW50Lm1vbnRoc1Nob3J0KCk7XHJcbiAgICAgICAgbGV0IG1vbnRoczogQXJyYXk8TW9udGhEYXRhPiA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBtb250aHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBhdmFpbGFibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogbVtpXSxcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IHNlbGVjdGVkRGF0ZSA/IG1baV0gPT09IHNlbGVjdGVkRGF0ZS5mb3JtYXQoJ01NTScpIDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBkYXRlOiBtb21lbnQoZGF0ZS5mb3JtYXQoJ1lZWVknKSArIG1baV0gKyBkYXRlLmZvcm1hdCgnREQnKSwgJ1lZWVlNTU1ERCcpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbW9udGhzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5qC55o2u5Lyg5YWl55qE5pel5pyf5p6E5bu65b2T5YmN5pi+56S65pel5Y6G6Z2i5p2/77yI5b2T5YmN6L+Z5Liq5pyI55qE5aSp5pWw6Z2i5p2/77yJ44CCXHJcbiAgICAgKiDkvovlpoLvvJrkvKDlhaXml6XmnJ/kuLoyMDIwLzA4LzIw77yM5YiZ6L+U5Zue5LiA5LiqRGF5RGF0YVBlck1vbnRo5pWw57uE77yMXHJcbiAgICAgKiDlhbbkuK3nmoR2YWx1ZeekuuS+i+WmguS4izpcclxuICAgICAqIFxyXG4gICAgICogWyfml6UnLCAn5LiAJywgJ+S6jCcsICfkuIknLCAn5ZubJywgJ+S6lCcsICflha0nLCBcclxuICAgICAqIFxyXG4gICAgICogICcyNicsICcyNycsICcyOCcsICcyOScsICczMCcsICczMScsICcxJywgXHJcbiAgICAgKiBcclxuICAgICAqICAnMicsICAnMycsICAnNCcsICAnNScsICAnNicsICAnNycsICAnOCcsXHJcbiAgICAgKiBcclxuICAgICAqICAnOScsICAnMTAnLCAnMTEnLCAnMTInLCAnMTMnLCAnMTQnLCAnMTUnLFxyXG4gICAgICogXHJcbiAgICAgKiAgJzE2JywgJzE3JywgJzE4JywgJzE5JywgJzIwJywgJzIxJywgJzIyJyxcclxuICAgICAqIFxyXG4gICAgICogICcyMycsICcyNCcsICcyNScsICcyNicsICcyNycsICcyOCcsICcyOScsXHJcbiAgICAgKiBcclxuICAgICAqICAnMzAnLCAnMzEnLCAgJzEnLCAgJzInLCAgJzMnLCAgJzQnLCAgJzUnXVxyXG4gICAgICogQHBhcmFtIGRhdGUg5p6E5bu65pel5pyf6Z2i5p2/55qE5pel5pyfXHJcbiAgICAgKiBAcGFyYW0gc2VsZWN0ZWREYXRlIOW9k+WJjemAieS4reeahOaXpeacn1xyXG4gICAgICogQHBhcmFtIGlzUmFuZ2VQaWNrZXIg5piv5ZCm5piv5pe26Ze05Yy66Ze06YCJ5oupXHJcbiAgICAgKiBAcGFyYW0gZGF0ZXMg5b2TaXNSYW5nZVBpY2tlcuS4unRydWXml7bvvIzpnIDopoHkvKDlhaXmraTml7bpl7TljLrpl7TlrZfmrrXvvIzku6Pooajml7bpl7TljLrpl7Tlt7LpgInmi6nnmoTljLrpl7TlgLxcclxuICAgICAqL1xyXG4gICAgYnVpbGREYXlzUGFuZWwoZGF0ZTogbW9tZW50Xy5Nb21lbnQsIHNlbGVjdGVkRGF0ZTogbW9tZW50Xy5Nb21lbnQpOiBBcnJheTxEYXlEYXRhUGVyTW9udGg+IHtcclxuICAgICAgICBjb25zdCB0b3RhbCA9IDQ5O1xyXG4gICAgICAgIGxldCBkYXlzOiBBcnJheTxEYXlEYXRhUGVyTW9udGg+ID0gW107XHJcbiAgICAgICAgbGV0IGNvcHlEYXRlID0gZGF0ZS5jbG9uZSgpO1xyXG4gICAgICAgIGxldCB3ZWVrZGF5c01pbiA9IHRoaXMuZ2V0V2Vla2RheXNNaW4oKTtcclxuICAgICAgICB3ZWVrZGF5c01pbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBkYXlzLnB1c2goeyBhdmFpbGFibGU6IGZhbHNlLCB2YWx1ZTogaXRlbSwgaXNTZWxlY3RlZDogZmFsc2UsIGlzV2Vla0RheU1pbjogdHJ1ZSwgZGF0ZTogbnVsbCB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IHN0YXJ0T2ZNb250aCA9IGNvcHlEYXRlLmNsb25lKCkuc3RhcnRPZignbW9udGgnKTtcclxuICAgICAgICBzdGFydE9mTW9udGggPSBtb21lbnQoc3RhcnRPZk1vbnRoLmZvcm1hdChEQVRFX0ZPUk1BVCkgKyAnICcgKyBjb3B5RGF0ZS5mb3JtYXQoVElNRV9GT1JNQVQpKTtcclxuICAgICAgICAvLyDojrflj5blvZPmnIjnrKzkuIDlpKnmmK/lkajlh6DvvIzlpoIyMDIwLzA4LzAx5piv5ZGo5YWt77yM5YiZ5b6X5Yiw55qE5piv4oCc5YWt4oCdXHJcbiAgICAgICAgbGV0IHdlZWtEYXlNaW5fc3RhcnRPZk1vbnRoID0gd2Vla2RheXNNaW5bK3N0YXJ0T2ZNb250aC53ZWVrZGF5KCkgKyAxXTtcclxuICAgICAgICBsZXQgaW5kZXhfd2Vla0RheU1pbl9zdGFydE9mTW9udGggPSB3ZWVrZGF5c01pbi5pbmRleE9mKHdlZWtEYXlNaW5fc3RhcnRPZk1vbnRoKTtcclxuICAgICAgICAvLyDmt7vliqDkuIrmnIjlkI7lh6DlpKnnlKjku6XooaXotrPlvZPliY3pnaLmnb9cclxuICAgICAgICB3aGlsZSAoaW5kZXhfd2Vla0RheU1pbl9zdGFydE9mTW9udGggPiAwKSB7XHJcbiAgICAgICAgICAgIGRheXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBhdmFpbGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHN0YXJ0T2ZNb250aC5jbG9uZSgpLmFkZCgtaW5kZXhfd2Vla0RheU1pbl9zdGFydE9mTW9udGgsICdkYXknKS5mb3JtYXQoJ0QnKSxcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgaXNXZWVrRGF5TWluOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRhdGU6IHN0YXJ0T2ZNb250aC5jbG9uZSgpLmFkZCgtaW5kZXhfd2Vla0RheU1pbl9zdGFydE9mTW9udGgsICdkYXknKS5jbG9uZSgpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpbmRleF93ZWVrRGF5TWluX3N0YXJ0T2ZNb250aC0tO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGxhc3RPZk1vbnRoID0gY29weURhdGUuY2xvbmUoKS5lbmRPZignbW9udGgnKTtcclxuICAgICAgICBsYXN0T2ZNb250aCA9IG1vbWVudChsYXN0T2ZNb250aC5mb3JtYXQoREFURV9GT1JNQVQpICsgJyAnICsgY29weURhdGUuZm9ybWF0KFRJTUVfRk9STUFUKSk7XHJcbiAgICAgICAgLy8g6I635Y+W5b2T5pyI5pyA5ZCO5aSp5piv5ZGo5Yeg77yM5aaCMjAyMC8wOC8zMeaYr+WRqOS4gO+8jOWImeW+l+WIsOeahOaYr+KAnOS4gOKAnVxyXG4gICAgICAgIC8vIOa3u+WKoOW9k+aciOWIsOW9k+WJjemdouadv+aVsOe7hFxyXG4gICAgICAgIHdoaWxlIChzdGFydE9mTW9udGggPD0gbGFzdE9mTW9udGgpIHtcclxuICAgICAgICAgICAgZGF5cy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBzdGFydE9mTW9udGguZm9ybWF0KCdEJyksXHJcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBzZWxlY3RlZERhdGUgPyBzdGFydE9mTW9udGguZm9ybWF0KERBVEVfRk9STUFUKSA9PT0gc2VsZWN0ZWREYXRlLmZvcm1hdChEQVRFX0ZPUk1BVCkgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGlzV2Vla0RheU1pbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBkYXRlOiBzdGFydE9mTW9udGguY2xvbmUoKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc3RhcnRPZk1vbnRoID0gc3RhcnRPZk1vbnRoLmFkZCgxLCAnZGF5Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDmt7vliqDkuIvmnIjliY3lh6DlpKnnlKjku6XooaXotrPlvZPliY3pnaLmnb9cclxuICAgICAgICBsZXQgaSA9IDE7XHJcbiAgICAgICAgd2hpbGUgKGRheXMubGVuZ3RoIDwgdG90YWwpIHtcclxuICAgICAgICAgICAgZGF5cy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogbGFzdE9mTW9udGguY2xvbmUoKS5hZGQoaSwgJ2RheScpLmZvcm1hdCgnRCcpLFxyXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBpc1dlZWtEYXlNaW46IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgZGF0ZTogbGFzdE9mTW9udGguY2xvbmUoKS5hZGQoaSwgJ2RheScpLmNsb25lKClcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGkrKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXlzO1xyXG4gICAgfVxyXG5cclxuICAgIHNvcnREYXRlcyhkYXRlczogQXJyYXk8bW9tZW50Xy5Nb21lbnQ+LCBhc2M6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGVzLnNvcnQoKGEsIGIpID0+IGFzYyA/IGEuZGlmZihiKSA6IGIuZGlmZihhKSk7XHJcbiAgICB9XHJcblxyXG4gICAgYnVpbGRTdGFydEFuZEVuZERhdGVzKHNEYXRlOiBtb21lbnRfLk1vbWVudCwgZURhdGU6IG1vbWVudF8uTW9tZW50KSB7XHJcbiAgICAgICAgaWYgKCFzRGF0ZSB8fCAhZURhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1vbWVudChzRGF0ZSkgPCBtb21lbnQoZURhdGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbc0RhdGUsIGVEYXRlXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBbZURhdGUsIHNEYXRlXTtcclxuICAgIH1cclxuXHJcbiAgICBkYXkoZGF0ZTogbW9tZW50Xy5Nb21lbnQpIHtcclxuICAgICAgICBpZiAoZGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KGRhdGUuZm9ybWF0KERBVEVfRk9STUFUICsgJyAwMDowMDowMCcpLCAnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1vbWVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0RGF5U3RhdHVzKGN1cnJlbnREYXRlOiBtb21lbnRfLk1vbWVudCwgaG92ZXJEYXRlOiBtb21lbnRfLk1vbWVudCwgZGF0ZXM6IEFycmF5PG1vbWVudF8uTW9tZW50PiA9IFtdKTogRGF5U3RhdHVzRm9yUmFuZ2VQaWNrZXIge1xyXG4gICAgICAgIGlmICghZGF0ZXMgfHwgZGF0ZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnbm9ybWFsJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRheSA9IChkYXRlOiBtb21lbnRfLk1vbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudChkYXRlLmZvcm1hdChEQVRFX0ZPUk1BVCArICcgMDA6MDA6MDAnKSwgJ1lZWVktTU0tREQnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1vbWVudCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHNvcnRlZERhdGVzID0gdGhpcy5zb3J0RGF0ZXMoW2hvdmVyRGF0ZSwgLi4uZGF0ZXNdKTtcclxuICAgICAgICBpZiAoY3VycmVudERhdGUgPCBzb3J0ZWREYXRlc1swXSB8fCBjdXJyZW50RGF0ZSA+IHNvcnRlZERhdGVzWzJdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnbm9ybWFsJyBhcyBEYXlTdGF0dXNGb3JSYW5nZVBpY2tlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkYXkoaG92ZXJEYXRlKS5kaWZmKGRhdGVzWzBdKSA8IDApIHtcclxuICAgICAgICAgICAgaWYgKGRheShjdXJyZW50RGF0ZSkuZGlmZihkYXkoaG92ZXJEYXRlKSkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ25vcm1hbCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF5KGN1cnJlbnREYXRlKS5kaWZmKGhvdmVyRGF0ZSkgPj0gMCAmJiBkYXkoY3VycmVudERhdGUpLmRpZmYoZGF0ZXNbMF0pIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICd3aXRoaW4taG92ZXInO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRheShjdXJyZW50RGF0ZSkuZGlmZihkYXRlc1swXSkgPj0gMCAmJiBkYXkoY3VycmVudERhdGUpLmRpZmYoZGF0ZXNbMV0pIDw9IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnd2l0aGluLXNlbGVjdGVkJztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXkoY3VycmVudERhdGUpLmRpZmYoZGF0ZXNbMV0pID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdub3JtYWwnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGF5KGhvdmVyRGF0ZSkuZGlmZihkYXRlc1swXSkgPj0gMCAmJiBkYXkoaG92ZXJEYXRlKS5kaWZmKGRhdGVzWzFdKSA8PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXkoY3VycmVudERhdGUpLmRpZmYoZGF5KGRhdGVzWzBdKSkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ25vcm1hbCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF5KGN1cnJlbnREYXRlKS5kaWZmKGRhdGVzWzBdKSA+PSAwICYmIGRheShjdXJyZW50RGF0ZSkuZGlmZihob3ZlckRhdGUpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICd3aXRoaW4tc2VsZWN0ZWQtaG92ZXInO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRheShjdXJyZW50RGF0ZSkuZGlmZihob3ZlckRhdGUpID49IDAgJiYgZGF5KGN1cnJlbnREYXRlKS5kaWZmKGRhdGVzWzFdKSA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3dpdGhpbi1zZWxlY3RlZCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF5KGN1cnJlbnREYXRlKS5kaWZmKGRhdGVzWzFdKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnbm9ybWFsJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRheShob3ZlckRhdGUpLmRpZmYoZGF0ZXNbMV0pID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoZGF5KGN1cnJlbnREYXRlKS5kaWZmKGRheShkYXRlc1swXSkpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdub3JtYWwnO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRheShjdXJyZW50RGF0ZSkuZGlmZihkYXRlc1swXSkgPj0gMCAmJiBkYXkoY3VycmVudERhdGUpLmRpZmYoZGF0ZXNbMV0pIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICd3aXRoaW4tc2VsZWN0ZWQnO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRheShjdXJyZW50RGF0ZSkuZGlmZihkYXRlc1sxXSkgPj0gMCAmJiBkYXkoY3VycmVudERhdGUpLmRpZmYoaG92ZXJEYXRlKSA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3dpdGhpbi1ob3Zlcic7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF5KGN1cnJlbnREYXRlKS5kaWZmKGhvdmVyRGF0ZSkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ25vcm1hbCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAnbm9ybWFsJyBhcyBEYXlTdGF0dXNGb3JSYW5nZVBpY2tlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaehOW7uuaXtumXtOWMuumXtOmAieaLqeW9k+m8oOagh2hvdmVy6Z2i5p2/5pe255qE54q25oCB77yM5ZCMYnVpbGREYXlzUGFuZWznmoTlip/og73vvIxcclxuICAgICAqIOWinuWKoOWvueixoURheURhdGFQZXJNb250aOS4reWvueWtl+autWlzV2l0aGluRGF0ZVJhbmdlSG92ZXLnmoTlgLznmoTljLrliIbjgIJcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGRhdGUg5p6E5bu65pel5pyf6Z2i5p2/55qE5pel5pyfXHJcbiAgICAgKiBAcGFyYW0gc2VsZWN0ZWREYXRlIOW9k+WJjemAieS4reeahOaXpeacn1xyXG4gICAgICogQHBhcmFtIGhvdmVyRGF0ZSDlvZPliY1ob3ZlcueahOaXtumXtG1vbWVudOWAvFxyXG4gICAgICogQHBhcmFtIGRhdGVzIOmcgOimgeS8oOWFpeatpOaXtumXtOWMuumXtOWtl+aute+8jOS7o+ihqOaXtumXtOWMuumXtOW3sumAieaLqeeahOWMuumXtOWAvFxyXG4gICAgICovXHJcbiAgICBidWlsZERheXNQYW5lbEZvclJhbmdlUGlja2VyKGRhdGU6IG1vbWVudF8uTW9tZW50LCBzZWxlY3RlZERhdGU6IG1vbWVudF8uTW9tZW50LFxyXG4gICAgICAgIGhvdmVyRGF0ZTogbW9tZW50Xy5Nb21lbnQsIGRhdGVzOiBBcnJheTxtb21lbnRfLk1vbWVudD4gPSBbXSkge1xyXG4gICAgICAgIGNvbnN0IHRvdGFsID0gNDk7XHJcbiAgICAgICAgbGV0IGRheXM6IEFycmF5PERheURhdGFQZXJNb250aD4gPSBbXTtcclxuICAgICAgICBsZXQgY29weURhdGUgPSBkYXRlLmNsb25lKCk7XHJcbiAgICAgICAgbGV0IHdlZWtkYXlzTWluID0gdGhpcy5nZXRXZWVrZGF5c01pbigpO1xyXG4gICAgICAgIHdlZWtkYXlzTWluLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGRheXMucHVzaCh7IGF2YWlsYWJsZTogZmFsc2UsIHZhbHVlOiBpdGVtLCBpc1NlbGVjdGVkOiBmYWxzZSwgaXNXZWVrRGF5TWluOiB0cnVlLCBkYXRlOiBudWxsLCBob3ZlckRhdGVUeXBlOiAnbm9ybWFsJyB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IHN0YXJ0T2ZNb250aCA9IGNvcHlEYXRlLmNsb25lKCkuc3RhcnRPZignbW9udGgnKTtcclxuICAgICAgICBzdGFydE9mTW9udGggPSBtb21lbnQoc3RhcnRPZk1vbnRoLmZvcm1hdChEQVRFX0ZPUk1BVCkgKyAnICcgKyBjb3B5RGF0ZS5mb3JtYXQoVElNRV9GT1JNQVQpKTtcclxuICAgICAgICAvLyDojrflj5blvZPmnIjnrKzkuIDlpKnmmK/lkajlh6DvvIzlpoIyMDIwLzA4LzAx5piv5ZGo5YWt77yM5YiZ5b6X5Yiw55qE5piv4oCc5YWt4oCdXHJcbiAgICAgICAgbGV0IHdlZWtEYXlNaW5fc3RhcnRPZk1vbnRoID0gd2Vla2RheXNNaW5bK3N0YXJ0T2ZNb250aC53ZWVrZGF5KCkgKyAxXTtcclxuICAgICAgICBsZXQgaW5kZXhfd2Vla0RheU1pbl9zdGFydE9mTW9udGggPSB3ZWVrZGF5c01pbi5pbmRleE9mKHdlZWtEYXlNaW5fc3RhcnRPZk1vbnRoKTtcclxuICAgICAgICAvLyDmt7vliqDkuIrmnIjlkI7lh6DlpKnnlKjku6XooaXotrPlvZPliY3pnaLmnb9cclxuICAgICAgICB3aGlsZSAoaW5kZXhfd2Vla0RheU1pbl9zdGFydE9mTW9udGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBjRGF0ZSA9IHN0YXJ0T2ZNb250aC5jbG9uZSgpLmFkZCgtaW5kZXhfd2Vla0RheU1pbl9zdGFydE9mTW9udGgsICdkYXknKS5jbG9uZSgpO1xyXG4gICAgICAgICAgICBkYXlzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBjRGF0ZS5mb3JtYXQoJ0QnKSxcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgaXNXZWVrRGF5TWluOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRhdGU6IGNEYXRlLFxyXG4gICAgICAgICAgICAgICAgaG92ZXJEYXRlVHlwZTogdGhpcy5nZXREYXlTdGF0dXMoY0RhdGUsIGhvdmVyRGF0ZSwgZGF0ZXMpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpbmRleF93ZWVrRGF5TWluX3N0YXJ0T2ZNb250aC0tO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGxhc3RPZk1vbnRoID0gY29weURhdGUuY2xvbmUoKS5lbmRPZignbW9udGgnKTtcclxuICAgICAgICBsYXN0T2ZNb250aCA9IG1vbWVudChsYXN0T2ZNb250aC5mb3JtYXQoREFURV9GT1JNQVQpICsgJyAnICsgY29weURhdGUuZm9ybWF0KFRJTUVfRk9STUFUKSk7XHJcbiAgICAgICAgLy8g6I635Y+W5b2T5pyI5pyA5ZCO5aSp5piv5ZGo5Yeg77yM5aaCMjAyMC8wOC8zMeaYr+WRqOS4gO+8jOWImeW+l+WIsOeahOaYr+KAnOS4gOKAnVxyXG4gICAgICAgIC8vIOa3u+WKoOW9k+aciOWIsOW9k+WJjemdouadv+aVsOe7hFxyXG4gICAgICAgIHdoaWxlIChzdGFydE9mTW9udGggPD0gbGFzdE9mTW9udGgpIHtcclxuICAgICAgICAgICAgZGF5cy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBzdGFydE9mTW9udGguZm9ybWF0KCdEJyksXHJcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBzZWxlY3RlZERhdGUgPyBzdGFydE9mTW9udGguZm9ybWF0KERBVEVfRk9STUFUKSA9PT0gc2VsZWN0ZWREYXRlLmZvcm1hdChEQVRFX0ZPUk1BVCkgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGlzV2Vla0RheU1pbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBkYXRlOiBzdGFydE9mTW9udGguY2xvbmUoKSxcclxuICAgICAgICAgICAgICAgIGhvdmVyRGF0ZVR5cGU6IHRoaXMuZ2V0RGF5U3RhdHVzKHN0YXJ0T2ZNb250aC5jbG9uZSgpLCBob3ZlckRhdGUsIGRhdGVzKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc3RhcnRPZk1vbnRoID0gc3RhcnRPZk1vbnRoLmFkZCgxLCAnZGF5Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDmt7vliqDkuIvmnIjliY3lh6DlpKnnlKjku6XooaXotrPlvZPliY3pnaLmnb9cclxuICAgICAgICBsZXQgaSA9IDE7XHJcbiAgICAgICAgd2hpbGUgKGRheXMubGVuZ3RoIDwgdG90YWwpIHtcclxuICAgICAgICAgICAgbGV0IGNEYXRlID0gbGFzdE9mTW9udGguY2xvbmUoKS5hZGQoaSwgJ2RheScpLmNsb25lKCk7XHJcbiAgICAgICAgICAgIGRheXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBhdmFpbGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNEYXRlLmZvcm1hdCgnRCcpLFxyXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBpc1dlZWtEYXlNaW46IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgZGF0ZTogY0RhdGUuY2xvbmUoKSxcclxuICAgICAgICAgICAgICAgIGhvdmVyRGF0ZVR5cGU6IHRoaXMuZ2V0RGF5U3RhdHVzKGNEYXRlLCBob3ZlckRhdGUsIGRhdGVzKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRheXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0V2Vla2RheXNNaW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIG1vbWVudC53ZWVrZGF5c01pbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE92ZXJsYXlSZWYoZWxlbWVudFJlZjogRWxlbWVudFJlZik6IE92ZXJsYXlSZWYge1xyXG4gICAgICAgIGNvbnN0IHBvcHVwUG9zaXRpb25zOiBDb25uZWN0ZWRQb3NpdGlvbltdID0gW3tcclxuICAgICAgICAgICAgb3JpZ2luWDogXCJzdGFydFwiLFxyXG4gICAgICAgICAgICBvcmlnaW5ZOiBcImJvdHRvbVwiLFxyXG4gICAgICAgICAgICBvdmVybGF5WDogXCJzdGFydFwiLFxyXG4gICAgICAgICAgICBvdmVybGF5WTogXCJ0b3BcIixcclxuICAgICAgICAgICAgb2Zmc2V0WDogMCxcclxuICAgICAgICAgICAgb2Zmc2V0WTogMVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgb3JpZ2luWDogXCJzdGFydFwiLFxyXG4gICAgICAgICAgICBvcmlnaW5ZOiBcInRvcFwiLFxyXG4gICAgICAgICAgICBvdmVybGF5WDogXCJzdGFydFwiLFxyXG4gICAgICAgICAgICBvdmVybGF5WTogXCJib3R0b21cIixcclxuICAgICAgICAgICAgb2Zmc2V0WDogMCxcclxuICAgICAgICAgICAgb2Zmc2V0WTogLTFcclxuICAgICAgICB9XTtcclxuXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheVBvc2l0aW9uQnVpbGRlclxyXG4gICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyhlbGVtZW50UmVmKVxyXG4gICAgICAgICAgICAud2l0aFBvc2l0aW9ucyhwb3B1cFBvc2l0aW9ucyk7XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxyXG4gICAgICAgICAgICBiYWNrZHJvcENsYXNzOiAnY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnLFxyXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMubm9vcCgpXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoq6I635Y+WY2FsZW5kYXLml7bpl7TvvIzkvovlpoLku4rlpKnvvIzmmKjlpKnvvIzmmI7lpKnnrYkgKi9cclxuICAgIGNhbGVuZGFyKGRhdGU6IG1vbWVudF8uTW9tZW50LCBsb2NhbGU6IERhdGVQaWNrZXJMb2NhbGUgPSAnemgtY24nKSB7XHJcbiAgICAgICAgbGV0IGNhbGVuZGFyRGF0ZSA9ICcnO1xyXG4gICAgICAgIHN3aXRjaCAobG9jYWxlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3poLWNuJzpcclxuICAgICAgICAgICAgICAgIGNhbGVuZGFyRGF0ZSA9IGRhdGUuY2FsZW5kYXIoe1xyXG4gICAgICAgICAgICAgICAgICAgIHNhbWVEYXk6ICdb5LuK5aSpXScsXHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dERheTogJ1vmmI7lpKldJyxcclxuICAgICAgICAgICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQnLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhc3REYXk6ICdb5pio5aSpXScsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdFdlZWs6ICdb5LiKXSBkZGRkJyxcclxuICAgICAgICAgICAgICAgICAgICBzYW1lRWxzZTogJ0REL01NL1lZWVknXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdlbic6XHJcbiAgICAgICAgICAgICAgICBjYWxlbmRhckRhdGUgPSBkYXRlLmNhbGVuZGFyKHtcclxuICAgICAgICAgICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5XScsXHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dERheTogJ1tUb21vcnJvd10nLFxyXG4gICAgICAgICAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXldJyxcclxuICAgICAgICAgICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkJyxcclxuICAgICAgICAgICAgICAgICAgICBzYW1lRWxzZTogJ0REL01NL1lZWVknXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgY2FsZW5kYXJEYXRlID0gZGF0ZS5jYWxlbmRhcih7XHJcbiAgICAgICAgICAgICAgICAgICAgc2FtZURheTogJ1vku4rlpKldJyxcclxuICAgICAgICAgICAgICAgICAgICBuZXh0RGF5OiAnW+aYjuWkqV0nLFxyXG4gICAgICAgICAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdERheTogJ1vmmKjlpKldJyxcclxuICAgICAgICAgICAgICAgICAgICBsYXN0V2VlazogJ1vkuIpdIGRkZGQnLFxyXG4gICAgICAgICAgICAgICAgICAgIHNhbWVFbHNlOiAnREQvTU0vWVlZWSdcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2FsZW5kYXJEYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGlzVmFsaWQoZGF0ZTogbW9tZW50Xy5Nb21lbnQgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gZGF0ZSAmJiBtb21lbnQoZGF0ZSkuaXNWYWxpZCgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERhdGVEYXRhIHtcclxuICAgIC8qKuaYr+WQpuWPr+mAiSAqL1xyXG4gICAgYXZhaWxhYmxlOiBib29sZWFuO1xyXG4gICAgLyoq5b2T5YmN5YC8ICovXHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gICAgLyoq5b2T5YmN5piv5ZCm6YCJ5LitICovXHJcbiAgICBpc1NlbGVjdGVkOiBib29sZWFuO1xyXG4gICAgLyoq5b2T5YmN5pel5pyfICovXHJcbiAgICBkYXRlOiBtb21lbnRfLk1vbWVudDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEYXlEYXRhUGVyTW9udGggZXh0ZW5kcyBEYXRlRGF0YSB7XHJcbiAgICAvKirmmK/lkKbmmK/nrKzkuIDooYznmoTlkaggKi9cclxuICAgIGlzV2Vla0RheU1pbjogYm9vbGVhbjtcclxuICAgIC8qKuW9k2RhdGVwaWNrZXJ0eXBl5Li6ZGF0ZS1yYW5nZS1waWNrZXLnmoTml7blgJnvvIzpvKDmoIdob3ZlcuWQjuWcqOWAmemAieaXtumXtOWMuumXtOeahOWImeS4unRydWXvvIzlkKbliJlmYWxzZSAqL1xyXG4gICAgaG92ZXJEYXRlVHlwZT86IERheVN0YXR1c0ZvclJhbmdlUGlja2VyO1xyXG59XHJcblxyXG4vKipcclxuICog5Yy66Ze05pe26Ze06YCJ5oup5Zyo5omA5pyJ5pel5pyf5aSp5pWw6Z2i5p2/55qE54q25oCB5Y+K5a+55bqU5qC35byPXHJcbiAqIFxyXG4gKiBub3JtYWwgLSDmraPluLjml6XmnJ/lpKnmlbAg5peg6aKd5aSW5qC35byPXHJcbiAqIFxyXG4gKiB3aXRoaW4taG92ZXIgLSDlnKhob3ZlcueahOaXtumXtOWMuumXtOmHjOmdoiDmnInomZrnur/ovrnmoYZcclxuICogXHJcbiAqIHdpdGhpbi1zZWxlY3RlZCAtIOWcqOW3sumAieeahOaXtumXtOWMuumXtOmHjOmdoiDmnInog4zmma/oibJcclxuICogXHJcbiAqIHdpdGhpbi1zZWxlY3RlZC1ob3ZlciAtIOWcqOW3sumAieeahOaXtumXtOWMuumXtOmHjOmdouiiq2hvdmVyIOWKoOa3seiDjOaZr+iJslxyXG4gKi9cclxuZXhwb3J0IHR5cGUgRGF5U3RhdHVzRm9yUmFuZ2VQaWNrZXIgPSAnbm9ybWFsJyB8ICd3aXRoaW4taG92ZXInIHwgJ3dpdGhpbi1zZWxlY3RlZCcgfCAnd2l0aGluLXNlbGVjdGVkLWhvdmVyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgWWVhckRhdGEgZXh0ZW5kcyBEYXRlRGF0YSB7IH1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTW9udGhEYXRhIGV4dGVuZHMgRGF0ZURhdGEgeyB9Il19