UNPKG

@asadi/angular-date-components

Version:

`Angular Date Components` is a comprehensive angular library of date-related components designed to meet the needs of applications that require localization based on various calendar systems. While the package currently includes two powerful components (S

204 lines 37.9 kB
import { Component } from '@angular/core'; import { ADCCommonService, ADCStaticValues, TableSelection, FlatEventBuilder } from '@asadi/angular-date-components/core'; import { AdcSchedulerBase } from '../adc-scheduler-base/adc-scheduler-base'; import * as i0 from "@angular/core"; import * as i1 from "@asadi/angular-date-components/core"; export class ADCMonthViewComponent extends AdcSchedulerBase { constructor() { super(); this.month = 0; this.year = 0; this.daysOfWeek = ADCStaticValues.getDaysOfWeek(); this.monthsOfYear = this.dateAdapter.getMonthsOfYear(); this.weeksOfMonth = []; this.title = ''; this.dateSplitter = this.dateFormatter.DateSplitter; this.events = []; this.rows = []; this.startOfMonth = ''; this.endOfMonth = ''; this.weekends = []; this.holidays = []; this.today = this.dateAdapter.today(); this.commonService = new ADCCommonService(this.dateAdapter, this.labels); this.selectionManager = new TableSelection(this.dateFilter); this.eventBuilder = new FlatEventBuilder(); } ngOnInit() { super.init(); this.selectionManager.cellSelectionStream.subscribe(e => { this.onDateRangeSelect(e.start, e.end); }); this.eventBuilder.eventSelectionStream.subscribe(e => { this.onEventClick(e.event, e.dom, e.jsEvent); }); } dateFilter(cell1, cell2) { return +cell2.rowValue > +cell1.rowValue || (cell2.rowValue == cell1.rowValue && cell2.columnIndex >= cell1.columnIndex); } todayButtonHandler() { this.month = this.dateAdapter.getCurrentMonth(); this.year = this.dateAdapter.getCurrentYear(); this.calculateCurrentDate(); } previousButtonHandler() { this.month--; if (this.month < 1) { this.month = 12; this.year--; } this.calculateCurrentDate(); } nextButtonHandler() { this.month++; if (this.month > 12) { this.month = 1; this.year++; } this.calculateCurrentDate(); } calculateCurrentDate() { this.weeksOfMonth = this.dateAdapter.getWeeksOfMonth(this.year, this.month); this.startOfMonth = this.dateAdapter.transformDate(this.year, this.month, 1); const daysOfMonth = this.dateAdapter.getDaysOfMonth(this.year, this.month); this.endOfMonth = this.dateAdapter.transformDate(this.year, this.month, daysOfMonth); const month = this.monthsOfYear[this.month - 1]; this.title = this.commonService.getMonthName(month) || month + ' ' + this.year; this.dateChangesHandler(); super.dateRangeChange({ startDate: this.startOfMonth, endDate: this.endOfMonth }); } initViewHanlder() { if (this.startOf == null) { this.todayButtonHandler(); } else { this.month = this.dateAdapter.getMonthOf(this.startOf); this.year = this.dateAdapter.getYearOf(this.startOf); this.calculateCurrentDate(); } } eventChangesHandler(schedulerEvents) { const tableEvents = []; this.events = schedulerEvents; const viewEvents = this.tools.scheduler.getEventsBetweenDateRange(this.startOfMonth, this.endOfMonth, this.events); viewEvents.forEach((e) => { const startRowIndex = this.rows.findIndex((r, i) => { if (i == 0) return; return r.columns.map(c => (this.tools.dateTime.dateOnly(c.value))).includes(this.tools.dateTime.dateOnly(e.startDate)); }); const startColumnIndex = startRowIndex == -1 ? 0 : this.rows[startRowIndex].columns.findIndex(c => this.tools.dateTime.dateOnly(c.value) == this.tools.dateTime.dateOnly(e.startDate)); const endRowIndex = this.rows.findIndex((r, i) => { if (i == 0) return; return r.columns.map(c => (this.tools.dateTime.dateOnly(c.value))).includes(this.tools.dateTime.dateOnly(e.endDate)); }); const endColumnIndex = endRowIndex == -1 ? this.rows[this.rows.length - 1].columns.length - 1 : this.rows[endRowIndex].columns.findIndex(c => this.tools.dateTime.dateOnly(c.value) == this.tools.dateTime.dateOnly(e.endDate)); const startTime = +this.tools.dateTime.hourOrDefault(e.startTime, '00'); const endTime = +this.tools.dateTime.hourOrDefault(e.endTime, '24'); const cellEvent = { columnStart: startRowIndex != -1 ? startColumnIndex : null, columnEnd: endRowIndex != -1 ? endColumnIndex : null, data: e, rowStart: startRowIndex != -1 ? startRowIndex : 0, rowEnd: endRowIndex != -1 ? endRowIndex : this.rows.length - 1, offsetX: startTime / 24, fractionX: e.allDay == true ? 1 : (endTime / 24), overlapTolerance: this.options.eventOverlapTolerance / 24 }; tableEvents.push(cellEvent); }); this.eventBuilder.data = tableEvents; } dateChangesHandler() { this.rows = this.getRowsInitialValue(); this.weeksOfMonth.forEach((week, weekIndex) => { const row = { verticalAlign: 'start', horizontalAlign: 'start', label: '', classList: '', prefix: '', suffix: '', value: week, columns: [] }; this.daysOfWeek.forEach((day, dayIndex) => { const date = this.dateAdapter.getDateOfDay(this.year, +week, dayIndex); const splittedDate = date.split(this.dateSplitter); const transformedDate = this.dateAdapter.transformDate(+splittedDate[0], +splittedDate[1], +splittedDate[2]); row.columns.push({ classList: ''.concat(transformedDate.split('T')[0] == this.today && this.month == +splittedDate[1] ? ' today ' : ' ', this.weekends.includes(dayIndex) || this.holidays.includes(transformedDate.split('T')[0]) ? ' holiday ' : ' ', this.month != +splittedDate[1] ? ' unavailable ' : ' '), label: splittedDate[2], prefix: '', suffix: '', value: transformedDate.split('T')[0], verticalAlign: 'start', horizontalAlign: 'start', selectable: true }); }); this.rows.push(row); }); } weekendsChangesHandler(weekends) { this.weekends = weekends; this.dateChangesHandler(); } holidaysChangesHandler(holidays) { this.holidays = holidays; this.dateChangesHandler(); } onDateRangeSelect(startCell, endCell) { const startDate = this.dateAdapter.getDateOfDay(this.year, +startCell.rowValue, +startCell.columnIndex).split(this.dateSplitter); const transformedStart = this.dateAdapter.transformDate(+startDate[0], +startDate[1], +startDate[2]); const endDate = this.dateAdapter.getDateOfDay(this.year, +endCell.rowValue, +endCell.columnIndex).split(this.dateSplitter); const transformedEnd = this.dateAdapter.transformDate(+endDate[0], +endDate[1], +endDate[2]); const e = { endDate: transformedEnd, endTime: '00:00', startDate: transformedStart, startTime: '00:00', }; super.dateRangeSelect(e); } onEventClick(event, dom, jsEvent) { const schedulerEvent = this.events.filter(item => item.id == event.data.id)[0]; super.eventClick({ dom: dom, event: schedulerEvent, jsEvent: jsEvent }); } ngOnDestroy() { super.destroy(); } getRowsInitialValue() { return [{ label: '', prefix: '', suffix: '', verticalAlign: 'center', horizontalAlign: 'center', classList: '', value: '', columns: this.daysOfWeek.map((dayName, index) => { const dIndex = this.commonService.getDayIndex(index); return { label: this.labels?.daysOfWeek[dIndex] || dayName, prefix: '', suffix: '', verticalAlign: 'center', horizontalAlign: 'center', classList: this.weekends.includes(index) ? 'holiday' : '', display: true, value: index.toString(), selectable: false, }; }), }]; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ADCMonthViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: ADCMonthViewComponent, selector: "adc-month-view", usesInheritance: true, ngImport: i0, template: " \r\n<adc-table\r\n[rows]=\"rows\"\r\n[title]=\"title\"\r\n[showRowDetails]=\"false\"\r\n[selectionManager]=\"selectionManager\"\r\n[eventBuilder]=\"eventBuilder\"\r\n(viewReady)=\"markViewAsReady()\"\r\n></adc-table>\r\n\r\n<!-- [eventBuilder]=\"builder\" -->\r\n\r\n<!-- [tableEvents]=\"tableEvents\" -->\r\n\r\n<!-- <div flatEventBuilder [columns]=\"columns.length\" [rows]=\"rows.length\" #builder=\"eventBuilder\"></div> -->\r\n\r\n\r\n\r\n", styles: ["table{border-collapse:collapse;table-layout:fixed}.w-full{width:100%}.h-full{height:100%}.table-border{border:1px solid #000}.relative{position:relative}.disabled{pointer-events:none;opacity:.5}.date{font-weight:500}.text-left{text-align:left}.vertical-text-top{vertical-align:text-top}.min-h-24{height:6rem}\n"], dependencies: [{ kind: "component", type: i1.ADCTableComponent, selector: "adc-table", inputs: ["rows", "showRowDetails", "title", "titleClass", "eventBuilder", "selectionManager"], outputs: ["viewReady"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ADCMonthViewComponent, decorators: [{ type: Component, args: [{ selector: 'adc-month-view', template: " \r\n<adc-table\r\n[rows]=\"rows\"\r\n[title]=\"title\"\r\n[showRowDetails]=\"false\"\r\n[selectionManager]=\"selectionManager\"\r\n[eventBuilder]=\"eventBuilder\"\r\n(viewReady)=\"markViewAsReady()\"\r\n></adc-table>\r\n\r\n<!-- [eventBuilder]=\"builder\" -->\r\n\r\n<!-- [tableEvents]=\"tableEvents\" -->\r\n\r\n<!-- <div flatEventBuilder [columns]=\"columns.length\" [rows]=\"rows.length\" #builder=\"eventBuilder\"></div> -->\r\n\r\n\r\n\r\n", styles: ["table{border-collapse:collapse;table-layout:fixed}.w-full{width:100%}.h-full{height:100%}.table-border{border:1px solid #000}.relative{position:relative}.disabled{pointer-events:none;opacity:.5}.date{font-weight:500}.text-left{text-align:left}.vertical-text-top{vertical-align:text-top}.min-h-24{height:6rem}\n"] }] }], ctorParameters: () => [] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRjbW9udGgtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc2FkaS9hbmd1bGFyLWRhdGUtY29tcG9uZW50cy9zY2hlZHVsZXIvc3JjL2NvbXBvbmVudHMvYWRjbW9udGgtdmlldy9hZGNtb250aC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FzYWRpL2FuZ3VsYXItZGF0ZS1jb21wb25lbnRzL3NjaGVkdWxlci9zcmMvY29tcG9uZW50cy9hZGNtb250aC12aWV3L2FkY21vbnRoLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFpRCxnQkFBZ0IsRUFBRSxlQUFlLEVBQWlCLGNBQWMsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBRXZMLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7QUFPNUUsTUFBTSxPQUFPLHFCQUFzQixTQUFRLGdCQUFnQjtJQTRCekQ7UUFFRSxLQUFLLEVBQUUsQ0FBQztRQTVCVixVQUFLLEdBQVcsQ0FBQyxDQUFDO1FBQ2xCLFNBQUksR0FBVyxDQUFDLENBQUM7UUFFakIsZUFBVSxHQUFhLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2RCxpQkFBWSxHQUFhLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDNUQsaUJBQVksR0FBYSxFQUFFLENBQUM7UUFFNUIsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUVuQixpQkFBWSxHQUFvQixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztRQUVoRSxXQUFNLEdBQXlCLEVBQUUsQ0FBQztRQUVsQyxTQUFJLEdBQW1CLEVBQUUsQ0FBQztRQUVsQixp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RUFBRTtnQkFDVixhQUFhLEVBQUUsUUFBUTtnQkFDdkIsZUFBZSxFQUFFLFFBQVE7Z0JBQ3pCLFNBQVMsRUFBRSxFQUFFO2dCQUNiLEtBQUssRUFBRSxFQUFFO2dCQUNULE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRTtvQkFFOUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBRXJELE9BQU87d0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU87d0JBQ2pELE1BQU0sRUFBRSxFQUFFO3dCQUNWLE1BQU0sRUFBRSxFQUFFO3dCQUNWLGFBQWEsRUFBRSxRQUFRO3dCQUN2QixlQUFlLEVBQUUsUUFBUTt3QkFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQ3pELE9BQU8sRUFBRSxJQUFJO3dCQUNiLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFO3dCQUN2QixVQUFVLEVBQUUsS0FBSztxQkFDbEIsQ0FBQTtnQkFDSCxDQUFDLENBQUM7YUFDSCxDQUFDLENBQUE7SUFDSixDQUFDOzhHQXhSVSxxQkFBcUI7a0dBQXJCLHFCQUFxQiw2RUNWbEMsZ2NBa0JBOzsyRkRSYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBRENEYXRlU3BsaXR0ZXIsIEFEQ0lUYWJsZUV2ZW50LCBBRENJVGFibGVSb3csIEFEQ0NvbW1vblNlcnZpY2UsIEFEQ1N0YXRpY1ZhbHVlcywgQURDSVRhYmxlQ2VsbCwgVGFibGVTZWxlY3Rpb24sIEZsYXRFdmVudEJ1aWxkZXJ9IGZyb20gJ0Bhc2FkaS9hbmd1bGFyLWRhdGUtY29tcG9uZW50cy9jb3JlJztcclxuaW1wb3J0IHsgQURDSVNjaGVkdWxlckRhdGVSYW5nZVNlbGVjdEV2ZW50LCBBRENJU2NoZWR1bGVyRXZlbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2UuZ2xvYmFsJztcclxuaW1wb3J0IHsgQWRjU2NoZWR1bGVyQmFzZSB9IGZyb20gJy4uL2FkYy1zY2hlZHVsZXItYmFzZS9hZGMtc2NoZWR1bGVyLWJhc2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhZGMtbW9udGgtdmlldycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkY21vbnRoLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2FkY21vbnRoLXZpZXcuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBRENNb250aFZpZXdDb21wb25lbnQgZXh0ZW5kcyBBZGNTY2hlZHVsZXJCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3l7XHJcblxyXG4gIG1vbnRoOiBudW1iZXIgPSAwO1xyXG4gIHllYXI6IG51bWJlciA9IDA7XHJcblxyXG4gIGRheXNPZldlZWs6IHN0cmluZ1tdID0gQURDU3RhdGljVmFsdWVzLmdldERheXNPZldlZWsoKTtcclxuICBtb250aHNPZlllYXI6IHN0cmluZ1tdID0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aHNPZlllYXIoKTtcclxuICB3ZWVrc09mTW9udGg6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHRpdGxlOiBzdHJpbmcgPSAnJztcclxuICBcclxuICBkYXRlU3BsaXR0ZXI6IEFEQ0RhdGVTcGxpdHRlciA9IHRoaXMuZGF0ZUZvcm1hdHRlci5EYXRlU3BsaXR0ZXI7XHJcblxyXG4gIGV2ZW50czogQURDSVNjaGVkdWxlckV2ZW50W10gPSBbXTtcclxuXHJcbiAgcm93czogQURDSVRhYmxlUm93W10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBzdGFydE9mTW9udGg6IHN0cmluZyA9ICcnO1xyXG4gIHByaXZhdGUgZW5kT2ZNb250aDogc3RyaW5nID0gJyc7XHJcblxyXG4gIHdlZWtlbmRzOiBudW1iZXJbXSA9IFtdO1xyXG4gIGhvbGlkYXlzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICByZWFkb25seSB0b2RheTogc3RyaW5nID0gdGhpcy5kYXRlQWRhcHRlci50b2RheSgpO1xyXG4gIHJlYWRvbmx5IGNvbW1vblNlcnZpY2UgPSBuZXcgQURDQ29tbW9uU2VydmljZSh0aGlzLmRhdGVBZGFwdGVyLCB0aGlzLmxhYmVscyk7XHJcbiAgcmVhZG9ubHkgc2VsZWN0aW9uTWFuYWdlciA9IG5ldyBUYWJsZVNlbGVjdGlvbih0aGlzLmRhdGVGaWx0ZXIpO1xyXG4gIHJlYWRvbmx5IGV2ZW50QnVpbGRlciA9IG5ldyBGbGF0RXZlbnRCdWlsZGVyKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKClcclxuICB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCBcclxuICB7XHJcbiAgICBzdXBlci5pbml0KCk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3Rpb25NYW5hZ2VyLmNlbGxTZWxlY3Rpb25TdHJlYW0uc3Vic2NyaWJlKGUgPT4ge1xyXG4gICAgICB0aGlzLm9uRGF0ZVJhbmdlU2VsZWN0KGUuc3RhcnQsIGUuZW5kKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZXZlbnRCdWlsZGVyLmV2ZW50U2VsZWN0aW9uU3RyZWFtLnN1YnNjcmliZShlID0+IHtcclxuICAgICAgdGhpcy5vbkV2ZW50Q2xpY2soZS5ldmVudCwgZS5kb20sIGUuanNFdmVudCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRhdGVGaWx0ZXIoY2VsbDE6IEFEQ0lUYWJsZUNlbGwsIGNlbGwyOiBBRENJVGFibGVDZWxsKTogYm9vbGVhblxyXG4gIHtcclxuICAgIHJldHVybiArY2VsbDIucm93VmFsdWUgPiArY2VsbDEucm93VmFsdWUgfHwgKGNlbGwyLnJvd1ZhbHVlID09IGNlbGwxLnJvd1ZhbHVlICYmIGNlbGwyLmNvbHVtbkluZGV4ID49IGNlbGwxLmNvbHVtbkluZGV4KTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHRvZGF5QnV0dG9uSGFuZGxlcigpOiB2b2lkXHJcbiAge1xyXG4gICAgdGhpcy5tb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0Q3VycmVudE1vbnRoKCk7XHJcbiAgICB0aGlzLnllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldEN1cnJlbnRZZWFyKCk7XHJcblxyXG4gICAgdGhpcy5jYWxjdWxhdGVDdXJyZW50RGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgcHJldmlvdXNCdXR0b25IYW5kbGVyKCk6IHZvaWRcclxuICB7XHJcbiAgICB0aGlzLm1vbnRoLS07XHJcbiAgICBpZih0aGlzLm1vbnRoIDwgMSlcclxuICAgIHtcclxuICAgICAgdGhpcy5tb250aCA9IDEyO1xyXG4gICAgICB0aGlzLnllYXItLTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhbGN1bGF0ZUN1cnJlbnREYXRlKCk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBuZXh0QnV0dG9uSGFuZGxlcigpOiB2b2lkXHJcbiAge1xyXG4gICAgdGhpcy5tb250aCsrO1xyXG4gICAgaWYodGhpcy5tb250aCA+IDEyKVxyXG4gICAge1xyXG4gICAgICB0aGlzLm1vbnRoID0gMTtcclxuICAgICAgdGhpcy55ZWFyKys7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jYWxjdWxhdGVDdXJyZW50RGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlQ3VycmVudERhdGUoKTogdm9pZFxyXG4gIHtcclxuICAgIHRoaXMud2Vla3NPZk1vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5nZXRXZWVrc09mTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTtcclxuICAgIHRoaXMuc3RhcnRPZk1vbnRoID0gdGhpcy5kYXRlQWRhcHRlci50cmFuc2Zvcm1EYXRlKHRoaXMueWVhciwgdGhpcy5tb250aCwgMSk7XHJcbiAgICBjb25zdCBkYXlzT2ZNb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF5c09mTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTtcclxuICAgIHRoaXMuZW5kT2ZNb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIudHJhbnNmb3JtRGF0ZSh0aGlzLnllYXIsIHRoaXMubW9udGgsIGRheXNPZk1vbnRoKTtcclxuXHJcbiAgICBjb25zdCBtb250aCA9ICB0aGlzLm1vbnRoc09mWWVhclt0aGlzLm1vbnRoIC0gMV07XHJcblxyXG4gICAgdGhpcy50aXRsZSA9IHRoaXMuY29tbW9uU2VydmljZS5nZXRNb250aE5hbWUobW9udGgpIHx8IG1vbnRoICsgJyAnICsgdGhpcy55ZWFyO1xyXG5cclxuICAgIHRoaXMuZGF0ZUNoYW5nZXNIYW5kbGVyKCk7XHJcbiAgICBzdXBlci5kYXRlUmFuZ2VDaGFuZ2Uoe3N0YXJ0RGF0ZTogdGhpcy5zdGFydE9mTW9udGgsIGVuZERhdGU6IHRoaXMuZW5kT2ZNb250aH0pO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgaW5pdFZpZXdIYW5sZGVyKCk6IHZvaWQgXHJcbiAge1xyXG4gICAgaWYodGhpcy5zdGFydE9mID09IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMudG9kYXlCdXR0b25IYW5kbGVyKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIHRoaXMubW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoT2YodGhpcy5zdGFydE9mKTtcclxuICAgICAgdGhpcy55ZWFyID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyT2YodGhpcy5zdGFydE9mKTtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVDdXJyZW50RGF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgZXZlbnRDaGFuZ2VzSGFuZGxlcihzY2hlZHVsZXJFdmVudHM6IEFEQ0lTY2hlZHVsZXJFdmVudFtdKTogdm9pZFxyXG4gIHtcclxuICAgIGNvbnN0IHRhYmxlRXZlbnRzOiBBRENJVGFibGVFdmVudFtdID0gW107XHJcblxyXG4gICAgdGhpcy5ldmVudHMgPSBzY2hlZHVsZXJFdmVudHM7XHJcblxyXG4gICAgY29uc3Qgdmlld0V2ZW50cyA9IHRoaXMudG9vbHMuc2NoZWR1bGVyLmdldEV2ZW50c0JldHdlZW5EYXRlUmFuZ2UodGhpcy5zdGFydE9mTW9udGgsIHRoaXMuZW5kT2ZNb250aCwgdGhpcy5ldmVudHMpO1xyXG5cclxuICAgIHZpZXdFdmVudHMuZm9yRWFjaCgoZTogQURDSVNjaGVkdWxlckV2ZW50KSA9PiB7XHJcblxyXG4gICAgICBjb25zdCBzdGFydFJvd0luZGV4ID0gdGhpcy5yb3dzLmZpbmRJbmRleCgociwgaSkgPT4ge1xyXG4gICAgICAgIGlmKGkgPT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICByZXR1cm4gci5jb2x1bW5zLm1hcChjID0+ICh0aGlzLnRvb2xzLmRhdGVUaW1lLmRhdGVPbmx5KGMudmFsdWUpKSkuaW5jbHVkZXModGhpcy50b29scy5kYXRlVGltZS5kYXRlT25seShlLnN0YXJ0RGF0ZSkpXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3Qgc3RhcnRDb2x1bW5JbmRleCA9IHN0YXJ0Um93SW5kZXggPT0gLTEgPyAwIDogdGhpcy5yb3dzW3N0YXJ0Um93SW5kZXhdLmNvbHVtbnMuZmluZEluZGV4KGMgPT4gXHJcbiAgICAgICAgdGhpcy50b29scy5kYXRlVGltZS5kYXRlT25seShjLnZhbHVlKSA9PSB0aGlzLnRvb2xzLmRhdGVUaW1lLmRhdGVPbmx5KGUuc3RhcnREYXRlKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgZW5kUm93SW5kZXggPSB0aGlzLnJvd3MuZmluZEluZGV4KChyLCBpKSA9PiB7XHJcblxyXG4gICAgICAgIGlmKGkgPT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICByZXR1cm4gci5jb2x1bW5zLm1hcChjID0+ICh0aGlzLnRvb2xzLmRhdGVUaW1lLmRhdGVPbmx5KGMudmFsdWUpKSkuaW5jbHVkZXModGhpcy50b29scy5kYXRlVGltZS5kYXRlT25seShlLmVuZERhdGUpKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBlbmRDb2x1bW5JbmRleCA9IGVuZFJvd0luZGV4ID09IC0xID8gdGhpcy5yb3dzW3RoaXMucm93cy5sZW5ndGggLSAxXS5jb2x1bW5zLmxlbmd0aCAtIDEgOiB0aGlzLnJvd3NbZW5kUm93SW5kZXhdLmNvbHVtbnMuZmluZEluZGV4KGMgPT4gXHJcbiAgICAgICAgdGhpcy50b29scy5kYXRlVGltZS5kYXRlT25seShjLnZhbHVlKSA9PSB0aGlzLnRvb2xzLmRhdGVUaW1lLmRhdGVPbmx5KGUuZW5kRGF0ZSlcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9ICt0aGlzLnRvb2xzLmRhdGVUaW1lLmhvdXJPckRlZmF1bHQoZS5zdGFydFRpbWUsICcwMCcpO1xyXG4gICAgICBjb25zdCBlbmRUaW1lID0gK3RoaXMudG9vbHMuZGF0ZVRpbWUuaG91ck9yRGVmYXVsdChlLmVuZFRpbWUsICcyNCcpO1xyXG5cclxuICAgICAgY29uc3QgY2VsbEV2ZW50OiBBRENJVGFibGVFdmVudCA9IHtcclxuICAgICAgICBjb2x1bW5TdGFydDogc3RhcnRSb3dJbmRleCAhPSAtMSA/IHN0YXJ0Q29sdW1uSW5kZXggOiBudWxsLFxyXG4gICAgICAgIGNvbHVtbkVuZDogZW5kUm93SW5kZXggIT0gLTEgPyBlbmRDb2x1bW5JbmRleCA6IG51bGwsXHJcbiAgICAgICAgZGF0YTogZSxcclxuICAgICAgICByb3dTdGFydDogc3RhcnRSb3dJbmRleCAhPSAtMSA/IHN0YXJ0Um93SW5kZXggOiAwLFxyXG4gICAgICAgIHJvd0VuZDogIGVuZFJvd0luZGV4ICE9IC0xID8gZW5kUm93SW5kZXggOiB0aGlzLnJvd3MubGVuZ3RoIC0gMSxcclxuICAgICAgICBvZmZzZXRYOiBzdGFydFRpbWUgLyAyNCxcclxuICAgICAgICBmcmFjdGlvblg6IGUuYWxsRGF5ID09IHRydWUgPyAxIDogKGVuZFRpbWUgLyAyNCksXHJcbiAgICAgICAgb3ZlcmxhcFRvbGVyYW5jZTogdGhpcy5vcHRpb25zLmV2ZW50T3ZlcmxhcFRvbGVyYW5jZSAvIDI0XHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0YWJsZUV2ZW50cy5wdXNoKGNlbGxFdmVudCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmV2ZW50QnVpbGRlci5kYXRhID0gdGFibGVFdmVudHM7XHJcbiAgfVxyXG5cclxuICBkYXRlQ2hhbmdlc0hhbmRsZXIoKTogdm9pZFxyXG4gIHtcclxuICAgIHRoaXMucm93cyA9IHRoaXMuZ2V0Um93c0luaXRpYWxWYWx1ZSgpO1xyXG5cclxuICAgIHRoaXMud2Vla3NPZk1vbnRoLmZvckVhY2goKHdlZWs6IHN0cmluZywgd2Vla0luZGV4OiBudW1iZXIpID0+IHtcclxuXHJcbiAgICAgICAgY29uc3Qgcm93OiBBRENJVGFibGVSb3cgPSB7XHJcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnc3RhcnQnLFxyXG4gICAgICAgICAgaG9yaXpvbnRhbEFsaWduOiAnc3RhcnQnLFxyXG4gICAgICAgICAgbGFiZWw6ICcnLFxyXG4gICAgICAgICAgY2xhc3NMaXN0OiAnJyxcclxuICAgICAgICAgIHByZWZpeDogJycsXHJcbiAgICAgICAgICBzdWZmaXg6ICcnLFxyXG4gICAgICAgICAgdmFsdWU6IHdlZWssXHJcbiAgICAgICAgICBjb2x1bW5zOiBbXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuZGF5c09mV2Vlay5mb3JFYWNoKChkYXk6IHN0cmluZywgZGF5SW5kZXg6IG51bWJlcikgPT4ge1xyXG5cclxuICAgICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLmdldERhdGVPZkRheSh0aGlzLnllYXIsICt3ZWVrLCBkYXlJbmRleCk7XHJcbiAgICAgICAgICBjb25zdCBzcGxpdHRlZERhdGUgPSBkYXRlLnNwbGl0KHRoaXMuZGF0ZVNwbGl0dGVyKTtcclxuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIudHJhbnNmb3JtRGF0ZSgrc3BsaXR0ZWREYXRlWzBdLCArc3BsaXR0ZWREYXRlWzFdLCArc3BsaXR0ZWREYXRlWzJdKTtcclxuXHJcbiAgICAgICAgICByb3cuY29sdW1ucy5wdXNoKHtcclxuICAgICAgICAgICAgY2xhc3NMaXN0OiAnJy5jb25jYXQoXHJcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZWREYXRlLnNwbGl0KCdUJylbMF0gPT0gdGhpcy50b2RheSAmJiB0aGlzLm1vbnRoID09ICtzcGxpdHRlZERhdGVbMV0gPyAnIHRvZGF5ICcgOiAnICcsXHJcbiAgICAgICAgICAgICAgdGhpcy53ZWVrZW5kcy5pbmNsdWRlcyhkYXlJbmRleCkgfHwgdGhpcy5ob2xpZGF5cy5pbmNsdWRlcyh0cmFuc2Zvcm1lZERhdGUuc3BsaXQoJ1QnKVswXSkgPyAnIGhvbGlkYXkgJyA6ICcgJyxcclxuICAgICAgICAgICAgICB0aGlzLm1vbnRoICE9ICtzcGxpdHRlZERhdGVbMV0gPyAnIHVuYXZhaWxhYmxlICcgOiAnICdcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgbGFiZWw6IHNwbGl0dGVkRGF0ZVsyXSxcclxuICAgICAgICAgICAgcHJlZml4OiAnJyxcclxuICAgICAgICAgICAgc3VmZml4OiAnJyxcclxuICAgICAgICAgICAgdmFsdWU6IHRyYW5zZm9ybWVkRGF0ZS5zcGxpdCgnVCcpWzBdLFxyXG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnc3RhcnQnLFxyXG4gICAgICAgICAgICBob3Jpem9udGFsQWxpZ246ICdzdGFydCcsXHJcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IHRydWVcclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJvd3MucHVzaChyb3cpO1xyXG5cclxuXHJcbiAgICB9KTsgICBcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHdlZWtlbmRzQ2hhbmdlc0hhbmRsZXIod2Vla2VuZHM6IG51bWJlcltdKTogdm9pZCBcclxuICB7XHJcbiAgICB0aGlzLndlZWtlbmRzID0gd2Vla2VuZHM7XHJcbiAgICB0aGlzLmRhdGVDaGFuZ2VzSGFuZGxlcigpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgaG9saWRheXNDaGFuZ2VzSGFuZGxlcihob2xpZGF5czogc3RyaW5nW10pOiB2b2lkIFxyXG4gIHtcclxuICAgIHRoaXMuaG9saWRheXMgPSBob2xpZGF5cztcclxuICAgIHRoaXMuZGF0ZUNoYW5nZXNIYW5kbGVyKCk7XHJcbiAgfVxyXG5cclxuICBvbkRhdGVSYW5nZVNlbGVjdChzdGFydENlbGw6IEFEQ0lUYWJsZUNlbGwsIGVuZENlbGw6IEFEQ0lUYWJsZUNlbGwpOiB2b2lkXHJcbiAge1xyXG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5kYXRlQWRhcHRlci5nZXREYXRlT2ZEYXkodGhpcy55ZWFyLCArc3RhcnRDZWxsLnJvd1ZhbHVlLCArc3RhcnRDZWxsLmNvbHVtbkluZGV4KS5zcGxpdCh0aGlzLmRhdGVTcGxpdHRlcik7XHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFN0YXJ0ID0gdGhpcy5kYXRlQWRhcHRlci50cmFuc2Zvcm1EYXRlKCtzdGFydERhdGVbMF0sICtzdGFydERhdGVbMV0sICtzdGFydERhdGVbMl0pO1xyXG5cclxuICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLmdldERhdGVPZkRheSh0aGlzLnllYXIsICtlbmRDZWxsLnJvd1ZhbHVlLCArZW5kQ2VsbC5jb2x1bW5JbmRleCkuc3BsaXQodGhpcy5kYXRlU3BsaXR0ZXIpO1xyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRFbmQgPSB0aGlzLmRhdGVBZGFwdGVyLnRyYW5zZm9ybURhdGUoK2VuZERhdGVbMF0sICtlbmREYXRlWzFdLCArZW5kRGF0ZVsyXSk7XHJcblxyXG5cclxuICAgIGNvbnN0IGU6IEFEQ0lTY2hlZHVsZXJEYXRlUmFuZ2VTZWxlY3RFdmVudCA9IFxyXG4gICAge1xyXG4gICAgICBlbmREYXRlOiB0cmFuc2Zvcm1lZEVuZCxcclxuICAgICAgZW5kVGltZTogJzAwOjAwJyxcclxuICAgICAgc3RhcnREYXRlOiB0cmFuc2Zvcm1lZFN0YXJ0LFxyXG4gICAgICBzdGFydFRpbWU6ICcwMDowMCcsXHJcbiAgICB9XHJcblxyXG4gICAgc3VwZXIuZGF0ZVJhbmdlU2VsZWN0KGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIG92ZXJyaWRlIG9uRXZlbnRDbGljayhldmVudDogQURDSVRhYmxlRXZlbnQsIGRvbTogSFRNTEVsZW1lbnQsIGpzRXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIFxyXG4gIHtcclxuICAgIGNvbnN0IHNjaGVkdWxlckV2ZW50OiBBRENJU2NoZWR1bGVyRXZlbnQgPSB0aGlzLmV2ZW50cy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkID09IGV2ZW50LmRhdGEuaWQpWzBdO1xyXG5cclxuICAgIHN1cGVyLmV2ZW50Q2xpY2soe2RvbTogZG9tLCBldmVudDogc2NoZWR1bGVyRXZlbnQsIGpzRXZlbnQ6IGpzRXZlbnR9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgc3VwZXIuZGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSb3dzSW5pdGlhbFZhbHVlKCk6IEFEQ0lUYWJsZVJvd1tdXHJcbiAge1xyXG4gICAgcmV0dXJuIFt7XHJcbiAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgcHJlZml4OiAnJyxcclxuICAgICAgc3VmZml4OiAnJyxcclxuICAgICAgdmVydGljYWxBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgIGhvcml6b250YWxBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgIGNsYXNzTGlzdDogJycsXHJcbiAgICAgIHZhbHVlOiAnJyxcclxuICAgICAgY29sdW1uczogdGhpcy5kYXlzT2ZXZWVrLm1hcCgoZGF5TmFtZSwgaW5kZXgpID0+IHtcclxuXHJcbiAgICAgICAgY29uc3QgZEluZGV4ID0gdGhpcy5jb21tb25TZXJ2aWNlLmdldERheUluZGV4KGluZGV4KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGxhYmVsOiB0aGlzLmxhYmVscz8uZGF5c09mV2Vla1tkSW5kZXhdIHx8IGRheU5hbWUsXHJcbiAgICAgICAgICBwcmVmaXg6ICcnLFxyXG4gICAgICAgICAgc3VmZml4OiAnJyxcclxuICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgICAgaG9yaXpvbnRhbEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICAgIGNsYXNzTGlzdDogdGhpcy53ZWVrZW5kcy5pbmNsdWRlcyhpbmRleCkgPyAnaG9saWRheScgOiAnJyxcclxuICAgICAgICAgIGRpc3BsYXk6IHRydWUsXHJcbiAgICAgICAgICB2YWx1ZTogaW5kZXgudG9TdHJpbmcoKSxcclxuICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICB9XVxyXG4gIH1cclxufVxyXG4iLCIgXHJcbjxhZGMtdGFibGVcclxuW3Jvd3NdPVwicm93c1wiXHJcblt0aXRsZV09XCJ0aXRsZVwiXHJcbltzaG93Um93RGV0YWlsc109XCJmYWxzZVwiXHJcbltzZWxlY3Rpb25NYW5hZ2VyXT1cInNlbGVjdGlvbk1hbmFnZXJcIlxyXG5bZXZlbnRCdWlsZGVyXT1cImV2ZW50QnVpbGRlclwiXHJcbih2aWV3UmVhZHkpPVwibWFya1ZpZXdBc1JlYWR5KClcIlxyXG4+PC9hZGMtdGFibGU+XHJcblxyXG48IS0tIFtldmVudEJ1aWxkZXJdPVwiYnVpbGRlclwiIC0tPlxyXG5cclxuPCEtLSBbdGFibGVFdmVudHNdPVwidGFibGVFdmVudHNcIiAgLS0+XHJcblxyXG48IS0tIDxkaXYgZmxhdEV2ZW50QnVpbGRlciBbY29sdW1uc109XCJjb2x1bW5zLmxlbmd0aFwiIFtyb3dzXT1cInJvd3MubGVuZ3RoXCIgI2J1aWxkZXI9XCJldmVudEJ1aWxkZXJcIj48L2Rpdj4gLS0+XHJcblxyXG5cclxuXHJcbiJdfQ==