@uiowa/date-range-picker
Version:
An Angular library for date range picker.
76 lines • 21 kB
JavaScript
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, } from '@angular/core';
import { NgbDate, } from '@ng-bootstrap/ng-bootstrap';
import * as i0 from "@angular/core";
import * as i1 from "@ng-bootstrap/ng-bootstrap";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
export class DatePickerComponent {
constructor(dateAdapter, calendar) {
this.dateAdapter = dateAdapter;
this.calendar = calendar;
this.id = '';
this.date = null;
this.disabled = false;
this.isInvalid = false;
this.allowClear = false;
this.dateChange = new EventEmitter();
this.ngbDate = null;
this.today = this.calendar.getToday();
this.isDisabled = (date) => date.after(this.ngbMaxDate) || date.before(this.ngbMinDate);
}
ngOnInit() {
this.ngbDate = NgbDate.from(this.dateAdapter.fromModel(this.date));
if (!this.id) {
this.id = `date-picker-` + Math.random().toString(36).substring(4);
}
if (this.minDate) {
this.ngbMinDate = this.dateAdapter.fromModel(new Date(this.minDate)) || {
year: 1900,
month: 1,
day: 1,
};
}
if (this.maxDate) {
this.ngbMaxDate = this.dateAdapter.fromModel(new Date(this.maxDate)) || {
year: 2099,
month: 12,
day: 31,
};
}
}
ngOnChanges(changes) {
this.ngOnInit();
}
onDateChange(date) {
const newDate = this.dateAdapter.toModel(date);
if (newDate)
this.dateChange.emit(newDate);
}
isWeekend(date) {
const d = new Date(date.year, date.month - 1, date.day);
return d.getDay() === 0 || d.getDay() === 6;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.5", ngImport: i0, type: DatePickerComponent, deps: [{ token: i1.NgbDateNativeAdapter }, { token: i1.NgbCalendar }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.5", type: DatePickerComponent, selector: "date-picker", inputs: { id: "id", date: "date", disabled: "disabled", minDate: "minDate", maxDate: "maxDate", isInvalid: "isInvalid", allowClear: "allowClear" }, outputs: { dateChange: "dateChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"input-group\">\r\n <input\r\n ngbDatepicker\r\n #d=\"ngbDatepicker\"\r\n class=\"form-control\"\r\n [class.is-invalid]=\"isInvalid\"\r\n name=\"dp\"\r\n [attr.id]=\"id\"\r\n [(ngModel)]=\"ngbDate\"\r\n (click)=\"d.toggle()\"\r\n [disabled]=\"disabled\"\r\n [minDate]=\"ngbMinDate\"\r\n [maxDate]=\"ngbMaxDate\"\r\n [markDisabled]=\"isDisabled\"\r\n [firstDayOfWeek]=\"7\"\r\n [dayTemplate]=\"dayTemplate\"\r\n [footerTemplate]=\"footerTemplate\"\r\n readonly\r\n (keydown.enter)=\"d.toggle()\"\r\n (dateSelect)=\"onDateChange($event)\"\r\n style=\"max-width: 208px; cursor: pointer\"\r\n title=\"click to select a date\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-outline-secondary d-flex align-items-center\"\r\n (click)=\"d.toggle()\"\r\n [disabled]=\"disabled\"\r\n >\r\n <svg\r\n aria-hidden=\"true\"\r\n role=\"icon\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 448 512\"\r\n >\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M148 288h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm108-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 96v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96-260v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"\r\n ></path>\r\n </svg>\r\n </button>\r\n</div>\r\n\r\n<ng-template\r\n #dayTemplate\r\n let-date=\"date\"\r\n let-disabled=\"disabled\"\r\n let-currentMonth=\"currentMonth\"\r\n>\r\n <span\r\n class=\"custom-day\"\r\n [class.weekend]=\"isWeekend(date)\"\r\n [class.disabled]=\"disabled\"\r\n [class.outside]=\"date.month !== currentMonth\"\r\n >\r\n {{ date.day }}\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #footerTemplate>\r\n <div *ngIf=\"allowClear\">\r\n <hr class=\"my-0\" />\r\n <button\r\n class=\"btn btn-primary btn-sm m-2 float-start\"\r\n (click)=\"ngbDate = today; onDateChange(today); d.close()\"\r\n >\r\n Today\r\n </button>\r\n <button\r\n class=\"btn btn-secondary btn-sm m-2 float-end\"\r\n (click)=\"ngbDate = null; dateChange.emit(undefined); d.close()\"\r\n >\r\n Clear\r\n </button>\r\n </div>\r\n</ng-template>\r\n", styles: [".custom-day{text-align:center;padding:.185rem .25rem;display:inline-block;height:2rem;width:2rem}.custom-day.weekend{color:#d81e1e}.custom-day.disabled{color:#c8cdd2}.custom-day.outside{opacity:.5}svg{width:1rem;height:1rem}.form-control[readonly]{background-color:#fdfdfd!important}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.5", ngImport: i0, type: DatePickerComponent, decorators: [{
type: Component,
args: [{ selector: 'date-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"input-group\">\r\n <input\r\n ngbDatepicker\r\n #d=\"ngbDatepicker\"\r\n class=\"form-control\"\r\n [class.is-invalid]=\"isInvalid\"\r\n name=\"dp\"\r\n [attr.id]=\"id\"\r\n [(ngModel)]=\"ngbDate\"\r\n (click)=\"d.toggle()\"\r\n [disabled]=\"disabled\"\r\n [minDate]=\"ngbMinDate\"\r\n [maxDate]=\"ngbMaxDate\"\r\n [markDisabled]=\"isDisabled\"\r\n [firstDayOfWeek]=\"7\"\r\n [dayTemplate]=\"dayTemplate\"\r\n [footerTemplate]=\"footerTemplate\"\r\n readonly\r\n (keydown.enter)=\"d.toggle()\"\r\n (dateSelect)=\"onDateChange($event)\"\r\n style=\"max-width: 208px; cursor: pointer\"\r\n title=\"click to select a date\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-outline-secondary d-flex align-items-center\"\r\n (click)=\"d.toggle()\"\r\n [disabled]=\"disabled\"\r\n >\r\n <svg\r\n aria-hidden=\"true\"\r\n role=\"icon\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 448 512\"\r\n >\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M148 288h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm108-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 96v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96-260v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"\r\n ></path>\r\n </svg>\r\n </button>\r\n</div>\r\n\r\n<ng-template\r\n #dayTemplate\r\n let-date=\"date\"\r\n let-disabled=\"disabled\"\r\n let-currentMonth=\"currentMonth\"\r\n>\r\n <span\r\n class=\"custom-day\"\r\n [class.weekend]=\"isWeekend(date)\"\r\n [class.disabled]=\"disabled\"\r\n [class.outside]=\"date.month !== currentMonth\"\r\n >\r\n {{ date.day }}\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #footerTemplate>\r\n <div *ngIf=\"allowClear\">\r\n <hr class=\"my-0\" />\r\n <button\r\n class=\"btn btn-primary btn-sm m-2 float-start\"\r\n (click)=\"ngbDate = today; onDateChange(today); d.close()\"\r\n >\r\n Today\r\n </button>\r\n <button\r\n class=\"btn btn-secondary btn-sm m-2 float-end\"\r\n (click)=\"ngbDate = null; dateChange.emit(undefined); d.close()\"\r\n >\r\n Clear\r\n </button>\r\n </div>\r\n</ng-template>\r\n", styles: [".custom-day{text-align:center;padding:.185rem .25rem;display:inline-block;height:2rem;width:2rem}.custom-day.weekend{color:#d81e1e}.custom-day.disabled{color:#c8cdd2}.custom-day.outside{opacity:.5}svg{width:1rem;height:1rem}.form-control[readonly]{background-color:#fdfdfd!important}\n"] }]
}], ctorParameters: () => [{ type: i1.NgbDateNativeAdapter }, { type: i1.NgbCalendar }], propDecorators: { id: [{
type: Input
}], date: [{
type: Input
}], disabled: [{
type: Input
}], minDate: [{
type: Input
}], maxDate: [{
type: Input
}], isInvalid: [{
type: Input
}], allowClear: [{
type: Input
}], dateChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWlvd2EvZGF0ZS1yYW5nZS1waWNrZXIvc3JjL2xpYi9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aW93YS9kYXRlLXJhbmdlLXBpY2tlci9zcmMvbGliL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osdUJBQXVCLEdBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxPQUFPLEdBR1IsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7QUFRcEMsTUFBTSxPQUFPLG1CQUFtQjtJQW1COUIsWUFDbUIsV0FBaUMsRUFDMUMsUUFBcUI7UUFEWixnQkFBVyxHQUFYLFdBQVcsQ0FBc0I7UUFDMUMsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQXBCdEIsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUVqQixTQUFJLEdBQWdCLElBQUksQ0FBQztRQUV6QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR1IsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRzVCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXRDLFlBQU8sR0FBbUIsSUFBSSxDQUFDO1FBRy9CLFVBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBeUNqQyxlQUFVLEdBQUcsQ0FBQyxJQUFhLEVBQUUsRUFBRSxDQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQXJDM0QsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDWixJQUFJLENBQUMsRUFBRSxHQUFHLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwRTtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJO2dCQUN0RSxJQUFJLEVBQUUsSUFBSTtnQkFDVixLQUFLLEVBQUUsQ0FBQztnQkFDUixHQUFHLEVBQUUsQ0FBQzthQUNQLENBQUM7U0FDSDtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJO2dCQUN0RSxJQUFJLEVBQUUsSUFBSTtnQkFDVixLQUFLLEVBQUUsRUFBRTtnQkFDVCxHQUFHLEVBQUUsRUFBRTthQUNSLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBYTtRQUN4QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxJQUFJLE9BQU87WUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsU0FBUyxDQUFDLElBQWE7UUFDckIsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEQsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQzs4R0F6RFUsbUJBQW1CO2tHQUFuQixtQkFBbUIsbVFDdkJoQyxrMEZBNEVBOzsyRkRyRGEsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGFBQWEsbUJBR04sdUJBQXVCLENBQUMsTUFBTTttSEFHdEMsRUFBRTtzQkFBVixLQUFLO2dCQUVOLElBQUk7c0JBREgsS0FBSztnQkFHTixRQUFRO3NCQURQLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR04sVUFBVTtzQkFEVCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgTmdiQ2FsZW5kYXIsXHJcbiAgTmdiRGF0ZSxcclxuICBOZ2JEYXRlTmF0aXZlQWRhcHRlcixcclxuICBOZ2JEYXRlU3RydWN0LFxyXG59IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZGF0ZS1waWNrZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZS1waWNrZXIuY29tcG9uZW50LmNzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBpZCA9ICcnO1xyXG4gIEBJbnB1dCgpXHJcbiAgZGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpXHJcbiAgZGlzYWJsZWQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBtaW5EYXRlPzogRGF0ZTtcclxuICBASW5wdXQoKSBtYXhEYXRlPzogRGF0ZTtcclxuICBASW5wdXQoKSBpc0ludmFsaWQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBhbGxvd0NsZWFyID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGRhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XHJcblxyXG4gIG5nYkRhdGU6IE5nYkRhdGUgfCBudWxsID0gbnVsbDtcclxuICBuZ2JNaW5EYXRlITogTmdiRGF0ZVN0cnVjdDtcclxuICBuZ2JNYXhEYXRlITogTmdiRGF0ZVN0cnVjdDtcclxuICB0b2RheSA9IHRoaXMuY2FsZW5kYXIuZ2V0VG9kYXkoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGVBZGFwdGVyOiBOZ2JEYXRlTmF0aXZlQWRhcHRlcixcclxuICAgIHByaXZhdGUgY2FsZW5kYXI6IE5nYkNhbGVuZGFyXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMubmdiRGF0ZSA9IE5nYkRhdGUuZnJvbSh0aGlzLmRhdGVBZGFwdGVyLmZyb21Nb2RlbCh0aGlzLmRhdGUpKTtcclxuICAgIGlmICghdGhpcy5pZCkge1xyXG4gICAgICB0aGlzLmlkID0gYGRhdGUtcGlja2VyLWAgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5taW5EYXRlKSB7XHJcbiAgICAgIHRoaXMubmdiTWluRGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIuZnJvbU1vZGVsKG5ldyBEYXRlKHRoaXMubWluRGF0ZSkpIHx8IHtcclxuICAgICAgICB5ZWFyOiAxOTAwLFxyXG4gICAgICAgIG1vbnRoOiAxLFxyXG4gICAgICAgIGRheTogMSxcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1heERhdGUpIHtcclxuICAgICAgdGhpcy5uZ2JNYXhEYXRlID0gdGhpcy5kYXRlQWRhcHRlci5mcm9tTW9kZWwobmV3IERhdGUodGhpcy5tYXhEYXRlKSkgfHwge1xyXG4gICAgICAgIHllYXI6IDIwOTksXHJcbiAgICAgICAgbW9udGg6IDEyLFxyXG4gICAgICAgIGRheTogMzEsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgfVxyXG5cclxuICBvbkRhdGVDaGFuZ2UoZGF0ZTogTmdiRGF0ZSkge1xyXG4gICAgY29uc3QgbmV3RGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIudG9Nb2RlbChkYXRlKTtcclxuICAgIGlmIChuZXdEYXRlKSB0aGlzLmRhdGVDaGFuZ2UuZW1pdChuZXdEYXRlKTtcclxuICB9XHJcblxyXG4gIGlzV2Vla2VuZChkYXRlOiBOZ2JEYXRlKSB7XHJcbiAgICBjb25zdCBkID0gbmV3IERhdGUoZGF0ZS55ZWFyLCBkYXRlLm1vbnRoIC0gMSwgZGF0ZS5kYXkpO1xyXG4gICAgcmV0dXJuIGQuZ2V0RGF5KCkgPT09IDAgfHwgZC5nZXREYXkoKSA9PT0gNjtcclxuICB9XHJcbiAgaXNEaXNhYmxlZCA9IChkYXRlOiBOZ2JEYXRlKSA9PlxyXG4gICAgZGF0ZS5hZnRlcih0aGlzLm5nYk1heERhdGUpIHx8IGRhdGUuYmVmb3JlKHRoaXMubmdiTWluRGF0ZSk7XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XHJcbiAgPGlucHV0XHJcbiAgICBuZ2JEYXRlcGlja2VyXHJcbiAgICAjZD1cIm5nYkRhdGVwaWNrZXJcIlxyXG4gICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgW2NsYXNzLmlzLWludmFsaWRdPVwiaXNJbnZhbGlkXCJcclxuICAgIG5hbWU9XCJkcFwiXHJcbiAgICBbYXR0ci5pZF09XCJpZFwiXHJcbiAgICBbKG5nTW9kZWwpXT1cIm5nYkRhdGVcIlxyXG4gICAgKGNsaWNrKT1cImQudG9nZ2xlKClcIlxyXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgIFttaW5EYXRlXT1cIm5nYk1pbkRhdGVcIlxyXG4gICAgW21heERhdGVdPVwibmdiTWF4RGF0ZVwiXHJcbiAgICBbbWFya0Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgW2ZpcnN0RGF5T2ZXZWVrXT1cIjdcIlxyXG4gICAgW2RheVRlbXBsYXRlXT1cImRheVRlbXBsYXRlXCJcclxuICAgIFtmb290ZXJUZW1wbGF0ZV09XCJmb290ZXJUZW1wbGF0ZVwiXHJcbiAgICByZWFkb25seVxyXG4gICAgKGtleWRvd24uZW50ZXIpPVwiZC50b2dnbGUoKVwiXHJcbiAgICAoZGF0ZVNlbGVjdCk9XCJvbkRhdGVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICBzdHlsZT1cIm1heC13aWR0aDogMjA4cHg7IGN1cnNvcjogcG9pbnRlclwiXHJcbiAgICB0aXRsZT1cImNsaWNrIHRvIHNlbGVjdCBhIGRhdGVcIlxyXG4gIC8+XHJcbiAgPGJ1dHRvblxyXG4gICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAoY2xpY2spPVwiZC50b2dnbGUoKVwiXHJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gID5cclxuICAgIDxzdmdcclxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgcm9sZT1cImljb25cIlxyXG4gICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgdmlld0JveD1cIjAgMCA0NDggNTEyXCJcclxuICAgID5cclxuICAgICAgPHBhdGhcclxuICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICBkPVwiTTE0OCAyODhoLTQwYy02LjYgMC0xMi01LjQtMTItMTJ2LTQwYzAtNi42IDUuNC0xMiAxMi0xMmg0MGM2LjYgMCAxMiA1LjQgMTIgMTJ2NDBjMCA2LjYtNS40IDEyLTEyIDEyem0xMDgtMTJ2LTQwYzAtNi42LTUuNC0xMi0xMi0xMmgtNDBjLTYuNiAwLTEyIDUuNC0xMiAxMnY0MGMwIDYuNiA1LjQgMTIgMTIgMTJoNDBjNi42IDAgMTItNS40IDEyLTEyem05NiAwdi00MGMwLTYuNi01LjQtMTItMTItMTJoLTQwYy02LjYgMC0xMiA1LjQtMTIgMTJ2NDBjMCA2LjYgNS40IDEyIDEyIDEyaDQwYzYuNiAwIDEyLTUuNCAxMi0xMnptLTk2IDk2di00MGMwLTYuNi01LjQtMTItMTItMTJoLTQwYy02LjYgMC0xMiA1LjQtMTIgMTJ2NDBjMCA2LjYgNS40IDEyIDEyIDEyaDQwYzYuNiAwIDEyLTUuNCAxMi0xMnptLTk2IDB2LTQwYzAtNi42LTUuNC0xMi0xMi0xMmgtNDBjLTYuNiAwLTEyIDUuNC0xMiAxMnY0MGMwIDYuNiA1LjQgMTIgMTIgMTJoNDBjNi42IDAgMTItNS40IDEyLTEyem0xOTIgMHYtNDBjMC02LjYtNS40LTEyLTEyLTEyaC00MGMtNi42IDAtMTIgNS40LTEyIDEydjQwYzAgNi42IDUuNCAxMiAxMiAxMmg0MGM2LjYgMCAxMi01LjQgMTItMTJ6bTk2LTI2MHYzNTJjMCAyNi41LTIxLjUgNDgtNDggNDhINDhjLTI2LjUgMC00OC0yMS41LTQ4LTQ4VjExMmMwLTI2LjUgMjEuNS00OCA0OC00OGg0OFYxMmMwLTYuNiA1LjQtMTIgMTItMTJoNDBjNi42IDAgMTIgNS40IDEyIDEydjUyaDEyOFYxMmMwLTYuNiA1LjQtMTIgMTItMTJoNDBjNi42IDAgMTIgNS40IDEyIDEydjUyaDQ4YzI2LjUgMCA0OCAyMS41IDQ4IDQ4em0tNDggMzQ2VjE2MEg0OHYyOThjMCAzLjMgMi43IDYgNiA2aDM0MGMzLjMgMCA2LTIuNyA2LTZ6XCJcclxuICAgICAgPjwvcGF0aD5cclxuICAgIDwvc3ZnPlxyXG4gIDwvYnV0dG9uPlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZVxyXG4gICNkYXlUZW1wbGF0ZVxyXG4gIGxldC1kYXRlPVwiZGF0ZVwiXHJcbiAgbGV0LWRpc2FibGVkPVwiZGlzYWJsZWRcIlxyXG4gIGxldC1jdXJyZW50TW9udGg9XCJjdXJyZW50TW9udGhcIlxyXG4+XHJcbiAgPHNwYW5cclxuICAgIGNsYXNzPVwiY3VzdG9tLWRheVwiXHJcbiAgICBbY2xhc3Mud2Vla2VuZF09XCJpc1dlZWtlbmQoZGF0ZSlcIlxyXG4gICAgW2NsYXNzLmRpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgIFtjbGFzcy5vdXRzaWRlXT1cImRhdGUubW9udGggIT09IGN1cnJlbnRNb250aFwiXHJcbiAgPlxyXG4gICAge3sgZGF0ZS5kYXkgfX1cclxuICA8L3NwYW4+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2Zvb3RlclRlbXBsYXRlPlxyXG4gIDxkaXYgKm5nSWY9XCJhbGxvd0NsZWFyXCI+XHJcbiAgICA8aHIgY2xhc3M9XCJteS0wXCIgLz5cclxuICAgIDxidXR0b25cclxuICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtIG0tMiBmbG9hdC1zdGFydFwiXHJcbiAgICAgIChjbGljayk9XCJuZ2JEYXRlID0gdG9kYXk7IG9uRGF0ZUNoYW5nZSh0b2RheSk7IGQuY2xvc2UoKVwiXHJcbiAgICA+XHJcbiAgICAgIFRvZGF5XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b25cclxuICAgICAgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc20gbS0yIGZsb2F0LWVuZFwiXHJcbiAgICAgIChjbGljayk9XCJuZ2JEYXRlID0gbnVsbDsgZGF0ZUNoYW5nZS5lbWl0KHVuZGVmaW5lZCk7IGQuY2xvc2UoKVwiXHJcbiAgICA+XHJcbiAgICAgIENsZWFyXHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19