mat-daterangepicker
Version:
Angular material date picker extension to support range selection.
172 lines • 23.4 kB
JavaScript
/*
RANGE: Most of the code is redundant and hera as inheritance boilerplate.
The relevant code is marked with a comment.
*/
import { __awaiter, __decorate } from "tslib";
import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation, ViewChildren } from '@angular/core';
import { MatCalendarBody } from '@angular/material/datepicker';
import { Subscription } from 'rxjs';
let MatDaterangeCalendarBody = class MatDaterangeCalendarBody extends MatCalendarBody {
constructor() {
super(...arguments);
this.hoverSubscription = Subscription.EMPTY;
this.clearBodySubscription = Subscription.EMPTY;
}
ngOnInit() {
this.hoverSubscription = this.setHoverCells.subscribe((tmpDate) => __awaiter(this, void 0, void 0, function* () {
if (!tmpDate || !this.selected || this.selectedRangeEnd || (this.selected && this.selectedRangeEnd))
return;
this._doHoverCells(tmpDate);
}));
this.clearBodySubscription = this.clearBody.subscribe(clear => {
if (clear) {
this._doHoverCells(null, clear);
}
});
}
_cellClass(date) {
if (!this.selected || !this.selectedRangeEnd)
return;
const startDate = this.selected.getTime();
const endDate = this.selectedRangeEnd.getTime();
const cellDate = this.createDate(date).getTime();
return {
'mat-daterange-calendar-body-in-range': cellDate >= startDate && cellDate <= endDate && startDate !== endDate,
'mat-daterange-calendar-body-range-start': cellDate === startDate && startDate !== endDate,
'mat-daterange-calendar-body-range-end': cellDate === endDate && startDate !== endDate
};
}
_inRange(date) {
// if (this.range) {
// if (this.allInRange) {
// return true;
// }
// if (this.selectedValue && !this.selectedRangeEndValue) {
// return date >= this.selectedValue;
// }
// if (this.selectedRangeEndValue && !this.selectedValue) {
// return date <= this.selectedRangeEndValue;
// }
// return date >= this.selectedValue && date <= this.selectedRangeEndValue;
// }
}
_onHoverCell(tmpDate) {
if (this.selectedRangeEndValue)
return;
this.setHoverCells.next(this.createDate(tmpDate));
}
_doHoverCells(tmpDate, clear) {
var _a;
const startDate = (_a = this.selected) === null || _a === void 0 ? void 0 : _a.getTime();
const endTempDate = tmpDate === null || tmpDate === void 0 ? void 0 : tmpDate.getTime();
this.rows.map((row, r) => {
const rowElm = this.rowsElms.toArray()[r];
let hasLabel = false;
row.map((cell, c) => {
let cellElm = rowElm.nativeElement.cells[hasLabel ? c + 1 : c];
if (cellElm.classList.contains('mat-calendar-body-label')) {
hasLabel = true;
cellElm = rowElm.nativeElement.cells[c + 1];
}
cellElm.classList.remove('mat-daterange-calendar-body-in-range');
cellElm.classList.remove('mat-daterange-calendar-body-range-end');
cellElm.classList.remove('mat-daterange-calendar-body-range-start');
if (clear)
return;
const inRange = this._inRangeTemp(cell.value, startDate, endTempDate, cellElm);
});
});
}
_inRangeTemp(date, startDate, endTempDate, cellElm) {
const cellDate = this.createDate(date).getTime();
if (endTempDate >= startDate) {
if (endTempDate !== startDate) {
if (cellDate === startDate) {
cellElm.classList.add('mat-daterange-calendar-body-in-range');
cellElm.classList.add('mat-daterange-calendar-body-range-start');
}
if (cellDate === endTempDate) {
cellElm.classList.add('mat-daterange-calendar-body-in-range');
cellElm.classList.add('mat-daterange-calendar-body-range-end');
}
}
if (cellDate > startDate && cellDate < endTempDate) {
cellElm.classList.add('mat-daterange-calendar-body-in-range');
return true;
}
return false;
}
else {
if (endTempDate !== startDate) {
if (cellDate === startDate) {
cellElm.classList.add('mat-daterange-calendar-body-in-range');
cellElm.classList.add('mat-daterange-calendar-body-range-end');
}
if (cellDate === endTempDate) {
cellElm.classList.add('mat-daterange-calendar-body-in-range');
cellElm.classList.add('mat-daterange-calendar-body-range-start');
}
}
if (cellDate < startDate && cellDate > endTempDate) {
cellElm.classList.add('mat-daterange-calendar-body-in-range');
return true;
}
return false;
}
}
ngOnDestroy() {
this.hoverSubscription.unsubscribe();
this.clearBodySubscription.unsubscribe();
}
};
__decorate([
Input()
], MatDaterangeCalendarBody.prototype, "range", void 0);
__decorate([
Input()
], MatDaterangeCalendarBody.prototype, "allInRange", void 0);
__decorate([
Input()
], MatDaterangeCalendarBody.prototype, "selectedRangeEndValue", void 0);
__decorate([
Input()
], MatDaterangeCalendarBody.prototype, "view", void 0);
__decorate([
Input()
], MatDaterangeCalendarBody.prototype, "createDate", void 0);
__decorate([
Input()
], MatDaterangeCalendarBody.prototype, "selected", void 0);
__decorate([
Input()
], MatDaterangeCalendarBody.prototype, "selectedRangeEnd", void 0);
__decorate([
Input()
], MatDaterangeCalendarBody.prototype, "setHoverCells", void 0);
__decorate([
Input()
], MatDaterangeCalendarBody.prototype, "clearBody", void 0);
__decorate([
Input()
], MatDaterangeCalendarBody.prototype, "dateAdapter", void 0);
__decorate([
ViewChildren('Row')
], MatDaterangeCalendarBody.prototype, "rowsElms", void 0);
MatDaterangeCalendarBody = __decorate([
Component({
selector: '[mat-daterange-calendar-body]',
template: "<!-- \n RANGE: Most of the code is redundant and hera as inheritance boilerplate.\n The relevant code is all element attribute bindings with the word \"range\"\n and an editing to the binding of [class.mat-calendar-body-selected]\n\n ADDED LOC ~3\n -->\n\n<!--\n If there's not enough space in the first row, create a separate label row. We mark this row as\n aria-hidden because we don't want it to be read out as one of the weeks in the month.\n-->\n<tr *ngIf=\"_firstRowOffset < labelMinRequiredCells\" aria-hidden=\"true\">\n\t<td class=\"mat-calendar-body-label\"\n\t\t[attr.colspan]=\"numCols\"\n\t\t[style.paddingTop.%]=\"50 * cellAspectRatio / numCols\"\n\t\t[style.paddingBottom.%]=\"50 * cellAspectRatio / numCols\">\n\t\t{{label}}\n\t</td>\n</tr>\n\n<!-- Create the first row separately so we can include a special spacer cell. -->\n<tr *ngFor=\"let row of rows; let rowIndex = index\" #Row role=\"row\">\n\t<!--\n\t\tWe mark this cell as aria-hidden so it doesn't get read out as one of the days in the week.\n\t\tThe aspect ratio of the table cells is maintained by setting the top and bottom padding as a\n\t\tpercentage of the width (a variant of the trick described here:\n\t\thttps://www.w3schools.com/howto/howto_css_aspect_ratio.asp).\n\t-->\n\t<td *ngIf=\"rowIndex === 0 && _firstRowOffset\"\n\t\taria-hidden=\"true\"\n\t\tclass=\"mat-calendar-body-label\"\n\t\t[attr.colspan]=\"_firstRowOffset\"\n\t\t[style.paddingTop.%]=\"50 * cellAspectRatio / numCols\"\n\t\t[style.paddingBottom.%]=\"50 * cellAspectRatio / numCols\">\n\t\t{{_firstRowOffset >= labelMinRequiredCells ? label : ''}}\n\t</td>\n\t<td *ngFor=\"let item of row; let colIndex = index\"\n\t\t#Cell\n\t\trole=\"gridcell\"\n\t\tclass=\"mat-calendar-body-cell\"\n\t\t[tabindex]=\"_isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n\t\t[class.mat-calendar-body-disabled]=\"!item.enabled\"\n\t\t[class.mat-calendar-body-active]=\"_isActiveCell(rowIndex, colIndex)\"\n\n\t\t[ngClass]=\"_cellClass(item.value)\"\n\n\t\t[attr.aria-label]=\"item.ariaLabel\"\n\t\t[attr.aria-disabled]=\"!item.enabled || null\"\n\t\t(click)=\"_cellClicked(item)\"\n\t\t(mouseover)=\"_onHoverCell(item.value)\"\n\t\t[style.width.%]=\"100 / numCols\"\n\t\t[style.paddingTop.%]=\"50 * cellAspectRatio / numCols\"\n\t\t[style.paddingBottom.%]=\"50 * cellAspectRatio / numCols\">\n\t\t<div class=\"mat-calendar-body-cell-content\"\n\t\t\t[class.mat-calendar-body-selected]=\"selectedValue === item.value || selectedRangeEndValue === item.value\"\n\t\t\t[class.mat-calendar-body-today]=\"todayValue === item.value\">\n\t\t{{item.displayValue}}\n\t\t</div>\n\t</td>\n</tr>\n",
host: {
'class': 'mat-calendar-body',
'[class.mat-daterange-calendar-body-range]': 'range',
'role': 'grid',
'attr.aria-readonly': 'true'
},
exportAs: 'matCalendarBody',
encapsulation: ViewEncapsulation.None,
preserveWhitespaces: false,
changeDetection: ChangeDetectionStrategy.OnPush
})
], MatDaterangeCalendarBody);
export { MatDaterangeCalendarBody };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tYXQtZGF0ZXJhbmdlcGlja2VyLyIsInNvdXJjZXMiOlsibGliL2NhbGVuZGFyLWJvZHkvY2FsZW5kYXItYm9keS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztFQUdFOztBQUVGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBNEMsTUFBTSxlQUFlLENBQUM7QUFDckosT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBbUIsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBaUJyRCxJQUFhLHdCQUF3QixHQUFyQyxNQUFhLHdCQUE0QixTQUFRLGVBQWU7SUFBaEU7O1FBZUMsc0JBQWlCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQTtRQUN0QywwQkFBcUIsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFBO0lBb0gzQyxDQUFDO0lBbEhBLFFBQVE7UUFDUCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBTyxPQUFtQixFQUFFLEVBQUU7WUFDbkYsSUFBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUM7Z0JBQUUsT0FBTztZQUMzRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzVCLENBQUMsQ0FBQSxDQUFDLENBQUE7UUFFRixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDN0QsSUFBRyxLQUFLLEVBQUM7Z0JBQ1IsSUFBSSxDQUFDLGFBQWEsQ0FB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QzdCO1FBQ0QsUUFBUSxFQUFFLGlCQUFpQjtRQUMzQixhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtRQUNyQyxtQkFBbUIsRUFBRSxLQUFLO1FBQzFCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO0tBQ2hELENBQUM7R0FDVyx3QkFBd0IsQ0FvSXBDO1NBcElZLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gICAgUkFOR0U6IE1vc3Qgb2YgdGhlIGNvZGUgaXMgcmVkdW5kYW50IGFuZCBoZXJhIGFzIGluaGVyaXRhbmNlIGJvaWxlcnBsYXRlLlxuICAgIFRoZSByZWxldmFudCBjb2RlIGlzIG1hcmtlZCB3aXRoIGEgY29tbWVudC5cbiovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBWaWV3RW5jYXBzdWxhdGlvbiwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIEVsZW1lbnRSZWYsIE9uSW5pdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRDYWxlbmRhckJvZHkgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdbbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5XScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1ib2R5LmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDoge1xuICAgICdjbGFzcyc6ICdtYXQtY2FsZW5kYXItYm9keScsXG4gICAgJ1tjbGFzcy5tYXQtZGF0ZXJhbmdlLWNhbGVuZGFyLWJvZHktcmFuZ2VdJzogJ3JhbmdlJywgLy8gUkVMRVZBTlQgQ09ERSBGT1IgTkFUSVZFIElNUExFTUVOVEFUSU9OXG4gICAgJ3JvbGUnOiAnZ3JpZCcsXG4gICAgJ2F0dHIuYXJpYS1yZWFkb25seSc6ICd0cnVlJ1xuICB9LFxuICBleHBvcnRBczogJ21hdENhbGVuZGFyQm9keScsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTWF0RGF0ZXJhbmdlQ2FsZW5kYXJCb2R5PEQ+IGV4dGVuZHMgTWF0Q2FsZW5kYXJCb2R5IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG5cdC8qIFJFTEVWQU5UIENPREUgRk9SIE5BVElWRSBJTVBMRU1FTlRBVElPTiAtIH4gMTMgTE9DICovXG5cdEBJbnB1dCgpIHJhbmdlOiBib29sZWFuO1xuXHRASW5wdXQoKSBhbGxJblJhbmdlOiBib29sZWFuO1xuXHRASW5wdXQoKSBzZWxlY3RlZFJhbmdlRW5kVmFsdWU6IG51bWJlcjtcblx0QElucHV0KCkgdmlldzogbnVtYmVyXG5cdEBJbnB1dCgpIGNyZWF0ZURhdGU6IGFueVxuXHRASW5wdXQoKSBzZWxlY3RlZDogRGF0ZSB8IG51bGxcblx0QElucHV0KCkgc2VsZWN0ZWRSYW5nZUVuZDogRGF0ZSB8IG51bGxcblx0QElucHV0KCkgc2V0SG92ZXJDZWxsczogQmVoYXZpb3JTdWJqZWN0PGFueT5cblx0QElucHV0KCkgY2xlYXJCb2R5OiBCZWhhdmlvclN1YmplY3Q8YW55PlxuXHRASW5wdXQoKSBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RD5cblx0QFZpZXdDaGlsZHJlbignUm93Jykgcm93c0VsbXM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPlxuXG5cdGhvdmVyU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZXG5cdGNsZWFyQm9keVN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWVxuXG5cdG5nT25Jbml0KCkge1xuXHRcdHRoaXMuaG92ZXJTdWJzY3JpcHRpb24gPSB0aGlzLnNldEhvdmVyQ2VsbHMuc3Vic2NyaWJlKGFzeW5jICh0bXBEYXRlOiBhbnkgfCBudWxsKSA9PiB7XG5cdFx0XHRpZighdG1wRGF0ZSB8fCAhdGhpcy5zZWxlY3RlZCB8fCB0aGlzLnNlbGVjdGVkUmFuZ2VFbmQgfHwgKHRoaXMuc2VsZWN0ZWQgJiYgdGhpcy5zZWxlY3RlZFJhbmdlRW5kKSkgcmV0dXJuO1xuXHRcdFx0dGhpcy5fZG9Ib3ZlckNlbGxzKHRtcERhdGUpXG5cdFx0fSlcblxuXHRcdHRoaXMuY2xlYXJCb2R5U3Vic2NyaXB0aW9uID0gdGhpcy5jbGVhckJvZHkuc3Vic2NyaWJlKGNsZWFyID0+IHtcblx0XHRcdGlmKGNsZWFyKXtcblx0XHRcdFx0dGhpcy5fZG9Ib3ZlckNlbGxzKG51bGwsIGNsZWFyKVxuXHRcdFx0fVxuXHRcdH0pXG5cdH1cblxuXHRfY2VsbENsYXNzKGRhdGU6IG51bWJlcil7XG5cdFx0aWYoIXRoaXMuc2VsZWN0ZWQgfHwgIXRoaXMuc2VsZWN0ZWRSYW5nZUVuZCkgcmV0dXJuO1xuXG5cdFx0Y29uc3Qgc3RhcnREYXRlID0gdGhpcy5zZWxlY3RlZC5nZXRUaW1lKClcblx0XHRjb25zdCBlbmREYXRlID0gdGhpcy5zZWxlY3RlZFJhbmdlRW5kLmdldFRpbWUoKVxuXHRcdGNvbnN0IGNlbGxEYXRlID0gdGhpcy5jcmVhdGVEYXRlKGRhdGUpLmdldFRpbWUoKVxuXHRcdFxuXHRcdHJldHVybiB7XG5cdFx0XHQnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LWluLXJhbmdlJzogY2VsbERhdGUgPj0gc3RhcnREYXRlICYmIGNlbGxEYXRlIDw9IGVuZERhdGUgJiYgc3RhcnREYXRlICE9PSBlbmREYXRlLFxuXHRcdFx0J21hdC1kYXRlcmFuZ2UtY2FsZW5kYXItYm9keS1yYW5nZS1zdGFydCc6IGNlbGxEYXRlID09PSBzdGFydERhdGUgJiYgc3RhcnREYXRlICE9PSBlbmREYXRlLFxuXHRcdFx0J21hdC1kYXRlcmFuZ2UtY2FsZW5kYXItYm9keS1yYW5nZS1lbmQnOiBjZWxsRGF0ZSA9PT0gZW5kRGF0ZSAmJiBzdGFydERhdGUgIT09IGVuZERhdGVcblx0XHR9XG5cdH1cblxuXHRfaW5SYW5nZShkYXRlOiBudW1iZXIpIHtcblx0XHQvLyBpZiAodGhpcy5yYW5nZSkge1xuXHRcdC8vIFx0aWYgKHRoaXMuYWxsSW5SYW5nZSkge1xuXHRcdC8vIFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHQvLyBcdH1cblxuXHRcdC8vIFx0aWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSAmJiAhdGhpcy5zZWxlY3RlZFJhbmdlRW5kVmFsdWUpIHtcblx0XHQvLyBcdFx0cmV0dXJuIGRhdGUgPj0gdGhpcy5zZWxlY3RlZFZhbHVlO1xuXHRcdC8vIFx0fVxuXHRcdC8vIFx0aWYgKHRoaXMuc2VsZWN0ZWRSYW5nZUVuZFZhbHVlICYmICF0aGlzLnNlbGVjdGVkVmFsdWUpIHtcblx0XHQvLyBcdFx0cmV0dXJuIGRhdGUgPD0gdGhpcy5zZWxlY3RlZFJhbmdlRW5kVmFsdWU7XG5cdFx0Ly8gXHR9XG5cdFx0Ly8gXHRyZXR1cm4gZGF0ZSA+PSB0aGlzLnNlbGVjdGVkVmFsdWUgJiYgZGF0ZSA8PSB0aGlzLnNlbGVjdGVkUmFuZ2VFbmRWYWx1ZTtcblx0XHQvLyB9XG5cdH1cblxuXHRfb25Ib3ZlckNlbGwodG1wRGF0ZTogbnVtYmVyKXtcblx0XHRpZih0aGlzLnNlbGVjdGVkUmFuZ2VFbmRWYWx1ZSkgcmV0dXJuO1xuXG5cdFx0dGhpcy5zZXRIb3ZlckNlbGxzLm5leHQodGhpcy5jcmVhdGVEYXRlKHRtcERhdGUpKVxuXHR9XG5cblx0X2RvSG92ZXJDZWxscyh0bXBEYXRlPzogYW55LCBjbGVhcj86IGJvb2xlYW4pe1xuXHRcdGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuc2VsZWN0ZWQ/LmdldFRpbWUoKVxuXHRcdGNvbnN0IGVuZFRlbXBEYXRlID0gdG1wRGF0ZT8uZ2V0VGltZSgpXG5cdFx0dGhpcy5yb3dzLm1hcCgocm93LCByKSA9PiB7XG5cdFx0XHRjb25zdCByb3dFbG0gPSB0aGlzLnJvd3NFbG1zLnRvQXJyYXkoKVtyXVxuXHRcdFx0bGV0IGhhc0xhYmVsID0gZmFsc2Vcblx0XHRcdHJvdy5tYXAoKGNlbGwsIGMpID0+IHtcblx0XHRcdFx0bGV0IGNlbGxFbG0gPSByb3dFbG0ubmF0aXZlRWxlbWVudC5jZWxsc1toYXNMYWJlbCA/IGMgKyAxIDogY11cblx0XHRcdFx0aWYoY2VsbEVsbS5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1jYWxlbmRhci1ib2R5LWxhYmVsJykpe1xuXHRcdFx0XHRcdGhhc0xhYmVsID0gdHJ1ZVxuXHRcdFx0XHRcdGNlbGxFbG0gPSByb3dFbG0ubmF0aXZlRWxlbWVudC5jZWxsc1tjICsgMV1cblx0XHRcdFx0fVxuXHRcdFx0XHRjZWxsRWxtLmNsYXNzTGlzdC5yZW1vdmUoJ21hdC1kYXRlcmFuZ2UtY2FsZW5kYXItYm9keS1pbi1yYW5nZScpXG5cdFx0XHRcdGNlbGxFbG0uY2xhc3NMaXN0LnJlbW92ZSgnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LXJhbmdlLWVuZCcpXG5cdFx0XHRcdGNlbGxFbG0uY2xhc3NMaXN0LnJlbW92ZSgnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LXJhbmdlLXN0YXJ0Jylcblx0XHRcdFx0aWYoY2xlYXIpIHJldHVybjtcblx0XHRcdFx0Y29uc3QgaW5SYW5nZSA9IHRoaXMuX2luUmFuZ2VUZW1wKGNlbGwudmFsdWUsIHN0YXJ0RGF0ZSwgZW5kVGVtcERhdGUsIGNlbGxFbG0pXG5cdFx0XHR9KVxuXHRcdH0pXG5cdH1cblxuXHRfaW5SYW5nZVRlbXAoZGF0ZTogbnVtYmVyLCBzdGFydERhdGUsIGVuZFRlbXBEYXRlLCBjZWxsRWxtKSB7XG5cdFx0XG5cdFx0Y29uc3QgY2VsbERhdGUgPSB0aGlzLmNyZWF0ZURhdGUoZGF0ZSkuZ2V0VGltZSgpXG5cblx0XHRpZihlbmRUZW1wRGF0ZSA+PSBzdGFydERhdGUpe1xuXHRcdFx0aWYoZW5kVGVtcERhdGUgIT09IHN0YXJ0RGF0ZSl7XG5cdFx0XHRcdGlmKGNlbGxEYXRlID09PSBzdGFydERhdGUpe1xuXHRcdFx0XHRcdGNlbGxFbG0uY2xhc3NMaXN0LmFkZCgnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LWluLXJhbmdlJylcblx0XHRcdFx0XHRjZWxsRWxtLmNsYXNzTGlzdC5hZGQoJ21hdC1kYXRlcmFuZ2UtY2FsZW5kYXItYm9keS1yYW5nZS1zdGFydCcpXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoY2VsbERhdGUgPT09IGVuZFRlbXBEYXRlKXtcblx0XHRcdFx0XHRjZWxsRWxtLmNsYXNzTGlzdC5hZGQoJ21hdC1kYXRlcmFuZ2UtY2FsZW5kYXItYm9keS1pbi1yYW5nZScpXG5cdFx0XHRcdFx0Y2VsbEVsbS5jbGFzc0xpc3QuYWRkKCdtYXQtZGF0ZXJhbmdlLWNhbGVuZGFyLWJvZHktcmFuZ2UtZW5kJylcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYoY2VsbERhdGUgPiBzdGFydERhdGUgJiYgY2VsbERhdGUgPCBlbmRUZW1wRGF0ZSl7XG5cdFx0XHRcdGNlbGxFbG0uY2xhc3NMaXN0LmFkZCgnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LWluLXJhbmdlJylcblx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdH1lbHNle1xuXHRcdFx0aWYoZW5kVGVtcERhdGUgIT09IHN0YXJ0RGF0ZSl7XG5cdFx0XHRcdGlmKGNlbGxEYXRlID09PSBzdGFydERhdGUpe1xuXHRcdFx0XHRcdGNlbGxFbG0uY2xhc3NMaXN0LmFkZCgnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LWluLXJhbmdlJylcblx0XHRcdFx0XHRjZWxsRWxtLmNsYXNzTGlzdC5hZGQoJ21hdC1kYXRlcmFuZ2UtY2FsZW5kYXItYm9keS1yYW5nZS1lbmQnKVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKGNlbGxEYXRlID09PSBlbmRUZW1wRGF0ZSl7XG5cdFx0XHRcdFx0Y2VsbEVsbS5jbGFzc0xpc3QuYWRkKCdtYXQtZGF0ZXJhbmdlLWNhbGVuZGFyLWJvZHktaW4tcmFuZ2UnKVxuXHRcdFx0XHRcdGNlbGxFbG0uY2xhc3NMaXN0LmFkZCgnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LXJhbmdlLXN0YXJ0Jylcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYoY2VsbERhdGUgPCBzdGFydERhdGUgJiYgY2VsbERhdGUgPiBlbmRUZW1wRGF0ZSl7XG5cdFx0XHRcdGNlbGxFbG0uY2xhc3NMaXN0LmFkZCgnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LWluLXJhbmdlJylcblx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdH1cblx0fVxuXG5cdG5nT25EZXN0cm95KCl7XG5cdFx0dGhpcy5ob3ZlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG5cdFx0dGhpcy5jbGVhckJvZHlTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuXHR9XG4gIFxufVxuIl19