@ng-bootstrap/ng-bootstrap
Version:
Angular powered Bootstrap
297 lines • 45.8 kB
JavaScript
import { NgbCalendar } from './ngb-calendar';
import { NgbDate } from './ngb-date';
import { inject, Injectable } from '@angular/core';
import { isInteger, toInteger } from '../util/util';
import { Subject } from 'rxjs';
import { buildMonths, checkDateInRange, checkMinBeforeMax, generateSelectBoxMonths, generateSelectBoxYears, isChangedDate, isChangedMonth, isDateSelectable, nextMonthDisabled, prevMonthDisabled, } from './datepicker-tools';
import { filter } from 'rxjs/operators';
import { NgbDatepickerI18n } from './datepicker-i18n';
import { TranslationWidth } from '@angular/common';
import * as i0 from "@angular/core";
export class NgbDatepickerService {
constructor() {
this._VALIDATORS = {
dayTemplateData: (dayTemplateData) => {
if (this._state.dayTemplateData !== dayTemplateData) {
return { dayTemplateData };
}
},
displayMonths: (displayMonths) => {
displayMonths = toInteger(displayMonths);
if (isInteger(displayMonths) && displayMonths > 0 && this._state.displayMonths !== displayMonths) {
return { displayMonths };
}
},
disabled: (disabled) => {
if (this._state.disabled !== disabled) {
return { disabled };
}
},
firstDayOfWeek: (firstDayOfWeek) => {
firstDayOfWeek = toInteger(firstDayOfWeek);
if (isInteger(firstDayOfWeek) && firstDayOfWeek >= 0 && this._state.firstDayOfWeek !== firstDayOfWeek) {
return { firstDayOfWeek };
}
},
focusVisible: (focusVisible) => {
if (this._state.focusVisible !== focusVisible && !this._state.disabled) {
return { focusVisible };
}
},
markDisabled: (markDisabled) => {
if (this._state.markDisabled !== markDisabled) {
return { markDisabled };
}
},
maxDate: (date) => {
const maxDate = this.toValidDate(date, null);
if (isChangedDate(this._state.maxDate, maxDate)) {
return { maxDate };
}
},
minDate: (date) => {
const minDate = this.toValidDate(date, null);
if (isChangedDate(this._state.minDate, minDate)) {
return { minDate };
}
},
navigation: (navigation) => {
if (this._state.navigation !== navigation) {
return { navigation };
}
},
outsideDays: (outsideDays) => {
if (this._state.outsideDays !== outsideDays) {
return { outsideDays };
}
},
weekdays: (weekdays) => {
const weekdayWidth = weekdays === true || weekdays === false ? TranslationWidth.Short : weekdays;
const weekdaysVisible = weekdays === true || weekdays === false ? weekdays : true;
if (this._state.weekdayWidth !== weekdayWidth || this._state.weekdaysVisible !== weekdaysVisible) {
return { weekdayWidth, weekdaysVisible };
}
},
};
this._calendar = inject(NgbCalendar);
this._i18n = inject(NgbDatepickerI18n);
this._model$ = new Subject();
this._dateSelect$ = new Subject();
this._state = {
dayTemplateData: null,
markDisabled: null,
maxDate: null,
minDate: null,
disabled: false,
displayMonths: 1,
firstDate: null,
firstDayOfWeek: 1,
lastDate: null,
focusDate: null,
focusVisible: false,
months: [],
navigation: 'select',
outsideDays: 'visible',
prevDisabled: false,
nextDisabled: false,
selectedDate: null,
selectBoxes: { years: [], months: [] },
weekdayWidth: TranslationWidth.Short,
weekdaysVisible: true,
};
}
get model$() {
return this._model$.pipe(filter((model) => model.months.length > 0));
}
get dateSelect$() {
return this._dateSelect$.pipe(filter((date) => date !== null));
}
set(options) {
let patch = Object.keys(options)
.map((key) => this._VALIDATORS[key](options[key]))
.reduce((obj, part) => ({ ...obj, ...part }), {});
if (Object.keys(patch).length > 0) {
this._nextState(patch);
}
}
focus(date) {
const focusedDate = this.toValidDate(date, null);
if (focusedDate != null && !this._state.disabled && isChangedDate(this._state.focusDate, focusedDate)) {
this._nextState({ focusDate: date });
}
}
focusSelect() {
if (isDateSelectable(this._state.focusDate, this._state)) {
this.select(this._state.focusDate, { emitEvent: true });
}
}
open(date) {
const firstDate = this.toValidDate(date, this._calendar.getToday());
if (firstDate != null &&
!this._state.disabled &&
(!this._state.firstDate || isChangedMonth(this._state.firstDate, firstDate))) {
this._nextState({ firstDate });
}
}
select(date, options = {}) {
const selectedDate = this.toValidDate(date, null);
if (selectedDate != null && !this._state.disabled) {
if (isChangedDate(this._state.selectedDate, selectedDate)) {
this._nextState({ selectedDate });
}
if (options.emitEvent && isDateSelectable(selectedDate, this._state)) {
this._dateSelect$.next(selectedDate);
}
}
}
toValidDate(date, defaultValue) {
const ngbDate = NgbDate.from(date);
if (defaultValue === undefined) {
defaultValue = this._calendar.getToday();
}
return this._calendar.isValid(ngbDate) ? ngbDate : defaultValue;
}
getMonth(struct) {
for (let month of this._state.months) {
if (struct.month === month.number && struct.year === month.year) {
return month;
}
}
throw new Error(`month ${struct.month} of year ${struct.year} not found`);
}
_nextState(patch) {
const newState = this._updateState(patch);
this._patchContexts(newState);
this._state = newState;
this._model$.next(this._state);
}
_patchContexts(state) {
const { months, displayMonths, selectedDate, focusDate, focusVisible, disabled, outsideDays } = state;
state.months.forEach((month) => {
month.weeks.forEach((week) => {
week.days.forEach((day) => {
// patch focus flag
if (focusDate) {
day.context.focused = focusDate.equals(day.date) && focusVisible;
}
// calculating tabindex
day.tabindex =
!disabled && focusDate && day.date.equals(focusDate) && focusDate.month === month.number ? 0 : -1;
// override context disabled
if (disabled === true) {
day.context.disabled = true;
}
// patch selection flag
if (selectedDate !== undefined) {
day.context.selected = selectedDate !== null && selectedDate.equals(day.date);
}
// visibility
if (month.number !== day.date.month) {
day.hidden =
outsideDays === 'hidden' ||
outsideDays === 'collapsed' ||
(displayMonths > 1 &&
day.date.after(months[0].firstDate) &&
day.date.before(months[displayMonths - 1].lastDate));
}
});
});
});
}
_updateState(patch) {
// patching fields
const state = Object.assign({}, this._state, patch);
let startDate = state.firstDate;
// min/max dates changed
if ('minDate' in patch || 'maxDate' in patch) {
checkMinBeforeMax(state.minDate, state.maxDate);
state.focusDate = checkDateInRange(state.focusDate, state.minDate, state.maxDate);
state.firstDate = checkDateInRange(state.firstDate, state.minDate, state.maxDate);
startDate = state.focusDate;
}
// disabled
if ('disabled' in patch) {
state.focusVisible = false;
}
// initial rebuild via 'select()'
if ('selectedDate' in patch && this._state.months.length === 0) {
startDate = state.selectedDate;
}
// terminate early if only focus visibility was changed
if ('focusVisible' in patch) {
return state;
}
// focus date changed
if ('focusDate' in patch) {
state.focusDate = checkDateInRange(state.focusDate, state.minDate, state.maxDate);
startDate = state.focusDate;
// nothing to rebuild if only focus changed and it is still visible
if (state.months.length !== 0 &&
state.focusDate &&
!state.focusDate.before(state.firstDate) &&
!state.focusDate.after(state.lastDate)) {
return state;
}
}
// first date changed
if ('firstDate' in patch) {
state.firstDate = checkDateInRange(state.firstDate, state.minDate, state.maxDate);
startDate = state.firstDate;
}
// rebuilding months
if (startDate) {
const forceRebuild = 'dayTemplateData' in patch ||
'firstDayOfWeek' in patch ||
'markDisabled' in patch ||
'minDate' in patch ||
'maxDate' in patch ||
'disabled' in patch ||
'outsideDays' in patch ||
'weekdaysVisible' in patch;
const months = buildMonths(this._calendar, startDate, state, this._i18n, forceRebuild);
// updating months and boundary dates
state.months = months;
state.firstDate = months[0].firstDate;
state.lastDate = months[months.length - 1].lastDate;
// reset selected date if 'markDisabled' returns true
if ('selectedDate' in patch && !isDateSelectable(state.selectedDate, state)) {
state.selectedDate = null;
}
// adjusting focus after months were built
if ('firstDate' in patch) {
if (!state.focusDate || state.focusDate.before(state.firstDate) || state.focusDate.after(state.lastDate)) {
state.focusDate = startDate;
}
}
// adjusting months/years for the select box navigation
const yearChanged = !this._state.firstDate || this._state.firstDate.year !== state.firstDate.year;
const monthChanged = !this._state.firstDate || this._state.firstDate.month !== state.firstDate.month;
if (state.navigation === 'select') {
// years -> boundaries (min/max were changed)
if ('minDate' in patch || 'maxDate' in patch || state.selectBoxes.years.length === 0 || yearChanged) {
state.selectBoxes.years = generateSelectBoxYears(state.firstDate, state.minDate, state.maxDate);
}
// months -> when current year or boundaries change
if ('minDate' in patch || 'maxDate' in patch || state.selectBoxes.months.length === 0 || yearChanged) {
state.selectBoxes.months = generateSelectBoxMonths(this._calendar, state.firstDate, state.minDate, state.maxDate);
}
}
else {
state.selectBoxes = { years: [], months: [] };
}
// updating navigation arrows -> boundaries change (min/max) or month/year changes
if ((state.navigation === 'arrows' || state.navigation === 'select') &&
(monthChanged || yearChanged || 'minDate' in patch || 'maxDate' in patch || 'disabled' in patch)) {
state.prevDisabled = state.disabled || prevMonthDisabled(this._calendar, state.firstDate, state.minDate);
state.nextDisabled = state.disabled || nextMonthDisabled(this._calendar, state.lastDate, state.maxDate);
}
}
return state;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgbDatepickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgbDatepickerService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgbDatepickerService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BELE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUNOLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdEIsYUFBYSxFQUNiLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGlCQUFpQixHQUNqQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFpQm5ELE1BQU0sT0FBTyxvQkFBb0I7SUFEakM7UUFFUyxnQkFBVyxHQUVmO1lBQ0gsZUFBZSxFQUFFLENBQUMsZUFBbUMsRUFBRSxFQUFFO2dCQUN4RCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxLQUFLLGVBQWUsRUFBRTtvQkFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxDQUFDO2lCQUMzQjtZQUNGLENBQUM7WUFDRCxhQUFhLEVBQUUsQ0FBQyxhQUFxQixFQUFFLEVBQUU7Z0JBQ3hDLGFBQWEsR0FBRyxTQUFT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QUFFLEVBQUUsQ0FBQzthQUM5QztZQUVELGtGQUFrRjtZQUNsRixJQUNDLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUM7Z0JBQ2hFLENBQUMsWUFBWSxJQUFJLFdBQVcsSUFBSSxTQUFTLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxLQUFLLElBQUksVUFBVSxJQUFJLEtBQUssQ0FBQyxFQUMvRjtnQkFDRCxLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxRQUFRLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekcsS0FBSyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDeEc7U0FDRDtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQzs4R0F6VVcsb0JBQW9CO2tIQUFwQixvQkFBb0I7OzJGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ2JDYWxlbmRhciB9IGZyb20gJy4vbmdiLWNhbGVuZGFyJztcbmltcG9ydCB7IE5nYkRhdGUgfSBmcm9tICcuL25nYi1kYXRlJztcbmltcG9ydCB7IE5nYkRhdGVTdHJ1Y3QgfSBmcm9tICcuL25nYi1kYXRlLXN0cnVjdCc7XG5pbXBvcnQgeyBEYXRlcGlja2VyVmlld01vZGVsLCBOZ2JEYXlUZW1wbGF0ZURhdGEsIE5nYk1hcmtEaXNhYmxlZCB9IGZyb20gJy4vZGF0ZXBpY2tlci12aWV3LW1vZGVsJztcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNJbnRlZ2VyLCB0b0ludGVnZXIgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcblx0YnVpbGRNb250aHMsXG5cdGNoZWNrRGF0ZUluUmFuZ2UsXG5cdGNoZWNrTWluQmVmb3JlTWF4LFxuXHRnZW5lcmF0ZVNlbGVjdEJveE1vbnRocyxcblx0Z2VuZXJhdGVTZWxlY3RCb3hZZWFycyxcblx0aXNDaGFuZ2VkRGF0ZSxcblx0aXNDaGFuZ2VkTW9udGgsXG5cdGlzRGF0ZVNlbGVjdGFibGUsXG5cdG5leHRNb250aERpc2FibGVkLFxuXHRwcmV2TW9udGhEaXNhYmxlZCxcbn0gZnJvbSAnLi9kYXRlcGlja2VyLXRvb2xzJztcblxuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTmdiRGF0ZXBpY2tlckkxOG4gfSBmcm9tICcuL2RhdGVwaWNrZXItaTE4bic7XG5pbXBvcnQgeyBUcmFuc2xhdGlvbldpZHRoIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuZXhwb3J0IHR5cGUgRGF0ZXBpY2tlclNlcnZpY2VJbnB1dHMgPSBQYXJ0aWFsPHtcblx0ZGF5VGVtcGxhdGVEYXRhOiBOZ2JEYXlUZW1wbGF0ZURhdGE7XG5cdGRpc3BsYXlNb250aHM6IG51bWJlcjtcblx0ZGlzYWJsZWQ6IGJvb2xlYW47XG5cdGZpcnN0RGF5T2ZXZWVrOiBudW1iZXI7XG5cdGZvY3VzVmlzaWJsZTogYm9vbGVhbjtcblx0bWFya0Rpc2FibGVkOiBOZ2JNYXJrRGlzYWJsZWQ7XG5cdG1heERhdGU6IE5nYkRhdGUgfCBudWxsO1xuXHRtaW5EYXRlOiBOZ2JEYXRlIHwgbnVsbDtcblx0bmF2aWdhdGlvbjogJ3NlbGVjdCcgfCAnYXJyb3dzJyB8ICdub25lJztcblx0b3V0c2lkZURheXM6ICd2aXNpYmxlJyB8ICdjb2xsYXBzZWQnIHwgJ2hpZGRlbic7XG5cdHdlZWtkYXlzOiBUcmFuc2xhdGlvbldpZHRoIHwgYm9vbGVhbjtcbn0+O1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmdiRGF0ZXBpY2tlclNlcnZpY2Uge1xuXHRwcml2YXRlIF9WQUxJREFUT1JTOiB7XG5cdFx0W0sgaW4ga2V5b2YgRGF0ZXBpY2tlclNlcnZpY2VJbnB1dHNdOiAodjogRGF0ZXBpY2tlclNlcnZpY2VJbnB1dHNbS10pID0+IFBhcnRpYWw8RGF0ZXBpY2tlclZpZXdNb2RlbD4gfCB2b2lkO1xuXHR9ID0ge1xuXHRcdGRheVRlbXBsYXRlRGF0YTogKGRheVRlbXBsYXRlRGF0YTogTmdiRGF5VGVtcGxhdGVEYXRhKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5fc3RhdGUuZGF5VGVtcGxhdGVEYXRhICE9PSBkYXlUZW1wbGF0ZURhdGEpIHtcblx0XHRcdFx0cmV0dXJuIHsgZGF5VGVtcGxhdGVEYXRhIH07XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRkaXNwbGF5TW9udGhzOiAoZGlzcGxheU1vbnRoczogbnVtYmVyKSA9PiB7XG5cdFx0XHRkaXNwbGF5TW9udGhzID0gdG9JbnRlZ2VyKGRpc3BsYXlNb250aHMpO1xuXHRcdFx0aWYgKGlzSW50ZWdlcihkaXNwbGF5TW9udGhzKSAmJiBkaXNwbGF5TW9udGhzID4gMCAmJiB0aGlzLl9zdGF0ZS5kaXNwbGF5TW9udGhzICE9PSBkaXNwbGF5TW9udGhzKSB7XG5cdFx0XHRcdHJldHVybiB7IGRpc3BsYXlNb250aHMgfTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGRpc2FibGVkOiAoZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcblx0XHRcdGlmICh0aGlzLl9zdGF0ZS5kaXNhYmxlZCAhPT0gZGlzYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuIHsgZGlzYWJsZWQgfTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGZpcnN0RGF5T2ZXZWVrOiAoZmlyc3REYXlPZldlZWs6IG51bWJlcikgPT4ge1xuXHRcdFx0Zmlyc3REYXlPZldlZWsgPSB0b0ludGVnZXIoZmlyc3REYXlPZldlZWspO1xuXHRcdFx0aWYgKGlzSW50ZWdlcihmaXJzdERheU9mV2VlaykgJiYgZmlyc3REYXlPZldlZWsgPj0gMCAmJiB0aGlzLl9zdGF0ZS5maXJzdERheU9mV2VlayAhPT0gZmlyc3REYXlPZldlZWspIHtcblx0XHRcdFx0cmV0dXJuIHsgZmlyc3REYXlPZldlZWsgfTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGZvY3VzVmlzaWJsZTogKGZvY3VzVmlzaWJsZTogYm9vbGVhbikgPT4ge1xuXHRcdFx0aWYgKHRoaXMuX3N0YXRlLmZvY3VzVmlzaWJsZSAhPT0gZm9jdXNWaXNpYmxlICYmICF0aGlzLl9zdGF0ZS5kaXNhYmxlZCkge1xuXHRcdFx0XHRyZXR1cm4geyBmb2N1c1Zpc2libGUgfTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG1hcmtEaXNhYmxlZDogKG1hcmtEaXNhYmxlZDogTmdiTWFya0Rpc2FibGVkKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5fc3RhdGUubWFya0Rpc2FibGVkICE9PSBtYXJrRGlzYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuIHsgbWFya0Rpc2FibGVkIH07XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRtYXhEYXRlOiAoZGF0ZTogTmdiRGF0ZSB8IG51bGwpID0+IHtcblx0XHRcdGNvbnN0IG1heERhdGUgPSB0aGlzLnRvVmFsaWREYXRlKGRhdGUsIG51bGwpO1xuXHRcdFx0aWYgKGlzQ2hhbmdlZERhdGUodGhpcy5fc3RhdGUubWF4RGF0ZSwgbWF4RGF0ZSkpIHtcblx0XHRcdFx0cmV0dXJuIHsgbWF4RGF0ZSB9O1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0bWluRGF0ZTogKGRhdGU6IE5nYkRhdGUgfCBudWxsKSA9PiB7XG5cdFx0XHRjb25zdCBtaW5EYXRlID0gdGhpcy50b1ZhbGlkRGF0ZShkYXRlLCBudWxsKTtcblx0XHRcdGlmIChpc0NoYW5nZWREYXRlKHRoaXMuX3N0YXRlLm1pbkRhdGUsIG1pbkRhdGUpKSB7XG5cdFx0XHRcdHJldHVybiB7IG1pbkRhdGUgfTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG5hdmlnYXRpb246IChuYXZpZ2F0aW9uOiAnc2VsZWN0JyB8ICdhcnJvd3MnIHwgJ25vbmUnKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5fc3RhdGUubmF2aWdhdGlvbiAhPT0gbmF2aWdhdGlvbikge1xuXHRcdFx0XHRyZXR1cm4geyBuYXZpZ2F0aW9uIH07XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvdXRzaWRlRGF5czogKG91dHNpZGVEYXlzOiAndmlzaWJsZScgfCAnY29sbGFwc2VkJyB8ICdoaWRkZW4nKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5fc3RhdGUub3V0c2lkZURheXMgIT09IG91dHNpZGVEYXlzKSB7XG5cdFx0XHRcdHJldHVybiB7IG91dHNpZGVEYXlzIH07XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR3ZWVrZGF5czogKHdlZWtkYXlzOiBib29sZWFuIHwgVHJhbnNsYXRpb25XaWR0aCkgPT4ge1xuXHRcdFx0Y29uc3Qgd2Vla2RheVdpZHRoID0gd2Vla2RheXMgPT09IHRydWUgfHwgd2Vla2RheXMgPT09IGZhbHNlID8gVHJhbnNsYXRpb25XaWR0aC5TaG9ydCA6IHdlZWtkYXlzO1xuXHRcdFx0Y29uc3Qgd2Vla2RheXNWaXNpYmxlID0gd2Vla2RheXMgPT09IHRydWUgfHwgd2Vla2RheXMgPT09IGZhbHNlID8gd2Vla2RheXMgOiB0cnVlO1xuXHRcdFx0aWYgKHRoaXMuX3N0YXRlLndlZWtkYXlXaWR0aCAhPT0gd2Vla2RheVdpZHRoIHx8IHRoaXMuX3N0YXRlLndlZWtkYXlzVmlzaWJsZSAhPT0gd2Vla2RheXNWaXNpYmxlKSB7XG5cdFx0XHRcdHJldHVybiB7IHdlZWtkYXlXaWR0aCwgd2Vla2RheXNWaXNpYmxlIH07XG5cdFx0XHR9XG5cdFx0fSxcblx0fTtcblxuXHRwcml2YXRlIF9jYWxlbmRhciA9IGluamVjdChOZ2JDYWxlbmRhcik7XG5cdHByaXZhdGUgX2kxOG4gPSBpbmplY3QoTmdiRGF0ZXBpY2tlckkxOG4pO1xuXG5cdHByaXZhdGUgX21vZGVsJCA9IG5ldyBTdWJqZWN0PERhdGVwaWNrZXJWaWV3TW9kZWw+KCk7XG5cblx0cHJpdmF0ZSBfZGF0ZVNlbGVjdCQgPSBuZXcgU3ViamVjdDxOZ2JEYXRlPigpO1xuXG5cdHByaXZhdGUgX3N0YXRlOiBEYXRlcGlja2VyVmlld01vZGVsID0ge1xuXHRcdGRheVRlbXBsYXRlRGF0YTogbnVsbCxcblx0XHRtYXJrRGlzYWJsZWQ6IG51bGwsXG5cdFx0bWF4RGF0ZTogbnVsbCxcblx0XHRtaW5EYXRlOiBudWxsLFxuXHRcdGRpc2FibGVkOiBmYWxzZSxcblx0XHRkaXNwbGF5TW9udGhzOiAxLFxuXHRcdGZpcnN0RGF0ZTogbnVsbCxcblx0XHRmaXJzdERheU9mV2VlazogMSxcblx0XHRsYXN0RGF0ZTogbnVsbCxcblx0XHRmb2N1c0RhdGU6IG51bGwsXG5cdFx0Zm9jdXNWaXNpYmxlOiBmYWxzZSxcblx0XHRtb250aHM6IFtdLFxuXHRcdG5hdmlnYXRpb246ICdzZWxlY3QnLFxuXHRcdG91dHNpZGVEYXlzOiAndmlzaWJsZScsXG5cdFx0cHJldkRpc2FibGVkOiBmYWxzZSxcblx0XHRuZXh0RGlzYWJsZWQ6IGZhbHNlLFxuXHRcdHNlbGVjdGVkRGF0ZTogbnVsbCxcblx0XHRzZWxlY3RCb3hlczogeyB5ZWFyczogW10sIG1vbnRoczogW10gfSxcblx0XHR3ZWVrZGF5V2lkdGg6IFRyYW5zbGF0aW9uV2lkdGguU2hvcnQsXG5cdFx0d2Vla2RheXNWaXNpYmxlOiB0cnVlLFxuXHR9O1xuXG5cdGdldCBtb2RlbCQoKTogT2JzZXJ2YWJsZTxEYXRlcGlja2VyVmlld01vZGVsPiB7XG5cdFx0cmV0dXJuIHRoaXMuX21vZGVsJC5waXBlKGZpbHRlcigobW9kZWwpID0+IG1vZGVsLm1vbnRocy5sZW5ndGggPiAwKSk7XG5cdH1cblxuXHRnZXQgZGF0ZVNlbGVjdCQoKTogT2JzZXJ2YWJsZTxOZ2JEYXRlPiB7XG5cdFx0cmV0dXJuIHRoaXMuX2RhdGVTZWxlY3QkLnBpcGUoZmlsdGVyKChkYXRlKSA9PiBkYXRlICE9PSBudWxsKSk7XG5cdH1cblxuXHRzZXQob3B0aW9uczogRGF0ZXBpY2tlclNlcnZpY2VJbnB1dHMpIHtcblx0XHRsZXQgcGF0Y2ggPSBPYmplY3Qua2V5cyhvcHRpb25zKVxuXHRcdFx0Lm1hcCgoa2V5KSA9PiB0aGlzLl9WQUxJREFUT1JTW2tleV0ob3B0aW9uc1trZXldKSlcblx0XHRcdC5yZWR1Y2UoKG9iaiwgcGFydCkgPT4gKHsgLi4ub2JqLCAuLi5wYXJ0IH0pLCB7fSk7XG5cblx0XHRpZiAoT2JqZWN0LmtleXMocGF0Y2gpLmxlbmd0aCA+IDApIHtcblx0XHRcdHRoaXMuX25leHRTdGF0ZShwYXRjaCk7XG5cdFx0fVxuXHR9XG5cblx0Zm9jdXMoZGF0ZT86IE5nYkRhdGUgfCBudWxsKSB7XG5cdFx0Y29uc3QgZm9jdXNlZERhdGUgPSB0aGlzLnRvVmFsaWREYXRlKGRhdGUsIG51bGwpO1xuXHRcdGlmIChmb2N1c2VkRGF0ZSAhPSBudWxsICYmICF0aGlzLl9zdGF0ZS5kaXNhYmxlZCAmJiBpc0NoYW5nZWREYXRlKHRoaXMuX3N0YXRlLmZvY3VzRGF0ZSwgZm9jdXNlZERhdGUpKSB7XG5cdFx0XHR0aGlzLl9uZXh0U3RhdGUoeyBmb2N1c0RhdGU6IGRhdGUgfSk7XG5cdFx0fVxuXHR9XG5cblx0Zm9jdXNTZWxlY3QoKSB7XG5cdFx0aWYgKGlzRGF0ZVNlbGVjdGFibGUodGhpcy5fc3RhdGUuZm9jdXNEYXRlLCB0aGlzLl9zdGF0ZSkpIHtcblx0XHRcdHRoaXMuc2VsZWN0KHRoaXMuX3N0YXRlLmZvY3VzRGF0ZSwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG5cdFx0fVxuXHR9XG5cblx0b3BlbihkYXRlPzogTmdiRGF0ZSB8IG51bGwpIHtcblx0XHRjb25zdCBmaXJzdERhdGUgPSB0aGlzLnRvVmFsaWREYXRlKGRhdGUsIHRoaXMuX2NhbGVuZGFyLmdldFRvZGF5KCkpO1xuXHRcdGlmIChcblx0XHRcdGZpcnN0RGF0ZSAhPSBudWxsICYmXG5cdFx0XHQhdGhpcy5fc3RhdGUuZGlzYWJsZWQgJiZcblx0XHRcdCghdGhpcy5fc3RhdGUuZmlyc3REYXRlIHx8IGlzQ2hhbmdlZE1vbnRoKHRoaXMuX3N0YXRlLmZpcnN0RGF0ZSwgZmlyc3REYXRlKSlcblx0XHQpIHtcblx0XHRcdHRoaXMuX25leHRTdGF0ZSh7IGZpcnN0RGF0ZSB9KTtcblx0XHR9XG5cdH1cblxuXHRzZWxlY3QoZGF0ZT86IE5nYkRhdGUgfCBudWxsLCBvcHRpb25zOiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSA9IHt9KSB7XG5cdFx0Y29uc3Qgc2VsZWN0ZWREYXRlID0gdGhpcy50b1ZhbGlkRGF0ZShkYXRlLCBudWxsKTtcblx0XHRpZiAoc2VsZWN0ZWREYXRlICE9IG51bGwgJiYgIXRoaXMuX3N0YXRlLmRpc2FibGVkKSB7XG5cdFx0XHRpZiAoaXNDaGFuZ2VkRGF0ZSh0aGlzLl9zdGF0ZS5zZWxlY3RlZERhdGUsIHNlbGVjdGVkRGF0ZSkpIHtcblx0XHRcdFx0dGhpcy5fbmV4dFN0YXRlKHsgc2VsZWN0ZWREYXRlIH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob3B0aW9ucy5lbWl0RXZlbnQgJiYgaXNEYXRlU2VsZWN0YWJsZShzZWxlY3RlZERhdGUsIHRoaXMuX3N0YXRlKSkge1xuXHRcdFx0XHR0aGlzLl9kYXRlU2VsZWN0JC5uZXh0KHNlbGVjdGVkRGF0ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dG9WYWxpZERhdGUoZGF0ZT86IE5nYkRhdGVTdHJ1Y3QgfCBudWxsLCBkZWZhdWx0VmFsdWU/OiBOZ2JEYXRlIHwgbnVsbCk6IE5nYkRhdGUgfCBudWxsIHtcblx0XHRjb25zdCBuZ2JEYXRlID0gTmdiRGF0ZS5mcm9tKGRhdGUpO1xuXHRcdGlmIChkZWZhdWx0VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZGVmYXVsdFZhbHVlID0gdGhpcy5fY2FsZW5kYXIuZ2V0VG9kYXkoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX2NhbGVuZGFyLmlzVmFsaWQobmdiRGF0ZSkgPyBuZ2JEYXRlIDogZGVmYXVsdFZhbHVlO1xuXHR9XG5cblx0Z2V0TW9udGgoc3RydWN0OiBOZ2JEYXRlU3RydWN0KSB7XG5cdFx0Zm9yIChsZXQgbW9udGggb2YgdGhpcy5fc3RhdGUubW9udGhzKSB7XG5cdFx0XHRpZiAoc3RydWN0Lm1vbnRoID09PSBtb250aC5udW1iZXIgJiYgc3RydWN0LnllYXIgPT09IG1vbnRoLnllYXIpIHtcblx0XHRcdFx0cmV0dXJuIG1vbnRoO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoYG1vbnRoICR7c3RydWN0Lm1vbnRofSBvZiB5ZWFyICR7c3RydWN0LnllYXJ9IG5vdCBmb3VuZGApO1xuXHR9XG5cblx0cHJpdmF0ZSBfbmV4dFN0YXRlKHBhdGNoOiBQYXJ0aWFsPERhdGVwaWNrZXJWaWV3TW9kZWw+KSB7XG5cdFx0Y29uc3QgbmV3U3RhdGUgPSB0aGlzLl91cGRhdGVTdGF0ZShwYXRjaCk7XG5cdFx0dGhpcy5fcGF0Y2hDb250ZXh0cyhuZXdTdGF0ZSk7XG5cdFx0dGhpcy5fc3RhdGUgPSBuZXdTdGF0ZTtcblx0XHR0aGlzLl9tb2RlbCQubmV4dCh0aGlzLl9zdGF0ZSk7XG5cdH1cblxuXHRwcml2YXRlIF9wYXRjaENvbnRleHRzKHN0YXRlOiBEYXRlcGlja2VyVmlld01vZGVsKSB7XG5cdFx0Y29uc3QgeyBtb250aHMsIGRpc3BsYXlNb250aHMsIHNlbGVjdGVkRGF0ZSwgZm9jdXNEYXRlLCBmb2N1c1Zpc2libGUsIGRpc2FibGVkLCBvdXRzaWRlRGF5cyB9ID0gc3RhdGU7XG5cdFx0c3RhdGUubW9udGhzLmZvckVhY2goKG1vbnRoKSA9PiB7XG5cdFx0XHRtb250aC53ZWVrcy5mb3JFYWNoKCh3ZWVrKSA9PiB7XG5cdFx0XHRcdHdlZWsuZGF5cy5mb3JFYWNoKChkYXkpID0+IHtcblx0XHRcdFx0XHQvLyBwYXRjaCBmb2N1cyBmbGFnXG5cdFx0XHRcdFx0aWYgKGZvY3VzRGF0ZSkge1xuXHRcdFx0XHRcdFx0ZGF5LmNvbnRleHQuZm9jdXNlZCA9IGZvY3VzRGF0ZS5lcXVhbHMoZGF5LmRhdGUpICYmIGZvY3VzVmlzaWJsZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBjYWxjdWxhdGluZyB0YWJpbmRleFxuXHRcdFx0XHRcdGRheS50YWJpbmRleCA9XG5cdFx0XHRcdFx0XHQhZGlzYWJsZWQgJiYgZm9jdXNEYXRlICYmIGRheS5kYXRlLmVxdWFscyhmb2N1c0RhdGUpICYmIGZvY3VzRGF0ZS5tb250aCA9PT0gbW9udGgubnVtYmVyID8gMCA6IC0xO1xuXG5cdFx0XHRcdFx0Ly8gb3ZlcnJpZGUgY29udGV4dCBkaXNhYmxlZFxuXHRcdFx0XHRcdGlmIChkaXNhYmxlZCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0ZGF5LmNvbnRleHQuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHBhdGNoIHNlbGVjdGlvbiBmbGFnXG5cdFx0XHRcdFx0aWYgKHNlbGVjdGVkRGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRkYXkuY29udGV4dC5zZWxlY3RlZCA9IHNlbGVjdGVkRGF0ZSAhPT0gbnVsbCAmJiBzZWxlY3RlZERhdGUuZXF1YWxzKGRheS5kYXRlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB2aXNpYmlsaXR5XG5cdFx0XHRcdFx0aWYgKG1vbnRoLm51bWJlciAhPT0gZGF5LmRhdGUubW9udGgpIHtcblx0XHRcdFx0XHRcdGRheS5oaWRkZW4gPVxuXHRcdFx0XHRcdFx0XHRvdXRzaWRlRGF5cyA9PT0gJ2hpZGRlbicgfHxcblx0XHRcdFx0XHRcdFx0b3V0c2lkZURheXMgPT09ICdjb2xsYXBzZWQnIHx8XG5cdFx0XHRcdFx0XHRcdChkaXNwbGF5TW9udGhzID4gMSAmJlxuXHRcdFx0XHRcdFx0XHRcdGRheS5kYXRlLmFmdGVyKG1vbnRoc1swXS5maXJzdERhdGUpICYmXG5cdFx0XHRcdFx0XHRcdFx0ZGF5LmRhdGUuYmVmb3JlKG1vbnRoc1tkaXNwbGF5TW9udGhzIC0gMV0ubGFzdERhdGUpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIF91cGRhdGVTdGF0ZShwYXRjaDogUGFydGlhbDxEYXRlcGlja2VyVmlld01vZGVsPik6IERhdGVwaWNrZXJWaWV3TW9kZWwge1xuXHRcdC8vIHBhdGNoaW5nIGZpZWxkc1xuXHRcdGNvbnN0IHN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fc3RhdGUsIHBhdGNoKTtcblxuXHRcdGxldCBzdGFydERhdGUgPSBzdGF0ZS5maXJzdERhdGU7XG5cblx0XHQvLyBtaW4vbWF4IGRhdGVzIGNoYW5nZWRcblx0XHRpZiAoJ21pbkRhdGUnIGluIHBhdGNoIHx8ICdtYXhEYXRlJyBpbiBwYXRjaCkge1xuXHRcdFx0Y2hlY2tNaW5CZWZvcmVNYXgoc3RhdGUubWluRGF0ZSwgc3RhdGUubWF4RGF0ZSk7XG5cdFx0XHRzdGF0ZS5mb2N1c0RhdGUgPSBjaGVja0RhdGVJblJhbmdlKHN0YXRlLmZvY3VzRGF0ZSwgc3RhdGUubWluRGF0ZSwgc3RhdGUubWF4RGF0ZSk7XG5cdFx0XHRzdGF0ZS5maXJzdERhdGUgPSBjaGVja0RhdGVJblJhbmdlKHN0YXRlLmZpcnN0RGF0ZSwgc3RhdGUubWluRGF0ZSwgc3RhdGUubWF4RGF0ZSk7XG5cdFx0XHRzdGFydERhdGUgPSBzdGF0ZS5mb2N1c0RhdGU7XG5cdFx0fVxuXG5cdFx0Ly8gZGlzYWJsZWRcblx0XHRpZiAoJ2Rpc2FibGVkJyBpbiBwYXRjaCkge1xuXHRcdFx0c3RhdGUuZm9jdXNWaXNpYmxlID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaW5pdGlhbCByZWJ1aWxkIHZpYSAnc2VsZWN0KCknXG5cdFx0aWYgKCdzZWxlY3RlZERhdGUnIGluIHBhdGNoICYmIHRoaXMuX3N0YXRlLm1vbnRocy5sZW5ndGggPT09IDApIHtcblx0XHRcdHN0YXJ0RGF0ZSA9IHN0YXRlLnNlbGVjdGVkRGF0ZTtcblx0XHR9XG5cblx0XHQvLyB0ZXJtaW5hdGUgZWFybHkgaWYgb25seSBmb2N1cyB2aXNpYmlsaXR5IHdhcyBjaGFuZ2VkXG5cdFx0aWYgKCdmb2N1c1Zpc2libGUnIGluIHBhdGNoKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMgZGF0ZSBjaGFuZ2VkXG5cdFx0aWYgKCdmb2N1c0RhdGUnIGluIHBhdGNoKSB7XG5cdFx0XHRzdGF0ZS5mb2N1c0RhdGUgPSBjaGVja0RhdGVJblJhbmdlKHN0YXRlLmZvY3VzRGF0ZSwgc3RhdGUubWluRGF0ZSwgc3RhdGUubWF4RGF0ZSk7XG5cdFx0XHRzdGFydERhdGUgPSBzdGF0ZS5mb2N1c0RhdGU7XG5cblx0XHRcdC8vIG5vdGhpbmcgdG8gcmVidWlsZCBpZiBvbmx5IGZvY3VzIGNoYW5nZWQgYW5kIGl0IGlzIHN0aWxsIHZpc2libGVcblx0XHRcdGlmIChcblx0XHRcdFx0c3RhdGUubW9udGhzLmxlbmd0aCAhPT0gMCAmJlxuXHRcdFx0XHRzdGF0ZS5mb2N1c0RhdGUgJiZcblx0XHRcdFx0IXN0YXRlLmZvY3VzRGF0ZS5iZWZvcmUoc3RhdGUuZmlyc3REYXRlKSAmJlxuXHRcdFx0XHQhc3RhdGUuZm9jdXNEYXRlLmFmdGVyKHN0YXRlLmxhc3REYXRlKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBmaXJzdCBkYXRlIGNoYW5nZWRcblx0XHRpZiAoJ2ZpcnN0RGF0ZScgaW4gcGF0Y2gpIHtcblx0XHRcdHN0YXRlLmZpcnN0RGF0ZSA9IGNoZWNrRGF0ZUluUmFuZ2Uoc3RhdGUuZmlyc3REYXRlLCBzdGF0ZS5taW5EYXRlLCBzdGF0ZS5tYXhEYXRlKTtcblx0XHRcdHN0YXJ0RGF0ZSA9IHN0YXRlLmZpcnN0RGF0ZTtcblx0XHR9XG5cblx0XHQvLyByZWJ1aWxkaW5nIG1vbnRoc1xuXHRcdGlmIChzdGFydERhdGUpIHtcblx0XHRcdGNvbnN0IGZvcmNlUmVidWlsZCA9XG5cdFx0XHRcdCdkYXlUZW1wbGF0ZURhdGEnIGluIHBhdGNoIHx8XG5cdFx0XHRcdCdmaXJzdERheU9mV2VlaycgaW4gcGF0Y2ggfHxcblx0XHRcdFx0J21hcmtEaXNhYmxlZCcgaW4gcGF0Y2ggfHxcblx0XHRcdFx0J21pbkRhdGUnIGluIHBhdGNoIHx8XG5cdFx0XHRcdCdtYXhEYXRlJyBpbiBwYXRjaCB8fFxuXHRcdFx0XHQnZGlzYWJsZWQnIGluIHBhdGNoIHx8XG5cdFx0XHRcdCdvdXRzaWRlRGF5cycgaW4gcGF0Y2ggfHxcblx0XHRcdFx0J3dlZWtkYXlzVmlzaWJsZScgaW4gcGF0Y2g7XG5cblx0XHRcdGNvbnN0IG1vbnRocyA9IGJ1aWxkTW9udGhzKHRoaXMuX2NhbGVuZGFyLCBzdGFydERhdGUsIHN0YXRlLCB0aGlzLl9pMThuLCBmb3JjZVJlYnVpbGQpO1xuXG5cdFx0XHQvLyB1cGRhdGluZyBtb250aHMgYW5kIGJvdW5kYXJ5IGRhdGVzXG5cdFx0XHRzdGF0ZS5tb250aHMgPSBtb250aHM7XG5cdFx0XHRzdGF0ZS5maXJzdERhdGUgPSBtb250aHNbMF0uZmlyc3REYXRlO1xuXHRcdFx0c3RhdGUubGFzdERhdGUgPSBtb250aHNbbW9udGhzLmxlbmd0aCAtIDFdLmxhc3REYXRlO1xuXG5cdFx0XHQvLyByZXNldCBzZWxlY3RlZCBkYXRlIGlmICdtYXJrRGlzYWJsZWQnIHJldHVybnMgdHJ1ZVxuXHRcdFx0aWYgKCdzZWxlY3RlZERhdGUnIGluIHBhdGNoICYmICFpc0RhdGVTZWxlY3RhYmxlKHN0YXRlLnNlbGVjdGVkRGF0ZSwgc3RhdGUpKSB7XG5cdFx0XHRcdHN0YXRlLnNlbGVjdGVkRGF0ZSA9IG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGFkanVzdGluZyBmb2N1cyBhZnRlciBtb250aHMgd2VyZSBidWlsdFxuXHRcdFx0aWYgKCdmaXJzdERhdGUnIGluIHBhdGNoKSB7XG5cdFx0XHRcdGlmICghc3RhdGUuZm9jdXNEYXRlIHx8IHN0YXRlLmZvY3VzRGF0ZS5iZWZvcmUoc3RhdGUuZmlyc3REYXRlKSB8fCBzdGF0ZS5mb2N1c0RhdGUuYWZ0ZXIoc3RhdGUubGFzdERhdGUpKSB7XG5cdFx0XHRcdFx0c3RhdGUuZm9jdXNEYXRlID0gc3RhcnREYXRlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGFkanVzdGluZyBtb250aHMveWVhcnMgZm9yIHRoZSBzZWxlY3QgYm94IG5hdmlnYXRpb25cblx0XHRcdGNvbnN0IHllYXJDaGFuZ2VkID0gIXRoaXMuX3N0YXRlLmZpcnN0RGF0ZSB8fCB0aGlzLl9zdGF0ZS5maXJzdERhdGUueWVhciAhPT0gc3RhdGUuZmlyc3REYXRlLnllYXI7XG5cdFx0XHRjb25zdCBtb250aENoYW5nZWQgPSAhdGhpcy5fc3RhdGUuZmlyc3REYXRlIHx8IHRoaXMuX3N0YXRlLmZpcnN0RGF0ZS5tb250aCAhPT0gc3RhdGUuZmlyc3REYXRlLm1vbnRoO1xuXHRcdFx0aWYgKHN0YXRlLm5hdmlnYXRpb24gPT09ICdzZWxlY3QnKSB7XG5cdFx0XHRcdC8vIHllYXJzIC0+ICBib3VuZGFyaWVzIChtaW4vbWF4IHdlcmUgY2hhbmdlZClcblx0XHRcdFx0aWYgKCdtaW5EYXRlJyBpbiBwYXRjaCB8fCAnbWF4RGF0ZScgaW4gcGF0Y2ggfHwgc3RhdGUuc2VsZWN0Qm94ZXMueWVhcnMubGVuZ3RoID09PSAwIHx8IHllYXJDaGFuZ2VkKSB7XG5cdFx0XHRcdFx0c3RhdGUuc2VsZWN0Qm94ZXMueWVhcnMgPSBnZW5lcmF0ZVNlbGVjdEJveFllYXJzKHN0YXRlLmZpcnN0RGF0ZSwgc3RhdGUubWluRGF0ZSwgc3RhdGUubWF4RGF0ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBtb250aHMgLT4gd2hlbiBjdXJyZW50IHllYXIgb3IgYm91bmRhcmllcyBjaGFuZ2Vcblx0XHRcdFx0aWYgKCdtaW5EYXRlJyBpbiBwYXRjaCB8fCAnbWF4RGF0ZScgaW4gcGF0Y2ggfHwgc3RhdGUuc2VsZWN0Qm94ZXMubW9udGhzLmxlbmd0aCA9PT0gMCB8fCB5ZWFyQ2hhbmdlZCkge1xuXHRcdFx0XHRcdHN0YXRlLnNlbGVjdEJveGVzLm1vbnRocyA9IGdlbmVyYXRlU2VsZWN0Qm94TW9udGhzKFxuXHRcdFx0XHRcdFx0dGhpcy5fY2FsZW5kYXIsXG5cdFx0XHRcdFx0XHRzdGF0ZS5maXJzdERhdGUsXG5cdFx0XHRcdFx0XHRzdGF0ZS5taW5EYXRlLFxuXHRcdFx0XHRcdFx0c3RhdGUubWF4RGF0ZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdGF0ZS5zZWxlY3RCb3hlcyA9IHsgeWVhcnM6IFtdLCBtb250aHM6IFtdIH07XG5cdFx0XHR9XG5cblx0XHRcdC8vIHVwZGF0aW5nIG5hdmlnYXRpb24gYXJyb3dzIC0+IGJvdW5kYXJpZXMgY2hhbmdlIChtaW4vbWF4KSBvciBtb250aC95ZWFyIGNoYW5nZXNcblx0XHRcdGlmIChcblx0XHRcdFx0KHN0YXRlLm5hdmlnYXRpb24gPT09ICdhcnJvd3MnIHx8IHN0YXRlLm5hdmlnYXRpb24gPT09ICdzZWxlY3QnKSAmJlxuXHRcdFx0XHQobW9udGhDaGFuZ2VkIHx8IHllYXJDaGFuZ2VkIHx8ICdtaW5EYXRlJyBpbiBwYXRjaCB8fCAnbWF4RGF0ZScgaW4gcGF0Y2ggfHwgJ2Rpc2FibGVkJyBpbiBwYXRjaClcblx0XHRcdCkge1xuXHRcdFx0XHRzdGF0ZS5wcmV2RGlzYWJsZWQgPSBzdGF0ZS5kaXNhYmxlZCB8fCBwcmV2TW9udGhEaXNhYmxlZCh0aGlzLl9jYWxlbmRhciwgc3RhdGUuZmlyc3REYXRlLCBzdGF0ZS5taW5EYXRlKTtcblx0XHRcdFx0c3RhdGUubmV4dERpc2FibGVkID0gc3RhdGUuZGlzYWJsZWQgfHwgbmV4dE1vbnRoRGlzYWJsZWQodGhpcy5fY2FsZW5kYXIsIHN0YXRlLmxhc3REYXRlLCBzdGF0ZS5tYXhEYXRlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cbn1cbiJdfQ==