mat-daterangepicker
Version:
Angular material date picker extension to support range selection.
168 lines • 22.8 kB
JavaScript
/*
RANGE: Most of the code is redundant and hera as inheritance boilerplate.
The added/edited code adds logic for handling range / non range mode.
Additionaly, in range mode it will apply logic to mark the dates within the active month
that are within the range.
There are 3 range states for a month view, set by the combination of "_rangable" and "_allInRange":
- Not rangable (single value datepicker OR active month not in range) - _rangable = False
- Rangable but not all (active month is partially in range) - _rangable = True
- All In Range (active month is in range, start/end dates before/after this month) - _rangable = True & _allInRange = True
*/
import { __awaiter, __decorate } from "tslib";
import { Component, ChangeDetectionStrategy, ViewEncapsulation, Input, Output, EventEmitter } from '@angular/core';
import { MatMonthView } from '@angular/material/datepicker';
let MatDaterangeMonthView = class MatDaterangeMonthView extends MatMonthView {
constructor() {
super(...arguments);
this.selectedRangeEndChange = new EventEmitter();
this._createDate = (date) => {
const selectedYear = this._dateAdapter.getYear(this.activeDate);
const selectedMonth = this._dateAdapter.getMonth(this.activeDate);
return new Date(selectedYear, selectedMonth, date);
};
}
get selectedRangeEnd() {
return this._selectedRangeEnd;
}
set selectedRangeEnd(value) {
this._selectedRangeEnd = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
this._selectedRangeEndDate = this._getDateInCurrentMonth(this._selectedRangeEnd);
}
get _allInRange() {
if (!this.range || !this.activeDate || !this.selectedRangeEnd || !this.selected) {
return false;
}
else {
const daysInMonth = this._dateAdapter.getNumDaysInMonth(this.activeDate);
const startDate = this.createDate(1);
const endDate = this.createDate(daysInMonth);
return this._dateAdapter.compareDate(this.selected, startDate) < 0 &&
this._dateAdapter.compareDate(this.selectedRangeEnd, endDate) > 0;
}
}
get _rangable() {
if (!this.range || !this._weeks) {
return false;
}
else {
const daysInMonth = this._dateAdapter.getNumDaysInMonth(this.activeDate);
const startDate = this.createDate(1);
const endDate = this.createDate(daysInMonth);
if (this.selectedRangeEnd < startDate) {
return false;
}
if (this.selected > endDate) {
return false;
}
return true;
}
}
_init() {
this._selectedRangeEndDate = this._getDateInCurrentMonth(this.selectedRangeEnd);
super._init();
}
_dateSelected(date) {
const _super = Object.create(null, {
_dateSelected: { get: () => super._dateSelected }
});
return __awaiter(this, void 0, void 0, function* () {
if (!this.range) {
_super._dateSelected.call(this, date);
}
else {
if (!this.selected || this.selectedRangeEnd) {
if (this._selectedRangeEnd) {
this._dateSelectedRangeEnd(null);
}
_super._dateSelected.call(this, date);
}
else {
if (date === null) {
this._dateSelectedRangeEnd(null);
}
else {
const selectedDate = this.createDate(date);
if (selectedDate < this.selected) {
// const swap = this._selectedDate;
const year = this._dateAdapter.getYear(this.selected);
const month = this._dateAdapter.getMonth(this.selected);
const swap = this._dateAdapter.getDate(this.selected);
_super._dateSelected.call(this, date);
this._dateSelectedRangeEnd(swap, year, month);
}
else {
this._dateSelectedRangeEnd(date);
}
}
}
}
});
}
_dateSelectedRangeEnd(date, year, month) {
if (date === null) {
this.selectedRangeEndChange.emit(null);
}
else if (this._selectedRangeEndDate != date) {
let selectedDate;
if (year && month) {
selectedDate = this._dateAdapter.createDate(year, month, date);
}
else {
selectedDate = this.createDate(date);
}
this.selectedRangeEndChange.emit(selectedDate);
this._userSelection.emit();
}
}
createDate(date) {
const selectedYear = this._dateAdapter.getYear(this.activeDate);
const selectedMonth = this._dateAdapter.getMonth(this.activeDate);
return this._dateAdapter.createDate(selectedYear, selectedMonth, date);
}
getSelectedDate() {
if (!this.selected)
return null;
const selectedYear = this._dateAdapter.getYear(this.selected);
const selectedMonth = this._dateAdapter.getMonth(this.selected);
const selectedDate = this._dateAdapter.getDate(this.selected);
return new Date(selectedYear, selectedMonth, selectedDate);
}
getSelectedRangeEndDate() {
if (!this.selectedRangeEnd)
return null;
const selectedYear = this._dateAdapter.getYear(this.selectedRangeEnd);
const selectedMonth = this._dateAdapter.getMonth(this.selectedRangeEnd);
const selectedDate = this._dateAdapter.getDate(this.selectedRangeEnd);
return new Date(selectedYear, selectedMonth, selectedDate);
}
};
__decorate([
Input()
], MatDaterangeMonthView.prototype, "range", void 0);
__decorate([
Input()
], MatDaterangeMonthView.prototype, "view", void 0);
__decorate([
Input()
], MatDaterangeMonthView.prototype, "setHoverCells", void 0);
__decorate([
Input()
], MatDaterangeMonthView.prototype, "clearBody", void 0);
__decorate([
Input()
], MatDaterangeMonthView.prototype, "selectedRangeEnd", null);
__decorate([
Output()
], MatDaterangeMonthView.prototype, "selectedRangeEndChange", void 0);
MatDaterangeMonthView = __decorate([
Component({
selector: 'mat-daterange-month-view',
template: "<!-- \n RANGE: Most of the code is redundant and hera as inheritance boilerplate.\n \n The 3 attributes in the middle are the additional bindings to the template.\n They notify the body:\n - Are we in range mode ([range])\n - Are all the dates in range ([allInRange])\n this happens when the start date is before the current month and the end is after it.\n - The value marking the end of the range ([selectedRangeEndValue])\n\n ADDED LOC ~3\n -->\n\n<table class=\"mat-calendar-table\">\n <thead class=\"mat-calendar-table-header\">\n <tr><th *ngFor=\"let day of _weekdays\" [attr.aria-label]=\"day.long\">{{day.narrow}}</th></tr>\n <tr><th class=\"mat-calendar-table-header-divider\" colspan=\"7\" aria-hidden=\"true\"></th></tr>\n </thead>\n <tbody mat-daterange-calendar-body\n [view]=\"view\"\n [label]=\"_monthLabel\"\n [rows]=\"_weeks\"\n [todayValue]=\"_todayDate\"\n [selectedValue]=\"_selectedDate\"\n\n [selectedRangeEndValue]=\"_selectedRangeEndDate\"\n [allInRange]=\"_allInRange\"\n [range]=\"_rangable\"\n [createDate]=\"_createDate\"\n [dateAdapter]=\"_dateAdapter\"\n [selected]=\"getSelectedDate()\"\n [selectedRangeEnd]=\"getSelectedRangeEndDate()\"\n [setHoverCells]=\"setHoverCells\"\n [clearBody]=\"clearBody\"\n [labelMinRequiredCells]=\"3\"\n [activeCell]=\"_dateAdapter.getDate(activeDate) - 1\"\n (selectedValueChange)=\"_dateSelected($event)\" \n (keydown)=\"_handleCalendarBodyKeydown($event)\">\n </tbody>\n</table>\n",
exportAs: 'matMonthView',
encapsulation: ViewEncapsulation.None,
preserveWhitespaces: false,
changeDetection: ChangeDetectionStrategy.OnPush
})
], MatDaterangeMonthView);
export { MatDaterangeMonthView };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udGgtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tYXQtZGF0ZXJhbmdlcGlja2VyLyIsInNvdXJjZXMiOlsibGliL21vbnRoLXZpZXcvbW9udGgtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztFQVNFOztBQUdGLE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBVzVELElBQWEscUJBQXFCLEdBQWxDLE1BQWEscUJBQXlCLFNBQVEsWUFBZTtJQUE3RDs7UUFvRG9CLDJCQUFzQixHQUFvQixJQUFJLFlBQVksRUFBSyxDQUFDO1FBMERuRixnQkFBVyxHQUFHLENBQUMsSUFBWSxFQUFRLEVBQUU7WUFDcEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRSxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFBO0lBaUJGLENBQUM7SUExSFMsSUFBSSxnQkFBZ0I7UUFDNUIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQUksZ0JBQWdCLENBQUMsS0FBZTtRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEdBQVUsSUFBSyxDQUFDLG1CQUFtQixDQUFRLElBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDeEcsSUFBSSxDQUFDLHFCQUFx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S0FBSyxFQUFFO29EQUFnQjtBQUNmO0lBQVIsS0FBSyxFQUFFO21EQUFhO0FBQ1o7SUFBUixLQUFLLEVBQUU7NERBQW9DO0FBQ25DO0lBQVIsS0FBSyxFQUFFO3dEQUFnQztBQUUvQjtJQUFSLEtBQUssRUFBRTs2REFFUDtBQXlDUztJQUFULE1BQU0sRUFBRTtxRUFBMEU7QUFwRHZFLHFCQUFxQjtJQVJqQyxTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsMEJBQTBCO1FBQ3BDLG9uREFBMEM7UUFDMUMsUUFBUSxFQUFFLGNBQWM7UUFDeEIsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7UUFDckMsbUJBQW1CLEVBQUUsS0FBSztRQUMxQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtLQUNoRCxDQUFDO0dBQ1cscUJBQXFCLENBbUlqQztTQW5JWSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICAgIFJBTkdFOiBNb3N0IG9mIHRoZSBjb2RlIGlzIHJlZHVuZGFudCBhbmQgaGVyYSBhcyBpbmhlcml0YW5jZSBib2lsZXJwbGF0ZS5cbiAgICBUaGUgYWRkZWQvZWRpdGVkIGNvZGUgYWRkcyBsb2dpYyBmb3IgaGFuZGxpbmcgcmFuZ2UgLyBub24gcmFuZ2UgbW9kZS5cbiAgICBBZGRpdGlvbmFseSwgaW4gcmFuZ2UgbW9kZSBpdCB3aWxsIGFwcGx5IGxvZ2ljIHRvIG1hcmsgdGhlIGRhdGVzIHdpdGhpbiB0aGUgYWN0aXZlIG1vbnRoXG4gICAgdGhhdCBhcmUgd2l0aGluIHRoZSByYW5nZS5cbiAgICBUaGVyZSBhcmUgMyByYW5nZSBzdGF0ZXMgZm9yIGEgbW9udGggdmlldywgc2V0IGJ5IHRoZSBjb21iaW5hdGlvbiBvZiBcIl9yYW5nYWJsZVwiIGFuZCBcIl9hbGxJblJhbmdlXCI6XG4gICAgICAtIE5vdCByYW5nYWJsZSAoc2luZ2xlIHZhbHVlIGRhdGVwaWNrZXIgT1IgYWN0aXZlIG1vbnRoIG5vdCBpbiByYW5nZSkgLSBfcmFuZ2FibGUgPSBGYWxzZVxuICAgICAgLSBSYW5nYWJsZSBidXQgbm90IGFsbCAoYWN0aXZlIG1vbnRoIGlzIHBhcnRpYWxseSBpbiByYW5nZSkgLSBfcmFuZ2FibGUgPSBUcnVlXG4gICAgICAtIEFsbCBJbiBSYW5nZSAoYWN0aXZlIG1vbnRoIGlzIGluIHJhbmdlLCBzdGFydC9lbmQgZGF0ZXMgYmVmb3JlL2FmdGVyIHRoaXMgbW9udGgpIC0gX3JhbmdhYmxlID0gVHJ1ZSAmIF9hbGxJblJhbmdlID0gVHJ1ZVxuKi9cblxuXG5pbXBvcnQgeyBDb21wb25lbnQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBWaWV3RW5jYXBzdWxhdGlvbiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE1hdE1vbnRoVmlldyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1kYXRlcmFuZ2UtbW9udGgtdmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb250aC12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgZXhwb3J0QXM6ICdtYXRNb250aFZpZXcnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdERhdGVyYW5nZU1vbnRoVmlldzxEPiBleHRlbmRzIE1hdE1vbnRoVmlldzxEPiB7XG5cblx0X3NlbGVjdGVkUmFuZ2VFbmREYXRlOiBudW1iZXIgfCBudWxsO1xuXG5cdEBJbnB1dCgpIHJhbmdlOiBib29sZWFuO1xuXHRASW5wdXQoKSB2aWV3OiBudW1iZXJcblx0QElucHV0KCkgc2V0SG92ZXJDZWxsczogQmVoYXZpb3JTdWJqZWN0PGFueT5cblx0QElucHV0KCkgY2xlYXJCb2R5OiBCZWhhdmlvclN1YmplY3Q8YW55PlxuXG5cdEBJbnB1dCgpIGdldCBzZWxlY3RlZFJhbmdlRW5kKCk6IEQgfCBudWxsIHtcblx0XHRyZXR1cm4gdGhpcy5fc2VsZWN0ZWRSYW5nZUVuZDtcblx0fVxuXHRzZXQgc2VsZWN0ZWRSYW5nZUVuZCh2YWx1ZTogRCB8IG51bGwpIHtcblx0XHR0aGlzLl9zZWxlY3RlZFJhbmdlRW5kID0gKDxhbnk+IHRoaXMpLl9nZXRWYWxpZERhdGVPck51bGwoKDxhbnk+IHRoaXMpLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuXHRcdHRoaXMuX3NlbGVjdGVkUmFuZ2VFbmREYXRlID0gKDxhbnk+IHRoaXMpLl9nZXREYXRlSW5DdXJyZW50TW9udGgoKDxhbnk+IHRoaXMpLl9zZWxlY3RlZFJhbmdlRW5kKTtcblx0fVxuXG5cdGdldCBfYWxsSW5SYW5nZSgpOiBib29sZWFuIHtcblx0XHRpZiAoIXRoaXMucmFuZ2UgfHwgIXRoaXMuYWN0aXZlRGF0ZSB8fCAhdGhpcy5zZWxlY3RlZFJhbmdlRW5kIHx8ICF0aGlzLnNlbGVjdGVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGRheXNJbk1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgodGhpcy5hY3RpdmVEYXRlKTtcblx0XHRcdGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuY3JlYXRlRGF0ZSgxKTtcblx0XHRcdGNvbnN0IGVuZERhdGUgPSB0aGlzLmNyZWF0ZURhdGUoZGF5c0luTW9udGgpO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5zZWxlY3RlZCwgc3RhcnREYXRlKSA8IDAgJiZcblx0XHRcdFx0dGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5zZWxlY3RlZFJhbmdlRW5kLCBlbmREYXRlKSA+IDA7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IF9yYW5nYWJsZSgpOiBib29sZWFuIHtcblx0XHRpZiAoIXRoaXMucmFuZ2UgfHwgIXRoaXMuX3dlZWtzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGRheXNJbk1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgodGhpcy5hY3RpdmVEYXRlKTtcblx0XHRcdGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuY3JlYXRlRGF0ZSgxKTtcblx0XHRcdGNvbnN0IGVuZERhdGUgPSB0aGlzLmNyZWF0ZURhdGUoZGF5c0luTW9udGgpO1xuXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZFJhbmdlRW5kIDwgc3RhcnREYXRlKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWQgPiBlbmREYXRlKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBfc2VsZWN0ZWRSYW5nZUVuZDogRCB8IG51bGw7XG5cblx0QE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkUmFuZ2VFbmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEPiA9IG5ldyBFdmVudEVtaXR0ZXI8RD4oKTtcblxuXHRfaW5pdCgpIHtcblx0XHR0aGlzLl9zZWxlY3RlZFJhbmdlRW5kRGF0ZSA9ICg8YW55PiB0aGlzKS5fZ2V0RGF0ZUluQ3VycmVudE1vbnRoKHRoaXMuc2VsZWN0ZWRSYW5nZUVuZCk7XG5cdFx0c3VwZXIuX2luaXQoKTtcblx0fVxuXG5cdGFzeW5jIF9kYXRlU2VsZWN0ZWQoZGF0ZTogbnVtYmVyKSB7XG5cdFx0aWYgKCAhdGhpcy5yYW5nZSApIHtcblx0XHRcdHN1cGVyLl9kYXRlU2VsZWN0ZWQoZGF0ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggIXRoaXMuc2VsZWN0ZWQgfHwgdGhpcy5zZWxlY3RlZFJhbmdlRW5kICkge1xuXHRcdFx0XHRpZiAoIHRoaXMuX3NlbGVjdGVkUmFuZ2VFbmQgKSB7XG5cdFx0XHRcdFx0dGhpcy5fZGF0ZVNlbGVjdGVkUmFuZ2VFbmQobnVsbCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3VwZXIuX2RhdGVTZWxlY3RlZChkYXRlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChkYXRlID09PSBudWxsKSB7XG5cdFx0XHRcdFx0dGhpcy5fZGF0ZVNlbGVjdGVkUmFuZ2VFbmQobnVsbCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2VsZWN0ZWREYXRlID0gdGhpcy5jcmVhdGVEYXRlKGRhdGUpO1xuXHRcdFx0XHRcdGlmIChzZWxlY3RlZERhdGUgPCB0aGlzLnNlbGVjdGVkKSB7XG5cdFx0XHRcdFx0XHQvLyBjb25zdCBzd2FwID0gdGhpcy5fc2VsZWN0ZWREYXRlO1xuXHRcdFx0XHRcdFx0Y29uc3QgeWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5zZWxlY3RlZCk7XG5cdFx0XHRcdFx0XHRjb25zdCBtb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuc2VsZWN0ZWQpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc3dhcCA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUodGhpcy5zZWxlY3RlZCk7XG5cdFx0XHRcdFx0XHRzdXBlci5fZGF0ZVNlbGVjdGVkKGRhdGUpO1xuXHRcdFx0XHRcdFx0dGhpcy5fZGF0ZVNlbGVjdGVkUmFuZ2VFbmQoc3dhcCwgeWVhciwgbW9udGgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9kYXRlU2VsZWN0ZWRSYW5nZUVuZChkYXRlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIF9kYXRlU2VsZWN0ZWRSYW5nZUVuZChkYXRlOiBudW1iZXIgfCBudWxsLCB5ZWFyPywgbW9udGg/KSB7XG5cdFx0aWYgKGRhdGUgPT09IG51bGwpIHtcblx0XHRcdHRoaXMuc2VsZWN0ZWRSYW5nZUVuZENoYW5nZS5lbWl0KG51bGwpO1xuXHRcdH0gZWxzZSBpZiAoIHRoaXMuX3NlbGVjdGVkUmFuZ2VFbmREYXRlICE9IGRhdGUgKSB7XG5cdFx0XHRsZXQgc2VsZWN0ZWREYXRlXG5cdFx0XHRpZih5ZWFyICYmIG1vbnRoKXtcblx0XHRcdFx0c2VsZWN0ZWREYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSk7XG5cdFx0XHR9ZWxzZXtcblx0XHRcdFx0c2VsZWN0ZWREYXRlID0gdGhpcy5jcmVhdGVEYXRlKGRhdGUpXG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdHRoaXMuc2VsZWN0ZWRSYW5nZUVuZENoYW5nZS5lbWl0KHNlbGVjdGVkRGF0ZSk7XG5cdFx0XHR0aGlzLl91c2VyU2VsZWN0aW9uLmVtaXQoKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZURhdGUoZGF0ZTogbnVtYmVyKTogRCB7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLmFjdGl2ZURhdGUpO1xuXHRcdGNvbnN0IHNlbGVjdGVkTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLmFjdGl2ZURhdGUpO1xuXHRcdHJldHVybiB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHNlbGVjdGVkWWVhciwgc2VsZWN0ZWRNb250aCwgZGF0ZSk7XG5cdH1cblxuXHRfY3JlYXRlRGF0ZSA9IChkYXRlOiBudW1iZXIpOiBEYXRlID0+IHtcblx0XHRjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuYWN0aXZlRGF0ZSk7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRNb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuYWN0aXZlRGF0ZSk7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKHNlbGVjdGVkWWVhciwgc2VsZWN0ZWRNb250aCwgZGF0ZSk7XG5cdH1cblxuXHRnZXRTZWxlY3RlZERhdGUoKXtcblx0XHRpZighdGhpcy5zZWxlY3RlZCkgcmV0dXJuIG51bGxcblx0XHRjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuc2VsZWN0ZWQpO1xuXHRcdGNvbnN0IHNlbGVjdGVkTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLnNlbGVjdGVkKTtcblx0XHRjb25zdCBzZWxlY3RlZERhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuc2VsZWN0ZWQpO1xuXHRcdHJldHVybiBuZXcgRGF0ZShzZWxlY3RlZFllYXIsIHNlbGVjdGVkTW9udGgsIHNlbGVjdGVkRGF0ZSk7XG5cdH1cblxuXHRnZXRTZWxlY3RlZFJhbmdlRW5kRGF0ZSgpe1xuXHRcdGlmKCF0aGlzLnNlbGVjdGVkUmFuZ2VFbmQpIHJldHVybiBudWxsXG5cdFx0Y29uc3Qgc2VsZWN0ZWRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLnNlbGVjdGVkUmFuZ2VFbmQpO1xuXHRcdGNvbnN0IHNlbGVjdGVkTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLnNlbGVjdGVkUmFuZ2VFbmQpO1xuXHRcdGNvbnN0IHNlbGVjdGVkRGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldERhdGUodGhpcy5zZWxlY3RlZFJhbmdlRW5kKTtcblx0XHRyZXR1cm4gbmV3IERhdGUoc2VsZWN0ZWRZZWFyLCBzZWxlY3RlZE1vbnRoLCBzZWxlY3RlZERhdGUpO1xuXHR9XG59XG5cbiJdfQ==