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

217 lines 36.8 kB
import { Component } from '@angular/core'; import { ADCCommonService, ADCStaticValues, FlatEventBuilder, TableSelection } from '@asadi/angular-date-components/core'; import { AdcResourceSchedulerBase } from '../adc-resource-scheduler-base/adc-resource-scheduler-base'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@asadi/angular-date-components/core"; export class ADCMonthViewComponent extends AdcResourceSchedulerBase { 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.resources = []; this.events = []; this.rows = []; this.startOfMonth = ''; this.endOfMonth = ''; this.weekends = []; this.holidays = []; this.commonService = new ADCCommonService(this.dateAdapter, this.labels); this.today = this.dateAdapter.today(); this.selectionManager = new TableSelection(this.dateFilter); this.eventBuilder = new FlatEventBuilder(); } ngOnInit() { super.init(); this.selectionManager.cellSelectionStream.subscribe(event => this.onDateRangeSelect(event.start, event.end)); this.eventBuilder.eventSelectionStream.subscribe(e => { this.onEventClick(e.event, e.dom, e.jsEvent); }); } dateFilter(cell1, cell2) { return cell1.rowValue == cell2.rowValue && cell2.columnValue >= cell1.columnValue; } initViewHanlder() { if (this.startOf == null) { this.todayButtonHandler(); } else { this.month = this.dateAdapter.getMonthOf(this.startOf); this.year = this.dateAdapter.getYearOf(this.startOf); this.calculateCurrentDate(); } } 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 }); } eventChangesHandler(events) { const tableEvents = []; this.events = events; const viewEvents = this.tools.resourceScheduler.getEventsBetweenDateRange(this.startOfMonth, this.endOfMonth, this.events); viewEvents.forEach((e) => { const rowIndex = this.rows.findIndex((r) => r.value == e.resourceId); if (rowIndex == -1) return; const row = this.rows[rowIndex]; const startColumnIndex = row.columns.findIndex((c) => { return this.tools.dateTime.dateOnly(c.value.toString()) == this.tools.dateTime.dateOnly(e.startDate); }); const endColumnIndex = row.columns.findIndex((c) => { return this.tools.dateTime.dateOnly(c.value.toString()) == 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: startColumnIndex != -1 ? startColumnIndex : null, columnEnd: endColumnIndex != -1 ? endColumnIndex : null, data: e, rowStart: rowIndex, rowEnd: rowIndex, offsetX: startTime / 24, fractionX: e.allDay == true ? 1 : (endTime / 24), overlapTolerance: this.options.eventOverlapTolerance / 24 }; tableEvents.push(cellEvent); }); this.eventBuilder.data = tableEvents; } resourceChangesHandler(resources) { this.resources = resources; this.dateChangesHandler(); } dateChangesHandler() { this.rows = this.getRowInitialValue(); if (this.resources.length == 0) return; this.resources.forEach((resource, rowIndex) => { const row = { label: resource.title, classList: '', prefix: '', suffix: '', value: resource.id.toString(), verticalAlign: 'center', horizontalAlign: 'center', columns: [], }; this.weeksOfMonth.forEach((week, weekIndex) => { 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]); if (+splittedDate[1] != this.month) return; row.columns.push({ label: '', classList: '', prefix: '', suffix: '', value: transformedDate.split('T')[0], verticalAlign: 'center', horizontalAlign: 'center', selectable: true }); }); }); this.rows.push(row); }); } holidaysChangesHandler(holidays) { this.holidays = holidays; this.dateChangesHandler(); } weekendChangesHandler(weekends) { this.weekends = weekends; this.dateChangesHandler(); } onDateRangeSelect(start, end) { const e = { endDate: end.columnValue.split('T')[0], endTime: '00:00', startDate: start.columnValue.split('T')[0], startTime: '00:00', resourceId: start.rowValue }; super.dateRangeSelect(e); } onEventClick(event, dom, jsEvent) { const resourceSchedulerEvent = this.events.filter(item => item.id == event.data.id)[0]; super.eventClick({ dom: dom, jsEvent: jsEvent, event: resourceSchedulerEvent }); } ngOnDestroy() { super.destory(); } getRowInitialValue() { const row = { verticalAlign: 'center', horizontalAlign: 'center', classList: '', label: '', prefix: '', suffix: '', value: '', columns: [], }; this.weeksOfMonth.forEach((week, weekIndex) => { 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]); const dIndex = this.commonService.getDayIndex(dayIndex); if (+splittedDate[1] != this.month) return; row.columns.push({ label: this.labels?.daysOfWeek[dIndex] || day, classList: ''.concat(transformedDate.split('T')[0] == this.today ? ' today ' : ' ', this.weekends.includes(dayIndex) || this.holidays.includes(transformedDate.split('T')[0]) ? ' holiday ' : ' '), prefix: '', suffix: date.split(this.dateSplitter)[1] + this.dateSplitter + date.split(this.dateSplitter)[2], value: dayIndex.toString(), verticalAlign: 'center', horizontalAlign: 'center', selectable: false }); }); }); return [row]; } 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: "<ng-container *ngIf=\"resources.length != 0\">\r\n <adc-table\r\n [rows]=\"rows\"\r\n [title]=\"title\" \r\n [selectionManager]=\"selectionManager\"\r\n [eventBuilder]=\"eventBuilder\"\r\n (viewReady)=\"markViewAsReady()\"\r\n ></adc-table>\r\n</ng-container>\r\n\r\n\r\n\r\n\r\n\r\n", styles: [".w-full{width:100%}.table-layout-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.h-12{height:3rem}.text-center{text-align:center}.events{height:100%;width:100%;overflow:visible;padding:0;margin:0}.h-1152{height:1152px}.over-flow-hidden{overflow:hidden}table{border-spacing:0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.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: "<ng-container *ngIf=\"resources.length != 0\">\r\n <adc-table\r\n [rows]=\"rows\"\r\n [title]=\"title\" \r\n [selectionManager]=\"selectionManager\"\r\n [eventBuilder]=\"eventBuilder\"\r\n (viewReady)=\"markViewAsReady()\"\r\n ></adc-table>\r\n</ng-container>\r\n\r\n\r\n\r\n\r\n\r\n", styles: [".w-full{width:100%}.table-layout-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.h-12{height:3rem}.text-center{text-align:center}.events{height:100%;width:100%;overflow:visible;padding:0;margin:0}.h-1152{height:1152px}.over-flow-hidden{overflow:hidden}table{border-spacing:0}\n"] }] }], ctorParameters: () => [] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRjLW1vbnRoLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNhZGkvYW5ndWxhci1kYXRlLWNvbXBvbmVudHMvcmVzb3VyY2Utc2NoZWR1bGVyL3NyYy9jb21wb25lbnRzL2FkYy1tb250aC12aWV3L2FkYy1tb250aC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FzYWRpL2FuZ3VsYXItZGF0ZS1jb21wb25lbnRzL3Jlc291cmNlLXNjaGVkdWxlci9zcmMvY29tcG9uZW50cy9hZGMtbW9udGgtdmlldy9hZGMtbW9udGgtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQWlGLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUV6TSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQzs7OztBQU90RyxNQUFNLE9BQU8scUJBQXNCLFNBQVEsd0JBQXdCO0lBOEJqRTtRQUdFLEtBQUssRUFBRSxDQUFDO1FBOUJWLFVBQUssR0FBVyxDQUFDLENBQUM7UUFDbEIsU0FBSSxHQUFXLENBQUMsQ0FBQztRQUVqQixlQUFVLEdBQWEsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZELGlCQUFZLEdBQWEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1RCxpQkFBWSxHQUFhLEVBQUUsQ0FBQztRQUU1QixVQUFLLEdBQVcsRUFBRSxDQUFDO1FBRW5CLGlCQUFZLEdBQW9CLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDO1FBRWhFLGNBQVMsR0FBb0MsRUFBRSxDQUFDO1FBQ2hELFdBQU0s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LENBQUE7WUFDSixDQUFDLENBQUMsQ0FBQztRQUVMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQzs4R0FuU1UscUJBQXFCO2tHQUFyQixxQkFBcUIsNkVDVmxDLHFUQWNBOzsyRkRKYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBRENDb21tb25TZXJ2aWNlLCBBRENEYXRlU3BsaXR0ZXIsIEFEQ0lUYWJsZUNlbGwsIEFEQ0lUYWJsZUNvbHVtbiwgQURDSVRhYmxlRXZlbnQsIEFEQ0lUYWJsZVJvdywgQURDU3RhdGljVmFsdWVzLCBGbGF0RXZlbnRCdWlsZGVyLCBUYWJsZVNlbGVjdGlvbiB9IGZyb20gJ0Bhc2FkaS9hbmd1bGFyLWRhdGUtY29tcG9uZW50cy9jb3JlJztcclxuaW1wb3J0IHsgQURDSVJlc291cmNlU2NoZWR1bGVyRXZlbnQsIEFEQ0lSZXNvdXJjZVNjaGVkdWxlclJlc291cmNlLCBBRENJUmVzb3VyY2VTY2hlZHVsZXJUYWJsZUV2ZW50fSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlLmdsb2JhbFwiO1xyXG5pbXBvcnQgeyBBZGNSZXNvdXJjZVNjaGVkdWxlckJhc2UgfSBmcm9tICcuLi9hZGMtcmVzb3VyY2Utc2NoZWR1bGVyLWJhc2UvYWRjLXJlc291cmNlLXNjaGVkdWxlci1iYXNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYWRjLW1vbnRoLXZpZXcnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGMtbW9udGgtdmlldy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYWRjLW1vbnRoLXZpZXcuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBRENNb250aFZpZXdDb21wb25lbnQgZXh0ZW5kcyBBZGNSZXNvdXJjZVNjaGVkdWxlckJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveXtcclxuXHJcbiAgIFxyXG4gIG1vbnRoOiBudW1iZXIgPSAwO1xyXG4gIHllYXI6IG51bWJlciA9IDA7XHJcblxyXG4gIGRheXNPZldlZWs6IHN0cmluZ1tdID0gQURDU3RhdGljVmFsdWVzLmdldERheXNPZldlZWsoKTtcclxuICBtb250aHNPZlllYXI6IHN0cmluZ1tdID0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aHNPZlllYXIoKTtcclxuICB3ZWVrc09mTW9udGg6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHRpdGxlOiBzdHJpbmcgPSAnJztcclxuICBcclxuICBkYXRlU3BsaXR0ZXI6IEFEQ0RhdGVTcGxpdHRlciA9IHRoaXMuZGF0ZUZvcm1hdHRlci5EYXRlU3BsaXR0ZXI7XHJcblxyXG4gIHJlc291cmNlczogQURDSVJlc291cmNlU2NoZWR1bGVyUmVzb3VyY2VbXSA9IFtdO1xyXG4gIGV2ZW50czogQURDSVJlc291cmNlU2NoZWR1bGVyRXZlbnRbXSA9IFtdO1xyXG5cclxuICByb3dzOiBBRENJVGFibGVSb3dbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIHN0YXJ0T2ZNb250aDogc3RyaW5nID0gJyc7XHJcbiAgcHJpdmF0ZSBlbmRPZk1vbnRoOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgd2Vla2VuZHM6IG51bWJlcltdID0gW107XHJcbiAgaG9saWRheXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHJlYWRvbmx5IGNvbW1vblNlcnZpY2UgPSBuZXcgQURDQ29tbW9uU2VydmljZSh0aGlzLmRhdGVBZGFwdGVyLCB0aGlzLmxhYmVscyk7XHJcbiAgcmVhZG9ubHkgdG9kYXk6IHN0cmluZyA9IHRoaXMuZGF0ZUFkYXB0ZXIudG9kYXkoKTtcclxuICByZWFkb25seSBzZWxlY3Rpb25NYW5hZ2VyID0gbmV3IFRhYmxlU2VsZWN0aW9uKHRoaXMuZGF0ZUZpbHRlcik7XHJcbiAgcmVhZG9ubHkgZXZlbnRCdWlsZGVyID0gbmV3IEZsYXRFdmVudEJ1aWxkZXIoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgKVxyXG4gIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIFxyXG4gIHtcclxuICAgIHN1cGVyLmluaXQoKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGlvbk1hbmFnZXIuY2VsbFNlbGVjdGlvblN0cmVhbS5zdWJzY3JpYmUoZXZlbnQgPT4gdGhpcy5vbkRhdGVSYW5nZVNlbGVjdChldmVudC5zdGFydCwgZXZlbnQuZW5kKSk7XHJcblxyXG4gICAgdGhpcy5ldmVudEJ1aWxkZXIuZXZlbnRTZWxlY3Rpb25TdHJlYW0uc3Vic2NyaWJlKGUgPT4ge1xyXG4gICAgICB0aGlzLm9uRXZlbnRDbGljayhlLmV2ZW50LCBlLmRvbSwgZS5qc0V2ZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGF0ZUZpbHRlcihjZWxsMTogQURDSVRhYmxlQ2VsbCwgY2VsbDI6IEFEQ0lUYWJsZUNlbGwpOiBib29sZWFuXHJcbiAge1xyXG4gICAgcmV0dXJuIGNlbGwxLnJvd1ZhbHVlID09IGNlbGwyLnJvd1ZhbHVlICYmIGNlbGwyLmNvbHVtblZhbHVlID49IGNlbGwxLmNvbHVtblZhbHVlO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgaW5pdFZpZXdIYW5sZGVyKCk6IHZvaWQgXHJcbiAge1xyXG4gICAgaWYodGhpcy5zdGFydE9mID09IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMudG9kYXlCdXR0b25IYW5kbGVyKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIHRoaXMubW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoT2YodGhpcy5zdGFydE9mKTtcclxuICAgICAgdGhpcy55ZWFyID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyT2YodGhpcy5zdGFydE9mKTtcclxuICAgICAgXHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlQ3VycmVudERhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHRvZGF5QnV0dG9uSGFuZGxlcigpOiB2b2lkXHJcbiAge1xyXG4gICAgdGhpcy5tb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0Q3VycmVudE1vbnRoKCk7XHJcbiAgICB0aGlzLnllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldEN1cnJlbnRZZWFyKCk7XHJcbiAgICB0aGlzLmNhbGN1bGF0ZUN1cnJlbnREYXRlKCk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBwcmV2aW91c0J1dHRvbkhhbmRsZXIoKTogdm9pZFxyXG4gIHtcclxuICAgIHRoaXMubW9udGgtLTtcclxuICAgIGlmKHRoaXMubW9udGggPCAxKVxyXG4gICAge1xyXG4gICAgICB0aGlzLm1vbnRoID0gMTI7XHJcbiAgICAgIHRoaXMueWVhci0tO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2FsY3VsYXRlQ3VycmVudERhdGUoKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIG5leHRCdXR0b25IYW5kbGVyKCk6IHZvaWRcclxuICB7XHJcbiAgICB0aGlzLm1vbnRoKys7XHJcbiAgICBpZih0aGlzLm1vbnRoID4gMTIpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMubW9udGggPSAxO1xyXG4gICAgICB0aGlzLnllYXIrKztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhbGN1bGF0ZUN1cnJlbnREYXRlKCk7XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVDdXJyZW50RGF0ZSgpOiB2b2lkXHJcbiAge1xyXG4gICAgdGhpcy53ZWVrc09mTW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmdldFdlZWtzT2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpO1xyXG4gICAgdGhpcy5zdGFydE9mTW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLnRyYW5zZm9ybURhdGUodGhpcy55ZWFyLCB0aGlzLm1vbnRoLCAxKTtcclxuICAgIGNvbnN0IGRheXNPZk1vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5nZXREYXlzT2ZNb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpO1xyXG4gICAgdGhpcy5lbmRPZk1vbnRoID0gdGhpcy5kYXRlQWRhcHRlci50cmFuc2Zvcm1EYXRlKHRoaXMueWVhciwgdGhpcy5tb250aCwgZGF5c09mTW9udGgpO1xyXG5cclxuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5tb250aHNPZlllYXJbdGhpcy5tb250aCAtIDFdO1xyXG5cclxuICAgIHRoaXMudGl0bGUgPSB0aGlzLmNvbW1vblNlcnZpY2UuZ2V0TW9udGhOYW1lKG1vbnRoKSB8fCBtb250aCArICcgJyArIHRoaXMueWVhcjtcclxuXHJcbiAgICB0aGlzLmRhdGVDaGFuZ2VzSGFuZGxlcigpO1xyXG4gICAgc3VwZXIuZGF0ZVJhbmdlQ2hhbmdlKHtzdGFydERhdGU6IHRoaXMuc3RhcnRPZk1vbnRoLCBlbmREYXRlOiB0aGlzLmVuZE9mTW9udGh9KTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGV2ZW50Q2hhbmdlc0hhbmRsZXIoZXZlbnRzOiBBRENJUmVzb3VyY2VTY2hlZHVsZXJFdmVudFtdKTogdm9pZFxyXG4gIHtcclxuICAgIGNvbnN0IHRhYmxlRXZlbnRzOiBBRENJVGFibGVFdmVudFtdID0gW107XHJcblxyXG4gICAgdGhpcy5ldmVudHMgPSBldmVudHM7XHJcbiAgICBcclxuICAgIGNvbnN0IHZpZXdFdmVudHMgPSB0aGlzLnRvb2xzLnJlc291cmNlU2NoZWR1bGVyLmdldEV2ZW50c0JldHdlZW5EYXRlUmFuZ2UodGhpcy5zdGFydE9mTW9udGgsIHRoaXMuZW5kT2ZNb250aCwgdGhpcy5ldmVudHMpO1xyXG5cclxuICAgIHZpZXdFdmVudHMuZm9yRWFjaCgoZTogQURDSVJlc291cmNlU2NoZWR1bGVyRXZlbnQpID0+IHtcclxuXHJcbiAgICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy5yb3dzLmZpbmRJbmRleCgocjogQURDSVRhYmxlUm93KSA9PiByLnZhbHVlID09IGUucmVzb3VyY2VJZCk7XHJcblxyXG4gICAgICBpZihyb3dJbmRleCA9PSAtMSkgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3Qgcm93ID0gdGhpcy5yb3dzW3Jvd0luZGV4XTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXJ0Q29sdW1uSW5kZXggPSByb3cuY29sdW1ucy5maW5kSW5kZXgoKGM6IEFEQ0lUYWJsZUNvbHVtbikgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvb2xzLmRhdGVUaW1lLmRhdGVPbmx5KGMudmFsdWUudG9TdHJpbmcoKSkgPT0gdGhpcy50b29scy5kYXRlVGltZS5kYXRlT25seShlLnN0YXJ0RGF0ZSlcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBlbmRDb2x1bW5JbmRleCA9IHJvdy5jb2x1bW5zLmZpbmRJbmRleCgoYzogQURDSVRhYmxlQ29sdW1uKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9vbHMuZGF0ZVRpbWUuZGF0ZU9ubHkoYy52YWx1ZS50b1N0cmluZygpKSA9PSB0aGlzLnRvb2xzLmRhdGVUaW1lLmRhdGVPbmx5KGUuZW5kRGF0ZSlcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBzdGFydFRpbWUgPSArdGhpcy50b29scy5kYXRlVGltZS5ob3VyT3JEZWZhdWx0KGUuc3RhcnRUaW1lLCAnMDAnKTtcclxuICAgICAgY29uc3QgZW5kVGltZSA9ICt0aGlzLnRvb2xzLmRhdGVUaW1lLmhvdXJPckRlZmF1bHQoZS5lbmRUaW1lLCAnMjQnKTtcclxuXHJcbiAgICAgIGNvbnN0IGNlbGxFdmVudDogQURDSVRhYmxlRXZlbnQgPSB7XHJcbiAgICAgICAgY29sdW1uU3RhcnQ6IHN0YXJ0Q29sdW1uSW5kZXggIT0gLTEgPyBzdGFydENvbHVtbkluZGV4IDogbnVsbCxcclxuICAgICAgICBjb2x1bW5FbmQ6IGVuZENvbHVtbkluZGV4ICE9IC0gMSA/IGVuZENvbHVtbkluZGV4IDogbnVsbCxcclxuICAgICAgICBkYXRhOiBlLFxyXG4gICAgICAgIHJvd1N0YXJ0OiByb3dJbmRleCxcclxuICAgICAgICByb3dFbmQ6IHJvd0luZGV4LFxyXG4gICAgICAgIG9mZnNldFg6IHN0YXJ0VGltZSAvIDI0LFxyXG4gICAgICAgIGZyYWN0aW9uWDogZS5hbGxEYXkgPT0gdHJ1ZSA/IDEgOiAoZW5kVGltZSAvIDI0KSxcclxuICAgICAgICBvdmVybGFwVG9sZXJhbmNlOiB0aGlzLm9wdGlvbnMuZXZlbnRPdmVybGFwVG9sZXJhbmNlIC8gMjRcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRhYmxlRXZlbnRzLnB1c2goY2VsbEV2ZW50KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZXZlbnRCdWlsZGVyLmRhdGEgPSB0YWJsZUV2ZW50cztcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHJlc291cmNlQ2hhbmdlc0hhbmRsZXIocmVzb3VyY2VzOiBBRENJUmVzb3VyY2VTY2hlZHVsZXJSZXNvdXJjZVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlc291cmNlcyA9IHJlc291cmNlcztcclxuICAgIHRoaXMuZGF0ZUNoYW5nZXNIYW5kbGVyKCk7XHJcbiAgfVxyXG5cclxuICBkYXRlQ2hhbmdlc0hhbmRsZXIoKTogdm9pZFxyXG4gIHtcclxuICAgIHRoaXMucm93cyA9IHRoaXMuZ2V0Um93SW5pdGlhbFZhbHVlKCk7XHJcblxyXG4gICAgaWYodGhpcy5yZXNvdXJjZXMubGVuZ3RoID09IDApIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnJlc291cmNlcy5mb3JFYWNoKChyZXNvdXJjZTogQURDSVJlc291cmNlU2NoZWR1bGVyUmVzb3VyY2UsIHJvd0luZGV4OiBudW1iZXIpID0+IHtcclxuXHJcbiAgICAgIGNvbnN0IHJvdzogQURDSVRhYmxlUm93ID0gXHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogcmVzb3VyY2UudGl0bGUsXHJcbiAgICAgICAgY2xhc3NMaXN0OiAnJyxcclxuICAgICAgICBwcmVmaXg6ICcnLFxyXG4gICAgICAgIHN1ZmZpeDogJycsXHJcbiAgICAgICAgdmFsdWU6IHJlc291cmNlLmlkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgdmVydGljYWxBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgaG9yaXpvbnRhbEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICBjb2x1bW5zOiBbXSxcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy53ZWVrc09mTW9udGguZm9yRWFjaCgod2Vlazogc3RyaW5nLCB3ZWVrSW5kZXgpID0+IHtcclxuXHJcbiAgICAgICAgdGhpcy5kYXlzT2ZXZWVrLmZvckVhY2goKGRheTogc3RyaW5nLCBkYXlJbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgXHJcbiAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlQWRhcHRlci5nZXREYXRlT2ZEYXkodGhpcy55ZWFyLCArd2VlaywgZGF5SW5kZXgpO1xyXG4gICAgICAgICAgY29uc3Qgc3BsaXR0ZWREYXRlID0gZGF0ZS5zcGxpdCh0aGlzLmRhdGVTcGxpdHRlcik7XHJcbiAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnRyYW5zZm9ybURhdGUoK3NwbGl0dGVkRGF0ZVswXSwgK3NwbGl0dGVkRGF0ZVsxXSwgK3NwbGl0dGVkRGF0ZVsyXSk7XHJcblxyXG4gICAgICAgICAgaWYoK3NwbGl0dGVkRGF0ZVsxXSAhPSB0aGlzLm1vbnRoKSByZXR1cm47XHJcbiAgXHJcbiAgICAgICAgICByb3cuY29sdW1ucy5wdXNoKHtcclxuICAgICAgICAgICAgbGFiZWw6ICcnLFxyXG4gICAgICAgICAgICBjbGFzc0xpc3Q6ICcnLFxyXG4gICAgICAgICAgICBwcmVmaXg6ICcnLFxyXG4gICAgICAgICAgICBzdWZmaXg6ICcnLFxyXG4gICAgICAgICAgICB2YWx1ZTogdHJhbnNmb3JtZWREYXRlLnNwbGl0KCdUJylbMF0sXHJcbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgICAgICBob3Jpem9udGFsQWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiB0cnVlXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG4gIFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMucm93cy5wdXNoKHJvdyk7XHJcblxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGhvbGlkYXlzQ2hhbmdlc0hhbmRsZXIoaG9saWRheXM6IHN0cmluZ1tdKTogdm9pZCBcclxuICB7XHJcbiAgICB0aGlzLmhvbGlkYXlzID0gaG9saWRheXM7XHJcbiAgICB0aGlzLmRhdGVDaGFuZ2VzSGFuZGxlcigpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgd2Vla2VuZENoYW5nZXNIYW5kbGVyKHdlZWtlbmRzOiBudW1iZXJbXSk6IHZvaWQgXHJcbiAge1xyXG4gICAgdGhpcy53ZWVrZW5kcyA9IHdlZWtlbmRzO1xyXG4gICAgdGhpcy5kYXRlQ2hhbmdlc0hhbmRsZXIoKTtcclxuICB9XHJcblxyXG4gIG9uRGF0ZVJhbmdlU2VsZWN0KHN0YXJ0OiBBRENJVGFibGVDZWxsLCBlbmQ6IEFEQ0lUYWJsZUNlbGwpOiB2b2lkXHJcbiAge1xyXG4gICAgY29uc3QgZTogQURDSVJlc291cmNlU2NoZWR1bGVyVGFibGVFdmVudCA9IFxyXG4gICAge1xyXG4gICAgICBlbmREYXRlOiBlbmQuY29sdW1uVmFsdWUuc3BsaXQoJ1QnKVswXSxcclxuICAgICAgZW5kVGltZTogJzAwOjAwJyxcclxuICAgICAgc3RhcnREYXRlOiBzdGFydC5jb2x1bW5WYWx1ZS5zcGxpdCgnVCcpWzBdLFxyXG4gICAgICBzdGFydFRpbWU6ICcwMDowMCcsXHJcbiAgICAgIHJlc291cmNlSWQ6IHN0YXJ0LnJvd1ZhbHVlXHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN1cGVyLmRhdGVSYW5nZVNlbGVjdChlKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIG9uRXZlbnRDbGljayhldmVudDogQURDSVRhYmxlRXZlbnQsIGRvbTogSFRNTEVsZW1lbnQsIGpzRXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIFxyXG4gIHtcclxuICAgIGNvbnN0IHJlc291cmNlU2NoZWR1bGVyRXZlbnQ6IEFEQ0lSZXNvdXJjZVNjaGVkdWxlckV2ZW50ID0gdGhpcy5ldmVudHMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pZCA9PSBldmVudC5kYXRhLmlkKVswXTtcclxuXHJcbiAgICBzdXBlci5ldmVudENsaWNrKHtkb206IGRvbSwganNFdmVudDoganNFdmVudCwgZXZlbnQ6IHJlc291cmNlU2NoZWR1bGVyRXZlbnR9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQgXHJcbiAge1xyXG4gICAgc3VwZXIuZGVzdG9yeSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSb3dJbml0aWFsVmFsdWUoKTogQURDSVRhYmxlUm93W11cclxuICB7XHJcbiAgICBjb25zdCByb3c6IEFEQ0lUYWJsZVJvdyA9IHtcclxuICAgICAgdmVydGljYWxBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgIGhvcml6b250YWxBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgIGNsYXNzTGlzdDogJycsXHJcbiAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgcHJlZml4OiAnJyxcclxuICAgICAgc3VmZml4OiAnJyxcclxuICAgICAgdmFsdWU6ICcnLFxyXG4gICAgICBjb2x1bW5zOiBbXSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy53ZWVrc09mTW9udGguZm9yRWFjaCgod2Vlazogc3RyaW5nLCB3ZWVrSW5kZXgpID0+IHtcclxuXHJcbiAgICAgIHRoaXMuZGF5c09mV2Vlay5mb3JFYWNoKChkYXk6IHN0cmluZywgZGF5SW5kZXg6IG51bWJlcikgPT4ge1xyXG5cclxuICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlQWRhcHRlci5nZXREYXRlT2ZEYXkodGhpcy55ZWFyLCArd2VlaywgZGF5SW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IHNwbGl0dGVkRGF0ZSA9IGRhdGUuc3BsaXQodGhpcy5kYXRlU3BsaXR0ZXIpO1xyXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIudHJhbnNmb3JtRGF0ZSgrc3BsaXR0ZWREYXRlWzBdLCArc3BsaXR0ZWREYXRlWzFdLCArc3BsaXR0ZWREYXRlWzJdKTtcclxuICAgICAgICBjb25zdCBkSW5kZXggPSB0aGlzLmNvbW1vblNlcnZpY2UuZ2V0RGF5SW5kZXgoZGF5SW5kZXgpO1xyXG5cclxuICAgICAgICBpZigrc3BsaXR0ZWREYXRlWzFdICE9IHRoaXMubW9udGgpIHJldHVybjtcclxuXHJcbiAgICAgICAgcm93LmNvbHVtbnMucHVzaCh7XHJcbiAgICAgICAgICBsYWJlbDogdGhpcy5sYWJlbHM/LmRheXNPZldlZWtbZEluZGV4XSB8fCBkYXksXHJcbiAgICAgICAgICBjbGFzc0xpc3Q6ICcnLmNvbmNhdChcclxuICAgICAgICAgICAgdHJhbnNmb3JtZWREYXRlLnNwbGl0KCdUJylbMF0gPT0gdGhpcy50b2RheSA/ICcgdG9kYXkgJyA6ICcgJyxcclxuICAgICAgICAgICAgdGhpcy53ZWVrZW5kcy5pbmNsdWRlcyhkYXlJbmRleCkgfHwgdGhpcy5ob2xpZGF5cy5pbmNsdWRlcyh0cmFuc2Zvcm1lZERhdGUuc3BsaXQoJ1QnKVswXSkgPyAnIGhvbGlkYXkgJyA6ICcgJ1xyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgcHJlZml4OiAnJyxcclxuICAgICAgICAgIHN1ZmZpeDogZGF0ZS5zcGxpdCh0aGlzLmRhdGVTcGxpdHRlcilbMV0gKyB0aGlzLmRhdGVTcGxpdHRlciArIGRhdGUuc3BsaXQodGhpcy5kYXRlU3BsaXR0ZXIpWzJdLFxyXG4gICAgICAgICAgdmFsdWU6IGRheUluZGV4LnRvU3RyaW5nKCksXHJcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICAgIGhvcml6b250YWxBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBbcm93XTtcclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlc291cmNlcy5sZW5ndGggIT0gMFwiPlxyXG4gICAgPGFkYy10YWJsZVxyXG4gICAgW3Jvd3NdPVwicm93c1wiXHJcbiAgICBbdGl0bGVdPVwidGl0bGVcIiAgICBcclxuICAgIFtzZWxlY3Rpb25NYW5hZ2VyXT1cInNlbGVjdGlvbk1hbmFnZXJcIlxyXG4gICAgW2V2ZW50QnVpbGRlcl09XCJldmVudEJ1aWxkZXJcIlxyXG4gICAgKHZpZXdSZWFkeSk9XCJtYXJrVmlld0FzUmVhZHkoKVwiXHJcbiAgICA+PC9hZGMtdGFibGU+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG5cclxuXHJcbiJdfQ==