@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
402 lines (401 loc) • 37.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { DefaultControlValueAccessor } from './../common/default-control-value-accessor';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Component, forwardRef, Input, Output, EventEmitter, ElementRef, Inject, PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
import * as calendarConst from './asi-calendar-constants';
import * as nh from '../../native-helper';
import moment from 'moment';
var AsiCalendarComponent = /** @class */ (function (_super) {
tslib_1.__extends(AsiCalendarComponent, _super);
function AsiCalendarComponent(platformId) {
var _this = _super.call(this) || this;
_this.platformId = platformId;
_this.onDatePicked = new EventEmitter();
_this.open = false;
if (_this.isFr()) {
_this.days = calendarConst.days_fr;
_this.months = calendarConst.months_fr;
}
else {
_this.days = calendarConst.days_en;
_this.months = calendarConst.months_en;
}
return _this;
}
Object.defineProperty(AsiCalendarComponent.prototype, "disableDayOfWeek", {
/** allow you to disable day of week exemple [disableDayOfWeek]="[1, 2]"" while disabled monday and tusday */
set: /**
* allow you to disable day of week exemple [disableDayOfWeek]="[1, 2]"" while disabled monday and tusday
* @param {?} daysOfWeek
* @return {?}
*/
function (daysOfWeek) {
if (!daysOfWeek) {
this._disableDayOfWeek = [];
}
else if (nh.isArray(daysOfWeek)) {
this._disableDayOfWeek = daysOfWeek;
}
else {
this._disableDayOfWeek = [daysOfWeek];
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
AsiCalendarComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.initYears();
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.isFr = /**
* @return {?}
*/
function () {
if (isPlatformBrowser(this.platformId)) {
return navigator.language === 'fr' || navigator.language === 'fr-FR';
}
else {
return false;
}
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
if (this.minDate) {
this.minDate.setHours(0, 0, 0, 0);
}
if (this.maxDate) {
this.maxDate.setHours(23, 59, 59, 999);
}
this.calculDays();
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.initYears = /**
* @return {?}
*/
function () {
/** @type {?} */
var results = new Array();
for (var year = this.maxYear; year >= this.minYear; year--) {
results.push(year);
}
this.years = results;
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.onDropdownClose = /**
* @return {?}
*/
function () {
this.open = false;
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.openCalendar = /**
* @return {?}
*/
function () {
this.open = true;
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.closeCalendar = /**
* @return {?}
*/
function () {
this.open = false;
};
/**
* @param {?} dayItem
* @return {?}
*/
AsiCalendarComponent.prototype.onDaySelected = /**
* @param {?} dayItem
* @return {?}
*/
function (dayItem) {
this.selectedDay = new calendarConst.DayItem(dayItem.day, dayItem.month, dayItem.year, dayItem.date, 'selected enabled');
this.value = dayItem.date;
this.closeCalendar();
this.calculDays();
this.onDatePicked.emit(this.value);
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.onMonthSelected = /**
* @return {?}
*/
function () {
/** @type {?} */
var date = new Date(this.selectedYear, this.selectedMonth.num - 1, this.selectedDay.day);
this.value = date;
this.calculDays();
this.onDatePicked.emit(date);
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.onYearSelected = /**
* @return {?}
*/
function () {
/** @type {?} */
var date = new Date(this.selectedYear, this.selectedMonth.num - 1, this.selectedDay.day);
this.value = date;
this.calculDays();
this.onDatePicked.emit(date);
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.calculDays = /**
* @return {?}
*/
function () {
if (!this.selectedMonth || !this.selectedYear) {
return;
}
/** @type {?} */
var month = this.selectedMonth.num - 1;
/** @type {?} */
var year = this.selectedYear;
/** @type {?} */
var result = [];
/** @type {?} */
var date = new Date(year, month, 1);
/** @type {?} */
var mondayDelta = 0;
/** @type {?} */
var day = date.getDay();
if (day === 0) {
mondayDelta = -6;
}
else {
mondayDelta = -(day - 1);
}
date = moment(date).add(mondayDelta, 'days').toDate();
/** @type {?} */
var deltaMonth = date.getMonth();
if (deltaMonth !== month) {
// Before first day of the month
while (date.getMonth() === deltaMonth) {
if (date.getDate() === this.selectedDay.day && date.getMonth() + 1 === this.selectedDay.month && date.getFullYear() === this.selectedDay.year) {
result.push(this.selectedDay);
}
else {
result.push(new calendarConst.DayItem(date.getDate(), date.getMonth() + 1, date.getFullYear(), new Date(date), 'extra enabled'));
}
date.setDate(date.getDate() + 1);
}
}
// Month dates
while (date.getMonth() === month) {
if (date.getDate() === this.selectedDay.day && date.getMonth() + 1 === this.selectedDay.month && date.getFullYear() === this.selectedDay.year) {
result.push(this.selectedDay);
}
else {
result.push(new calendarConst.DayItem(date.getDate(), date.getMonth() + 1, date.getFullYear(), new Date(date), 'enabled'));
}
date.setDate(date.getDate() + 1);
}
// Days of the last week
while (date.getDay() !== 1) {
if (date.getDate() === this.selectedDay.day && date.getMonth() + 1 === this.selectedDay.month && date.getFullYear() === this.selectedDay.year) {
result.push(this.selectedDay);
}
else {
result.push(new calendarConst.DayItem(date.getDate(), date.getMonth() + 1, date.getFullYear(), new Date(date), 'extra enabled'));
}
date.setDate(date.getDate() + 1);
}
this.dayOfMonths = result;
this.manageDisabledDate();
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.manageDisabledDate = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var dayOfWeekDisabled = !nh.isEmpty(this._disableDayOfWeek);
if (this.dayOfMonths) {
nh.forEach(this.dayOfMonths, function (dayItem) {
if (_this.minDate != null) {
if (dayItem.date < _this.minDate) {
dayItem.class = 'disabled';
}
}
if (_this.maxDate != null) {
if (dayItem.date > _this.maxDate) {
dayItem.class = 'disabled';
}
}
if (dayOfWeekDisabled && _this._disableDayOfWeek.includes(/** @type {?} */ (dayItem.date.getDay()))) {
dayItem.class = 'disabled';
}
});
}
};
/**
* @param {?} value
* @return {?}
*/
AsiCalendarComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this._value = value;
this.initToDate(value);
};
/**
* @param {?} value
* @return {?}
*/
AsiCalendarComponent.prototype.initToDate = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value == null || value['error']) {
value = new Date();
}
this.selectedYear = value.getFullYear();
/** @type {?} */
var dateMonth = value.getMonth() + 1;
this.selectedMonth = nh.find(this.months, function (month) {
return month.num === dateMonth;
});
this.selectedDay = new calendarConst.DayItem(value.getDate(), this.selectedMonth.num, this.selectedYear, new Date(value), 'selected enabled');
this.calculDays();
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.goNextMonth = /**
* @return {?}
*/
function () {
/** @type {?} */
var nextMonthNum = this.selectedMonth.num + 1;
if (nextMonthNum === 13) {
nextMonthNum = 1;
this.selectedYear = this.selectedYear + 1;
if (this.years.indexOf(this.selectedYear) === -1) {
this.years.push(this.selectedYear);
}
}
this.selectedMonth = nh.find(this.months, function (month) {
return month.num === nextMonthNum;
});
this.calculDays();
};
/**
* @return {?}
*/
AsiCalendarComponent.prototype.goPreviousMonth = /**
* @return {?}
*/
function () {
/** @type {?} */
var nextMonthNum = this.selectedMonth.num - 1;
if (nextMonthNum === 0) {
nextMonthNum = 12;
this.selectedYear = this.selectedYear - 1;
}
this.selectedMonth = nh.find(this.months, function (month) {
return month.num === nextMonthNum;
});
this.calculDays();
};
AsiCalendarComponent.decorators = [
{ type: Component, args: [{
selector: 'asi-calendar',
template: "<asi-fa-icon [disabled]=\"disabled\" icon=\"fa fa-calendar\" (onClick)=\"open = !open\"></asi-fa-icon>\n\n<asi-dropdown [open]=\"open\" [relativeTo]=\"relativeTo\" (onClose)=\"onDropdownClose()\" [calculWidth]=\"false\"\n dropDownClass=\"asi-calendar-dropdown\">\n\n <div class=\"asi-calendar-picker\">\n <div class=\"calendar-header\">\n <asi-fa-icon icon=\"fa fa-angle-left\" size=\"lg\" (onClick)=\"goPreviousMonth()\"></asi-fa-icon>\n <asi-select class=\"select-month\" [disabled]=\"disabled\" [(ngModel)]=\"selectedMonth\" [data]=\"months\"\n (onValueChange)=\"calculDays()\">\n <asi-selected *asiSelectedDef=\"let data\">{{data.num + \" - \" + data.libelle}}</asi-selected>\n <asi-option *asiOptionDef=\"let data\">{{data.num + \" - \" + data.libelle}}</asi-option>\n </asi-select>\n <asi-select class=\"select-year\" [disabled]=\"disabled\" [(ngModel)]=\"selectedYear\" [data]=\"years\"\n (onValueChange)=\"calculDays()\">\n <asi-selected *asiSelectedDef=\"let data\">{{data}}</asi-selected>\n <asi-option *asiOptionDef=\"let data\">{{data}}</asi-option>\n </asi-select>\n <asi-fa-icon icon=\"fa fa-angle-right\" size=\"lg\" (onClick)=\"goNextMonth()\"></asi-fa-icon>\n </div>\n <div class=\"day-list\">\n <div class=\"day-str\" *ngFor=\"let day of days\">\n <span>{{day.libelle}}</span>\n </div>\n </div>\n <div class=\"calendar-panel\" mouseWheel (mouseWheelUp)=\"goPreviousMonth()\" (mouseWheelDown)=\"goNextMonth()\">\n <button [attr.disabled]=\"day.class === 'disabled' ? true : null\" class=\"day-item\" *ngFor=\"let day of dayOfMonths\"\n [ngClass]=\"day.class\" (click)=\"onDaySelected(day)\">\n <span>{{day.day}}</span>\n </button>\n </div>\n </div>\n</asi-dropdown>\n",
host: { class: 'asi-component asi-calendar' },
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return AsiCalendarComponent; }),
multi: true
}
]
}] }
];
/** @nocollapse */
AsiCalendarComponent.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
]; };
AsiCalendarComponent.propDecorators = {
relativeTo: [{ type: Input }],
minDate: [{ type: Input }],
maxDate: [{ type: Input }],
minYear: [{ type: Input }],
maxYear: [{ type: Input }],
disableDayOfWeek: [{ type: Input }],
onDatePicked: [{ type: Output }]
};
return AsiCalendarComponent;
}(DefaultControlValueAccessor));
export { AsiCalendarComponent };
if (false) {
/** @type {?} */
AsiCalendarComponent.prototype.relativeTo;
/** @type {?} */
AsiCalendarComponent.prototype.minDate;
/** @type {?} */
AsiCalendarComponent.prototype.maxDate;
/** @type {?} */
AsiCalendarComponent.prototype.minYear;
/** @type {?} */
AsiCalendarComponent.prototype.maxYear;
/** @type {?} */
AsiCalendarComponent.prototype._disableDayOfWeek;
/** @type {?} */
AsiCalendarComponent.prototype.onDatePicked;
/** @type {?} */
AsiCalendarComponent.prototype.days;
/** @type {?} */
AsiCalendarComponent.prototype.months;
/** @type {?} */
AsiCalendarComponent.prototype.years;
/** @type {?} */
AsiCalendarComponent.prototype.selectedMonth;
/** @type {?} */
AsiCalendarComponent.prototype.selectedYear;
/** @type {?} */
AsiCalendarComponent.prototype.selectedDay;
/** @type {?} */
AsiCalendarComponent.prototype.dayOfMonths;
/** @type {?} */
AsiCalendarComponent.prototype.open;
/** @type {?} */
AsiCalendarComponent.prototype.platformId;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWNhbGVuZGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hc2ktY2FsZW5kYXIvYXNpLWNhbGVuZGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN2SSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRCxPQUFPLEtBQUssYUFBYSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDOztJQWNjLGdEQUEyQjtJQXFDbkUsOEJBQXlDLFVBQWU7UUFBeEQsWUFDRSxpQkFBTyxTQVFSO1FBVHdDLGdCQUFVLEdBQVYsVUFBVSxDQUFLOzZCQWQvQixJQUFJLFlBQVksRUFBUTtxQkFZMUMsS0FBSztRQUlWLEVBQUUsQ0FBQyxDQUFDLEtBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEIsS0FBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQ2xDLEtBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztTQUN2QztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sS0FBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQ2xDLEtBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxD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Q0FBQztTQUMzQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQUMsS0FBSztZQUM5QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxZQUFZLENBQUM7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0tBQ25COztnQkE3UEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxjQUFjO29CQUN4QixzeURBQTBDO29CQUMxQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsNEJBQTRCLEVBQUU7b0JBQzdDLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSxvQkFBb0IsRUFBcEIsQ0FBb0IsQ0FBQzs0QkFDbkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0Y7Ozs7Z0RBc0NjLE1BQU0sU0FBQyxXQUFXOzs7NkJBcEM5QixLQUFLOzBCQUVMLEtBQUs7MEJBQ0wsS0FBSzswQkFFTCxLQUFLOzBCQUNMLEtBQUs7bUNBS0wsS0FBSzsrQkFXTCxNQUFNOzsrQkE1Q1Q7RUFxQjBDLDJCQUEyQjtTQUF4RCxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLy4uL2NvbW1vbi9kZWZhdWx0LWNvbnRyb2wtdmFsdWUtYWNjZXNzb3InO1xyXG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIEluamVjdCwgUExBVEZPUk1fSUQsIE9uQ2hhbmdlcywgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbmltcG9ydCAqIGFzIGNhbGVuZGFyQ29uc3QgZnJvbSAnLi9hc2ktY2FsZW5kYXItY29uc3RhbnRzJztcclxuaW1wb3J0ICogYXMgbmggZnJvbSAnLi4vLi4vbmF0aXZlLWhlbHBlcic7XHJcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXNpLWNhbGVuZGFyJyxcclxuICB0ZW1wbGF0ZVVybDogJ2FzaS1jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXHJcbiAgaG9zdDogeyBjbGFzczogJ2FzaS1jb21wb25lbnQgYXNpLWNhbGVuZGFyJyB9LFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXNpQ2FsZW5kYXJDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFzaUNhbGVuZGFyQ29tcG9uZW50IGV4dGVuZHMgRGVmYXVsdENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQge1xyXG4gIEBJbnB1dCgpIHJlbGF0aXZlVG86IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIG1pbkRhdGU6IERhdGU7XHJcbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZTtcclxuXHJcbiAgQElucHV0KCkgbWluWWVhcjogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIG1heFllYXI6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSBfZGlzYWJsZURheU9mV2VlazogbnVtYmVyW107XHJcblxyXG4gIC8qKiBhbGxvdyB5b3UgdG8gZGlzYWJsZSBkYXkgb2Ygd2VlayBleGVtcGxlIFtkaXNhYmxlRGF5T2ZXZWVrXT1cIlsxLCAyXVwiXCIgd2hpbGUgZGlzYWJsZWQgbW9uZGF5IGFuZCB0dXNkYXkgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBkaXNhYmxlRGF5T2ZXZWVrKGRheXNPZldlZWspIHtcclxuICAgIGlmICghZGF5c09mV2Vlaykge1xyXG4gICAgICB0aGlzLl9kaXNhYmxlRGF5T2ZXZWVrID0gW107XHJcbiAgICB9IGVsc2UgaWYgKG5oLmlzQXJyYXkoZGF5c09mV2VlaykpIHtcclxuICAgICAgdGhpcy5fZGlzYWJsZURheU9mV2VlayA9IGRheXNPZldlZWs7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9kaXNhYmxlRGF5T2ZXZWVrID0gW2RheXNPZldlZWtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIG9uRGF0ZVBpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcclxuXHJcbiAgZGF5czogQXJyYXk8Y2FsZW5kYXJDb25zdC5EYXk+O1xyXG4gIG1vbnRoczogQXJyYXk8Y2FsZW5kYXJDb25zdC5Nb250aD47XHJcbiAgeWVhcnM6IEFycmF5PG51bWJlcj47XHJcblxyXG4gIHNlbGVjdGVkTW9udGg6IGNhbGVuZGFyQ29uc3QuTW9udGg7XHJcbiAgc2VsZWN0ZWRZZWFyOiBudW1iZXI7XHJcbiAgc2VsZWN0ZWREYXk6IGNhbGVuZGFyQ29uc3QuRGF5SXRlbTtcclxuXHJcbiAgZGF5T2ZNb250aHM6IEFycmF5PGNhbGVuZGFyQ29uc3QuRGF5SXRlbT47XHJcblxyXG4gIG9wZW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBhbnkpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBpZiAodGhpcy5pc0ZyKCkpIHtcclxuICAgICAgdGhpcy5kYXlzID0gY2FsZW5kYXJDb25zdC5kYXlzX2ZyO1xyXG4gICAgICB0aGlzLm1vbnRocyA9IGNhbGVuZGFyQ29uc3QubW9udGhzX2ZyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kYXlzID0gY2FsZW5kYXJDb25zdC5kYXlzX2VuO1xyXG4gICAgICB0aGlzLm1vbnRocyA9IGNhbGVuZGFyQ29uc3QubW9udGhzX2VuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRZZWFycygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0ZyKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgcmV0dXJuIG5hdmlnYXRvci5sYW5ndWFnZSA9PT0gJ2ZyJyB8fCBuYXZpZ2F0b3IubGFuZ3VhZ2UgPT09ICdmci1GUic7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuICAgIGlmICh0aGlzLm1pbkRhdGUpIHtcclxuICAgICAgdGhpcy5taW5EYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubWF4RGF0ZSkge1xyXG4gICAgICB0aGlzLm1heERhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcclxuICAgIH1cclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gIH1cclxuXHJcbiAgaW5pdFllYXJzKCkge1xyXG4gICAgbGV0IHJlc3VsdHMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG4gICAgZm9yIChsZXQgeWVhciA9IHRoaXMubWF4WWVhcjsgeWVhciA+PSB0aGlzLm1pblllYXI7IHllYXItLSkge1xyXG4gICAgICByZXN1bHRzLnB1c2goeWVhcik7XHJcbiAgICB9XHJcbiAgICB0aGlzLnllYXJzID0gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIG9uRHJvcGRvd25DbG9zZSgpIHtcclxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5DYWxlbmRhcigpIHtcclxuICAgIHRoaXMub3BlbiA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VDYWxlbmRhcigpIHtcclxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25EYXlTZWxlY3RlZChkYXlJdGVtOiBjYWxlbmRhckNvbnN0LkRheUl0ZW0pIHtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXkgPSBuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRheUl0ZW0uZGF5LCBkYXlJdGVtLm1vbnRoLCBkYXlJdGVtLnllYXIsIGRheUl0ZW0uZGF0ZSwgJ3NlbGVjdGVkIGVuYWJsZWQnKTtcclxuICAgIHRoaXMudmFsdWUgPSBkYXlJdGVtLmRhdGU7XHJcbiAgICB0aGlzLmNsb3NlQ2FsZW5kYXIoKTtcclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG5cclxuICAgIHRoaXMub25EYXRlUGlja2VkLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBvbk1vbnRoU2VsZWN0ZWQoKSB7XHJcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWRZZWFyLCB0aGlzLnNlbGVjdGVkTW9udGgubnVtIC0gMSwgdGhpcy5zZWxlY3RlZERheS5kYXkpO1xyXG4gICAgdGhpcy52YWx1ZSA9IGRhdGU7XHJcbiAgICB0aGlzLmNhbGN1bERheXMoKTtcclxuICAgIHRoaXMub25EYXRlUGlja2VkLmVtaXQoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBvblllYXJTZWxlY3RlZCgpIHtcclxuICAgIGxldCBkYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZFllYXIsIHRoaXMuc2VsZWN0ZWRNb250aC5udW0gLSAxLCB0aGlzLnNlbGVjdGVkRGF5LmRheSk7XHJcbiAgICB0aGlzLnZhbHVlID0gZGF0ZTtcclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gICAgdGhpcy5vbkRhdGVQaWNrZWQuZW1pdChkYXRlKTtcclxuICB9XHJcblxyXG4gIGNhbGN1bERheXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRNb250aCB8fCAhdGhpcy5zZWxlY3RlZFllYXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IG1vbnRoID0gdGhpcy5zZWxlY3RlZE1vbnRoLm51bSAtIDE7XHJcbiAgICBsZXQgeWVhciA9IHRoaXMuc2VsZWN0ZWRZZWFyO1xyXG4gICAgY29uc3QgcmVzdWx0ID0gW107XHJcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcclxuXHJcbiAgICBsZXQgbW9uZGF5RGVsdGEgPSAwO1xyXG4gICAgbGV0IGRheSA9IGRhdGUuZ2V0RGF5KCk7XHJcbiAgICBpZiAoZGF5ID09PSAwKSB7XHJcbiAgICAgIG1vbmRheURlbHRhID0gLTY7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBtb25kYXlEZWx0YSA9IC0oZGF5IC0gMSk7XHJcbiAgICB9XHJcblxyXG4gICAgZGF0ZSA9IG1vbWVudChkYXRlKS5hZGQobW9uZGF5RGVsdGEsICdkYXlzJykudG9EYXRlKCk7XHJcblxyXG4gICAgbGV0IGRlbHRhTW9udGggPSBkYXRlLmdldE1vbnRoKCk7XHJcblxyXG4gICAgaWYgKGRlbHRhTW9udGggIT09IG1vbnRoKSB7XHJcbiAgICAgIC8vIEJlZm9yZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICAgIHdoaWxlIChkYXRlLmdldE1vbnRoKCkgPT09IGRlbHRhTW9udGgpIHtcclxuICAgICAgICBpZiAoZGF0ZS5nZXREYXRlKCkgPT09IHRoaXMuc2VsZWN0ZWREYXkuZGF5ICYmIGRhdGUuZ2V0TW9udGgoKSArIDEgPT09IHRoaXMuc2VsZWN0ZWREYXkubW9udGggJiYgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLnNlbGVjdGVkRGF5LnllYXIpIHtcclxuICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuc2VsZWN0ZWREYXkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaChuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRhdGUuZ2V0RGF0ZSgpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldEZ1bGxZZWFyKCksIG5ldyBEYXRlKGRhdGUpLCAnZXh0cmEgZW5hYmxlZCcpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBNb250aCBkYXRlc1xyXG4gICAgd2hpbGUgKGRhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGgpIHtcclxuICAgICAgaWYgKGRhdGUuZ2V0RGF0ZSgpID09PSB0aGlzLnNlbGVjdGVkRGF5LmRheSAmJiBkYXRlLmdldE1vbnRoKCkgKyAxID09PSB0aGlzLnNlbGVjdGVkRGF5Lm1vbnRoICYmIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5zZWxlY3RlZERheS55ZWFyKSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5zZWxlY3RlZERheSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IGNhbGVuZGFyQ29uc3QuRGF5SXRlbShkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgZGF0ZS5nZXRGdWxsWWVhcigpLCBuZXcgRGF0ZShkYXRlKSwgJ2VuYWJsZWQnKSk7XHJcbiAgICAgIH1cclxuICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGF5cyBvZiB0aGUgbGFzdCB3ZWVrXHJcbiAgICB3aGlsZSAoZGF0ZS5nZXREYXkoKSAhPT0gMSkge1xyXG4gICAgICBpZiAoZGF0ZS5nZXREYXRlKCkgPT09IHRoaXMuc2VsZWN0ZWREYXkuZGF5ICYmIGRhdGUuZ2V0TW9udGgoKSArIDEgPT09IHRoaXMuc2VsZWN0ZWREYXkubW9udGggJiYgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLnNlbGVjdGVkRGF5LnllYXIpIHtcclxuICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbGVjdGVkRGF5KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQucHVzaChuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRhdGUuZ2V0RGF0ZSgpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldEZ1bGxZZWFyKCksIG5ldyBEYXRlKGRhdGUpLCAnZXh0cmEgZW5hYmxlZCcpKTtcclxuICAgICAgfVxyXG4gICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRheU9mTW9udGhzID0gcmVzdWx0O1xyXG5cclxuICAgIHRoaXMubWFuYWdlRGlzYWJsZWREYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hbmFnZURpc2FibGVkRGF0ZSgpIHtcclxuICAgIGNvbnN0IGRheU9mV2Vla0Rpc2FibGVkID0gIW5oLmlzRW1wdHkodGhpcy5fZGlzYWJsZURheU9mV2Vlayk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF5T2ZNb250aHMpIHtcclxuICAgICAgbmguZm9yRWFjaCh0aGlzLmRheU9mTW9udGhzLCAoZGF5SXRlbSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgaWYgKGRheUl0ZW0uZGF0ZSA8IHRoaXMubWluRGF0ZSkge1xyXG4gICAgICAgICAgICBkYXlJdGVtLmNsYXNzID0gJ2Rpc2FibGVkJztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubWF4RGF0ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBpZiAoZGF5SXRlbS5kYXRlID4gdGhpcy5tYXhEYXRlKSB7XHJcbiAgICAgICAgICAgIGRheUl0ZW0uY2xhc3MgPSAnZGlzYWJsZWQnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF5T2ZXZWVrRGlzYWJsZWQgJiYgdGhpcy5fZGlzYWJsZURheU9mV2Vlay5pbmNsdWRlcyg8bnVtYmVyPmRheUl0ZW0uZGF0ZS5nZXREYXkoKSkpIHtcclxuICAgICAgICAgIGRheUl0ZW0uY2xhc3MgPSAnZGlzYWJsZWQnO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlKSB7XHJcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5pbml0VG9EYXRlKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGluaXRUb0RhdGUodmFsdWU6IERhdGUpIHtcclxuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlWydlcnJvciddKSB7XHJcbiAgICAgIHZhbHVlID0gbmV3IERhdGUoKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRZZWFyID0gdmFsdWUuZ2V0RnVsbFllYXIoKTtcclxuXHJcbiAgICBsZXQgZGF0ZU1vbnRoID0gdmFsdWUuZ2V0TW9udGgoKSArIDE7XHJcbiAgICB0aGlzLnNlbGVjdGVkTW9udGggPSBuaC5maW5kKHRoaXMubW9udGhzLCAobW9udGgpID0+IHtcclxuICAgICAgcmV0dXJuIG1vbnRoLm51bSA9PT0gZGF0ZU1vbnRoO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZERheSA9IG5ldyBjYWxlbmRhckNvbnN0LkRheUl0ZW0odmFsdWUuZ2V0RGF0ZSgpLCB0aGlzLnNlbGVjdGVkTW9udGgubnVtLCB0aGlzLnNlbGVjdGVkWWVhciwgbmV3IERhdGUodmFsdWUpLCAnc2VsZWN0ZWQgZW5hYmxlZCcpO1xyXG5cclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gIH1cclxuXHJcbiAgZ29OZXh0TW9udGgoKSB7XHJcbiAgICBsZXQgbmV4dE1vbnRoTnVtID0gdGhpcy5zZWxlY3RlZE1vbnRoLm51bSArIDE7XHJcbiAgICBpZiAobmV4dE1vbnRoTnVtID09PSAxMykge1xyXG4gICAgICBuZXh0TW9udGhOdW0gPSAxO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkWWVhciA9IHRoaXMuc2VsZWN0ZWRZZWFyICsgMTtcclxuICAgICAgaWYgKHRoaXMueWVhcnMuaW5kZXhPZih0aGlzLnNlbGVjdGVkWWVhcikgPT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy55ZWFycy5wdXNoKHRoaXMuc2VsZWN0ZWRZZWFyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZE1vbnRoID0gbmguZmluZCh0aGlzLm1vbnRocywgKG1vbnRoKSA9PiB7XHJcbiAgICAgIHJldHVybiBtb250aC5udW0gPT09IG5leHRNb250aE51bTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gIH1cclxuXHJcbiAgZ29QcmV2aW91c01vbnRoKCkge1xyXG4gICAgbGV0IG5leHRNb250aE51bSA9IHRoaXMuc2VsZWN0ZWRNb250aC5udW0gLSAxO1xyXG4gICAgaWYgKG5leHRNb250aE51bSA9PT0gMCkge1xyXG4gICAgICBuZXh0TW9udGhOdW0gPSAxMjtcclxuICAgICAgdGhpcy5zZWxlY3RlZFllYXIgPSB0aGlzLnNlbGVjdGVkWWVhciAtIDE7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkTW9udGggPSBuaC5maW5kKHRoaXMubW9udGhzLCAobW9udGgpID0+IHtcclxuICAgICAgcmV0dXJuIG1vbnRoLm51bSA9PT0gbmV4dE1vbnRoTnVtO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxjdWxEYXlzKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==