@universal-material/angular
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.1.0.
280 lines • 37.1 kB
JavaScript
import { Directive, EventEmitter, Inject, Input, LOCALE_ID, Optional, Output } from '@angular/core';
import { getLocaleFirstDayOfWeek, WeekDay } from '@angular/common';
import { DATEPICKER_DEFAULT_OPTIONS, DefaultDatepickerConfig } from './datepicker-config.model';
import { DatepickerAdapter } from './datepicker-adapter';
import * as i0 from "@angular/core";
import * as i1 from "./default-datepicker-adapter";
import * as i2 from "./datepicker-adapter";
export class DatepickerBaseComponent {
get min() {
return this._min;
}
set min(value) {
this._min = value;
this._minYear = value && value.getUTCFullYear();
this._minMonth = value && value.getUTCMonth();
this._setYearsDisabled();
this._setMonthsDisabled();
this._setDaysDisabled();
}
get max() {
return this._max;
}
set max(value) {
this._max = value;
this._maxYear = value && value.getUTCFullYear();
this._maxMonth = value && value.getUTCMonth();
this._setYearsDisabled();
this._setMonthsDisabled();
this._setDaysDisabled();
}
constructor(_locale, _defaultConfig, datepickerAdapter, defaultDatepickerAdapter) {
this._locale = _locale;
this._defaultConfig = _defaultConfig;
this.datepickerAdapter = datepickerAdapter;
this._totalDaysOfWeek = 7;
this._yearsGroupsCount = 6;
this._yearsPerGroup = 4;
this.totalVisibleYears = this._yearsGroupsCount * this._yearsPerGroup;
this.monthsPerGroup = 4;
this._minYear = null;
this._minMonth = null;
this._maxYear = null;
this._maxMonth = null;
this.weeks = [];
this.yearGroups = [];
this.monthGroups = [];
this.dayTemplate = null;
this.datepickerTitle = 'Select date';
this.hideHeader = false;
this.hideClear = false;
this.clearLabel = null;
this.currentMonthChange = new EventEmitter();
this._min = null;
this._max = null;
this.date = null;
this.dateChange = new EventEmitter();
this.formattedDate = null;
this._setInnerConfig();
this.datepickerAdapter = this.datepickerAdapter || defaultDatepickerAdapter;
this.weekDayNames = this.datepickerAdapter.getWeekDaysNames(this.firstDayOfWeek);
this._setDate(null);
this.setYearGroups(this.currentMonth.utcYear - 2);
this._setMonthGroups();
}
setYearGroups(baseYear) {
this.baseYear = baseYear;
this.yearGroups.length = 0;
for (let g = 0; g < this._yearsGroupsCount; g++) {
const yearGroup = [];
this.yearGroups.push(yearGroup);
for (let y = 0; y < this._yearsPerGroup; y++) {
yearGroup.push({
year: baseYear,
disabled: this._isYearDisabled(baseYear)
});
baseYear++;
}
}
}
_setInnerConfig() {
const config = {
...DefaultDatepickerConfig,
firstDayOfWeek: getLocaleFirstDayOfWeek(this._locale),
...this._defaultConfig
};
this.clearLabel = config.clearLabel ?? null;
this.hideClear = config.hideClear ?? false;
this.firstDayOfWeek = config.firstDayOfWeek;
}
_setMonthGroups() {
let m = 0;
while (m < 12) {
const monthGroup = [];
this.monthGroups.push(monthGroup);
for (let i = 0; i < this.monthsPerGroup; i++) {
monthGroup.push(this.getMonth(new Date(this.baseYear, m)));
m++;
}
}
}
setYear(year) {
this._setCurrentMonth(new Date(year, this.currentMonth.utcMonth));
}
setMonth(month) {
this._setCurrentMonth(new Date(this.currentMonth.utcYear, month.utcMonth));
}
_setDate(date) {
this.date = date;
this.formattedDate = this.datepickerAdapter.formatDate(date);
date = date || new Date();
this._setCurrentMonth(new Date(date.getUTCFullYear(), date.getUTCMonth()));
}
getMonth(date) {
const month = {
date: date,
utcYear: date.getUTCFullYear(),
utcMonth: date.getUTCMonth(),
name: this.datepickerAdapter.getMonthName(date),
nameWithYear: this.datepickerAdapter.getMonthWithYear(date),
formattedYear: this.datepickerAdapter.getYear(date),
disabled: false
};
month.disabled = this._isMonthDisabled(month);
return month;
}
_addToCurrentMonth(value) {
this._setCurrentMonth(new Date(this.currentMonth.utcYear, this.currentMonth.utcMonth + value));
}
_getCurrentMonthInitialDate() {
return new Date(this.currentMonth.utcYear, this.currentMonth.utcMonth);
}
_getInitialDateForCurrentMonth() {
const currentMonthInitialDate = this._getCurrentMonthInitialDate();
if (currentMonthInitialDate.getDay() === this.firstDayOfWeek) {
return currentMonthInitialDate;
}
if (currentMonthInitialDate.getDay() > this.firstDayOfWeek) {
currentMonthInitialDate
.setDate(currentMonthInitialDate.getDate() - (currentMonthInitialDate.getDay() - this.firstDayOfWeek));
}
else {
currentMonthInitialDate
.setDate(currentMonthInitialDate.getDate() - (WeekDay.Saturday - (this.firstDayOfWeek - currentMonthInitialDate.getDay() - 1)));
}
return currentMonthInitialDate;
}
_setCurrentMonth(date) {
const previousMonth = this.currentMonth;
const newMonth = this.getMonth(date);
if (previousMonth && previousMonth.date.getTime() === newMonth.date.getTime()) {
return;
}
this.currentMonth = newMonth;
this.currentMonthChange.emit(this.currentMonth);
this.weeks.length = 0;
const processDate = new Date(this._getInitialDateForCurrentMonth());
do {
const currentWeek = {
baseDate: new Date(processDate),
days: []
};
this.weeks.push(currentWeek);
for (let i = 0; i < this._totalDaysOfWeek; i++) {
const dayDate = new Date(processDate);
currentWeek.days.push({
date: dayDate,
outsideMonth: processDate.getMonth() !== this.currentMonth.utcMonth,
disabled: this._isDayDisabled(dayDate)
});
processDate.setDate(processDate.getDate() + 1);
}
} while (processDate.getUTCMonth() === this.currentMonth.utcMonth);
this._setMonthsDisabled();
}
showNextMonth() {
this._addToCurrentMonth(1);
}
showPreviousMonth() {
this._addToCurrentMonth(-1);
}
_isDayDisabled(date) {
return !!this.min && date < this.min || !!this.max && date > this.max;
}
_setDaysDisabled() {
for (const week of this.weeks) {
for (const day of week.days) {
day.disabled = this._isDayDisabled(day.date);
}
}
}
_isMonthDisabled(month) {
return this.currentMonth
&& (this._isYearDisabled(this.currentMonth.utcYear)
|| (this.currentMonth.utcYear === this._minYear && month.utcMonth < this._minMonth)
|| (this.currentMonth.utcYear === this._maxYear && month.utcMonth > this._maxMonth));
}
_setMonthsDisabled() {
for (const monthGroup of this.monthGroups) {
for (const month of monthGroup) {
month.disabled = this._isMonthDisabled(month);
}
}
}
_isYearDisabled(year) {
return !!this._minYear && year < this._minYear || !!this._maxYear && year > this._maxYear;
}
_setYearsDisabled() {
for (const yearGroup of this.yearGroups) {
for (const year of yearGroup) {
year.disabled = this._isYearDisabled(year.year);
}
}
}
selectDate(date) {
this._setDate(date);
this.dateChange.emit(date);
}
_datesAreEqual(dateA, dateB) {
return dateA.getUTCMonth() === dateB.getUTCMonth()
&& dateA.getUTCFullYear() === dateB.getUTCFullYear()
&& dateA.getDate() === dateB.getDate();
}
isEqualToSelectedDate(date) {
return this.date && this._datesAreEqual(this.date, date);
}
isEqualToTodayDate(date) {
return this._datesAreEqual(new Date(), date);
}
trackByWeek(index, week) {
return week.baseDate.getTime();
}
trackByDay(index, day) {
return day.date.getTime();
}
ngOnChanges(changes) {
let dateChange = changes['date'];
if (dateChange && dateChange.currentValue && dateChange.currentValue !== dateChange.previousValue) {
this._setDate(dateChange.currentValue);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatepickerBaseComponent, deps: [{ token: LOCALE_ID }, { token: DATEPICKER_DEFAULT_OPTIONS, optional: true }, { token: DatepickerAdapter, optional: true }, { token: i1.DefaultDatepickerAdapter }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: DatepickerBaseComponent, inputs: { dayTemplate: "dayTemplate", datepickerTitle: "datepickerTitle", hideHeader: "hideHeader", hideClear: "hideClear", clearLabel: "clearLabel", min: "min", max: "max", date: "date" }, outputs: { currentMonthChange: "currentMonthChange", dateChange: "dateChange" }, usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DatepickerBaseComponent, decorators: [{
type: Directive
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [LOCALE_ID]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [DATEPICKER_DEFAULT_OPTIONS]
}] }, { type: i2.DatepickerAdapter, decorators: [{
type: Optional
}, {
type: Inject,
args: [DatepickerAdapter]
}] }, { type: i1.DefaultDatepickerAdapter }]; }, propDecorators: { dayTemplate: [{
type: Input
}], datepickerTitle: [{
type: Input
}], hideHeader: [{
type: Input
}], hideClear: [{
type: Input
}], clearLabel: [{
type: Input
}], currentMonthChange: [{
type: Output
}], min: [{
type: Input
}], max: [{
type: Input
}], date: [{
type: Input
}], dateChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kYXRlcGlja2VyL2RhdGVwaWNrZXItYmFzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJbkUsT0FBTyxFQUFFLDBCQUEwQixFQUFvQix1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7O0FBTXpELE1BQU0sT0FBZ0IsdUJBQXVCO0lBaUMzQyxJQUNJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLEtBQWtCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQ0ksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxHQUFHLENBQUMsS0FBa0I7UUFDeEIsSUFBSSxDQUFDLElB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O3NCQUROLEtBQUs7Z0JBY0YsR0FBRztzQkFETixLQUFLO2dCQWFHLElBQUk7c0JBQVosS0FBSztnQkFDSSxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBEaXJlY3RpdmUsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBMT0NBTEVfSUQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVGVtcGxhdGVSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZ2V0TG9jYWxlRmlyc3REYXlPZldlZWssIFdlZWtEYXkgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuaW1wb3J0IHsgV2VlayB9IGZyb20gJy4vd2Vlay5tb2RlbCc7XHJcbmltcG9ydCB7IERheU9mV2VlayB9IGZyb20gJy4vZGF5LW9mLXdlZWsubW9kZWwnO1xyXG5pbXBvcnQgeyBEQVRFUElDS0VSX0RFRkFVTFRfT1BUSU9OUywgRGF0ZXBpY2tlckNvbmZpZywgRGVmYXVsdERhdGVwaWNrZXJDb25maWcgfSBmcm9tICcuL2RhdGVwaWNrZXItY29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgRGF0ZXBpY2tlckFkYXB0ZXIgfSBmcm9tICcuL2RhdGVwaWNrZXItYWRhcHRlcic7XHJcbmltcG9ydCB7IERlZmF1bHREYXRlcGlja2VyQWRhcHRlciB9IGZyb20gJy4vZGVmYXVsdC1kYXRlcGlja2VyLWFkYXB0ZXInO1xyXG5pbXBvcnQgeyBNb250aCB9IGZyb20gJy4vbW9udGgubW9kZWwnO1xyXG5pbXBvcnQgeyBZZWFyIH0gZnJvbSAnLi95ZWFyLm1vZGVsJztcclxuXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGF0ZXBpY2tlckJhc2VDb21wb25lbnQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RvdGFsRGF5c09mV2VlayA9IDc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfeWVhcnNHcm91cHNDb3VudCA9IDY7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfeWVhcnNQZXJHcm91cCA9IDQ7XHJcblxyXG4gIHJlYWRvbmx5IHdlZWtEYXlOYW1lczogc3RyaW5nW107XHJcbiAgcmVhZG9ubHkgdG90YWxWaXNpYmxlWWVhcnMgPSB0aGlzLl95ZWFyc0dyb3Vwc0NvdW50ICogdGhpcy5feWVhcnNQZXJHcm91cDtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBtb250aHNQZXJHcm91cCA9IDQ7XHJcblxyXG4gIHByaXZhdGUgX21pblllYXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX21pbk1vbnRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9tYXhZZWFyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9tYXhNb250aDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHdlZWtzOiBXZWVrW10gPSBbXTtcclxuICB5ZWFyR3JvdXBzOiBZZWFyW11bXSA9IFtdO1xyXG4gIG1vbnRoR3JvdXBzOiBNb250aFtdW10gPSBbXTtcclxuICBjdXJyZW50TW9udGghOiBNb250aDtcclxuICBiYXNlWWVhciE6IG51bWJlcjtcclxuICBmaXJzdERheU9mV2VlayE6IG51bWJlcjtcclxuXHJcbiAgQElucHV0KCkgZGF5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPERheU9mV2Vlaz4gfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBkYXRlcGlja2VyVGl0bGU6IHN0cmluZyA9ICdTZWxlY3QgZGF0ZSc7XHJcbiAgQElucHV0KCkgaGlkZUhlYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGhpZGVDbGVhcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNsZWFyTGFiZWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBAT3V0cHV0KCkgY3VycmVudE1vbnRoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNb250aD4oKTtcclxuXHJcbiAgX21pbjogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gIF9tYXg6IERhdGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgbWluKCk6IERhdGUgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9taW47XHJcbiAgfVxyXG4gIHNldCBtaW4odmFsdWU6IERhdGUgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcclxuICAgIHRoaXMuX21pblllYXIgPSB2YWx1ZSAmJiB2YWx1ZS5nZXRVVENGdWxsWWVhcigpO1xyXG4gICAgdGhpcy5fbWluTW9udGggPSB2YWx1ZSAmJiB2YWx1ZS5nZXRVVENNb250aCgpO1xyXG4gICAgdGhpcy5fc2V0WWVhcnNEaXNhYmxlZCgpO1xyXG4gICAgdGhpcy5fc2V0TW9udGhzRGlzYWJsZWQoKTtcclxuICAgIHRoaXMuX3NldERheXNEaXNhYmxlZCgpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgbWF4KCk6IERhdGUgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXg7XHJcbiAgfVxyXG4gIHNldCBtYXgodmFsdWU6IERhdGUgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcclxuICAgIHRoaXMuX21heFllYXIgPSB2YWx1ZSAmJiB2YWx1ZS5nZXRVVENGdWxsWWVhcigpO1xyXG4gICAgdGhpcy5fbWF4TW9udGggPSB2YWx1ZSAmJiB2YWx1ZS5nZXRVVENNb250aCgpO1xyXG4gICAgdGhpcy5fc2V0WWVhcnNEaXNhYmxlZCgpO1xyXG4gICAgdGhpcy5fc2V0TW9udGhzRGlzYWJsZWQoKTtcclxuICAgIHRoaXMuX3NldERheXNEaXNhYmxlZCgpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgZGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gIEBPdXRwdXQoKSBkYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIGZvcm1hdHRlZERhdGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihASW5qZWN0KExPQ0FMRV9JRCkgcHJpdmF0ZSByZWFkb25seSBfbG9jYWxlOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEQVRFUElDS0VSX0RFRkFVTFRfT1BUSU9OUykgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdENvbmZpZzogRGF0ZXBpY2tlckNvbmZpZyxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERhdGVwaWNrZXJBZGFwdGVyKSBwcml2YXRlIHJlYWRvbmx5IGRhdGVwaWNrZXJBZGFwdGVyOiBEYXRlcGlja2VyQWRhcHRlcixcclxuICAgICAgICAgICAgICBkZWZhdWx0RGF0ZXBpY2tlckFkYXB0ZXI6IERlZmF1bHREYXRlcGlja2VyQWRhcHRlcikge1xyXG4gICAgdGhpcy5fc2V0SW5uZXJDb25maWcoKTtcclxuICAgIHRoaXMuZGF0ZXBpY2tlckFkYXB0ZXIgPSB0aGlzLmRhdGVwaWNrZXJBZGFwdGVyIHx8IGRlZmF1bHREYXRlcGlja2VyQWRhcHRlcjtcclxuXHJcbiAgICB0aGlzLndlZWtEYXlOYW1lcyA9IHRoaXMuZGF0ZXBpY2tlckFkYXB0ZXIuZ2V0V2Vla0RheXNOYW1lcyh0aGlzLmZpcnN0RGF5T2ZXZWVrKTtcclxuXHJcbiAgICB0aGlzLl9zZXREYXRlKG51bGwpO1xyXG4gICAgdGhpcy5zZXRZZWFyR3JvdXBzKHRoaXMuY3VycmVudE1vbnRoLnV0Y1llYXIgLSAyKTtcclxuICAgIHRoaXMuX3NldE1vbnRoR3JvdXBzKCk7XHJcbiAgfVxyXG5cclxuICBzZXRZZWFyR3JvdXBzKGJhc2VZZWFyOiBudW1iZXIpIHtcclxuICAgIHRoaXMuYmFzZVllYXIgPSBiYXNlWWVhcjtcclxuICAgIHRoaXMueWVhckdyb3Vwcy5sZW5ndGggPSAwO1xyXG5cclxuICAgIGZvciAobGV0IGcgPSAwOyBnIDwgdGhpcy5feWVhcnNHcm91cHNDb3VudDsgZysrKSB7XHJcbiAgICAgIGNvbnN0IHllYXJHcm91cDogWWVhcltdID0gW107XHJcblxyXG4gICAgICB0aGlzLnllYXJHcm91cHMucHVzaCh5ZWFyR3JvdXApO1xyXG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuX3llYXJzUGVyR3JvdXA7IHkrKykge1xyXG4gICAgICAgIHllYXJHcm91cC5wdXNoKHtcclxuICAgICAgICAgIHllYXI6IGJhc2VZZWFyLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuX2lzWWVhckRpc2FibGVkKGJhc2VZZWFyKVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJhc2VZZWFyKys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldElubmVyQ29uZmlnKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29uZmlnOiBEYXRlcGlja2VyQ29uZmlnID0ge1xyXG4gICAgICAuLi5EZWZhdWx0RGF0ZXBpY2tlckNvbmZpZyxcclxuICAgICAgZmlyc3REYXlPZldlZWs6IGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrKHRoaXMuX2xvY2FsZSksXHJcbiAgICAgIC4uLnRoaXMuX2RlZmF1bHRDb25maWdcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5jbGVhckxhYmVsID0gY29uZmlnLmNsZWFyTGFiZWwgPz8gbnVsbDtcclxuICAgIHRoaXMuaGlkZUNsZWFyID0gY29uZmlnLmhpZGVDbGVhciA/PyBmYWxzZTtcclxuICAgIHRoaXMuZmlyc3REYXlPZldlZWsgPSBjb25maWcuZmlyc3REYXlPZldlZWshO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0TW9udGhHcm91cHMoKSB7XHJcbiAgICBsZXQgbSA9IDA7XHJcblxyXG4gICAgd2hpbGUgKG0gPCAxMikge1xyXG4gICAgICBjb25zdCBtb250aEdyb3VwOiBNb250aFtdID0gW107XHJcbiAgICAgIHRoaXMubW9udGhHcm91cHMucHVzaChtb250aEdyb3VwKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tb250aHNQZXJHcm91cDsgaSsrKSB7XHJcbiAgICAgICAgbW9udGhHcm91cC5wdXNoKHRoaXMuZ2V0TW9udGgobmV3IERhdGUodGhpcy5iYXNlWWVhciwgbSkpKTtcclxuICAgICAgICBtKys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldFllYXIoeWVhcjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9zZXRDdXJyZW50TW9udGgobmV3IERhdGUoeWVhciwgdGhpcy5jdXJyZW50TW9udGgudXRjTW9udGgpKTtcclxuICB9XHJcblxyXG4gIHNldE1vbnRoKG1vbnRoOiBNb250aCkge1xyXG4gICAgdGhpcy5fc2V0Q3VycmVudE1vbnRoKG5ldyBEYXRlKHRoaXMuY3VycmVudE1vbnRoLnV0Y1llYXIsIG1vbnRoLnV0Y01vbnRoKSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX3NldERhdGUoZGF0ZTogRGF0ZSB8IG51bGwpIHtcclxuICAgIHRoaXMuZGF0ZSA9IGRhdGU7XHJcbiAgICB0aGlzLmZvcm1hdHRlZERhdGUgPSB0aGlzLmRhdGVwaWNrZXJBZGFwdGVyLmZvcm1hdERhdGUoZGF0ZSk7XHJcblxyXG4gICAgZGF0ZSA9IGRhdGUgfHwgbmV3IERhdGUoKTtcclxuICAgIHRoaXMuX3NldEN1cnJlbnRNb250aChuZXcgRGF0ZShkYXRlLmdldFVUQ0Z1bGxZZWFyKCksIGRhdGUuZ2V0VVRDTW9udGgoKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRNb250aChkYXRlOiBEYXRlKTogTW9udGgge1xyXG4gICAgY29uc3QgbW9udGggPSB7XHJcbiAgICAgIGRhdGU6IGRhdGUsXHJcbiAgICAgIHV0Y1llYXI6IGRhdGUuZ2V0VVRDRnVsbFllYXIoKSxcclxuICAgICAgdXRjTW9udGg6IGRhdGUuZ2V0VVRDTW9udGgoKSxcclxuICAgICAgbmFtZTogdGhpcy5kYXRlcGlja2VyQWRhcHRlci5nZXRNb250aE5hbWUoZGF0ZSksXHJcbiAgICAgIG5hbWVXaXRoWWVhcjogdGhpcy5kYXRlcGlja2VyQWRhcHRlci5nZXRNb250aFdpdGhZZWFyKGRhdGUpLFxyXG4gICAgICBmb3JtYXR0ZWRZZWFyOiB0aGlzLmRhdGVwaWNrZXJBZGFwdGVyLmdldFllYXIoZGF0ZSksXHJcbiAgICAgIGRpc2FibGVkOiBmYWxzZVxyXG4gICAgfTtcclxuXHJcbiAgICBtb250aC5kaXNhYmxlZCA9IHRoaXMuX2lzTW9udGhEaXNhYmxlZChtb250aCk7XHJcblxyXG4gICAgcmV0dXJuIG1vbnRoO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWRkVG9DdXJyZW50TW9udGgodmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5fc2V0Q3VycmVudE1vbnRoKG5ldyBEYXRlKHRoaXMuY3VycmVudE1vbnRoLnV0Y1llYXIsIHRoaXMuY3VycmVudE1vbnRoLnV0Y01vbnRoICsgdmFsdWUpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEN1cnJlbnRNb250aEluaXRpYWxEYXRlKCk6IERhdGUge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuY3VycmVudE1vbnRoLnV0Y1llYXIsIHRoaXMuY3VycmVudE1vbnRoLnV0Y01vbnRoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEluaXRpYWxEYXRlRm9yQ3VycmVudE1vbnRoKCk6IERhdGUge1xyXG4gICAgY29uc3QgY3VycmVudE1vbnRoSW5pdGlhbERhdGUgPSB0aGlzLl9nZXRDdXJyZW50TW9udGhJbml0aWFsRGF0ZSgpO1xyXG5cclxuICAgIGlmIChjdXJyZW50TW9udGhJbml0aWFsRGF0ZS5nZXREYXkoKSA9PT0gdGhpcy5maXJzdERheU9mV2Vlaykge1xyXG4gICAgICByZXR1cm4gY3VycmVudE1vbnRoSW5pdGlhbERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGN1cnJlbnRNb250aEluaXRpYWxEYXRlLmdldERheSgpID4gdGhpcy5maXJzdERheU9mV2VlayEpIHtcclxuICAgICAgY3VycmVudE1vbnRoSW5pdGlhbERhdGVcclxuICAgICAgICAuc2V0RGF0ZShjdXJyZW50TW9udGhJbml0aWFsRGF0ZS5nZXREYXRlKCkgLSAoY3VycmVudE1vbnRoSW5pdGlhbERhdGUuZ2V0RGF5KCkgLSB0aGlzLmZpcnN0RGF5T2ZXZWVrISkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY3VycmVudE1vbnRoSW5pdGlhbERhdGVcclxuICAgICAgICAuc2V0RGF0ZShjdXJyZW50TW9udGhJbml0aWFsRGF0ZS5nZXREYXRlKCkgLSAoV2Vla0RheS5TYXR1cmRheSAtICh0aGlzLmZpcnN0RGF5T2ZXZWVrISAtIGN1cnJlbnRNb250aEluaXRpYWxEYXRlLmdldERheSgpIC0gMSkpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3VycmVudE1vbnRoSW5pdGlhbERhdGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRDdXJyZW50TW9udGgoZGF0ZTogRGF0ZSkge1xyXG4gICAgY29uc3QgcHJldmlvdXNNb250aCA9IHRoaXMuY3VycmVudE1vbnRoO1xyXG4gICAgY29uc3QgbmV3TW9udGggPSB0aGlzLmdldE1vbnRoKGRhdGUpO1xyXG5cclxuICAgIGlmIChwcmV2aW91c01vbnRoICYmIHByZXZpb3VzTW9udGguZGF0ZS5nZXRUaW1lKCkgPT09IG5ld01vbnRoLmRhdGUuZ2V0VGltZSgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IG5ld01vbnRoO1xyXG4gICAgdGhpcy5jdXJyZW50TW9udGhDaGFuZ2UuZW1pdCh0aGlzLmN1cnJlbnRNb250aCk7XHJcblxyXG4gICAgdGhpcy53ZWVrcy5sZW5ndGggPSAwO1xyXG4gICAgY29uc3QgcHJvY2Vzc0RhdGUgPSBuZXcgRGF0ZSh0aGlzLl9nZXRJbml0aWFsRGF0ZUZvckN1cnJlbnRNb250aCgpKTtcclxuXHJcbiAgICBkbyB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRXZWVrOiBXZWVrID0ge1xyXG4gICAgICAgIGJhc2VEYXRlOiBuZXcgRGF0ZShwcm9jZXNzRGF0ZSksXHJcbiAgICAgICAgZGF5czogW11cclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMud2Vla3MucHVzaChjdXJyZW50V2Vlayk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RvdGFsRGF5c09mV2VlazsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgZGF5RGF0ZSA9IG5ldyBEYXRlKHByb2Nlc3NEYXRlKTtcclxuICAgICAgICBjdXJyZW50V2Vlay5kYXlzLnB1c2goe1xyXG4gICAgICAgICAgZGF0ZTogZGF5RGF0ZSxcclxuICAgICAgICAgIG91dHNpZGVNb250aDogcHJvY2Vzc0RhdGUuZ2V0TW9udGgoKSAhPT0gdGhpcy5jdXJyZW50TW9udGgudXRjTW9udGgsXHJcbiAgICAgICAgICBkaXNhYmxlZDogdGhpcy5faXNEYXlEaXNhYmxlZChkYXlEYXRlKVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwcm9jZXNzRGF0ZS5zZXREYXRlKHByb2Nlc3NEYXRlLmdldERhdGUoKSArIDEpO1xyXG4gICAgICB9XHJcbiAgICB9IHdoaWxlIChwcm9jZXNzRGF0ZS5nZXRVVENNb250aCgpID09PSB0aGlzLmN1cnJlbnRNb250aC51dGNNb250aCk7XHJcblxyXG4gICAgdGhpcy5fc2V0TW9udGhzRGlzYWJsZWQoKTtcclxuICB9XHJcblxyXG4gIHNob3dOZXh0TW9udGgoKSB7XHJcbiAgICB0aGlzLl9hZGRUb0N1cnJlbnRNb250aCgxKTtcclxuICB9XHJcblxyXG4gIHNob3dQcmV2aW91c01vbnRoKCkge1xyXG4gICAgdGhpcy5fYWRkVG9DdXJyZW50TW9udGgoLTEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNEYXlEaXNhYmxlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLm1pbiAmJiBkYXRlIDwgdGhpcy5taW4gfHwgISF0aGlzLm1heCAmJiBkYXRlID4gdGhpcy5tYXg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXREYXlzRGlzYWJsZWQoKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IHdlZWsgb2YgdGhpcy53ZWVrcykge1xyXG4gICAgICBmb3IgKGNvbnN0IGRheSBvZiB3ZWVrLmRheXMpIHtcclxuICAgICAgICBkYXkuZGlzYWJsZWQgPSB0aGlzLl9pc0RheURpc2FibGVkKGRheS5kYXRlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNNb250aERpc2FibGVkKG1vbnRoOiBNb250aCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudE1vbnRoXHJcbiAgICAgICYmICh0aGlzLl9pc1llYXJEaXNhYmxlZCh0aGlzLmN1cnJlbnRNb250aC51dGNZZWFyKVxyXG4gICAgICAgIHx8ICh0aGlzLmN1cnJlbnRNb250aC51dGNZZWFyID09PSB0aGlzLl9taW5ZZWFyICYmIG1vbnRoLnV0Y01vbnRoIDwgdGhpcy5fbWluTW9udGghKVxyXG4gICAgICAgIHx8ICh0aGlzLmN1cnJlbnRNb250aC51dGNZZWFyID09PSB0aGlzLl9tYXhZZWFyICYmIG1vbnRoLnV0Y01vbnRoID4gdGhpcy5fbWF4TW9udGghKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRNb250aHNEaXNhYmxlZCgpOiB2b2lkIHtcclxuICAgIGZvciAoY29uc3QgbW9udGhHcm91cCBvZiB0aGlzLm1vbnRoR3JvdXBzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgbW9udGggb2YgbW9udGhHcm91cCkge1xyXG4gICAgICAgIG1vbnRoLmRpc2FibGVkID0gdGhpcy5faXNNb250aERpc2FibGVkKG1vbnRoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNZZWFyRGlzYWJsZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLl9taW5ZZWFyICYmIHllYXIgPCB0aGlzLl9taW5ZZWFyIHx8ICEhdGhpcy5fbWF4WWVhciAmJiB5ZWFyID4gdGhpcy5fbWF4WWVhcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldFllYXJzRGlzYWJsZWQoKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IHllYXJHcm91cCBvZiB0aGlzLnllYXJHcm91cHMpIHtcclxuICAgICAgZm9yIChjb25zdCB5ZWFyIG9mIHllYXJHcm91cCkge1xyXG4gICAgICAgIHllYXIuZGlzYWJsZWQgPSB0aGlzLl9pc1llYXJEaXNhYmxlZCh5ZWFyLnllYXIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3REYXRlKGRhdGU6IERhdGUgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXREYXRlKGRhdGUpO1xyXG4gICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kYXRlc0FyZUVxdWFsKGRhdGVBOiBEYXRlLCBkYXRlQjogRGF0ZSkge1xyXG4gICAgcmV0dXJuIGRhdGVBLmdldFVUQ01vbnRoKCkgPT09IGRhdGVCLmdldFVUQ01vbnRoKClcclxuICAgICAgJiYgZGF0ZUEuZ2V0VVRDRnVsbFllYXIoKSA9PT0gZGF0ZUIuZ2V0VVRDRnVsbFllYXIoKVxyXG4gICAgICAmJiBkYXRlQS5nZXREYXRlKCkgPT09IGRhdGVCLmdldERhdGUoKTtcclxuICB9XHJcblxyXG4gIGlzRXF1YWxUb1NlbGVjdGVkRGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRlICYmIHRoaXMuX2RhdGVzQXJlRXF1YWwodGhpcy5kYXRlLCBkYXRlKTtcclxuICB9XHJcblxyXG4gIGlzRXF1YWxUb1RvZGF5RGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0ZXNBcmVFcXVhbChuZXcgRGF0ZSgpLCBkYXRlKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlXZWVrKGluZGV4OiBudW1iZXIsIHdlZWs6IFdlZWspIHtcclxuICAgIHJldHVybiB3ZWVrLmJhc2VEYXRlLmdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlEYXkoaW5kZXg6IG51bWJlciwgZGF5OiBEYXlPZldlZWspIHtcclxuICAgIHJldHVybiBkYXkuZGF0ZS5nZXRUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBsZXQgZGF0ZUNoYW5nZSA9IGNoYW5nZXNbJ2RhdGUnXTtcclxuXHJcbiAgICBpZiAoZGF0ZUNoYW5nZSAmJiBkYXRlQ2hhbmdlLmN1cnJlbnRWYWx1ZSAmJiBkYXRlQ2hhbmdlLmN1cnJlbnRWYWx1ZSAhPT0gZGF0ZUNoYW5nZS5wcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX3NldERhdGUoZGF0ZUNoYW5nZS5jdXJyZW50VmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=