UNPKG

@qeydar/datepicker

Version:

A comprehensive Date and Time Picker for Angular with Jalali calendar support

228 lines 27.7 kB
import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; export class SelectionStrategyService { /** * Check if a date is selected (for single selection) */ isSelected(date, selectedDate, dateAdapter) { return selectedDate && dateAdapter.isSameDay(date, selectedDate); } /** * Check if a date is the start of a range */ isRangeStart(date, selectedStartDate, dateAdapter) { return selectedStartDate && dateAdapter.isSameDay(date, selectedStartDate); } /** * Check if a date is the end of a range */ isRangeEnd(date, selectedEndDate, dateAdapter) { return selectedEndDate && dateAdapter.isSameDay(date, selectedEndDate); } /** * Check if a date is in range (between start and end) */ isInRange(date, selectedStartDate, selectedEndDate, tempEndDate, dateAdapter) { if (!selectedStartDate || (!selectedEndDate && !tempEndDate)) { return false; } const endDate = selectedEndDate || tempEndDate; return (dateAdapter.isAfter(date, selectedStartDate) && dateAdapter.isBefore(date, endDate)); } /** * Check if a date is selected (for range selection) */ isRangeSelected(date, selectedStartDate, selectedEndDate, dateAdapter) { return (this.isRangeStart(date, selectedStartDate, dateAdapter) || this.isRangeEnd(date, selectedEndDate, dateAdapter)); } /** * Handle single date selection */ handleSingleSelection(date, selectedDate, showTimePicker, existingTime) { let finalDate = date; if (showTimePicker && existingTime) { finalDate = this.applyTimeToDate(date, existingTime); } return { selectedDate: finalDate, shouldEmit: !showTimePicker, }; } /** * Handle range date selection */ handleRangeSelection(date, selectedStartDate, selectedEndDate, showTimePicker, existingTime) { let finalDate = date; if (showTimePicker && existingTime) { finalDate = this.applyTimeToDate(date, existingTime); } // If no start date or both dates are selected or new date is before start date if (!selectedStartDate || (selectedStartDate && selectedEndDate) || this.isDateBefore(date, selectedStartDate)) { return { selectedStartDate: finalDate, selectedEndDate: null, shouldEmit: true, activeInput: 'end', }; } else { return { selectedStartDate, selectedEndDate: finalDate, shouldEmit: true, activeInput: 'end', }; } } /** * Check if a period is active (for sidebar periods) */ isActivePeriod(period, selectedStartDate, selectedEndDate, dateAdapter, allPeriods) { if (!selectedStartDate || !selectedEndDate) return false; if (period.value === 'custom') { const otherPeriods = allPeriods.filter((p) => p.value !== 'custom'); const hasActiveOther = otherPeriods.some((p) => this.isPeriodMatch(p, selectedStartDate, selectedEndDate, dateAdapter)); return !hasActiveOther; } return this.isPeriodMatch(period, selectedStartDate, selectedEndDate, dateAdapter); } /** * Check if a period is matched (for sidebar periods) */ isPeriodMatch(period, selectedStartDate, selectedEndDate, dateAdapter) { const [start, end] = period.value; const sameStart = dateAdapter.isEqual(dateAdapter.startOfDay(start), dateAdapter.startOfDay(selectedStartDate)); const sameEnd = dateAdapter.isEqual(dateAdapter.startOfDay(end), dateAdapter.startOfDay(selectedEndDate)); return sameStart && sameEnd; } /** * Handle period selection */ selectPeriod(period) { if (period.value === 'custom') { return { selectedPeriod: 'custom', isCustom: true, }; } const [start, end] = period.value; return { selectedPeriod: period.value, dateRange: { start, end }, isCustom: false, }; } /** * Apply time to a date */ applyTimeToDate(date, timeDate) { const result = new Date(date); result.setHours(timeDate.getHours()); result.setMinutes(timeDate.getMinutes()); result.setSeconds(timeDate.getSeconds()); return result; } /** * Check if first date is before second date */ isDateBefore(date1, date2) { return date1 < date2; } /** * Create date range object */ createDateRange(start, end) { if (!start) return null; return { start, end }; } /** * Check if range selection is complete */ isRangeComplete(selectedStartDate, selectedEndDate) { return !!(selectedStartDate && selectedEndDate); } /** * Get the active date for range selection */ getActiveDateForRange(activeInput, selectedStartDate, selectedEndDate) { if (activeInput === 'start') { return selectedStartDate; } else if (activeInput === 'end') { return selectedEndDate; } return null; } /** * Update time for range selection */ updateRangeTime(timeDate, activeInput, selectedStartDate, selectedEndDate) { if (activeInput === 'start' && selectedStartDate) { const updatedDate = this.applyTimeToDate(selectedStartDate, timeDate); return { selectedStartDate: updatedDate, selectedEndDate, shouldEmit: true, }; } else if (activeInput === 'end' && selectedEndDate) { const updatedDate = this.applyTimeToDate(selectedEndDate, timeDate); return { selectedStartDate, selectedEndDate: updatedDate, shouldEmit: true, }; } return { selectedStartDate, selectedEndDate, shouldEmit: false, }; } /** * Update time for single selection */ updateSingleTime(timeDate, selectedDate) { if (!selectedDate) { return { selectedDate: new Date(), shouldEmit: false, }; } const updatedDate = this.applyTimeToDate(selectedDate, timeDate); return { selectedDate: updatedDate, shouldEmit: false, }; } /** * Handle mouse enter for range selection preview */ handleMouseEnter(date, selectedStartDate, selectedEndDate) { if (selectedStartDate && !selectedEndDate) { return date; // This will be used as tempEndDate } return null; } /** * Check if date is today */ isToday(date, dateAdapter, showToday) { return showToday && dateAdapter.isSameDay(date, dateAdapter.today()); } } SelectionStrategyService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SelectionStrategyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); SelectionStrategyService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SelectionStrategyService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SelectionStrategyService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLXN0cmF0ZWd5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9xZXlkYXItZGF0ZXBpY2tlci9zcmMvZGF0ZS1waWNrZXItcG9wdXAvc2VydmljZXMvc2VsZWN0aW9uLXN0cmF0ZWd5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFPM0MsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQzs7T0FFRztJQUNILFVBQVUsQ0FDUixJQUFVLEVBQ1YsWUFBeUIsRUFDekIsV0FBOEI7UUFFOUIsT0FBTyxZQUFZLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUNWLElBQVUsRUFDVixpQkFBOEIsRUFDOUIsV0FBOEI7UUFFOUIsT0FBTyxpQkFBaUIsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FDUixJQUFVLEVBQ1YsZUFBNEIsRUFDNUIsV0FBOEI7UUFFOUIsT0FBTyxlQUFlLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUNQLElBQVUsRUFDVixpQkFBOEIsRUFDOUIsZUFBNEIsRUFDNUIsV0FBd0IsRUFDeEIsV0FBOEI7UUFFOUIsSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxlQUFlLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUM1RCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsTUFBTSxPQUFPLEdBQUcsZUFBZSxJQUFJLFdBQVcsQ0FBQztRQUMvQyxPQUFPLENBQ0ws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b250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9kYXRlLWFkYXB0ZXInO1xyXG5pbXBvcnQgeyBDdXN0b21MYWJlbHMsIERhdGVSYW5nZSB9IGZyb20gJy4uLy4uL3V0aWxzL21vZGVscyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uU3RyYXRlZ3lTZXJ2aWNlIHtcclxuICAvKipcclxuICAgKiBDaGVjayBpZiBhIGRhdGUgaXMgc2VsZWN0ZWQgKGZvciBzaW5nbGUgc2VsZWN0aW9uKVxyXG4gICAqL1xyXG4gIGlzU2VsZWN0ZWQoXHJcbiAgICBkYXRlOiBEYXRlLFxyXG4gICAgc2VsZWN0ZWREYXRlOiBEYXRlIHwgbnVsbCxcclxuICAgIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPlxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkRGF0ZSAmJiBkYXRlQWRhcHRlci5pc1NhbWVEYXkoZGF0ZSwgc2VsZWN0ZWREYXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGEgZGF0ZSBpcyB0aGUgc3RhcnQgb2YgYSByYW5nZVxyXG4gICAqL1xyXG4gIGlzUmFuZ2VTdGFydChcclxuICAgIGRhdGU6IERhdGUsXHJcbiAgICBzZWxlY3RlZFN0YXJ0RGF0ZTogRGF0ZSB8IG51bGwsXHJcbiAgICBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT5cclxuICApOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzZWxlY3RlZFN0YXJ0RGF0ZSAmJiBkYXRlQWRhcHRlci5pc1NhbWVEYXkoZGF0ZSwgc2VsZWN0ZWRTdGFydERhdGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgYSBkYXRlIGlzIHRoZSBlbmQgb2YgYSByYW5nZVxyXG4gICAqL1xyXG4gIGlzUmFuZ2VFbmQoXHJcbiAgICBkYXRlOiBEYXRlLFxyXG4gICAgc2VsZWN0ZWRFbmREYXRlOiBEYXRlIHwgbnVsbCxcclxuICAgIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPlxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkRW5kRGF0ZSAmJiBkYXRlQWRhcHRlci5pc1NhbWVEYXkoZGF0ZSwgc2VsZWN0ZWRFbmREYXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGEgZGF0ZSBpcyBpbiByYW5nZSAoYmV0d2VlbiBzdGFydCBhbmQgZW5kKVxyXG4gICAqL1xyXG4gIGlzSW5SYW5nZShcclxuICAgIGRhdGU6IERhdGUsXHJcbiAgICBzZWxlY3RlZFN0YXJ0RGF0ZTogRGF0ZSB8IG51bGwsXHJcbiAgICBzZWxlY3RlZEVuZERhdGU6IERhdGUgfCBudWxsLFxyXG4gICAgdGVtcEVuZERhdGU6IERhdGUgfCBudWxsLFxyXG4gICAgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+XHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXNlbGVjdGVkU3RhcnREYXRlIHx8ICghc2VsZWN0ZWRFbmREYXRlICYmICF0ZW1wRW5kRGF0ZSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGVuZERhdGUgPSBzZWxlY3RlZEVuZERhdGUgfHwgdGVtcEVuZERhdGU7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBkYXRlQWRhcHRlci5pc0FmdGVyKGRhdGUsIHNlbGVjdGVkU3RhcnREYXRlKSAmJlxyXG4gICAgICBkYXRlQWRhcHRlci5pc0JlZm9yZShkYXRlLCBlbmREYXRlKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGEgZGF0ZSBpcyBzZWxlY3RlZCAoZm9yIHJhbmdlIHNlbGVjdGlvbilcclxuICAgKi9cclxuICBpc1JhbmdlU2VsZWN0ZWQoXHJcbiAgICBkYXRlOiBEYXRlLFxyXG4gICAgc2VsZWN0ZWRTdGFydERhdGU6IERhdGUgfCBudWxsLFxyXG4gICAgc2VsZWN0ZWRFbmREYXRlOiBEYXRlIHwgbnVsbCxcclxuICAgIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPlxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5pc1JhbmdlU3RhcnQoZGF0ZSwgc2VsZWN0ZWRTdGFydERhdGUsIGRhdGVBZGFwdGVyKSB8fFxyXG4gICAgICB0aGlzLmlzUmFuZ2VFbmQoZGF0ZSwgc2VsZWN0ZWRFbmREYXRlLCBkYXRlQWRhcHRlcilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgc2luZ2xlIGRhdGUgc2VsZWN0aW9uXHJcbiAgICovXHJcbiAgaGFuZGxlU2luZ2xlU2VsZWN0aW9uKFxyXG4gICAgZGF0ZTogRGF0ZSxcclxuICAgIHNlbGVjdGVkRGF0ZTogRGF0ZSB8IG51bGwsXHJcbiAgICBzaG93VGltZVBpY2tlcjogYm9vbGVhbixcclxuICAgIGV4aXN0aW5nVGltZT86IERhdGVcclxuICApOiB7IHNlbGVjdGVkRGF0ZTogRGF0ZTsgc2hvdWxkRW1pdDogYm9vbGVhbiB9IHtcclxuICAgIGxldCBmaW5hbERhdGUgPSBkYXRlO1xyXG5cclxuICAgIGlmIChzaG93VGltZVBpY2tlciAmJiBleGlzdGluZ1RpbWUpIHtcclxuICAgICAgZmluYWxEYXRlID0gdGhpcy5hcHBseVRpbWVUb0RhdGUoZGF0ZSwgZXhpc3RpbmdUaW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzZWxlY3RlZERhdGU6IGZpbmFsRGF0ZSxcclxuICAgICAgc2hvdWxkRW1pdDogIXNob3dUaW1lUGlja2VyLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSByYW5nZSBkYXRlIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGhhbmRsZVJhbmdlU2VsZWN0aW9uKFxyXG4gICAgZGF0ZTogRGF0ZSxcclxuICAgIHNlbGVjdGVkU3RhcnREYXRlOiBEYXRlIHwgbnVsbCxcclxuICAgIHNlbGVjdGVkRW5kRGF0ZTogRGF0ZSB8IG51bGwsXHJcbiAgICBzaG93VGltZVBpY2tlcjogYm9vbGVhbixcclxuICAgIGV4aXN0aW5nVGltZT86IERhdGVcclxuICApOiB7XHJcbiAgICBzZWxlY3RlZFN0YXJ0RGF0ZTogRGF0ZSB8IG51bGw7XHJcbiAgICBzZWxlY3RlZEVuZERhdGU6IERhdGUgfCBudWxsO1xyXG4gICAgc2hvdWxkRW1pdDogYm9vbGVhbjtcclxuICAgIGFjdGl2ZUlucHV0OiAnc3RhcnQnIHwgJ2VuZCc7XHJcbiAgfSB7XHJcbiAgICBsZXQgZmluYWxEYXRlID0gZGF0ZTtcclxuXHJcbiAgICBpZiAoc2hvd1RpbWVQaWNrZXIgJiYgZXhpc3RpbmdUaW1lKSB7XHJcbiAgICAgIGZpbmFsRGF0ZSA9IHRoaXMuYXBwbHlUaW1lVG9EYXRlKGRhdGUsIGV4aXN0aW5nVGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgbm8gc3RhcnQgZGF0ZSBvciBib3RoIGRhdGVzIGFyZSBzZWxlY3RlZCBvciBuZXcgZGF0ZSBpcyBiZWZvcmUgc3RhcnQgZGF0ZVxyXG4gICAgaWYgKFxyXG4gICAgICAhc2VsZWN0ZWRTdGFydERhdGUgfHxcclxuICAgICAgKHNlbGVjdGVkU3RhcnREYXRlICYmIHNlbGVjdGVkRW5kRGF0ZSkgfHxcclxuICAgICAgdGhpcy5pc0RhdGVCZWZvcmUoZGF0ZSwgc2VsZWN0ZWRTdGFydERhdGUpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzZWxlY3RlZFN0YXJ0RGF0ZTogZmluYWxEYXRlLFxyXG4gICAgICAgIHNlbGVjdGVkRW5kRGF0ZTogbnVsbCxcclxuICAgICAgICBzaG91bGRFbWl0OiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZUlucHV0OiAnZW5kJyxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc2VsZWN0ZWRTdGFydERhdGUsXHJcbiAgICAgICAgc2VsZWN0ZWRFbmREYXRlOiBmaW5hbERhdGUsXHJcbiAgICAgICAgc2hvdWxkRW1pdDogdHJ1ZSxcclxuICAgICAgICBhY3RpdmVJbnB1dDogJ2VuZCcsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBhIHBlcmlvZCBpcyBhY3RpdmUgKGZvciBzaWRlYmFyIHBlcmlvZHMpXHJcbiAgICovXHJcbiAgaXNBY3RpdmVQZXJpb2QoXHJcbiAgICBwZXJpb2Q6IEN1c3RvbUxhYmVscyxcclxuICAgIHNlbGVjdGVkU3RhcnREYXRlOiBEYXRlIHwgbnVsbCxcclxuICAgIHNlbGVjdGVkRW5kRGF0ZTogRGF0ZSB8IG51bGwsXHJcbiAgICBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4sXHJcbiAgICBhbGxQZXJpb2RzOiBDdXN0b21MYWJlbHNbXVxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFzZWxlY3RlZFN0YXJ0RGF0ZSB8fCAhc2VsZWN0ZWRFbmREYXRlKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHBlcmlvZC52YWx1ZSA9PT0gJ2N1c3RvbScpIHtcclxuICAgICAgY29uc3Qgb3RoZXJQZXJpb2RzID0gYWxsUGVyaW9kcy5maWx0ZXIoKHApID0+IHAudmFsdWUgIT09ICdjdXN0b20nKTtcclxuICAgICAgY29uc3QgaGFzQWN0aXZlT3RoZXIgPSBvdGhlclBlcmlvZHMuc29tZSgocCkgPT5cclxuICAgICAgICB0aGlzLmlzUGVyaW9kTWF0Y2gocCwgc2VsZWN0ZWRTdGFydERhdGUsIHNlbGVjdGVkRW5kRGF0ZSwgZGF0ZUFkYXB0ZXIpXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiAhaGFzQWN0aXZlT3RoZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaXNQZXJpb2RNYXRjaChcclxuICAgICAgcGVyaW9kLFxyXG4gICAgICBzZWxlY3RlZFN0YXJ0RGF0ZSxcclxuICAgICAgc2VsZWN0ZWRFbmREYXRlLFxyXG4gICAgICBkYXRlQWRhcHRlclxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGEgcGVyaW9kIGlzIG1hdGNoZWQgKGZvciBzaWRlYmFyIHBlcmlvZHMpXHJcbiAgICovXHJcbiAgaXNQZXJpb2RNYXRjaChcclxuICAgIHBlcmlvZDogQ3VzdG9tTGFiZWxzLFxyXG4gICAgc2VsZWN0ZWRTdGFydERhdGU6IERhdGUsXHJcbiAgICBzZWxlY3RlZEVuZERhdGU6IERhdGUsXHJcbiAgICBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT5cclxuICApOiBib29sZWFuIHtcclxuICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHBlcmlvZC52YWx1ZSBhcyBEYXRlW107XHJcblxyXG4gICAgY29uc3Qgc2FtZVN0YXJ0ID0gZGF0ZUFkYXB0ZXIuaXNFcXVhbChcclxuICAgICAgZGF0ZUFkYXB0ZXIuc3RhcnRPZkRheShzdGFydCksXHJcbiAgICAgIGRhdGVBZGFwdGVyLnN0YXJ0T2ZEYXkoc2VsZWN0ZWRTdGFydERhdGUpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHNhbWVFbmQgPSBkYXRlQWRhcHRlci5pc0VxdWFsKFxyXG4gICAgICBkYXRlQWRhcHRlci5zdGFydE9mRGF5KGVuZCksXHJcbiAgICAgIGRhdGVBZGFwdGVyLnN0YXJ0T2ZEYXkoc2VsZWN0ZWRFbmREYXRlKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gc2FtZVN0YXJ0ICYmIHNhbWVFbmQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgcGVyaW9kIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIHNlbGVjdFBlcmlvZChwZXJpb2Q6IEN1c3RvbUxhYmVscyk6IHtcclxuICAgIHNlbGVjdGVkUGVyaW9kOiBhbnk7XHJcbiAgICBkYXRlUmFuZ2U/OiBEYXRlUmFuZ2U7XHJcbiAgICBpc0N1c3RvbTogYm9vbGVhbjtcclxuICB9IHtcclxuICAgIGlmIChwZXJpb2QudmFsdWUgPT09ICdjdXN0b20nKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc2VsZWN0ZWRQZXJpb2Q6ICdjdXN0b20nLFxyXG4gICAgICAgIGlzQ3VzdG9tOiB0cnVlLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHBlcmlvZC52YWx1ZSBhcyBEYXRlW107XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzZWxlY3RlZFBlcmlvZDogcGVyaW9kLnZhbHVlLFxyXG4gICAgICBkYXRlUmFuZ2U6IHsgc3RhcnQsIGVuZCB9LFxyXG4gICAgICBpc0N1c3RvbTogZmFsc2UsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgdGltZSB0byBhIGRhdGVcclxuICAgKi9cclxuICBhcHBseVRpbWVUb0RhdGUoZGF0ZTogRGF0ZSwgdGltZURhdGU6IERhdGUpOiBEYXRlIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBEYXRlKGRhdGUpO1xyXG4gICAgcmVzdWx0LnNldEhvdXJzKHRpbWVEYXRlLmdldEhvdXJzKCkpO1xyXG4gICAgcmVzdWx0LnNldE1pbnV0ZXModGltZURhdGUuZ2V0TWludXRlcygpKTtcclxuICAgIHJlc3VsdC5zZXRTZWNvbmRzKHRpbWVEYXRlLmdldFNlY29uZHMoKSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgZmlyc3QgZGF0ZSBpcyBiZWZvcmUgc2Vjb25kIGRhdGVcclxuICAgKi9cclxuICBwcml2YXRlIGlzRGF0ZUJlZm9yZShkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBkYXRlMSA8IGRhdGUyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGRhdGUgcmFuZ2Ugb2JqZWN0XHJcbiAgICovXHJcbiAgY3JlYXRlRGF0ZVJhbmdlKHN0YXJ0OiBEYXRlIHwgbnVsbCwgZW5kOiBEYXRlIHwgbnVsbCk6IERhdGVSYW5nZSB8IG51bGwge1xyXG4gICAgaWYgKCFzdGFydCkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiByYW5nZSBzZWxlY3Rpb24gaXMgY29tcGxldGVcclxuICAgKi9cclxuICBpc1JhbmdlQ29tcGxldGUoXHJcbiAgICBzZWxlY3RlZFN0YXJ0RGF0ZTogRGF0ZSB8IG51bGwsXHJcbiAgICBzZWxlY3RlZEVuZERhdGU6IERhdGUgfCBudWxsXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISEoc2VsZWN0ZWRTdGFydERhdGUgJiYgc2VsZWN0ZWRFbmREYXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYWN0aXZlIGRhdGUgZm9yIHJhbmdlIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGdldEFjdGl2ZURhdGVGb3JSYW5nZShcclxuICAgIGFjdGl2ZUlucHV0OiAnc3RhcnQnIHwgJ2VuZCcgfCAnJyxcclxuICAgIHNlbGVjdGVkU3RhcnREYXRlOiBEYXRlIHwgbnVsbCxcclxuICAgIHNlbGVjdGVkRW5kRGF0ZTogRGF0ZSB8IG51bGxcclxuICApOiBEYXRlIHwgbnVsbCB7XHJcbiAgICBpZiAoYWN0aXZlSW5wdXQgPT09ICdzdGFydCcpIHtcclxuICAgICAgcmV0dXJuIHNlbGVjdGVkU3RhcnREYXRlO1xyXG4gICAgfSBlbHNlIGlmIChhY3RpdmVJbnB1dCA9PT0gJ2VuZCcpIHtcclxuICAgICAgcmV0dXJuIHNlbGVjdGVkRW5kRGF0ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRpbWUgZm9yIHJhbmdlIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIHVwZGF0ZVJhbmdlVGltZShcclxuICAgIHRpbWVEYXRlOiBEYXRlLFxyXG4gICAgYWN0aXZlSW5wdXQ6ICdzdGFydCcgfCAnZW5kJyB8ICcnLFxyXG4gICAgc2VsZWN0ZWRTdGFydERhdGU6IERhdGUgfCBudWxsLFxyXG4gICAgc2VsZWN0ZWRFbmREYXRlOiBEYXRlIHwgbnVsbFxyXG4gICk6IHtcclxuICAgIHNlbGVjdGVkU3RhcnREYXRlOiBEYXRlIHwgbnVsbDtcclxuICAgIHNlbGVjdGVkRW5kRGF0ZTogRGF0ZSB8IG51bGw7XHJcbiAgICBzaG91bGRFbWl0OiBib29sZWFuO1xyXG4gIH0ge1xyXG4gICAgaWYgKGFjdGl2ZUlucHV0ID09PSAnc3RhcnQnICYmIHNlbGVjdGVkU3RhcnREYXRlKSB7XHJcbiAgICAgIGNvbnN0IHVwZGF0ZWREYXRlID0gdGhpcy5hcHBseVRpbWVUb0RhdGUoc2VsZWN0ZWRTdGFydERhdGUsIHRpbWVEYXRlKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzZWxlY3RlZFN0YXJ0RGF0ZTogdXBkYXRlZERhdGUsXHJcbiAgICAgICAgc2VsZWN0ZWRFbmREYXRlLFxyXG4gICAgICAgIHNob3VsZEVtaXQ6IHRydWUsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKGFjdGl2ZUlucHV0ID09PSAnZW5kJyAmJiBzZWxlY3RlZEVuZERhdGUpIHtcclxuICAgICAgY29uc3QgdXBkYXRlZERhdGUgPSB0aGlzLmFwcGx5VGltZVRvRGF0ZShzZWxlY3RlZEVuZERhdGUsIHRpbWVEYXRlKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzZWxlY3RlZFN0YXJ0RGF0ZSxcclxuICAgICAgICBzZWxlY3RlZEVuZERhdGU6IHVwZGF0ZWREYXRlLFxyXG4gICAgICAgIHNob3VsZEVtaXQ6IHRydWUsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VsZWN0ZWRTdGFydERhdGUsXHJcbiAgICAgIHNlbGVjdGVkRW5kRGF0ZSxcclxuICAgICAgc2hvdWxkRW1pdDogZmFsc2UsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRpbWUgZm9yIHNpbmdsZSBzZWxlY3Rpb25cclxuICAgKi9cclxuICB1cGRhdGVTaW5nbGVUaW1lKFxyXG4gICAgdGltZURhdGU6IERhdGUsXHJcbiAgICBzZWxlY3RlZERhdGU6IERhdGUgfCBudWxsXHJcbiAgKTogeyBzZWxlY3RlZERhdGU6IERhdGU7IHNob3VsZEVtaXQ6IGJvb2xlYW4gfSB7XHJcbiAgICBpZiAoIXNlbGVjdGVkRGF0ZSkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHNlbGVjdGVkRGF0ZTogbmV3IERhdGUoKSxcclxuICAgICAgICBzaG91bGRFbWl0OiBmYWxzZSxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1cGRhdGVkRGF0ZSA9IHRoaXMuYXBwbHlUaW1lVG9EYXRlKHNlbGVjdGVkRGF0ZSwgdGltZURhdGUpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VsZWN0ZWREYXRlOiB1cGRhdGVkRGF0ZSxcclxuICAgICAgc2hvdWxkRW1pdDogZmFsc2UsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIG1vdXNlIGVudGVyIGZvciByYW5nZSBzZWxlY3Rpb24gcHJldmlld1xyXG4gICAqL1xyXG4gIGhhbmRsZU1vdXNlRW50ZXIoXHJcbiAgICBkYXRlOiBEYXRlLFxyXG4gICAgc2VsZWN0ZWRTdGFydERhdGU6IERhdGUgfCBudWxsLFxyXG4gICAgc2VsZWN0ZWRFbmREYXRlOiBEYXRlIHwgbnVsbFxyXG4gICk6IERhdGUgfCBudWxsIHtcclxuICAgIGlmIChzZWxlY3RlZFN0YXJ0RGF0ZSAmJiAhc2VsZWN0ZWRFbmREYXRlKSB7XHJcbiAgICAgIHJldHVybiBkYXRlOyAvLyBUaGlzIHdpbGwgYmUgdXNlZCBhcyB0ZW1wRW5kRGF0ZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBkYXRlIGlzIHRvZGF5XHJcbiAgICovXHJcbiAgaXNUb2RheShcclxuICAgIGRhdGU6IERhdGUsXHJcbiAgICBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4sXHJcbiAgICBzaG93VG9kYXk6IGJvb2xlYW5cclxuICApOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzaG93VG9kYXkgJiYgZGF0ZUFkYXB0ZXIuaXNTYW1lRGF5KGRhdGUsIGRhdGVBZGFwdGVyLnRvZGF5KCkpO1xyXG4gIH1cclxufVxyXG4iXX0=