@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
633 lines • 64.7 kB
JavaScript
import { __decorate, __metadata, __read, __spread } from "tslib";
import { Input, Output, EventEmitter, Directive } from '@angular/core';
import { Calendar, isDateInRanges } from './calendar';
import { Subject } from 'rxjs';
import { isDate } from '../core/utils';
/**
* Sets the selction type - single, multi or range.
*/
export var CalendarSelection;
(function (CalendarSelection) {
CalendarSelection["SINGLE"] = "single";
CalendarSelection["MULTI"] = "multi";
CalendarSelection["RANGE"] = "range";
})(CalendarSelection || (CalendarSelection = {}));
export var ScrollMonth;
(function (ScrollMonth) {
ScrollMonth["PREV"] = "prev";
ScrollMonth["NEXT"] = "next";
ScrollMonth["NONE"] = "none";
})(ScrollMonth || (ScrollMonth = {}));
/** @hidden @internal */
var IgxCalendarBaseDirective = /** @class */ (function () {
/**
* @hidden
*/
function IgxCalendarBaseDirective() {
/**
* Sets/gets whether the outside dates (dates that are out of the current month) will be hidden.
* Default value is `false`.
* ```html
* <igx-calendar [hideOutsideDays] = "true"></igx-calendar>
* ```
* ```typescript
* let hideOutsideDays = this.calendar.hideOutsideDays;
* ```
*/
this.hideOutsideDays = false;
/**
* Emits an event when a date is selected.
* Provides reference the `selectedDates` property.
*/
this.onSelection = new EventEmitter();
/**
*@hidden
*/
this._selection = CalendarSelection.SINGLE;
/**
*@hidden
*/
this.rangeStarted = false;
/**
*@hidden
*/
this._locale = 'en';
/**
*@hidden
*/
this._disabledDates = null;
/**
*@hidden
*/
this._specialDates = null;
/**
*@hidden
*/
this._formatOptions = {
day: 'numeric',
month: 'short',
weekday: 'short',
year: 'numeric'
};
/**
*@hidden
*/
this._formatViews = {
day: false,
month: true,
year: false
};
/**
* @hidden
*/
this.monthScrollDirection = ScrollMonth.NONE;
/**
*@hidden
*/
this.scrollMonth$ = new Subject();
/**
*@hidden
*/
this.stopMonthScroll$ = new Subject();
/**
*@hidden
*/
this.startMonthScroll$ = new Subject();
/**
*@hidden
*/
this._onTouchedCallback = function () { };
/**
*@hidden
*/
this._onChangeCallback = function () { };
this.calendarModel = new Calendar();
this.viewDate = this.viewDate ? this.viewDate : new Date();
this.calendarModel.firstWeekDay = this.weekStart;
this.initFormatters();
}
Object.defineProperty(IgxCalendarBaseDirective.prototype, "weekStart", {
/**
* Gets the start day of the week.
* Can return a numeric or an enum representation of the week day.
* Defaults to `Sunday` / `0`.
*/
get: function () {
return this.calendarModel.firstWeekDay;
},
/**
* Sets the start day of the week.
* Can be assigned to a numeric value or to `WEEKDAYS` enum value.
*/
set: function (value) {
this.calendarModel.firstWeekDay = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxCalendarBaseDirective.prototype, "locale", {
/**
* Gets the `locale` of the calendar.
* Default value is `"en"`.
*/
get: function () {
return this._locale;
},
/**
* Sets the `locale` of the calendar.
* Expects a valid BCP 47 language tag.
* Default value is `"en"`.
*/
set: function (value) {
this._locale = value;
this.initFormatters();
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxCalendarBaseDirective.prototype, "formatOptions", {
/**
* Gets the date format options of the days view.
*/
get: function () {
return this._formatOptions;
},
/**
* Sets the date format options of the days view.
* Default is { day: 'numeric', month: 'short', weekday: 'short', year: 'numeric' }
*/
set: function (formatOptions) {
this._formatOptions = Object.assign(this._formatOptions, formatOptions);
this.initFormatters();
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxCalendarBaseDirective.prototype, "formatViews", {
/**
* Gets whether the `day`, `month` and `year` should be rendered
* according to the locale and formatOptions, if any.
*/
get: function () {
return this._formatViews;
},
/**
* Gets whether the `day`, `month` and `year` should be rendered
* according to the locale and formatOptions, if any.
*/
set: function (formatViews) {
this._formatViews = Object.assign(this._formatViews, formatViews);
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxCalendarBaseDirective.prototype, "selection", {
/**
*
* Gets the selection type.
* Default value is `"single"`.
* Changing the type of selection resets the currently
* selected values if any.
*/
get: function () {
return this._selection;
},
/**
* Sets the selection.
*/
set: function (value) {
switch (value) {
case CalendarSelection.SINGLE:
this.selectedDates = null;
break;
case CalendarSelection.MULTI:
case CalendarSelection.RANGE:
this.selectedDates = [];
break;
default:
throw new Error('Invalid selection value');
}
this._onChangeCallback(this.selectedDates);
this.rangeStarted = false;
this._selection = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxCalendarBaseDirective.prototype, "value", {
/**
* Gets the selected date(s).
*
* When selection is set to `single`, it returns
* a single `Date` object.
* Otherwise it is an array of `Date` objects.
*/
get: function () {
return this.selectedDates;
},
/**
* Sets the selected date(s).
*
* When selection is set to `single`, it accepts
* a single `Date` object.
* Otherwise it is an array of `Date` objects.
*/
set: function (value) {
if (!value || !!value && value.length === 0) {
return;
}
this.selectDate(value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxCalendarBaseDirective.prototype, "viewDate", {
/**
* Gets the date that is presented.
* By default it is the current date.
*/
get: function () {
return this._viewDate;
},
/**
* Sets the date that will be presented in the default view when the component renders.
*/
set: function (value) {
this._viewDate = this.getDateOnly(value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxCalendarBaseDirective.prototype, "disabledDates", {
/**
* Gets the disabled dates descriptors.
*/
get: function () {
return this._disabledDates;
},
/**
* Sets the disabled dates' descriptors.
* ```typescript
*@ViewChild("MyCalendar")
*public calendar: IgxCalendarComponent;
*ngOnInit(){
* this.calendar.disabledDates = [
* {type: DateRangeType.Between, dateRange: [new Date("2020-1-1"), new Date("2020-1-15")]},
* {type: DateRangeType.Weekends}];
*}
*```
*/
set: function (value) {
this._disabledDates = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxCalendarBaseDirective.prototype, "specialDates", {
/**
* Gets the special dates descriptors.
*/
get: function () {
return this._specialDates;
},
/**
* Sets the special dates' descriptors.
* ```typescript
*@ViewChild("MyCalendar")
*public calendar: IgxCalendarComponent;
*ngOnInit(){
* this.calendar.specialDates = [
* {type: DateRangeType.Between, dateRange: [new Date("2020-1-1"), new Date("2020-1-15")]},
* {type: DateRangeType.Weekends}];
*}
*```
*/
set: function (value) {
this._specialDates = value;
},
enumerable: true,
configurable: true
});
/**
*@hidden
*/
IgxCalendarBaseDirective.prototype.getDateOnlyInMs = function (date) {
return this.getDateOnly(date).getTime();
};
/**
*@hidden
*/
IgxCalendarBaseDirective.prototype.generateDateRange = function (start, end) {
var result = [];
start = this.getDateOnly(start);
end = this.getDateOnly(end);
while (start.getTime() !== end.getTime()) {
start = this.calendarModel.timedelta(start, 'day', 1);
result.push(start);
}
return result;
};
/**
* Performs a single selection.
* @hidden
*/
IgxCalendarBaseDirective.prototype.selectSingle = function (value) {
this.selectedDates = this.getDateOnly(value);
this._onChangeCallback(this.selectedDates);
};
/**
* Performs a multiple selection
* @hidden
*/
IgxCalendarBaseDirective.prototype.selectMultiple = function (value) {
var _this = this;
if (Array.isArray(value)) {
var newDates = value.map(function (v) { return _this.getDateOnly(v).getTime(); });
var selDates = this.selectedDates.map(function (v) { return _this.getDateOnly(v).getTime(); });
if (JSON.stringify(newDates) === JSON.stringify(selDates)) {
return;
}
this.selectedDates = Array.from(new Set(__spread(newDates, selDates))).map(function (v) { return new Date(v); });
}
else {
var valueDateOnly_1 = this.getDateOnly(value);
var newSelection = [];
if (this.selectedDates.every(function (date) { return date.getTime() !== valueDateOnly_1.getTime(); })) {
newSelection.push(valueDateOnly_1);
}
else {
this.selectedDates = this.selectedDates.filter(function (date) { return date.getTime() !== valueDateOnly_1.getTime(); });
}
if (newSelection.length > 0) {
this.selectedDates = this.selectedDates.concat(newSelection);
}
}
this.selectedDates = this.selectedDates.filter(function (d) { return !_this.isDateDisabled(d); });
this.selectedDates.sort(function (a, b) { return a.valueOf() - b.valueOf(); });
this._onChangeCallback(this.selectedDates);
};
/**
*@hidden
*/
IgxCalendarBaseDirective.prototype.selectRange = function (value, excludeDisabledDates) {
var _this = this;
if (excludeDisabledDates === void 0) { excludeDisabledDates = false; }
var start;
var end;
if (Array.isArray(value)) {
// this.rangeStarted = false;
value.sort(function (a, b) { return a.valueOf() - b.valueOf(); });
start = this.getDateOnly(value[0]);
end = this.getDateOnly(value[value.length - 1]);
this.selectedDates = __spread([start], this.generateDateRange(start, end));
}
else {
if (!this.rangeStarted) {
this.rangeStarted = true;
this.selectedDates = [value];
}
else {
this.rangeStarted = false;
if (this.selectedDates[0].getTime() === value.getTime()) {
this.selectedDates = [];
this._onChangeCallback(this.selectedDates);
return;
}
this.selectedDates.push(value);
this.selectedDates.sort(function (a, b) { return a.valueOf() - b.valueOf(); });
start = this.selectedDates.shift();
end = this.selectedDates.pop();
this.selectedDates = __spread([start], this.generateDateRange(start, end));
}
}
if (excludeDisabledDates) {
this.selectedDates = this.selectedDates.filter(function (d) { return !_this.isDateDisabled(d); });
}
this._onChangeCallback(this.selectedDates);
};
/**
* Performs a single deselection.
* @hidden
*/
IgxCalendarBaseDirective.prototype.deselectSingle = function (value) {
if (this.selectedDates !== null &&
this.getDateOnlyInMs(value) === this.getDateOnlyInMs(this.selectedDates)) {
this.selectedDates = null;
this._onChangeCallback(this.selectedDates);
}
};
/**
* Performs a multiple deselection.
* @hidden
*/
IgxCalendarBaseDirective.prototype.deselectMultiple = function (value) {
var _this = this;
value = value.filter(function (v) { return v !== null; });
var selectedDatesCount = this.selectedDates.length;
var datesInMsToDeselect = new Set(value.map(function (v) { return _this.getDateOnlyInMs(v); }));
for (var i = this.selectedDates.length - 1; i >= 0; i--) {
if (datesInMsToDeselect.has(this.getDateOnlyInMs(this.selectedDates[i]))) {
this.selectedDates.splice(i, 1);
}
}
if (this.selectedDates.length !== selectedDatesCount) {
this._onChangeCallback(this.selectedDates);
}
};
/**
* Performs deselection of a single value, when selection is multi
* Usually performed by the selectMultiple method, but leads to bug when multiple months are in view
* @hidden
*/
IgxCalendarBaseDirective.prototype.deselectMultipleInMonth = function (value) {
var valueDateOnly = this.getDateOnly(value);
this.selectedDates = this.selectedDates.filter(function (date) { return date.getTime() !== valueDateOnly.getTime(); });
};
/**
* Performs a range deselection.
* @hidden
*/
IgxCalendarBaseDirective.prototype.deselectRange = function (value) {
value = value.filter(function (v) { return v !== null; });
if (value.length < 1) {
return;
}
value.sort(function (a, b) { return a.valueOf() - b.valueOf(); });
var valueStart = this.getDateOnlyInMs(value[0]);
var valueEnd = this.getDateOnlyInMs(value[value.length - 1]);
this.selectedDates.sort(function (a, b) { return a.valueOf() - b.valueOf(); });
var selectedDatesStart = this.getDateOnlyInMs(this.selectedDates[0]);
var selectedDatesEnd = this.getDateOnlyInMs(this.selectedDates[this.selectedDates.length - 1]);
if (!(valueEnd < selectedDatesStart) && !(valueStart > selectedDatesEnd)) {
this.selectedDates = [];
this.rangeStarted = false;
this._onChangeCallback(this.selectedDates);
}
};
/**
* @hidden
*/
IgxCalendarBaseDirective.prototype.initFormatters = function () {
this.formatterDay = new Intl.DateTimeFormat(this._locale, { day: this._formatOptions.day });
this.formatterWeekday = new Intl.DateTimeFormat(this._locale, { weekday: this._formatOptions.weekday });
this.formatterMonth = new Intl.DateTimeFormat(this._locale, { month: this._formatOptions.month });
this.formatterYear = new Intl.DateTimeFormat(this._locale, { year: this._formatOptions.year });
this.formatterMonthday = new Intl.DateTimeFormat(this._locale, { month: this._formatOptions.month, day: this._formatOptions.day });
};
/**
*@hidden
*/
IgxCalendarBaseDirective.prototype.getDateOnly = function (date) {
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
};
/**
* @hidden
*/
IgxCalendarBaseDirective.prototype.registerOnChange = function (fn) {
this._onChangeCallback = fn;
};
/**
* @hidden
*/
IgxCalendarBaseDirective.prototype.registerOnTouched = function (fn) {
this._onTouchedCallback = fn;
};
/**
* @hidden
*/
IgxCalendarBaseDirective.prototype.writeValue = function (value) {
this.selectDate(value);
};
/**
* Checks whether a date is disabled.
* @hidden
*/
IgxCalendarBaseDirective.prototype.isDateDisabled = function (date) {
if (this.disabledDates === null) {
return false;
}
return isDateInRanges(date, this.disabledDates);
};
/**
* Selects date(s) (based on the selection type).
*/
IgxCalendarBaseDirective.prototype.selectDate = function (value) {
if (value === null || value === undefined || (Array.isArray(value) && value.length === 0)) {
return;
}
switch (this.selection) {
case CalendarSelection.SINGLE:
if (isDate(value) && !this.isDateDisabled(value)) {
this.selectSingle(value);
}
break;
case CalendarSelection.MULTI:
this.selectMultiple(value);
break;
case CalendarSelection.RANGE:
this.selectRange(value, true);
break;
}
};
/**
* Deselects date(s) (based on the selection type).
*/
IgxCalendarBaseDirective.prototype.deselectDate = function (value) {
if (this.selectedDates === null || this.selectedDates.length === 0) {
return;
}
if (value === null || value === undefined) {
this.selectedDates = this.selection === CalendarSelection.SINGLE ? null : [];
this.rangeStarted = false;
this._onChangeCallback(this.selectedDates);
return;
}
switch (this.selection) {
case CalendarSelection.SINGLE:
this.deselectSingle(value);
break;
case CalendarSelection.MULTI:
this.deselectMultiple(value);
break;
case CalendarSelection.RANGE:
this.deselectRange(value);
break;
}
};
/**
* @hidden
*/
IgxCalendarBaseDirective.prototype.selectDateFromClient = function (value) {
switch (this.selection) {
case CalendarSelection.SINGLE:
case CalendarSelection.MULTI:
this.selectDate(value);
break;
case CalendarSelection.RANGE:
this.selectRange(value, true);
break;
}
};
__decorate([
Input(),
__metadata("design:type", Number),
__metadata("design:paramtypes", [Number])
], IgxCalendarBaseDirective.prototype, "weekStart", null);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], IgxCalendarBaseDirective.prototype, "locale", null);
__decorate([
Input(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], IgxCalendarBaseDirective.prototype, "formatOptions", null);
__decorate([
Input(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], IgxCalendarBaseDirective.prototype, "formatViews", null);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], IgxCalendarBaseDirective.prototype, "selection", null);
__decorate([
Input(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], IgxCalendarBaseDirective.prototype, "value", null);
__decorate([
Input(),
__metadata("design:type", Date),
__metadata("design:paramtypes", [Date])
], IgxCalendarBaseDirective.prototype, "viewDate", null);
__decorate([
Input(),
__metadata("design:type", Array),
__metadata("design:paramtypes", [Array])
], IgxCalendarBaseDirective.prototype, "disabledDates", null);
__decorate([
Input(),
__metadata("design:type", Array),
__metadata("design:paramtypes", [Array])
], IgxCalendarBaseDirective.prototype, "specialDates", null);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxCalendarBaseDirective.prototype, "hideOutsideDays", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], IgxCalendarBaseDirective.prototype, "onSelection", void 0);
IgxCalendarBaseDirective = __decorate([
Directive({
selector: '[igxCalendarBase]'
}),
__metadata("design:paramtypes", [])
], IgxCalendarBaseDirective);
return IgxCalendarBaseDirective;
}());
export { IgxCalendarBaseDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItYmFzZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY2FsZW5kYXIvY2FsZW5kYXItYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQVksUUFBUSxFQUFFLGNBQWMsRUFBd0MsTUFBTSxZQUFZLENBQUM7QUFHdEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksaUJBSVg7QUFKRCxXQUFZLGlCQUFpQjtJQUN6QixzQ0FBaUIsQ0FBQTtJQUNqQixvQ0FBZSxDQUFBO0lBQ2Ysb0NBQWUsQ0FBQTtBQUNuQixDQUFDLEVBSlcsaUJBQWlCLEtBQWpCLGlCQUFpQixRQUk1QjtBQUVELE1BQU0sQ0FBTixJQUFZLFdBSVg7QUFKRCxXQUFZLFdBQVc7SUFDbkIsNEJBQWEsQ0FBQTtJQUNiLDRCQUFhLENBQUE7SUFDYiw0QkFBYSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxXQUFXLEtBQVgsV0FBVyxRQUl0QjtBQUVELHdCQUF3QjtBQUl4QjtJQXlVSTs7T0FFRztJQUNIO1FBeklBOzs7Ozs7Ozs7V0FTRztRQUdJLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBRS9COzs7V0FHRztRQUVJLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFFdkQ7O1dBRUc7UUFDSyxlQUFVLEdBQStCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUUxRTs7V0FFRztRQUNJLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTVCOztVQUVFO1FBQ00sWUFBTyxHQUFHLElBQUksQ0FBQztRQU92Qjs7V0FFRztRQUNLLG1CQUFj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SztnQkFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzlCLE1BQU07U0FDYjtJQUNMLENBQUM7SUFsbkJEO1FBREMsS0FBSyxFQUFFOzs7NkRBR1A7SUFlRDtRQURDLEtBQUssRUFBRTs7OzBEQUdQO0lBZ0JEO1FBREMsS0FBSyxFQUFFOzs7aUVBR1A7SUFnQkQ7UUFEQyxLQUFLLEVBQUU7OzsrREFHUDtJQWtCRDtRQURDLEtBQUssRUFBRTs7OzZEQUdQO0lBOEJEO1FBREMsS0FBSyxFQUFFOzs7eURBR1A7SUFzQkQ7UUFEQyxLQUFLLEVBQUU7a0NBUW1CLElBQUk7eUNBQUosSUFBSTs0REFMOUI7SUFhRDtRQURDLEtBQUssRUFBRTs7O2lFQUdQO0lBc0JEO1FBREMsS0FBSyxFQUFFOzs7Z0VBR1A7SUE4QkQ7UUFEQyxLQUFLLEVBQUU7O3FFQUN1QjtJQU8vQjtRQURDLE1BQU0sRUFBRTs7aUVBQzhDO0lBdE45Qyx3QkFBd0I7UUFIcEMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLG1CQUFtQjtTQUNoQyxDQUFDOztPQUNXLHdCQUF3QixDQTBuQnBDO0lBQUQsK0JBQUM7Q0FBQSxBQTFuQkQsSUEwbkJDO1NBMW5CWSx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgV0VFS0RBWVMsIENhbGVuZGFyLCBpc0RhdGVJblJhbmdlcywgSUZvcm1hdHRpbmdPcHRpb25zLCBJRm9ybWF0dGluZ1ZpZXdzIH0gZnJvbSAnLi9jYWxlbmRhcic7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGVSYW5nZURlc2NyaXB0b3IgfSBmcm9tICcuLi9jb3JlL2RhdGVzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGlzRGF0ZSB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuXG4vKipcbiAqIFNldHMgdGhlIHNlbGN0aW9uIHR5cGUgLSBzaW5nbGUsIG11bHRpIG9yIHJhbmdlLlxuICovXG5leHBvcnQgZW51bSBDYWxlbmRhclNlbGVjdGlvbiB7XG4gICAgU0lOR0xFID0gJ3NpbmdsZScsXG4gICAgTVVMVEkgPSAnbXVsdGknLFxuICAgIFJBTkdFID0gJ3JhbmdlJ1xufVxuXG5leHBvcnQgZW51bSBTY3JvbGxNb250aCB7XG4gICAgUFJFViA9ICdwcmV2JyxcbiAgICBORVhUID0gJ25leHQnLFxuICAgIE5PTkUgPSAnbm9uZSdcbn1cblxuLyoqIEBoaWRkZW4gQGludGVybmFsICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hDYWxlbmRhckJhc2VdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYWxlbmRhckJhc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3RhcnQgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAqIENhbiByZXR1cm4gYSBudW1lcmljIG9yIGFuIGVudW0gcmVwcmVzZW50YXRpb24gb2YgdGhlIHdlZWsgZGF5LlxuICAgICAqIERlZmF1bHRzIHRvIGBTdW5kYXlgIC8gYDBgLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB3ZWVrU3RhcnQoKTogV0VFS0RBWVMgfCBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhck1vZGVsLmZpcnN0V2Vla0RheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdGFydCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICogQ2FuIGJlIGFzc2lnbmVkIHRvIGEgbnVtZXJpYyB2YWx1ZSBvciB0byBgV0VFS0RBWVNgIGVudW0gdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIHNldCB3ZWVrU3RhcnQodmFsdWU6IFdFRUtEQVlTIHwgbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJNb2RlbC5maXJzdFdlZWtEYXkgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgbG9jYWxlYCBvZiB0aGUgY2FsZW5kYXIuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgXCJlblwiYC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYGxvY2FsZWAgb2YgdGhlIGNhbGVuZGFyLlxuICAgICAqIEV4cGVjdHMgYSB2YWxpZCBCQ1AgNDcgbGFuZ3VhZ2UgdGFnLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYFwiZW5cImAuXG4gICAgICovXG4gICAgcHVibGljIHNldCBsb2NhbGUodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9sb2NhbGUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5pbml0Rm9ybWF0dGVycygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGUgZm9ybWF0IG9wdGlvbnMgb2YgdGhlIGRheXMgdmlldy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZm9ybWF0T3B0aW9ucygpOiBJRm9ybWF0dGluZ09wdGlvbnMge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0T3B0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkYXRlIGZvcm1hdCBvcHRpb25zIG9mIHRoZSBkYXlzIHZpZXcuXG4gICAgICogRGVmYXVsdCBpcyB7IGRheTogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0Jywgd2Vla2RheTogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnIH1cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGZvcm1hdE9wdGlvbnMoZm9ybWF0T3B0aW9uczogSUZvcm1hdHRpbmdPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX2Zvcm1hdE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHRoaXMuX2Zvcm1hdE9wdGlvbnMsIGZvcm1hdE9wdGlvbnMpO1xuICAgICAgICB0aGlzLmluaXRGb3JtYXR0ZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBgZGF5YCwgYG1vbnRoYCBhbmQgYHllYXJgIHNob3VsZCBiZSByZW5kZXJlZFxuICAgICAqIGFjY29yZGluZyB0byB0aGUgbG9jYWxlIGFuZCBmb3JtYXRPcHRpb25zLCBpZiBhbnkuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGZvcm1hdFZpZXdzKCk6IElGb3JtYXR0aW5nVmlld3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0Vmlld3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBgZGF5YCwgYG1vbnRoYCBhbmQgYHllYXJgIHNob3VsZCBiZSByZW5kZXJlZFxuICAgICAqIGFjY29yZGluZyB0byB0aGUgbG9jYWxlIGFuZCBmb3JtYXRPcHRpb25zLCBpZiBhbnkuXG4gICAgICovXG4gICAgcHVibGljIHNldCBmb3JtYXRWaWV3cyhmb3JtYXRWaWV3czogSUZvcm1hdHRpbmdWaWV3cykge1xuICAgICAgICB0aGlzLl9mb3JtYXRWaWV3cyA9IE9iamVjdC5hc3NpZ24odGhpcy5fZm9ybWF0Vmlld3MsIGZvcm1hdFZpZXdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEdldHMgdGhlIHNlbGVjdGlvbiB0eXBlLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYFwic2luZ2xlXCJgLlxuICAgICAqIENoYW5naW5nIHRoZSB0eXBlIG9mIHNlbGVjdGlvbiByZXNldHMgdGhlIGN1cnJlbnRseVxuICAgICAqIHNlbGVjdGVkIHZhbHVlcyBpZiBhbnkuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGlvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNlbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJTZWxlY3Rpb24uU0lOR0xFOlxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyU2VsZWN0aW9uLk1VTFRJOlxuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclNlbGVjdGlvbi5SQU5HRTpcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNlbGVjdGlvbiB2YWx1ZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sodGhpcy5zZWxlY3RlZERhdGVzKTtcbiAgICAgICAgdGhpcy5yYW5nZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2VsZWN0ZWQgZGF0ZShzKS5cbiAgICAgKlxuICAgICAqIFdoZW4gc2VsZWN0aW9uIGlzIHNldCB0byBgc2luZ2xlYCwgaXQgcmV0dXJuc1xuICAgICAqIGEgc2luZ2xlIGBEYXRlYCBvYmplY3QuXG4gICAgICogT3RoZXJ3aXNlIGl0IGlzIGFuIGFycmF5IG9mIGBEYXRlYCBvYmplY3RzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBEYXRlIHwgRGF0ZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzZWxlY3RlZCBkYXRlKHMpLlxuICAgICAqXG4gICAgICogV2hlbiBzZWxlY3Rpb24gaXMgc2V0IHRvIGBzaW5nbGVgLCBpdCBhY2NlcHRzXG4gICAgICogYSBzaW5nbGUgYERhdGVgIG9iamVjdC5cbiAgICAgKiBPdGhlcndpc2UgaXQgaXMgYW4gYXJyYXkgb2YgYERhdGVgIG9iamVjdHMuXG4gICAgICovXG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogRGF0ZSB8IERhdGVbXSkge1xuICAgICAgICBpZiAoIXZhbHVlIHx8ICEhdmFsdWUgJiYgKHZhbHVlIGFzIERhdGVbXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdERhdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGUgdGhhdCBpcyBwcmVzZW50ZWQuXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyB0aGUgY3VycmVudCBkYXRlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB2aWV3RGF0ZSgpOiBEYXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXdEYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGRhdGUgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBpbiB0aGUgZGVmYXVsdCB2aWV3IHdoZW4gdGhlIGNvbXBvbmVudCByZW5kZXJzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgdmlld0RhdGUodmFsdWU6IERhdGUpIHtcbiAgICAgICAgdGhpcy5fdmlld0RhdGUgPSB0aGlzLmdldERhdGVPbmx5KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkaXNhYmxlZCBkYXRlcyBkZXNjcmlwdG9ycy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWREYXRlcygpOiBEYXRlUmFuZ2VEZXNjcmlwdG9yW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWREYXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkaXNhYmxlZCBkYXRlcycgZGVzY3JpcHRvcnMuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15Q2FsZW5kYXJcIilcbiAgICAgKnB1YmxpYyBjYWxlbmRhcjogSWd4Q2FsZW5kYXJDb21wb25lbnQ7XG4gICAgICpuZ09uSW5pdCgpe1xuICAgICAqICAgIHRoaXMuY2FsZW5kYXIuZGlzYWJsZWREYXRlcyA9IFtcbiAgICAgKiAgICAge3R5cGU6IERhdGVSYW5nZVR5cGUuQmV0d2VlbiwgZGF0ZVJhbmdlOiBbbmV3IERhdGUoXCIyMDIwLTEtMVwiKSwgbmV3IERhdGUoXCIyMDIwLTEtMTVcIildfSxcbiAgICAgKiAgICAge3R5cGU6IERhdGVSYW5nZVR5cGUuV2Vla2VuZHN9XTtcbiAgICAgKn1cbiAgICAgKmBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgZGlzYWJsZWREYXRlcyh2YWx1ZTogRGF0ZVJhbmdlRGVzY3JpcHRvcltdKSB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkRGF0ZXMgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzcGVjaWFsIGRhdGVzIGRlc2NyaXB0b3JzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzcGVjaWFsRGF0ZXMoKTogRGF0ZVJhbmdlRGVzY3JpcHRvcltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NwZWNpYWxEYXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzcGVjaWFsIGRhdGVzJyBkZXNjcmlwdG9ycy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlDYWxlbmRhclwiKVxuICAgICAqcHVibGljIGNhbGVuZGFyOiBJZ3hDYWxlbmRhckNvbXBvbmVudDtcbiAgICAgKm5nT25Jbml0KCl7XG4gICAgICogICAgdGhpcy5jYWxlbmRhci5zcGVjaWFsRGF0ZXMgPSBbXG4gICAgICogICAgIHt0eXBlOiBEYXRlUmFuZ2VUeXBlLkJldHdlZW4sIGRhdGVSYW5nZTogW25ldyBEYXRlKFwiMjAyMC0xLTFcIiksIG5ldyBEYXRlKFwiMjAyMC0xLTE1XCIpXX0sXG4gICAgICogICAgIHt0eXBlOiBEYXRlUmFuZ2VUeXBlLldlZWtlbmRzfV07XG4gICAgICp9XG4gICAgICpgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNwZWNpYWxEYXRlcyh2YWx1ZTogRGF0ZVJhbmdlRGVzY3JpcHRvcltdKSB7XG4gICAgICAgIHRoaXMuX3NwZWNpYWxEYXRlcyA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBvdXRzaWRlIGRhdGVzIChkYXRlcyB0aGF0IGFyZSBvdXQgb2YgdGhlIGN1cnJlbnQgbW9udGgpIHdpbGwgYmUgaGlkZGVuLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYWxlbmRhciBbaGlkZU91dHNpZGVEYXlzXSA9IFwidHJ1ZVwiPjwvaWd4LWNhbGVuZGFyPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaGlkZU91dHNpZGVEYXlzID0gdGhpcy5jYWxlbmRhci5oaWRlT3V0c2lkZURheXM7XG4gICAgICogYGBgXG4gICAgICovXG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBoaWRlT3V0c2lkZURheXMgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBkYXRlIGlzIHNlbGVjdGVkLlxuICAgICAqIFByb3ZpZGVzIHJlZmVyZW5jZSB0aGUgYHNlbGVjdGVkRGF0ZXNgIHByb3BlcnR5LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvblNlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IERhdGVbXT4oKTtcblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX3NlbGVjdGlvbjogQ2FsZW5kYXJTZWxlY3Rpb24gfCBzdHJpbmcgPSBDYWxlbmRhclNlbGVjdGlvbi5TSU5HTEU7XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmFuZ2VTdGFydGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAqQGhpZGRlblxuICAgICovXG4gICAgcHJpdmF0ZSBfbG9jYWxlID0gJ2VuJztcblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX3ZpZXdEYXRlOiBEYXRlO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZGlzYWJsZWREYXRlczogRGF0ZVJhbmdlRGVzY3JpcHRvcltdID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX3NwZWNpYWxEYXRlczogRGF0ZVJhbmdlRGVzY3JpcHRvcltdID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX2Zvcm1hdE9wdGlvbnM6IElGb3JtYXR0aW5nT3B0aW9ucyA9IHtcbiAgICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICB3ZWVrZGF5OiAnc2hvcnQnLFxuICAgICAgICB5ZWFyOiAnbnVtZXJpYydcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9ybWF0Vmlld3M6IElGb3JtYXR0aW5nVmlld3MgPSB7XG4gICAgICAgIGRheTogZmFsc2UsXG4gICAgICAgIG1vbnRoOiB0cnVlLFxuICAgICAgICB5ZWFyOiBmYWxzZVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZm9ybWF0dGVyV2Vla2RheTtcblxuICAgIC8qKlxuICAgI