@updevs/components 1.0.0-alpha.48 → 1.0.0-alpha.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -13
- package/calendar/calendar.component.d.ts +58 -122
- package/calendar/models/calendar-date.model.d.ts +10 -0
- package/calendar/models/calendar-month.model.d.ts +7 -0
- package/calendar/models/calendar-selected.model.d.ts +5 -0
- package/calendar/models/calendar-year.model.d.ts +6 -0
- package/calendar/models/date-range.model.d.ts +0 -4
- package/calendar/models/enums/calendar-view.enum.d.ts +5 -0
- package/calendar/models/public-api.d.ts +5 -0
- package/calendar/upd-calendar.module.d.ts +6 -11
- package/card/public-api.d.ts +1 -0
- package/card/types/public-api.d.ts +5 -0
- package/dropdown/dropdown.component.d.ts +3 -0
- package/esm2022/calendar/calendar.component.mjs +288 -217
- package/esm2022/calendar/models/calendar-date.model.mjs +2 -0
- package/esm2022/calendar/models/calendar-month.model.mjs +2 -0
- package/esm2022/calendar/models/calendar-selected.model.mjs +2 -0
- package/esm2022/calendar/models/calendar-year.model.mjs +2 -0
- package/esm2022/calendar/models/date-range.model.mjs +1 -1
- package/esm2022/calendar/models/enums/calendar-view.enum.mjs +7 -0
- package/esm2022/calendar/models/public-api.mjs +6 -1
- package/esm2022/calendar/upd-calendar.module.mjs +2 -20
- package/esm2022/card/public-api.mjs +2 -1
- package/esm2022/card/types/public-api.mjs +6 -0
- package/esm2022/dropdown/dropdown.component.mjs +23 -7
- package/esm2022/form-controls/date-picker/date-picker.component.mjs +45 -60
- package/esm2022/form-controls/input/input.component.mjs +3 -3
- package/esm2022/popover/popover.directive.mjs +10 -26
- package/esm2022/pricing-cards/index.mjs +2 -0
- package/esm2022/pricing-cards/models/price-item-feature.model.mjs +2 -0
- package/esm2022/pricing-cards/models/price-item-features-group.model.mjs +2 -0
- package/esm2022/pricing-cards/models/price-item.model.mjs +2 -0
- package/esm2022/pricing-cards/models/public-api.mjs +4 -0
- package/esm2022/pricing-cards/pricing-cards.component.mjs +24 -0
- package/esm2022/pricing-cards/public-api.mjs +4 -0
- package/esm2022/pricing-cards/upd-pricing-cards.module.mjs +36 -0
- package/esm2022/pricing-cards/updevs-components-pricing-cards.mjs +5 -0
- package/esm2022/table/abstractions/base.column.mjs +30 -44
- package/esm2022/table/table.component.mjs +9 -12
- package/fesm2022/updevs-components-calendar.mjs +319 -1449
- package/fesm2022/updevs-components-calendar.mjs.map +1 -1
- package/fesm2022/updevs-components-dropdown.mjs +22 -6
- package/fesm2022/updevs-components-dropdown.mjs.map +1 -1
- package/fesm2022/updevs-components-form-controls-date-picker.mjs +44 -59
- package/fesm2022/updevs-components-form-controls-date-picker.mjs.map +1 -1
- package/fesm2022/updevs-components-form-controls-input.mjs +2 -2
- package/fesm2022/updevs-components-form-controls-input.mjs.map +1 -1
- package/fesm2022/updevs-components-popover.mjs +9 -25
- package/fesm2022/updevs-components-popover.mjs.map +1 -1
- package/fesm2022/updevs-components-pricing-cards.mjs +64 -0
- package/fesm2022/updevs-components-pricing-cards.mjs.map +1 -0
- package/fesm2022/updevs-components-table.mjs +38 -55
- package/fesm2022/updevs-components-table.mjs.map +1 -1
- package/form-controls/date-picker/date-picker.component.d.ts +10 -31
- package/package.json +37 -31
- package/pricing-cards/index.d.ts +1 -0
- package/pricing-cards/models/price-item-feature.model.d.ts +5 -0
- package/pricing-cards/models/price-item-features-group.model.d.ts +5 -0
- package/pricing-cards/models/price-item.model.d.ts +19 -0
- package/pricing-cards/models/public-api.d.ts +3 -0
- package/pricing-cards/pricing-cards.component.d.ts +11 -0
- package/pricing-cards/public-api.d.ts +3 -0
- package/pricing-cards/upd-pricing-cards.module.d.ts +11 -0
- package/table/abstractions/base.column.d.ts +4 -0
- package/calendar/components/calendar-body/calendar-body.component.d.ts +0 -263
- package/calendar/components/calendar-header/calendar-header.component.d.ts +0 -57
- package/calendar/components/calendar-month-view/calendar-month-view.component.d.ts +0 -151
- package/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +0 -10
- package/calendar/components/calendar-year-view/calendar-year-view.component.d.ts +0 -9
- package/calendar/models/calendar-cell.model.d.ts +0 -16
- package/calendar/services/calendar.service.d.ts +0 -15
- package/calendar/tools/events-options.d.ts +0 -12
- package/calendar/tools/keyboard-tools.d.ts +0 -9
- package/calendar/tools/passive-listeners.d.ts +0 -16
- package/calendar/types/calendar-cell-class-function.type.d.ts +0 -3
- package/calendar/types/calendar-cell-css-classes.type.d.ts +0 -3
- package/calendar/types/modifier-key.type.d.ts +0 -1
- package/esm2022/calendar/components/calendar-body/calendar-body.component.mjs +0 -515
- package/esm2022/calendar/components/calendar-header/calendar-header.component.mjs +0 -144
- package/esm2022/calendar/components/calendar-month-view/calendar-month-view.component.mjs +0 -423
- package/esm2022/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -18
- package/esm2022/calendar/components/calendar-year-view/calendar-year-view.component.mjs +0 -17
- package/esm2022/calendar/models/calendar-cell.model.mjs +0 -18
- package/esm2022/calendar/services/calendar.service.mjs +0 -40
- package/esm2022/calendar/tools/events-options.mjs +0 -14
- package/esm2022/calendar/tools/keyboard-tools.mjs +0 -14
- package/esm2022/calendar/tools/passive-listeners.mjs +0 -29
- package/esm2022/calendar/types/calendar-cell-class-function.type.mjs +0 -2
- package/esm2022/calendar/types/calendar-cell-css-classes.type.mjs +0 -2
- package/esm2022/calendar/types/modifier-key.type.mjs +0 -2
|
@@ -1,247 +1,318 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Component, inject, signal, computed, input, output } from '@angular/core';
|
|
2
2
|
import { DateService } from '@updevs/sdk/core';
|
|
3
|
-
import {
|
|
4
|
-
import { CalendarMonthViewComponent } from './components/calendar-month-view/calendar-month-view.component';
|
|
5
|
-
import { CalendarYearViewComponent } from './components/calendar-year-view/calendar-year-view.component';
|
|
6
|
-
import { CalendarMultiYearViewComponent } from './components/calendar-multi-year-view/calendar-multi-year-view.component';
|
|
3
|
+
import { CalendarViewEnum } from './models/enums/calendar-view.enum';
|
|
7
4
|
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "./components/calendar-month-view/calendar-month-view.component";
|
|
9
5
|
export class CalendarComponent {
|
|
10
6
|
constructor() {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
this.
|
|
15
|
-
|
|
16
|
-
this.
|
|
17
|
-
|
|
18
|
-
this.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
this.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
this.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
this.
|
|
33
|
-
|
|
34
|
-
this.
|
|
35
|
-
/** Emits a new date range value when the user completes a drag drop operation. */
|
|
36
|
-
this.userDragDrop = new EventEmitter();
|
|
37
|
-
/**
|
|
38
|
-
* Used for scheduling that focus should be moved to the active cell on the next tick.
|
|
39
|
-
* We need to schedule it, rather than do it immediately, because we have to wait
|
|
40
|
-
* for Angular to re-evaluate the view children.
|
|
41
|
-
*/
|
|
42
|
-
this._moveFocusOnNextTick = false;
|
|
7
|
+
this.selectedDate = input();
|
|
8
|
+
this.selectedStartDate = input();
|
|
9
|
+
this.selectedEndDate = input();
|
|
10
|
+
this.minDate = input();
|
|
11
|
+
this.maxDate = input();
|
|
12
|
+
this.disabledDatesFilter = input();
|
|
13
|
+
this.isRange = input(false);
|
|
14
|
+
this.shouldRemoveExternalBorder = input(false);
|
|
15
|
+
this.selected = output();
|
|
16
|
+
this.monthChanged = output();
|
|
17
|
+
this.CalendarViewEnum = CalendarViewEnum;
|
|
18
|
+
this.currentView = signal(CalendarViewEnum.Days);
|
|
19
|
+
this.currentDate = signal(new Date());
|
|
20
|
+
this.yearRange = signal({ start: 2020, end: 2030 });
|
|
21
|
+
this.currentYear = computed(() => this.currentDate().getFullYear());
|
|
22
|
+
this.currentMonth = computed(() => this.currentDate().getMonth());
|
|
23
|
+
this.currentMonthName = computed(() => this.dateService.format(this.currentDate(), { month: 'short', year: 'numeric' }).toUpperCase());
|
|
24
|
+
this.calendarDays = computed(() => this.generateCalendarDays());
|
|
25
|
+
this.calendarMonths = computed(() => this.generateCalendarMonths());
|
|
26
|
+
this.calendarYears = computed(() => this.generateCalendarYears());
|
|
27
|
+
this.weekDayNames = computed(() => this.dateService.getDayOfWeekNames('narrow'));
|
|
28
|
+
this.internalSelectedDate = signal(undefined);
|
|
29
|
+
this.internalSelectedStartDate = signal(undefined);
|
|
30
|
+
this.internalSelectedEndDate = signal(undefined);
|
|
43
31
|
this.dateService = inject(DateService);
|
|
44
|
-
this.
|
|
32
|
+
this.rangeSelectionState = 'start';
|
|
45
33
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
34
|
+
ngOnInit() {
|
|
35
|
+
this.syncInternalState();
|
|
36
|
+
if (this.selectedDate()) {
|
|
37
|
+
this.currentDate.set(new Date(this.selectedDate()));
|
|
38
|
+
}
|
|
39
|
+
else if (this.selectedStartDate()) {
|
|
40
|
+
this.currentDate.set(new Date(this.selectedStartDate()));
|
|
41
|
+
}
|
|
42
|
+
this.updateYearRange();
|
|
49
43
|
}
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
onHeaderClick() {
|
|
45
|
+
switch (this.currentView()) {
|
|
46
|
+
case CalendarViewEnum.Days:
|
|
47
|
+
this.currentView.set(CalendarViewEnum.Months);
|
|
48
|
+
break;
|
|
49
|
+
case CalendarViewEnum.Months:
|
|
50
|
+
this.currentView.set(CalendarViewEnum.Years);
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
onPreviousClick() {
|
|
55
|
+
const current = this.currentDate();
|
|
56
|
+
switch (this.currentView()) {
|
|
57
|
+
case CalendarViewEnum.Days:
|
|
58
|
+
this.currentDate.set(this.dateService.addMonths(current, -1));
|
|
59
|
+
this.monthChanged.emit(this.currentDate());
|
|
60
|
+
break;
|
|
61
|
+
case CalendarViewEnum.Months:
|
|
62
|
+
this.currentDate.set(this.dateService.addYears(current, -1));
|
|
63
|
+
break;
|
|
64
|
+
case CalendarViewEnum.Years:
|
|
65
|
+
this.moveYearRange(-12);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
52
68
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
69
|
+
onNextClick() {
|
|
70
|
+
const current = this.currentDate();
|
|
71
|
+
switch (this.currentView()) {
|
|
72
|
+
case CalendarViewEnum.Days:
|
|
73
|
+
this.currentDate.set(this.dateService.addMonths(current, 1));
|
|
74
|
+
this.monthChanged.emit(this.currentDate());
|
|
75
|
+
break;
|
|
76
|
+
case CalendarViewEnum.Months:
|
|
77
|
+
this.currentDate.set(this.dateService.addYears(current, 1));
|
|
78
|
+
break;
|
|
79
|
+
case CalendarViewEnum.Years:
|
|
80
|
+
this.moveYearRange(12);
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
58
83
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
84
|
+
onDateClick(dateModel) {
|
|
85
|
+
if (!dateModel.isCurrentMonth) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (dateModel.isDisabled) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (this.isRange()) {
|
|
92
|
+
this.handleRangeSelection(dateModel.date);
|
|
63
93
|
}
|
|
64
94
|
else {
|
|
65
|
-
this.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
this.
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
this.
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
this.
|
|
95
|
-
this.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
// Ignore date changes that are at a different time on the same day. This fixes issues where
|
|
123
|
-
// the calendar re-renders when there is no meaningful change to [minDate] or [maxDate]
|
|
124
|
-
// (#24435).
|
|
125
|
-
const minDateChange = changes['minDate'] && !this.dateService.areEqual(changes['minDate'].previousValue, changes['minDate'].currentValue)
|
|
126
|
-
? changes['minDate']
|
|
127
|
-
: undefined;
|
|
128
|
-
const maxDateChange = changes['maxDate'] && !this.dateService.areEqual(changes['maxDate'].previousValue, changes['maxDate'].currentValue)
|
|
129
|
-
? changes['maxDate']
|
|
130
|
-
: undefined;
|
|
131
|
-
const change = minDateChange || maxDateChange || changes['dateFilter'];
|
|
132
|
-
if (change && !change.firstChange) {
|
|
133
|
-
const view = this._getCurrentViewComponent();
|
|
134
|
-
if (view) {
|
|
135
|
-
// We need to `detectChanges` manually here, because the `minDate`, `maxDate` etc. are
|
|
136
|
-
// passed down to the view via data bindings which won't be up-to-date when we call `_init`.
|
|
137
|
-
this._changeDetectorRef.detectChanges();
|
|
138
|
-
view.init();
|
|
95
|
+
this.internalSelectedDate.set(dateModel.date);
|
|
96
|
+
this.selected.emit({ selectedDate: dateModel.date });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
onMonthClick(monthModel) {
|
|
100
|
+
if (monthModel.isDisabled) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const newDate = new Date(this.currentYear(), monthModel.monthIndex, 1);
|
|
104
|
+
this.currentDate.set(newDate);
|
|
105
|
+
this.currentView.set(CalendarViewEnum.Days);
|
|
106
|
+
this.monthChanged.emit(newDate);
|
|
107
|
+
}
|
|
108
|
+
onYearClick(yearModel) {
|
|
109
|
+
if (yearModel.isDisabled) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const newDate = new Date(yearModel.year, this.currentMonth(), 1);
|
|
113
|
+
this.currentDate.set(newDate);
|
|
114
|
+
this.currentView.set(CalendarViewEnum.Months);
|
|
115
|
+
}
|
|
116
|
+
clearSelection() {
|
|
117
|
+
this.internalSelectedDate.set(undefined);
|
|
118
|
+
this.internalSelectedStartDate.set(undefined);
|
|
119
|
+
this.internalSelectedEndDate.set(undefined);
|
|
120
|
+
this.rangeSelectionState = 'start';
|
|
121
|
+
this.selected.emit(undefined);
|
|
122
|
+
}
|
|
123
|
+
syncInternalState() {
|
|
124
|
+
this.internalSelectedDate.set(this.selectedDate());
|
|
125
|
+
this.internalSelectedStartDate.set(this.selectedStartDate());
|
|
126
|
+
this.internalSelectedEndDate.set(this.selectedEndDate());
|
|
127
|
+
}
|
|
128
|
+
handleRangeSelection(selectedDate) {
|
|
129
|
+
if (this.rangeSelectionState === 'start' || !this.internalSelectedStartDate()) {
|
|
130
|
+
this.internalSelectedStartDate.set(selectedDate);
|
|
131
|
+
this.internalSelectedEndDate.set(undefined);
|
|
132
|
+
this.rangeSelectionState = 'end';
|
|
133
|
+
this.selected.emit({ startDate: selectedDate });
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
const startDate = this.internalSelectedStartDate();
|
|
137
|
+
const endDate = selectedDate;
|
|
138
|
+
if (this.dateService.compare(selectedDate, startDate) < 0) {
|
|
139
|
+
this.internalSelectedStartDate.set(selectedDate);
|
|
140
|
+
this.internalSelectedEndDate.set(startDate);
|
|
141
|
+
this.selected.emit({
|
|
142
|
+
startDate: selectedDate,
|
|
143
|
+
endDate: startDate
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
this.internalSelectedEndDate.set(endDate);
|
|
148
|
+
this.selected.emit({
|
|
149
|
+
startDate: startDate,
|
|
150
|
+
endDate: endDate
|
|
151
|
+
});
|
|
139
152
|
}
|
|
153
|
+
this.rangeSelectionState = 'start';
|
|
140
154
|
}
|
|
141
155
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
156
|
+
generateCalendarDays() {
|
|
157
|
+
const current = this.currentDate();
|
|
158
|
+
const year = current.getFullYear();
|
|
159
|
+
const month = current.getMonth();
|
|
160
|
+
const firstDayOfMonth = new Date(year, month, 1);
|
|
161
|
+
const lastDayOfMonth = new Date(year, month + 1, 0);
|
|
162
|
+
const firstDayOfWeek = firstDayOfMonth.getDay();
|
|
163
|
+
const days = [];
|
|
164
|
+
const today = new Date();
|
|
165
|
+
if (firstDayOfWeek > 0) {
|
|
166
|
+
const prevMonthLastDay = new Date(year, month, 0);
|
|
167
|
+
const startDate = prevMonthLastDay.getDate() - firstDayOfWeek + 1;
|
|
168
|
+
for (let day = startDate; day <= prevMonthLastDay.getDate(); day++) {
|
|
169
|
+
const date = new Date(year, month - 1, day);
|
|
170
|
+
days.push({
|
|
171
|
+
date,
|
|
172
|
+
isCurrentMonth: false,
|
|
173
|
+
isToday: this.dateService.areEqual(date, today),
|
|
174
|
+
isSelected: false,
|
|
175
|
+
isDisabled: true,
|
|
176
|
+
isInRange: false,
|
|
177
|
+
isRangeStart: false,
|
|
178
|
+
isRangeEnd: false
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
for (let day = 1; day <= lastDayOfMonth.getDate(); day++) {
|
|
183
|
+
const date = new Date(year, month, day);
|
|
184
|
+
days.push({
|
|
185
|
+
date,
|
|
186
|
+
isCurrentMonth: true,
|
|
187
|
+
isToday: this.dateService.areEqual(date, today),
|
|
188
|
+
isSelected: this.isDateSelected(date),
|
|
189
|
+
isDisabled: this.isDateDisabled(date),
|
|
190
|
+
isInRange: this.isDateInRange(date),
|
|
191
|
+
isRangeStart: this.isDateRangeStart(date),
|
|
192
|
+
isRangeEnd: this.isDateRangeEnd(date)
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
const totalCells = Math.ceil(days.length / 7) * 7;
|
|
196
|
+
const nextMonthDays = totalCells - days.length;
|
|
197
|
+
for (let day = 1; day <= nextMonthDays; day++) {
|
|
198
|
+
const date = new Date(year, month + 1, day);
|
|
199
|
+
days.push({
|
|
200
|
+
date,
|
|
201
|
+
isCurrentMonth: false,
|
|
202
|
+
isToday: this.dateService.areEqual(date, today),
|
|
203
|
+
isSelected: false,
|
|
204
|
+
isDisabled: true,
|
|
205
|
+
isInRange: false,
|
|
206
|
+
isRangeStart: false,
|
|
207
|
+
isRangeEnd: false
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return days;
|
|
145
211
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
this.
|
|
212
|
+
generateCalendarMonths() {
|
|
213
|
+
const currentYear = this.currentYear();
|
|
214
|
+
const currentMonth = this.currentMonth();
|
|
215
|
+
const today = new Date();
|
|
216
|
+
const monthNames = this.dateService.getMonthNames('short');
|
|
217
|
+
return monthNames.map((name, index) => ({
|
|
218
|
+
monthIndex: index,
|
|
219
|
+
name: name.toUpperCase(),
|
|
220
|
+
isCurrentMonth: today.getFullYear() === currentYear && today.getMonth() === index,
|
|
221
|
+
isSelected: currentMonth === index,
|
|
222
|
+
isDisabled: this.isMonthDisabled(currentYear, index)
|
|
223
|
+
}));
|
|
149
224
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
225
|
+
generateCalendarYears() {
|
|
226
|
+
const range = this.yearRange();
|
|
227
|
+
const currentYear = this.currentYear();
|
|
228
|
+
const today = new Date();
|
|
229
|
+
const years = [];
|
|
230
|
+
for (let year = range.start; year <= range.end; year++) {
|
|
231
|
+
years.push({
|
|
232
|
+
year,
|
|
233
|
+
isCurrentYear: today.getFullYear() === year,
|
|
234
|
+
isSelected: currentYear === year,
|
|
235
|
+
isDisabled: this.isYearDisabled(year)
|
|
236
|
+
});
|
|
155
237
|
}
|
|
156
|
-
|
|
238
|
+
return years;
|
|
157
239
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
240
|
+
isDateSelected(date) {
|
|
241
|
+
if (this.isRange()) {
|
|
242
|
+
if (this.internalSelectedStartDate() && this.dateService.areEqual(date, this.internalSelectedStartDate())) {
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
return !!(this.internalSelectedEndDate() && this.dateService.areEqual(date, this.internalSelectedEndDate()));
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
return this.internalSelectedDate() ? this.dateService.areEqual(date, this.internalSelectedDate()) : false;
|
|
249
|
+
}
|
|
161
250
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
251
|
+
isDateInRange(date) {
|
|
252
|
+
if (!this.isRange() || !this.internalSelectedStartDate() || !this.internalSelectedEndDate()) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
return this.dateService.compare(date, this.internalSelectedStartDate()) > 0
|
|
256
|
+
&& this.dateService.compare(date, this.internalSelectedEndDate()) < 0;
|
|
165
257
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
258
|
+
isDateRangeStart(date) {
|
|
259
|
+
return this.isRange() && this.internalSelectedStartDate()
|
|
260
|
+
? this.dateService.areEqual(date, this.internalSelectedStartDate())
|
|
261
|
+
: false;
|
|
170
262
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
263
|
+
isDateRangeEnd(date) {
|
|
264
|
+
return this.isRange() && this.internalSelectedEndDate()
|
|
265
|
+
? this.dateService.areEqual(date, this.internalSelectedEndDate())
|
|
266
|
+
: false;
|
|
174
267
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
*/
|
|
179
|
-
_dragEnded(event) {
|
|
180
|
-
if (!this._activeDrag) {
|
|
181
|
-
return;
|
|
268
|
+
isDateDisabled(date) {
|
|
269
|
+
if (this.minDate() && this.dateService.compare(date, this.minDate()) < 0) {
|
|
270
|
+
return true;
|
|
182
271
|
}
|
|
183
|
-
if (
|
|
184
|
-
|
|
272
|
+
if (this.maxDate() && this.dateService.compare(date, this.maxDate()) > 0) {
|
|
273
|
+
return true;
|
|
185
274
|
}
|
|
186
|
-
|
|
275
|
+
const filterFn = this.disabledDatesFilter();
|
|
276
|
+
if (!!filterFn) {
|
|
277
|
+
return !filterFn(date);
|
|
278
|
+
}
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
isMonthDisabled(year, month) {
|
|
282
|
+
const firstDayOfMonth = new Date(year, month, 1);
|
|
283
|
+
const lastDayOfMonth = new Date(year, month + 1, 0);
|
|
284
|
+
if (this.minDate() && this.dateService.compare(lastDayOfMonth, this.minDate()) < 0) {
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
return !!(this.maxDate() && this.dateService.compare(firstDayOfMonth, this.maxDate()) > 0);
|
|
288
|
+
}
|
|
289
|
+
isYearDisabled(year) {
|
|
290
|
+
const firstDayOfYear = new Date(year, 0, 1);
|
|
291
|
+
const lastDayOfYear = new Date(year, 11, 31);
|
|
292
|
+
if (this.minDate() && this.dateService.compare(lastDayOfYear, this.minDate()) < 0) {
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
return !!(this.maxDate() && this.dateService.compare(firstDayOfYear, this.maxDate()) > 0);
|
|
296
|
+
}
|
|
297
|
+
updateYearRange() {
|
|
298
|
+
const currentYear = this.currentYear();
|
|
299
|
+
this.yearRange.set({
|
|
300
|
+
start: currentYear - 6,
|
|
301
|
+
end: currentYear + 5
|
|
302
|
+
});
|
|
187
303
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
304
|
+
moveYearRange(offset) {
|
|
305
|
+
const current = this.yearRange();
|
|
306
|
+
this.yearRange.set({
|
|
307
|
+
start: current.start + offset,
|
|
308
|
+
end: current.end + offset
|
|
309
|
+
});
|
|
194
310
|
}
|
|
195
311
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
196
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: CalendarComponent, selector: "upd-calendar", inputs: { startAt: "startAt", startView: "startView", selected: "selected", minDate: "minDate", maxDate: "maxDate", dateFilter: "dateFilter", dateClass: "dateClass", comparisonStart: "comparisonStart", comparisonEnd: "comparisonEnd", startDateAccessibleName: "startDateAccessibleName", endDateAccessibleName: "endDateAccessibleName", isRange: "isRange" }, outputs: { selectedChange: "selectedChange", yearSelected: "yearSelected", monthSelected: "monthSelected", viewChanged: "viewChanged", userSelection: "userSelection", userDragDrop: "userDragDrop" }, viewQueries: [{ propertyName: "monthView", first: true, predicate: CalendarMonthViewComponent, descendants: true }, { propertyName: "yearView", first: true, predicate: CalendarYearViewComponent, descendants: true }, { propertyName: "multiYearView", first: true, predicate: CalendarMultiYearViewComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@switch (currentView) {\n @case ('month') {\n <upd-calendar-month-view [(activeDate)]=\"activeDate\" [isRange]=\"isRange\" [selected]=\"selected\" [dateFilter]=\"dateFilter\"\n [maxDate]=\"maxDate\" [minDate]=\"minDate\" [dateClass]=\"dateClass\" [comparisonStart]=\"comparisonStart\"\n [comparisonEnd]=\"comparisonEnd\" [startDateAccessibleName]=\"startDateAccessibleName\"\n [endDateAccessibleName]=\"endDateAccessibleName\" (userSelection)=\"_dateSelected($event)\" (dragStarted)=\"_dragStarted($event)\"\n (dragEnded)=\"_dragEnded($event)\" [activeDrag]=\"_activeDrag\">\n </upd-calendar-month-view>\n }\n @case ('year') {\n YEAR!\n <!-- <upd-calendar-year-view-->\n <!-- [(activeDate)]=\"activeDate\"-->\n <!-- [selected]=\"selected\"-->\n <!-- [dateFilter]=\"dateFilter\"-->\n <!-- [maxDate]=\"maxDate\"-->\n <!-- [minDate]=\"minDate\"-->\n <!-- [dateClass]=\"dateClass\"-->\n <!-- (monthSelected)=\"_monthSelectedInYearView($event)\"-->\n <!-- (selectedChange)=\"_goToDateInView($event, 'month')\"></upd-calendar-year-view>-->\n }\n @case ('multi-year') {\n MUUMUMUULTI-YEAR!\n <!-- <upd-calendar-multi-year-view-->\n <!-- [(activeDate)]=\"activeDate\"-->\n <!-- [selected]=\"selected\"-->\n <!-- [dateFilter]=\"dateFilter\"-->\n <!-- [maxDate]=\"maxDate\"-->\n <!-- [minDate]=\"minDate\"-->\n <!-- [dateClass]=\"dateClass\"-->\n <!-- (yearSelected)=\"_yearSelectedInMultiYearView($event)\"-->\n <!-- (selectedChange)=\"_goToDateInView($event, 'year')\"></upd-calendar-multi-year-view>-->\n }\n}\n", styles: [""], dependencies: [{ kind: "component", type: i1.CalendarMonthViewComponent, selector: "upd-calendar-month-view", inputs: ["activeDate", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName", "firstDayOfWeek", "activeDrag", "isRange"], outputs: ["selectedChange", "userSelection", "dragStarted", "dragEnded", "activeDateChange"] }] }); }
|
|
312
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: CalendarComponent, selector: "upd-calendar", inputs: { selectedDate: { classPropertyName: "selectedDate", publicName: "selectedDate", isSignal: true, isRequired: false, transformFunction: null }, selectedStartDate: { classPropertyName: "selectedStartDate", publicName: "selectedStartDate", isSignal: true, isRequired: false, transformFunction: null }, selectedEndDate: { classPropertyName: "selectedEndDate", publicName: "selectedEndDate", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, disabledDatesFilter: { classPropertyName: "disabledDatesFilter", publicName: "disabledDatesFilter", isSignal: true, isRequired: false, transformFunction: null }, isRange: { classPropertyName: "isRange", publicName: "isRange", isSignal: true, isRequired: false, transformFunction: null }, shouldRemoveExternalBorder: { classPropertyName: "shouldRemoveExternalBorder", publicName: "shouldRemoveExternalBorder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selected", monthChanged: "monthChanged" }, ngImport: i0, template: "<div class=\"calendar\" [class.calendar-border]=\"!shouldRemoveExternalBorder()\">\n <div class=\"calendar-header\">\n <button type=\"button\" class=\"btn btn-sm btn-ghost-secondary\" (click)=\"onPreviousClick()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" stroke-width=\"2\"\n stroke=\"currentColor\" fill=\"none\">\n <path stroke=\"none\" d=\"m0 0h24v24H0z\" fill=\"none\" />\n <path d=\"m15 6-6 6 6 6\" />\n </svg>\n </button>\n\n <button type=\"button\" class=\"btn btn-sm btn-ghost-secondary calendar-title\" (click)=\"onHeaderClick()\">\n @switch (currentView()) {\n @case (CalendarViewEnum.Days) {\n {{ currentMonthName() }}\n }\n @case (CalendarViewEnum.Months) {\n {{ currentYear() }}\n }\n @case (CalendarViewEnum.Years) {\n {{ yearRange().start }} - {{ yearRange().end }}\n }\n }\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"icon ms-1\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" stroke-width=\"2\"\n stroke=\"currentColor\" fill=\"none\">\n <path stroke=\"none\" d=\"m0 0h24v24H0z\" fill=\"none\" />\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n <button type=\"button\" class=\"btn btn-sm btn-ghost-secondary\" (click)=\"onNextClick()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" stroke-width=\"2\"\n stroke=\"currentColor\" fill=\"none\">\n <path stroke=\"none\" d=\"m0 0h24v24H0z\" fill=\"none\" />\n <path d=\"m9 6 6 6-6 6\" />\n </svg>\n </button>\n </div>\n\n @if (currentView() === CalendarViewEnum.Days) {\n <div class=\"calendar-weekdays\">\n @for (dayName of weekDayNames(); track dayName) {\n <div class=\"calendar-weekday\">{{ dayName }}</div>\n }\n </div>\n\n <div class=\"calendar-days\">\n @for (day of calendarDays(); track day.date.getTime()) {\n <button type=\"button\" class=\"calendar-day\" [class.calendar-day-other-month]=\"!day.isCurrentMonth\"\n [class.calendar-day-today]=\"day.isToday\" [class.calendar-day-selected]=\"day.isSelected\"\n [class.calendar-day-in-range]=\"day.isInRange\" [class.calendar-day-range-start]=\"day.isRangeStart\"\n [class.calendar-day-range-end]=\"day.isRangeEnd\" [disabled]=\"day.isDisabled\" (click)=\"onDateClick(day)\">\n {{ day.date.getDate() }}\n </button>\n }\n </div>\n }\n\n @if (currentView() === CalendarViewEnum.Months) {\n <div class=\"calendar-months\">\n @for (month of calendarMonths(); track month.monthIndex) {\n <button type=\"button\" class=\"calendar-month\" [class.calendar-month-current]=\"month.isCurrentMonth\"\n [class.calendar-month-selected]=\"month.isSelected\" [disabled]=\"month.isDisabled\" (click)=\"onMonthClick(month)\">\n {{ month.name }}\n </button>\n }\n </div>\n }\n\n @if (currentView() === CalendarViewEnum.Years) {\n <div class=\"calendar-years\">\n @for (year of calendarYears(); track year.year) {\n <button type=\"button\" class=\"calendar-year\" [class.calendar-year-current]=\"year.isCurrentYear\"\n [class.calendar-year-selected]=\"year.isSelected\" [disabled]=\"year.isDisabled\" (click)=\"onYearClick(year)\">\n {{ year.year }}\n </button>\n }\n </div>\n }\n</div>\n", styles: [".calendar{background:var(--bs-body-bg);padding:1rem;width:100%;height:100%;border:0!important}.calendar-border{border:1px solid var(--bs-border-color)!important;border-radius:var(--bs-border-radius, .375rem);box-shadow:var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075))}.calendar-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1rem}.calendar-header .calendar-title{font-weight:600;flex:1;text-align:center;display:flex;align-items:center;justify-content:center;cursor:pointer}.calendar-header .calendar-title:hover{color:var(--bs-primary)}.calendar-header button{background:transparent;border:none;padding:.25rem;border-radius:var(--bs-border-radius-sm, .25rem);cursor:pointer;color:var(--bs-secondary)}.calendar-header button:hover{background-color:var(--bs-gray-100);color:var(--bs-gray-700)}.calendar-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:.25rem;margin-bottom:.5rem}.calendar-weekday{text-align:center;font-size:.75rem;font-weight:600;color:var(--bs-secondary);padding:.25rem;text-transform:uppercase}.calendar-days{display:grid;grid-template-columns:repeat(7,1fr);gap:.125rem}.calendar-day{aspect-ratio:1;border:none;background:transparent;border-radius:var(--bs-border-radius-sm, .25rem);font-size:.875rem;cursor:pointer;transition:all .15s ease-in-out;display:flex;align-items:center;justify-content:center;min-height:32px;font-weight:400;position:relative}.calendar-day:hover:not(:disabled):not(.calendar-day-other-month){background-color:var(--bs-gray-100)}.calendar-day:disabled{cursor:not-allowed}.calendar-day.calendar-day-other-month{color:var(--bs-gray-400, #adb5bd);cursor:default;pointer-events:none}.calendar-day.calendar-day-other-month:hover{background-color:transparent}.calendar-day.calendar-day-today{background-color:var(--bs-primary-bg-subtle, rgba(13, 110, 253, .1));color:var(--bs-primary, #0d6efd);font-weight:600}.calendar-day.calendar-day-today:hover:not(.calendar-day-other-month){background-color:var(--bs-primary-border-subtle, rgba(13, 110, 253, .2))}.calendar-day.calendar-day-selected{background-color:var(--bs-primary, #0d6efd);color:var(--bs-white, white);font-weight:600}.calendar-day.calendar-day-selected:hover:not(.calendar-day-other-month){background-color:var(--bs-primary-dark, #0a58ca)}.calendar-day.calendar-day-in-range{border-radius:0;background-color:var(--bs-secondary-bg-subtle, rgba(108, 117, 125, .1));color:var(--bs-secondary-emphasis, #495057)}.calendar-day.calendar-day-in-range:hover:not(.calendar-day-other-month){background-color:var(--bs-secondary-border-subtle, rgba(108, 117, 125, .2))}.calendar-day.calendar-day-range-start{background-color:var(--bs-primary, #0d6efd);color:var(--bs-white, white);font-weight:600;border-top-right-radius:0;border-bottom-right-radius:0}.calendar-day.calendar-day-range-start:hover:not(.calendar-day-other-month){background-color:var(--bs-primary-dark, #0a58ca)}.calendar-day.calendar-day-range-end{background-color:var(--bs-primary, #0d6efd);color:var(--bs-white, white);font-weight:600;border-top-left-radius:0;border-bottom-left-radius:0}.calendar-day.calendar-day-range-end:hover:not(.calendar-day-other-month){background-color:var(--bs-primary-dark, #0a58ca)}.calendar-day.calendar-day-range-start.calendar-day-range-end{border-radius:var(--bs-border-radius-sm, .25rem)}.calendar-day.calendar-day-other-month.calendar-day-selected{background-color:transparent;color:var(--bs-gray-400, #adb5bd);font-weight:400}.calendar-months{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem}.calendar-month{padding:.75rem .5rem;border:none;background:transparent;border-radius:var(--bs-border-radius-sm, .25rem);font-size:.875rem;font-weight:500;cursor:pointer;transition:all .15s ease-in-out}.calendar-month:hover:not(:disabled){background-color:var(--bs-gray-100, #f8f9fa)}.calendar-month:disabled{color:var(--bs-gray-400, #adb5bd);cursor:not-allowed}.calendar-month.calendar-month-current{background-color:var(--bs-primary-bg-subtle, rgba(13, 110, 253, .1));color:var(--bs-primary, #0d6efd);font-weight:600}.calendar-month.calendar-month-selected{background-color:var(--bs-primary, #0d6efd);color:var(--bs-white, white);font-weight:600}.calendar-month.calendar-month-selected:hover{background-color:var(--bs-primary-dark, #0a58ca)}.calendar-years{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem}.calendar-year{padding:.75rem .5rem;border:none;background:transparent;border-radius:var(--bs-border-radius-sm, .25rem);font-size:.875rem;font-weight:500;cursor:pointer;transition:all .15s ease-in-out}.calendar-year:hover:not(:disabled){background-color:var(--bs-gray-100, #f8f9fa)}.calendar-year:disabled{color:var(--bs-gray-400, #adb5bd);cursor:not-allowed}.calendar-year.calendar-year-current{background-color:var(--bs-primary-bg-subtle, rgba(13, 110, 253, .1));color:var(--bs-primary, #0d6efd);font-weight:600}.calendar-year.calendar-year-selected{background-color:var(--bs-primary, #0d6efd);color:var(--bs-white, white);font-weight:600}.calendar-year.calendar-year-selected:hover{background-color:var(--bs-primary-dark, #0a58ca)}.calendar-day-not-selectable{pointer-events:none;opacity:.5}\n"] }); }
|
|
197
313
|
}
|
|
198
314
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarComponent, decorators: [{
|
|
199
315
|
type: Component,
|
|
200
|
-
args: [{ selector: 'upd-calendar', template: "
|
|
201
|
-
}]
|
|
202
|
-
type: ViewChild,
|
|
203
|
-
args: [CalendarMonthViewComponent]
|
|
204
|
-
}], yearView: [{
|
|
205
|
-
type: ViewChild,
|
|
206
|
-
args: [CalendarYearViewComponent]
|
|
207
|
-
}], multiYearView: [{
|
|
208
|
-
type: ViewChild,
|
|
209
|
-
args: [CalendarMultiYearViewComponent]
|
|
210
|
-
}], startAt: [{
|
|
211
|
-
type: Input
|
|
212
|
-
}], startView: [{
|
|
213
|
-
type: Input
|
|
214
|
-
}], selected: [{
|
|
215
|
-
type: Input
|
|
216
|
-
}], minDate: [{
|
|
217
|
-
type: Input
|
|
218
|
-
}], maxDate: [{
|
|
219
|
-
type: Input
|
|
220
|
-
}], dateFilter: [{
|
|
221
|
-
type: Input
|
|
222
|
-
}], dateClass: [{
|
|
223
|
-
type: Input
|
|
224
|
-
}], comparisonStart: [{
|
|
225
|
-
type: Input
|
|
226
|
-
}], comparisonEnd: [{
|
|
227
|
-
type: Input
|
|
228
|
-
}], startDateAccessibleName: [{
|
|
229
|
-
type: Input
|
|
230
|
-
}], endDateAccessibleName: [{
|
|
231
|
-
type: Input
|
|
232
|
-
}], isRange: [{
|
|
233
|
-
type: Input
|
|
234
|
-
}], selectedChange: [{
|
|
235
|
-
type: Output
|
|
236
|
-
}], yearSelected: [{
|
|
237
|
-
type: Output
|
|
238
|
-
}], monthSelected: [{
|
|
239
|
-
type: Output
|
|
240
|
-
}], viewChanged: [{
|
|
241
|
-
type: Output
|
|
242
|
-
}], userSelection: [{
|
|
243
|
-
type: Output
|
|
244
|
-
}], userDragDrop: [{
|
|
245
|
-
type: Output
|
|
246
|
-
}] } });
|
|
247
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2NhbGVuZGFyL3NyYy9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvY2FsZW5kYXIvc3JjL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUdOLFNBQVMsRUFDVCxNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUkzRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUM1RyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUN6RyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwwRUFBMEUsQ0FBQzs7O0FBTzFILE1BQU0sT0FBTyxpQkFBaUI7SUFMOUI7UUF3Qkk7O1dBRUc7UUFDTSxjQUFTLEdBQXFCLE9BQU8sQ0FBQztRQXVEL0MsZ0VBQWdFO1FBQ3ZELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFekIsc0RBQXNEO1FBQ25DLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFFM0U7OztXQUdHO1FBQ2dCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUUzRDs7O1dBR0c7UUFDZ0Isa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRTVEOztXQUVHO1FBQ2dCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLENBQW1CLElBQUksQ0FBQyxDQUFDO1FBRTFFLHVDQUF1QztRQUNwQixrQkFB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QUF2RCxTQUFTO3VCQUFDLDhCQUE4QjtnQkFJckMsT0FBTztzQkFEVixLQUFLO2dCQVdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0YsUUFBUTtzQkFEWCxLQUFLO2dCQWdCRixPQUFPO3NCQURWLEtBQUs7Z0JBV0YsT0FBTztzQkFEVixLQUFLO2dCQVVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxlQUFlO3NCQUF2QixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUdHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR2EsY0FBYztzQkFBaEMsTUFBTTtnQkFNWSxZQUFZO3NCQUE5QixNQUFNO2dCQU1ZLGFBQWE7c0JBQS9CLE1BQU07Z0JBS1ksV0FBVztzQkFBN0IsTUFBTTtnQkFHWSxhQUFhO3NCQUEvQixNQUFNO2dCQUdZLFlBQVk7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkLFxuICAgIGluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9wdGlvbmFsVHlwZSB9IGZyb20gJ0B1cGRldnMvc2RrL3R5cGVzJztcbmltcG9ydCB7IERhdGVTZXJ2aWNlIH0gZnJvbSAnQHVwZGV2cy9zZGsvY29yZSc7XG5cbmltcG9ydCB7IERhdGVSYW5nZU1vZGVsIH0gZnJvbSAnLi9tb2RlbHMvZGF0ZS1yYW5nZS5tb2RlbCc7XG5pbXBvcnQgeyBDYWxlbmRhclZpZXdUeXBlIH0gZnJvbSAnLi90eXBlcy9jYWxlbmRhci12aWV3LnR5cGUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJVc2VyRXZlbnRNb2RlbCB9IGZyb20gJy4vbW9kZWxzL2NhbGVuZGFyLXVzZXItZXZlbnQubW9kZWwnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDZWxsQ2xhc3NGdW5jdGlvblR5cGUgfSBmcm9tICcuL3R5cGVzL2NhbGVuZGFyLWNlbGwtY2xhc3MtZnVuY3Rpb24udHlwZSc7XG5pbXBvcnQgeyBDYWxlbmRhck1vbnRoVmlld0NvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9jYWxlbmRhci1tb250aC12aWV3L2NhbGVuZGFyLW1vbnRoLXZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IENhbGVuZGFyWWVhclZpZXdDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY2FsZW5kYXIteWVhci12aWV3L2NhbGVuZGFyLXllYXItdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2FsZW5kYXJNdWx0aVllYXJWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2NhbGVuZGFyLW11bHRpLXllYXItdmlldy9jYWxlbmRhci1tdWx0aS15ZWFyLXZpZXcuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd1cGQtY2FsZW5kYXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBDYWxlbmRhckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uQ2hhbmdlcyB7XG4gICAgLyoqIFJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBtb250aCB2aWV3IGNvbXBvbmVudC4gKi9cbiAgICBAVmlld0NoaWxkKENhbGVuZGFyTW9udGhWaWV3Q29tcG9uZW50KSBtb250aFZpZXc/OiBDYWxlbmRhck1vbnRoVmlld0NvbXBvbmVudDtcblxuICAgIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgeWVhciB2aWV3IGNvbXBvbmVudC4gKi9cbiAgICBAVmlld0NoaWxkKENhbGVuZGFyWWVhclZpZXdDb21wb25lbnQpIHllYXJWaWV3PzogQ2FsZW5kYXJZZWFyVmlld0NvbXBvbmVudDtcblxuICAgIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbXVsdGkteWVhciB2aWV3IGNvbXBvbmVudC4gKi9cbiAgICBAVmlld0NoaWxkKENhbGVuZGFyTXVsdGlZZWFyVmlld0NvbXBvbmVudCkgbXVsdGlZZWFyVmlldz86IENhbGVuZGFyTXVsdGlZZWFyVmlld0NvbXBvbmVudDtcblxuICAgIC8qKiBBIGRhdGUgcmVwcmVzZW50aW5nIHRoZSBwZXJpb2QgKG1vbnRoIG9yIHllYXIpIHRvIHN0YXJ0IHRoZSBjYWxlbmRhciBpbi4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBzdGFydEF0KCk6IE9wdGlvbmFsVHlwZTxEYXRlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFydEF0O1xuICAgIH1cbiAgICBzZXQgc3RhcnRBdCh2YWx1ZTogT3B0aW9uYWxUeXBlPERhdGU+KSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0QXQgPSB0aGlzLmRhdGVTZXJ2aWNlLmdldFZhbGlkT3JVbmRlZmluZWQodGhpcy5kYXRlU2VydmljZS5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGNhbGVuZGFyIHNob3VsZCBiZSBzdGFydGVkIGluIG1vbnRoIG9yIHllYXIgdmlldy5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBzdGFydFZpZXc6IENhbGVuZGFyVmlld1R5cGUgPSAnbW9udGgnO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBzZWxlY3RlZCgpOiBEYXRlUmFuZ2VNb2RlbCB8IE9wdGlvbmFsVHlwZTxEYXRlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgICB9XG4gICAgc2V0IHNlbGVjdGVkKHZhbHVlOiBEYXRlUmFuZ2VNb2RlbCB8IE9wdGlvbmFsVHlwZTxEYXRlPikge1xuICAgICAgICBjb25zb2xlLmxvZygnc2V0dGluZyBzZWxlY3RlZCcsIHZhbHVlKTtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZVJhbmdlTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuZGF0ZVNlcnZpY2UuZ2V0VmFsaWRPclVuZGVmaW5lZCh0aGlzLmRhdGVTZXJ2aWNlLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gc2VsZWN0YWJsZSBkYXRlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IG1pbkRhdGUoKTogT3B0aW9uYWxUeXBlPERhdGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pbkRhdGU7XG4gICAgfVxuICAgIHNldCBtaW5EYXRlKHZhbHVlOiBPcHRpb25hbFR5cGU8RGF0ZT4pIHtcbiAgICAgICAgdGhpcy5fbWluRGF0ZSA9IHRoaXMuZGF0ZVNlcnZpY2UuZ2V0VmFsaWRPclVuZGVmaW5lZCh0aGlzLmRhdGVTZXJ2aWNlLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIHNlbGVjdGFibGUgZGF0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBtYXhEYXRlKCk6IE9wdGlvbmFsVHlwZTxEYXRlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xuICAgIH1cbiAgICBzZXQgbWF4RGF0ZSh2YWx1ZTogT3B0aW9uYWxUeXBlPERhdGU+KSB7XG4gICAgICAgIHRoaXMuX21heERhdGUgPSB0aGlzLmRhdGVTZXJ2aWNlLmdldFZhbGlkT3JVbmRlZmluZWQodGhpcy5kYXRlU2VydmljZS5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB1c2VkIHRvIGZpbHRlciB3aGljaCBkYXRlcyBhcmUgc2VsZWN0YWJsZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBkYXRlRmlsdGVyPzogKGRhdGU6IERhdGUpID0+IGJvb2xlYW47XG5cbiAgICAvKiogRnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBhZGQgY3VzdG9tIENTUyBjbGFzc2VzIHRvIGRhdGVzLiAqL1xuICAgIEBJbnB1dCgpIGRhdGVDbGFzcz86IENhbGVuZGFyQ2VsbENsYXNzRnVuY3Rpb25UeXBlO1xuXG4gICAgLyoqIFN0YXJ0IG9mIHRoZSBjb21wYXJpc29uIHJhbmdlLiAqL1xuICAgIEBJbnB1dCgpIGNvbXBhcmlzb25TdGFydD86IERhdGU7XG5cbiAgICAvKiogRW5kIG9mIHRoZSBjb21wYXJpc29uIHJhbmdlLiAqL1xuICAgIEBJbnB1dCgpIGNvbXBhcmlzb25FbmQ/OiBEYXRlO1xuXG4gICAgLyoqIEFSSUEgQWNjZXNzaWJsZSBuYW1lIG9mIHRoZSBgPGlucHV0IG1hdFN0YXJ0RGF0ZS8+YCAqL1xuICAgIEBJbnB1dCgpIHN0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lPzogc3RyaW5nO1xuXG4gICAgLyoqIEFSSUEgQWNjZXNzaWJsZSBuYW1lIG9mIHRoZSBgPGlucHV0IG1hdEVuZERhdGUvPmAgKi9cbiAgICBASW5wdXQoKSBlbmREYXRlQWNjZXNzaWJsZU5hbWU/OiBzdHJpbmc7XG4gICAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgaXMgY3VycmVudGx5IHNlbGVjdGluZyBhIHJhbmdlIG9mIGRhdGVzLiAqL1xuICAgIEBJbnB1dCgpIGlzUmFuZ2UgPSBmYWxzZTtcblxuICAgIC8qKiBFbWl0cyB3aGVuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0ZSBjaGFuZ2VzLiAqL1xuICAgIEBPdXRwdXQoKSByZWFkb25seSBzZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8T3B0aW9uYWxUeXBlPERhdGU+PigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgdGhlIHllYXIgY2hvc2VuIGluIG11bHRpeWVhciB2aWV3LlxuICAgICAqIFRoaXMgZG9lc24ndCBpbXBseSBhIGNoYW5nZSBvbiB0aGUgc2VsZWN0ZWQgZGF0ZS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgeWVhclNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgdGhlIG1vbnRoIGNob3NlbiBpbiB5ZWFyIHZpZXcuXG4gICAgICogVGhpcyBkb2Vzbid0IGltcGx5IGEgY2hhbmdlIG9uIHRoZSBzZWxlY3RlZCBkYXRlLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByZWFkb25seSBtb250aFNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgd2hlbiB0aGUgY3VycmVudCB2aWV3IGNoYW5nZXMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHZpZXdDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxDYWxlbmRhclZpZXdUeXBlPih0cnVlKTtcblxuICAgIC8qKiBFbWl0cyB3aGVuIGFueSBkYXRlIGlzIHNlbGVjdGVkLiAqL1xuICAgIEBPdXRwdXQoKSByZWFkb25seSB1c2VyU2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxDYWxlbmRhclVzZXJFdmVudE1vZGVsPE9wdGlvbmFsVHlwZTxEYXRlPj4+KCk7XG5cbiAgICAvKiogRW1pdHMgYSBuZXcgZGF0ZSByYW5nZSB2YWx1ZSB3aGVuIHRoZSB1c2VyIGNvbXBsZXRlcyBhIGRyYWcgZHJvcCBvcGVyYXRpb24uICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHVzZXJEcmFnRHJvcCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJVc2VyRXZlbnRNb2RlbDxEYXRlUmFuZ2VNb2RlbD4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBhY3RpdmUgZGF0ZS4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIHRpbWUgcGVyaW9kIGlzIHNob3duIGFuZCB3aGljaCBkYXRlIGlzXG4gICAgICogaGlnaGxpZ2h0ZWQgd2hlbiB1c2luZyBrZXlib2FyZCBuYXZpZ2F0aW9uLlxuICAgICAqL1xuICAgIGdldCBhY3RpdmVEYXRlKCk6IERhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xhbXBlZEFjdGl2ZURhdGU7XG4gICAgfVxuICAgIHNldCBhY3RpdmVEYXRlKHZhbHVlOiBEYXRlKSB7XG4gICAgICAgIHRoaXMuX2NsYW1wZWRBY3RpdmVEYXRlID0gdGhpcy5kYXRlU2VydmljZS5jbGFtcCh2YWx1ZSwgdGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUpO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKiogV2hldGhlciB0aGUgY2FsZW5kYXIgaXMgaW4gbW9udGggdmlldy4gKi9cbiAgICBnZXQgY3VycmVudFZpZXcoKTogQ2FsZW5kYXJWaWV3VHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50VmlldztcbiAgICB9XG4gICAgc2V0IGN1cnJlbnRWaWV3KHZhbHVlOiBDYWxlbmRhclZpZXdUeXBlKSB7XG4gICAgICAgIGNvbnN0IHZpZXdDaGFuZ2VkUmVzdWx0ID0gdGhpcy5fY3VycmVudFZpZXcgIT09IHZhbHVlID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRWaWV3ID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX21vdmVGb2N1c09uTmV4dFRpY2sgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIGlmICh2aWV3Q2hhbmdlZFJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy52aWV3Q2hhbmdlZC5lbWl0KHZpZXdDaGFuZ2VkUmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBPcmlnaW4gb2YgYWN0aXZlIGRyYWcsIG9yIG51bGwgd2hlbiBkcmFnZ2luZyBpcyBub3QgYWN0aXZlLiAqL1xuICAgIHByb3RlY3RlZCBfYWN0aXZlRHJhZz86IENhbGVuZGFyVXNlckV2ZW50TW9kZWw8RGF0ZT47XG5cbiAgICBwcml2YXRlIF9jbGFtcGVkQWN0aXZlRGF0ZSE6IERhdGU7XG4gICAgcHJpdmF0ZSBfc3RhcnRBdD86IERhdGU7XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWQ/OiBEYXRlUmFuZ2VNb2RlbCB8IERhdGU7XG4gICAgcHJpdmF0ZSBfbWluRGF0ZT86IERhdGU7XG4gICAgcHJpdmF0ZSBfbWF4RGF0ZT86IERhdGU7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBzY2hlZHVsaW5nIHRoYXQgZm9jdXMgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBhY3RpdmUgY2VsbCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgICAqIFdlIG5lZWQgdG8gc2NoZWR1bGUgaXQsIHJhdGhlciB0aGFuIGRvIGl0IGltbWVkaWF0ZWx5LCBiZWNhdXNlIHdlIGhhdmUgdG8gd2FpdFxuICAgICAqIGZvciBBbmd1bGFyIHRvIHJlLWV2YWx1YXRlIHRoZSB2aWV3IGNoaWxkcmVuLlxuICAgICAqL1xuICAgIHByaXZhdGUgX21vdmVGb2N1c09uTmV4dFRpY2sgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jdXJyZW50VmlldyE6IENhbGVuZGFyVmlld1R5cGU7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGVTZXJ2aWNlID0gaW5qZWN0KERhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFuZ2VEZXRlY3RvclJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMuc3RhcnRBdCB8fCBuZXcgRGF0ZSgpO1xuICAgICAgICAvLyBBc3NpZ24gdG8gdGhlIHByaXZhdGUgcHJvcGVydHkgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBtb3ZlIGZvY3VzIG9uIGluaXQuXG4gICAgICAgIHRoaXMuX2N1cnJlbnRWaWV3ID0gdGhpcy5zdGFydFZpZXc7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fbW92ZUZvY3VzT25OZXh0VGljaykge1xuICAgICAgICAgICAgdGhpcy5fbW92ZUZvY3VzT25OZXh0VGljayA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0FjdGl2ZUNlbGwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgLy8gSWdub3JlIGRhdGUgY2hhbmdlcyB0aGF0IGFyZSBhdCBhIGRpZmZlcmVudCB0aW1lIG9uIHRoZSBzYW1lIGRheS4gVGhpcyBmaXhlcyBpc3N1ZXMgd2hlcmVcbiAgICAgICAgLy8gdGhlIGNhbGVuZGFyIHJlLXJlbmRlcnMgd2hlbiB0aGVyZSBpcyBubyBtZWFuaW5nZnVsIGNoYW5nZSB0byBbbWluRGF0ZV0gb3IgW21heERhdGVdXG4gICAgICAgIC8vICgjMjQ0MzUpLlxuICAgICAgICBjb25zdCBtaW5EYXRlQ2hhbmdlOiBPcHRpb25hbFR5cGU8U2ltcGxlQ2hhbmdlPiA9XG4gICAgICAgICAgICBjaGFuZ2VzWydtaW5EYXRlJ10gJiYgIXRoaXMuZGF0ZVNlcnZpY2UuYXJlRXF1YWwoY2hhbmdlc1snbWluRGF0ZSddLnByZXZpb3VzVmFsdWUsIGNoYW5nZXNbJ21pbkRhdGUnXS5jdXJyZW50VmFsdWUpXG4gICAgICAgICAgICAgICAgPyBjaGFuZ2VzWydtaW5EYXRlJ11cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbWF4RGF0ZUNoYW5nZTogT3B0aW9uYWxUeXBlPFNpbXBsZUNoYW5nZT4gPVxuICAgICAgICAgICAgY2hhbmdlc1snbWF4RGF0ZSddICYmICF0aGlzLmRhdGVTZXJ2aWNlLmFyZUVxdWFsKGNoYW5nZXNbJ21heERhdGUnXS5wcmV2aW91c1ZhbHVlLCBjaGFuZ2VzWydtYXhEYXRlJ10uY3VycmVudFZhbHVlKVxuICAgICAgICAgICAgICAgID8gY2hhbmdlc1snbWF4RGF0ZSddXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3QgY2hhbmdlID0gbWluRGF0ZUNoYW5nZSB8fCBtYXhEYXRlQ2hhbmdlIHx8IGNoYW5nZXNbJ2RhdGVGaWx0ZXInXTtcblxuICAgICAgICBpZiAoY2hhbmdlICYmICFjaGFuZ2UuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLl9nZXRDdXJyZW50Vmlld0NvbXBvbmVudCgpO1xuXG4gICAgICAgICAgICBpZiAodmlldykge1xuICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYGRldGVjdENoYW5nZXNgIG1hbnVhbGx5IGhlcmUsIGJlY2F1c2UgdGhlIGBtaW5EYXRlYCwgYG1heERhdGVgIGV0Yy4gYXJlXG4gICAgICAgICAgICAgICAgLy8gcGFzc2VkIGRvd24gdG8gdGhlIHZpZXcgdmlhIGRhdGEgYmluZGluZ3Mgd2hpY2ggd29uJ3QgYmUgdXAtdG8tZGF0ZSB3aGVuIHdlIGNhbGwgYF9pbml0YC5cbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgdmlldy5pbml0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRm9jdXNlcyB0aGUgYWN0aXZlIGRhdGUuICovXG4gICAgZm9jdXNBY3RpdmVDZWxsKCkge1xuICAgICAgICB0aGlzLl9nZXRDdXJyZW50Vmlld0NvbXBvbmVudCgpLmZvY3VzQWN0aXZlQ2VsbChmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqIFVwZGF0ZXMgdG9kYXkncyBkYXRlIGFmdGVyIGFuIHVwZGF0ZSBvZiB0aGUgYWN0aXZlIGRhdGUgKi9cbiAgICB1cGRhdGVUb2RheXNEYXRlKCkge1xuICAgICAgICB0aGlzLl9nZXRDdXJyZW50Vmlld0NvbXBvbmVudCgpLmluaXQoKTtcbiAgICB9XG5cbiAgICAvKiogSGFuZGxlcyBkYXRlIHNlbGVjdGlvbiBpbiB0aGUgbW9udGggdmlldy4gKi9cbiAgICBfZGF0ZVNlbGVjdGVkKGV2ZW50OiBDYWxlbmRhclVzZXJFdmVudE1vZGVsPE9wdGlvbmFsVHlwZTxEYXRlPj4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IGV2ZW50LnZhbHVlO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkIGluc3RhbmNlb2YgRGF0ZVJhbmdlTW9kZWwgfHwgKGRhdGUgJiYgIXRoaXMuZGF0ZVNlcnZpY2UuYXJlRXF1YWwoZGF0ZSwgdGhpcy5zZWxlY3RlZCkpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQoZGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVzZXJTZWxlY3Rpb24uZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqIEhhbmRsZXMgeWVhciBzZWxlY3Rpb24gaW4gdGhlIG11bHRpeWVhciB2aWV3LiAqL1xuICAgIF95ZWFyU2VsZWN0ZWRJbk11bHRpWWVhclZpZXcobm9ybWFsaXplZFllYXI6IERhdGUpIHtcbiAgICAgICAgdGhpcy55ZWFyU2VsZWN0ZWQuZW1pdChub3JtYWxpemVkWWVhcik7XG4gICAgfVxuXG4gICAgLyoqIEhhbmRsZXMgbW9udGggc2VsZWN0aW9uIGluIHRoZSB5ZWFyIHZpZXcuICovXG4gICAgX21vbnRoU2VsZWN0ZWRJblllYXJWaWV3KG5vcm1hbGl6ZWRNb250aDogRGF0ZSkge1xuICAgICAgICB0aGlzLm1vbnRoU2VsZWN0ZWQuZW1pdChub3JtYWxpemVkTW9udGgpO1xuICAgIH1cblxuICAgIC8qKiBIYW5kbGVzIHllYXIvbW9udGggc2VsZWN0aW9uIGluIHRoZSBtdWx0aS15ZWFyL3llYXIgdmlld3MuICovXG4gICAgX2dvVG9EYXRlSW5WaWV3KGRhdGU6IERhdGUsIHZpZXc6IENhbGVuZGFyVmlld1R5cGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gZGF0ZTtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9IHZpZXc7XG4gICAgfVxuXG4gICAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHN0YXJ0cyBkcmFnZ2luZyB0byBjaGFuZ2UgYSBkYXRlIHJhbmdlLiAqL1xuICAgIF9kcmFnU3RhcnRlZChldmVudDogQ2FsZW5kYXJVc2VyRXZlbnRNb2RlbDxEYXRlPikge1xuICAgICAgICB0aGlzLl9hY3RpdmVEcmFnID0gZXZlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBkcmFnIGNvbXBsZXRlcy4gSXQgbWF5IGVuZCBpbiBjYW5jZWxhdGlvbiBvciBpbiB0aGUgc2VsZWN0aW9uXG4gICAgICogb2YgYSBuZXcgcmFuZ2UuXG4gICAgICovXG4gICAgX2RyYWdFbmRlZChldmVudDogQ2FsZW5kYXJVc2VyRXZlbnRNb2RlbDxPcHRpb25hbFR5cGU8RGF0ZVJhbmdlTW9kZWw+Pikge1xuICAgICAgICBpZiAoIXRoaXMuX2FjdGl2ZURyYWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy51c2VyRHJhZ0Ryb3AuZW1pdChldmVudCBhcyBDYWxlbmRhclVzZXJFdmVudE1vZGVsPERhdGVSYW5nZU1vZGVsPik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hY3RpdmVEcmFnID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjYWxlbmRhciB2aWV3LiAqL1xuICAgIHByaXZhdGUgX2dldEN1cnJlbnRWaWV3Q29tcG9uZW50KCk6IENhbGVuZGFyTW9udGhWaWV3Q29tcG9uZW50IHwgQ2FsZW5kYXJZZWFyVmlld0NvbXBvbmVudCB8IENhbGVuZGFyTXVsdGlZZWFyVmlld0NvbXBvbmVudCB7XG4gICAgICAgIC8vIFRoZSByZXR1cm4gdHlwZSBpcyBleHBsaWNpdGx5IHdyaXR0ZW4gYXMgYSB1bmlvbiB0byBlbnN1cmUgdGhhdCB0aGUgQ2xvc3VyZSBjb21waWxlciBkb2VzXG4gICAgICAgIC8vIG5vdCBvcHRpbWl6ZSBjYWxscyB0byBfaW5pdCgpLiBXaXRob3V0IHRoZSBleHBsaWNpdCByZXR1cm4gdHlwZSwgVHlwZVNjcmlwdCBuYXJyb3dzIGl0IHRvXG4gICAgICAgIC8vIG9ubHkgdGhlIGZpcnN0IGNvbXBvbmVudCB0eXBlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMjI5OTYuXG4gICAgICAgIHJldHVybiAodGhpcy5tb250aFZpZXcgfHwgdGhpcy55ZWFyVmlldyB8fCB0aGlzLm11bHRpWWVhclZpZXcpITtcbiAgICB9XG59XG4iLCJAc3dpdGNoIChjdXJyZW50Vmlldykge1xuICAgIEBjYXNlICgnbW9udGgnKSB7XG4gICAgICAgIDx1cGQtY2FsZW5kYXItbW9udGgtdmlldyBbKGFjdGl2ZURhdGUpXT1cImFjdGl2ZURhdGVcIiBbaXNSYW5nZV09XCJpc1JhbmdlXCIgW3NlbGVjdGVkXT1cInNlbGVjdGVkXCIgW2RhdGVGaWx0ZXJdPVwiZGF0ZUZpbHRlclwiXG4gICAgICAgICAgICBbbWF4RGF0ZV09XCJtYXhEYXRlXCIgW21pbkRhdGVdPVwibWluRGF0ZVwiIFtkYXRlQ2xhc3NdPVwiZGF0ZUNsYXNzXCIgW2NvbXBhcmlzb25TdGFydF09XCJjb21wYXJpc29uU3RhcnRcIlxuICAgICAgICAgICAgW2NvbXBhcmlzb25FbmRdPVwiY29tcGFyaXNvbkVuZFwiIFtzdGFydERhdGVBY2Nlc3NpYmxlTmFtZV09XCJzdGFydERhdGVBY2Nlc3NpYmxlTmFtZVwiXG4gICAgICAgICAgICBbZW5kRGF0ZUFjY2Vzc2libGVOYW1lXT1cImVuZERhdGVBY2Nlc3NpYmxlTmFtZVwiICh1c2VyU2VsZWN0aW9uKT1cIl9kYXRlU2VsZWN0ZWQoJGV2ZW50KVwiIChkcmFnU3RhcnRlZCk9XCJfZHJhZ1N0YXJ0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZHJhZ0VuZGVkKT1cIl9kcmFnRW5kZWQoJGV2ZW50KVwiIFthY3RpdmVEcmFnXT1cIl9hY3RpdmVEcmFnXCI+XG4gICAgICAgIDwvdXBkLWNhbGVuZGFyLW1vbnRoLXZpZXc+XG4gICAgfVxuICAgIEBjYXNlICgneWVhcicpIHtcbiAgICAgICAgWUVBUiFcbiAgICAgICAgICAgIDwhLS0gICAgICAgIDx1cGQtY2FsZW5kYXIteWVhci12aWV3LS0+XG4gICAgICAgICAgICA8IS0tICAgICAgICAgICAgWyhhY3RpdmVEYXRlKV09XCJhY3RpdmVEYXRlXCItLT5cbiAgICAgICAgICAgIDwhLS0gICAgICAgICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRcIi0tPlxuICAgICAgICAgICAgPCEtLSAgICAgICAgICAgIFtkYXRlRmlsdGVyXT1cImRhdGVGaWx0ZXJcIi0tPlxuICAgICAgICAgICAgPCEtLSAgICAgICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIi0tPlxuICAgICAgICAgICAgPCEtLSAgICAgICAgICAgIFttaW5EYXRlXT1cIm1pbkRhdGVcIi0tPlxuICAgICAgICAgICAgPCEtLSAgICAgICAgICAgIFtkYXRlQ2xhc3NdPVwiZGF0ZUNsYXNzXCItLT5cbiAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAobW9udGhTZWxlY3RlZCk9XCJfbW9udGhTZWxlY3RlZEluWWVhclZpZXcoJGV2ZW50KVwiLS0+XG4gICAgICAgICAgICA8IS0tICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cIl9nb1RvRGF0ZUluVmlldygkZXZlbnQsICdtb250aCcpXCI+PC91cGQtY2FsZW5kYXIteWVhci12aWV3Pi0tPlxuICAgIH1cbiAgICBAY2FzZSAoJ211bHRpLXllYXInKSB7XG4gICAgICAgIE1VVU1VTVVVTFRJLVlFQVIhXG4gICAgICAgICAgICA8IS0tICAgICAgICA8dXBkLWNhbGVuZGFyLW11bHRpLXllYXItdmlldy0tPlxuICAgICAgICAgICAgPCEtLSAgICAgICAgICAgIFsoYWN0aXZlRGF0ZSldPVwiYWN0aXZlRGF0ZVwiLS0+XG4gICAgICAgICAgICA8IS0tICAgICAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkXCItLT5cbiAgICAgICAgICAgIDwhLS0gICAgICAgICAgICBbZGF0ZUZpbHRlcl09XCJkYXRlRmlsdGVyXCItLT5cbiAgICAgICAgICAgIDwhLS0gICAgICAgICAgICBbbWF4RGF0ZV09XCJtYXhEYXRlXCItLT5cbiAgICAgICAgICAgIDwhLS0gICAgICAgICAgICBbbWluRGF0ZV09XCJtaW5EYXRlXCItLT5cbiAgICAgICAgICAgIDwhLS0gICAgICAgICAgICBbZGF0ZUNsYXNzXT1cImRhdGVDbGFzc1wiLS0+XG4gICAgICAgICAgICA8IS0tICAgICAgICAgICAgKHllYXJTZWxlY3RlZCk9XCJfeWVhclNlbGVjdGVkSW5NdWx0aVllYXJWaWV3KCRldmVudClcIi0tPlxuICAgICAgICAgICAgPCEtLSAgICAgICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJfZ29Ub0RhdGVJblZpZXcoJGV2ZW50LCAneWVhcicpXCI+PC91cGQtY2FsZW5kYXItbXVsdGkteWVhci12aWV3Pi0tPlxuICAgIH1cbn1cbiJdfQ==
|
|
316
|
+
args: [{ selector: 'upd-calendar', template: "<div class=\"calendar\" [class.calendar-border]=\"!shouldRemoveExternalBorder()\">\n <div class=\"calendar-header\">\n <button type=\"button\" class=\"btn btn-sm btn-ghost-secondary\" (click)=\"onPreviousClick()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" stroke-width=\"2\"\n stroke=\"currentColor\" fill=\"none\">\n <path stroke=\"none\" d=\"m0 0h24v24H0z\" fill=\"none\" />\n <path d=\"m15 6-6 6 6 6\" />\n </svg>\n </button>\n\n <button type=\"button\" class=\"btn btn-sm btn-ghost-secondary calendar-title\" (click)=\"onHeaderClick()\">\n @switch (currentView()) {\n @case (CalendarViewEnum.Days) {\n {{ currentMonthName() }}\n }\n @case (CalendarViewEnum.Months) {\n {{ currentYear() }}\n }\n @case (CalendarViewEnum.Years) {\n {{ yearRange().start }} - {{ yearRange().end }}\n }\n }\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"icon ms-1\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" stroke-width=\"2\"\n stroke=\"currentColor\" fill=\"none\">\n <path stroke=\"none\" d=\"m0 0h24v24H0z\" fill=\"none\" />\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n <button type=\"button\" class=\"btn btn-sm btn-ghost-secondary\" (click)=\"onNextClick()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" stroke-width=\"2\"\n stroke=\"currentColor\" fill=\"none\">\n <path stroke=\"none\" d=\"m0 0h24v24H0z\" fill=\"none\" />\n <path d=\"m9 6 6 6-6 6\" />\n </svg>\n </button>\n </div>\n\n @if (currentView() === CalendarViewEnum.Days) {\n <div class=\"calendar-weekdays\">\n @for (dayName of weekDayNames(); track dayName) {\n <div class=\"calendar-weekday\">{{ dayName }}</div>\n }\n </div>\n\n <div class=\"calendar-days\">\n @for (day of calendarDays(); track day.date.getTime()) {\n <button type=\"button\" class=\"calendar-day\" [class.calendar-day-other-month]=\"!day.isCurrentMonth\"\n [class.calendar-day-today]=\"day.isToday\" [class.calendar-day-selected]=\"day.isSelected\"\n [class.calendar-day-in-range]=\"day.isInRange\" [class.calendar-day-range-start]=\"day.isRangeStart\"\n [class.calendar-day-range-end]=\"day.isRangeEnd\" [disabled]=\"day.isDisabled\" (click)=\"onDateClick(day)\">\n {{ day.date.getDate() }}\n </button>\n }\n </div>\n }\n\n @if (currentView() === CalendarViewEnum.Months) {\n <div class=\"calendar-months\">\n @for (month of calendarMonths(); track month.monthIndex) {\n <button type=\"button\" class=\"calendar-month\" [class.calendar-month-current]=\"month.isCurrentMonth\"\n [class.calendar-month-selected]=\"month.isSelected\" [disabled]=\"month.isDisabled\" (click)=\"onMonthClick(month)\">\n {{ month.name }}\n </button>\n }\n </div>\n }\n\n @if (currentView() === CalendarViewEnum.Years) {\n <div class=\"calendar-years\">\n @for (year of calendarYears(); track year.year) {\n <button type=\"button\" class=\"calendar-year\" [class.calendar-year-current]=\"year.isCurrentYear\"\n [class.calendar-year-selected]=\"year.isSelected\" [disabled]=\"year.isDisabled\" (click)=\"onYearClick(year)\">\n {{ year.year }}\n </button>\n }\n </div>\n }\n</div>\n", styles: [".calendar{background:var(--bs-body-bg);padding:1rem;width:100%;height:100%;border:0!important}.calendar-border{border:1px solid var(--bs-border-color)!important;border-radius:var(--bs-border-radius, .375rem);box-shadow:var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075))}.calendar-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1rem}.calendar-header .calendar-title{font-weight:600;flex:1;text-align:center;display:flex;align-items:center;justify-content:center;cursor:pointer}.calendar-header .calendar-title:hover{color:var(--bs-primary)}.calendar-header button{background:transparent;border:none;padding:.25rem;border-radius:var(--bs-border-radius-sm, .25rem);cursor:pointer;color:var(--bs-secondary)}.calendar-header button:hover{background-color:var(--bs-gray-100);color:var(--bs-gray-700)}.calendar-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:.25rem;margin-bottom:.5rem}.calendar-weekday{text-align:center;font-size:.75rem;font-weight:600;color:var(--bs-secondary);padding:.25rem;text-transform:uppercase}.calendar-days{display:grid;grid-template-columns:repeat(7,1fr);gap:.125rem}.calendar-day{aspect-ratio:1;border:none;background:transparent;border-radius:var(--bs-border-radius-sm, .25rem);font-size:.875rem;cursor:pointer;transition:all .15s ease-in-out;display:flex;align-items:center;justify-content:center;min-height:32px;font-weight:400;position:relative}.calendar-day:hover:not(:disabled):not(.calendar-day-other-month){background-color:var(--bs-gray-100)}.calendar-day:disabled{cursor:not-allowed}.calendar-day.calendar-day-other-month{color:var(--bs-gray-400, #adb5bd);cursor:default;pointer-events:none}.calendar-day.calendar-day-other-month:hover{background-color:transparent}.calendar-day.calendar-day-today{background-color:var(--bs-primary-bg-subtle, rgba(13, 110, 253, .1));color:var(--bs-primary, #0d6efd);font-weight:600}.calendar-day.calendar-day-today:hover:not(.calendar-day-other-month){background-color:var(--bs-primary-border-subtle, rgba(13, 110, 253, .2))}.calendar-day.calendar-day-selected{background-color:var(--bs-primary, #0d6efd);color:var(--bs-white, white);font-weight:600}.calendar-day.calendar-day-selected:hover:not(.calendar-day-other-month){background-color:var(--bs-primary-dark, #0a58ca)}.calendar-day.calendar-day-in-range{border-radius:0;background-color:var(--bs-secondary-bg-subtle, rgba(108, 117, 125, .1));color:var(--bs-secondary-emphasis, #495057)}.calendar-day.calendar-day-in-range:hover:not(.calendar-day-other-month){background-color:var(--bs-secondary-border-subtle, rgba(108, 117, 125, .2))}.calendar-day.calendar-day-range-start{background-color:var(--bs-primary, #0d6efd);color:var(--bs-white, white);font-weight:600;border-top-right-radius:0;border-bottom-right-radius:0}.calendar-day.calendar-day-range-start:hover:not(.calendar-day-other-month){background-color:var(--bs-primary-dark, #0a58ca)}.calendar-day.calendar-day-range-end{background-color:var(--bs-primary, #0d6efd);color:var(--bs-white, white);font-weight:600;border-top-left-radius:0;border-bottom-left-radius:0}.calendar-day.calendar-day-range-end:hover:not(.calendar-day-other-month){background-color:var(--bs-primary-dark, #0a58ca)}.calendar-day.calendar-day-range-start.calendar-day-range-end{border-radius:var(--bs-border-radius-sm, .25rem)}.calendar-day.calendar-day-other-month.calendar-day-selected{background-color:transparent;color:var(--bs-gray-400, #adb5bd);font-weight:400}.calendar-months{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem}.calendar-month{padding:.75rem .5rem;border:none;background:transparent;border-radius:var(--bs-border-radius-sm, .25rem);font-size:.875rem;font-weight:500;cursor:pointer;transition:all .15s ease-in-out}.calendar-month:hover:not(:disabled){background-color:var(--bs-gray-100, #f8f9fa)}.calendar-month:disabled{color:var(--bs-gray-400, #adb5bd);cursor:not-allowed}.calendar-month.calendar-month-current{background-color:var(--bs-primary-bg-subtle, rgba(13, 110, 253, .1));color:var(--bs-primary, #0d6efd);font-weight:600}.calendar-month.calendar-month-selected{background-color:var(--bs-primary, #0d6efd);color:var(--bs-white, white);font-weight:600}.calendar-month.calendar-month-selected:hover{background-color:var(--bs-primary-dark, #0a58ca)}.calendar-years{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem}.calendar-year{padding:.75rem .5rem;border:none;background:transparent;border-radius:var(--bs-border-radius-sm, .25rem);font-size:.875rem;font-weight:500;cursor:pointer;transition:all .15s ease-in-out}.calendar-year:hover:not(:disabled){background-color:var(--bs-gray-100, #f8f9fa)}.calendar-year:disabled{color:var(--bs-gray-400, #adb5bd);cursor:not-allowed}.calendar-year.calendar-year-current{background-color:var(--bs-primary-bg-subtle, rgba(13, 110, 253, .1));color:var(--bs-primary, #0d6efd);font-weight:600}.calendar-year.calendar-year-selected{background-color:var(--bs-primary, #0d6efd);color:var(--bs-white, white);font-weight:600}.calendar-year.calendar-year-selected:hover{background-color:var(--bs-primary-dark, #0a58ca)}.calendar-day-not-selectable{pointer-events:none;opacity:.5}\n"] }]
|
|
317
|
+
}] });
|
|
318
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2NhbGVuZGFyL3NyYy9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvY2FsZW5kYXIvc3JjL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBV3JFLE1BQU0sT0FBTyxpQkFBaUI7SUFMOUI7UUFNYSxpQkFBWSxHQUFHLEtBQUssRUFBc0IsQ0FBQztRQUMzQyxzQkFBaUIsR0FBRyxLQUFLLEVBQXNCLENBQUM7UUFDaEQsb0JBQWUsR0FBRyxLQUFLLEVBQXNCLENBQUM7UUFDOUMsWUFBTyxHQUFHLEtBQUssRUFBc0IsQ0FBQztRQUN0QyxZQUFPLEdBQUcsS0FBSyxFQUFzQixDQUFDO1FBQ3RDLHdCQUFtQixHQUFHLEtBQUssRUFBeUMsQ0FBQztRQUNyRSxZQUFPLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLCtCQUEwQixHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUVuRCxhQUFRLEdBQUcsTUFBTSxFQUF1QyxDQUFDO1FBQ3pELGlCQUFZLEdBQUcsTUFBTSxFQUFRLENBQUM7UUFFdkMscUJBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFFM0IsZ0JBQVcsR0FBRyxNQUFNLENBQW1CLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELGdCQUFXLEdBQUcsTUFBTSxDQUFPLElB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QUFFLEVBQUUsQ0FBQyxDQUFDO1FBRTdDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqRixPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFTyxlQUFlO1FBQ25CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxXQUFXLEdBQUcsQ0FBQztZQUN0QixHQUFHLEVBQUUsV0FBVyxHQUFHLENBQUM7U0FDdkIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGFBQWEsQ0FBQyxNQUFjO1FBQ2hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUNmLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxHQUFHLE1BQU07WUFDN0IsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEdBQUcsTUFBTTtTQUM1QixDQUFDLENBQUM7SUFDUCxDQUFDOzhHQXhXUSxpQkFBaUI7a0dBQWpCLGlCQUFpQixteENDZjlCLHM0SEErRUE7OzJGRGhFYSxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0ksY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBpbmplY3QsIHNpZ25hbCwgY29tcHV0ZWQsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGVTZXJ2aWNlIH0gZnJvbSAnQHVwZGV2cy9zZGsvY29yZSc7XG5pbXBvcnQgeyBPcHRpb25hbFR5cGUgfSBmcm9tICdAdXBkZXZzL3Nkay90eXBlcyc7XG5cbmltcG9ydCB7IENhbGVuZGFyVmlld0VudW0gfSBmcm9tICcuL21vZGVscy9lbnVtcy9jYWxlbmRhci12aWV3LmVudW0nO1xuaW1wb3J0IHsgQ2FsZW5kYXJEYXRlTW9kZWwgfSBmcm9tICcuL21vZGVscy9jYWxlbmRhci1kYXRlLm1vZGVsJztcbmltcG9ydCB7IENhbGVuZGFyTW9udGhNb2RlbCB9IGZyb20gJy4vbW9kZWxzL2NhbGVuZGFyLW1vbnRoLm1vZGVsJztcbmltcG9ydCB7IENhbGVuZGFyWWVhck1vZGVsIH0gZnJvbSAnLi9tb2RlbHMvY2FsZW5kYXIteWVhci5tb2RlbCc7XG5pbXBvcnQgeyBDYWxlbmRhclNlbGVjdGVkTW9kZWwgfSBmcm9tICcuL21vZGVscy9jYWxlbmRhci1zZWxlY3RlZC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndXBkLWNhbGVuZGFyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIHJlYWRvbmx5IHNlbGVjdGVkRGF0ZSA9IGlucHV0PE9wdGlvbmFsVHlwZTxEYXRlPj4oKTtcbiAgICByZWFkb25seSBzZWxlY3RlZFN0YXJ0RGF0ZSA9IGlucHV0PE9wdGlvbmFsVHlwZTxEYXRlPj4oKTtcbiAgICByZWFkb25seSBzZWxlY3RlZEVuZERhdGUgPSBpbnB1dDxPcHRpb25hbFR5cGU8RGF0ZT4+KCk7XG4gICAgcmVhZG9ubHkgbWluRGF0ZSA9IGlucHV0PE9wdGlvbmFsVHlwZTxEYXRlPj4oKTtcbiAgICByZWFkb25seSBtYXhEYXRlID0gaW5wdXQ8T3B0aW9uYWxUeXBlPERhdGU+PigpO1xuICAgIHJlYWRvbmx5IGRpc2FibGVkRGF0ZXNGaWx0ZXIgPSBpbnB1dDxPcHRpb25hbFR5cGU8KGRhdGU6IERhdGUpID0+IGJvb2xlYW4+PigpO1xuICAgIHJlYWRvbmx5IGlzUmFuZ2UgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gICAgcmVhZG9ubHkgc2hvdWxkUmVtb3ZlRXh0ZXJuYWxCb3JkZXIgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICByZWFkb25seSBzZWxlY3RlZCA9IG91dHB1dDxPcHRpb25hbFR5cGU8Q2FsZW5kYXJTZWxlY3RlZE1vZGVsPj4oKTtcbiAgICByZWFkb25seSBtb250aENoYW5nZWQgPSBvdXRwdXQ8RGF0ZT4oKTtcblxuICAgIENhbGVuZGFyVmlld0VudW0gPSBDYWxlbmRhclZpZXdFbnVtO1xuXG4gICAgcmVhZG9ubHkgY3VycmVudFZpZXcgPSBzaWduYWw8Q2FsZW5kYXJWaWV3RW51bT4oQ2FsZW5kYXJWaWV3RW51bS5EYXlzKTtcbiAgICByZWFkb25seSBjdXJyZW50RGF0ZSA9IHNpZ25hbDxEYXRlPihuZXcgRGF0ZSgpKTtcbiAgICByZWFkb25seSB5ZWFyUmFuZ2UgPSBzaWduYWw8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9Pih7IHN0YXJ0OiAyMDIwLCBlbmQ6IDIwMzAgfSk7XG4gICAgcmVhZG9ubHkgY3VycmVudFllYXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN1cnJlbnREYXRlKCkuZ2V0RnVsbFllYXIoKSk7XG4gICAgcmVhZG9ubHkgY3VycmVudE1vbnRoID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jdXJyZW50RGF0ZSgpLmdldE1vbnRoKCkpO1xuICAgIHJlYWRvbmx5IGN1cnJlbnRNb250aE5hbWUgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICB0aGlzLmRhdGVTZXJ2aWNlLmZvcm1hdCh0aGlzLmN1cnJlbnREYXRlKCksIHsgbW9udGg6ICdzaG9ydCcsIHllYXI6ICdudW1lcmljJyB9KS50b1VwcGVyQ2FzZSgpXG4gICAgKTtcbiAgICByZWFkb25seSBjYWxlbmRhckRheXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJEYXlzKCkpO1xuICAgIHJlYWRvbmx5IGNhbGVuZGFyTW9udGhzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5nZW5lcmF0ZUNhbGVuZGFyTW9udGhzKCkpO1xuICAgIHJlYWRvbmx5IGNhbGVuZGFyWWVhcnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJZZWFycygpKTtcbiAgICByZWFkb25seSB3ZWVrRGF5TmFtZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRhdGVTZXJ2aWNlLmdldERheU9mV2Vla05hbWVzKCduYXJyb3cnKSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGludGVybmFsU2VsZWN0ZWREYXRlID0gc2lnbmFsPE9wdGlvbmFsVHlwZTxEYXRlPj4odW5kZWZpbmVkKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGludGVybmFsU2VsZWN0ZWRTdGFydERhdGUgPSBzaWduYWw8T3B0aW9uYWxUeXBlPERhdGU+Pih1bmRlZmluZWQpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJuYWxTZWxlY3RlZEVuZERhdGUgPSBzaWduYWw8T3B0aW9uYWxUeXBlPERhdGU+Pih1bmRlZmluZWQpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVNlcnZpY2UgPSBpbmplY3QoRGF0ZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmFuZ2VTZWxlY3Rpb25TdGF0ZTogJ3N0YXJ0JyB8ICdlbmQnID0gJ3N0YXJ0JztcblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN5bmNJbnRlcm5hbFN0YXRlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudERhdGUuc2V0KG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlKCkhKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFN0YXJ0RGF0ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnREYXRlLnNldChuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkU3RhcnREYXRlKCkhKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVllYXJSYW5nZSgpO1xuICAgIH1cblxuICAgIG9uSGVhZGVyQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5jdXJyZW50VmlldygpKSB7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlld0VudW0uRGF5czpcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3LnNldChDYWxlbmRhclZpZXdFbnVtLk1vbnRocyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlld0VudW0uTW9udGhzOlxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXcuc2V0KENhbGVuZGFyVmlld0VudW0uWWVhcnMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25QcmV2aW91c0NsaWNrKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50RGF0ZSgpO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5jdXJyZW50VmlldygpKSB7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlld0VudW0uRGF5czpcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnREYXRlLnNldCh0aGlzLmRhdGVTZXJ2aWNlLmFkZE1vbnRocyhjdXJyZW50LCAtMSkpO1xuICAgICAgICAgICAgICAgIHRoaXMubW9udGhDaGFuZ2VkLmVtaXQodGhpcy5jdXJyZW50RGF0ZSgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3RW51bS5Nb250aHM6XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RGF0ZS5zZXQodGhpcy5kYXRlU2VydmljZS5hZGRZZWFycyhjdXJyZW50LCAtMSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXdFbnVtLlllYXJzOlxuICAgICAgICAgICAgICAgIHRoaXMubW92ZVllYXJSYW5nZSgtMTIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25OZXh0Q2xpY2soKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnREYXRlKCk7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLmN1cnJlbnRWaWV3KCkpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3RW51bS5EYXlzOlxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudERhdGUuc2V0KHRoaXMuZGF0ZVNlcnZpY2UuYWRkTW9udGhzKGN1cnJlbnQsIDEpKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vbnRoQ2hhbmdlZC5lbWl0KHRoaXMuY3VycmVudERhdGUoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlld0VudW0uTW9udGhzOlxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudERhdGUuc2V0KHRoaXMuZGF0ZVNlcnZpY2UuYWRkWWVhcnMoY3VycmVudCwgMSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXdFbnVtLlllYXJzOlxuICAgICAgICAgICAgICAgIHRoaXMubW92ZVllYXJSYW5nZSgxMik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkRhdGVDbGljayhkYXRlTW9kZWw6IENhbGVuZGFyRGF0ZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGlmICghZGF0ZU1vZGVsLmlzQ3VycmVudE1vbnRoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0ZU1vZGVsLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzUmFuZ2UoKSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVSYW5nZVNlbGVjdGlvbihkYXRlTW9kZWwuZGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0ZWREYXRlLnNldChkYXRlTW9kZWwuZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoeyBzZWxlY3RlZERhdGU6IGRhdGVNb2RlbC5kYXRlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Nb250aENsaWNrKG1vbnRoTW9kZWw6IENhbGVuZGFyTW9udGhNb2RlbCk6IHZvaWQge1xuICAgICAgICBpZiAobW9udGhNb2RlbC5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhcigpLCBtb250aE1vZGVsLm1vbnRoSW5kZXgsIDEpO1xuXG4gICAgICAgIHRoaXMuY3VycmVudERhdGUuc2V0KG5ld0RhdGUpO1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3LnNldChDYWxlbmRhclZpZXdFbnVtLkRheXMpO1xuICAgICAgICB0aGlzLm1vbnRoQ2hhbmdlZC5lbWl0KG5ld0RhdGUpO1xuICAgIH1cblxuICAgIG9uWWVhckNsaWNrKHllYXJNb2RlbDogQ2FsZW5kYXJZZWFyTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHllYXJNb2RlbC5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoeWVhck1vZGVsLnllYXIsIHRoaXMuY3VycmVudE1vbnRoKCksIDEpO1xuXG4gICAgICAgIHRoaXMuY3VycmVudERhdGUuc2V0KG5ld0RhdGUpO1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3LnNldChDYWxlbmRhclZpZXdFbnVtLk1vbnRocyk7XG4gICAgfVxuXG4gICAgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3RlZERhdGUuc2V0KHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3RlZFN0YXJ0RGF0ZS5zZXQodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGVkRW5kRGF0ZS5zZXQodW5kZWZpbmVkKTtcblxuICAgICAgICB0aGlzLnJhbmdlU2VsZWN0aW9uU3RhdGUgPSAnc3RhcnQnO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdCh1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3luY0ludGVybmFsU3RhdGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3RlZERhdGUuc2V0KHRoaXMuc2VsZWN0ZWREYXRlKCkpO1xuICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0ZWRTdGFydERhdGUuc2V0KHRoaXMuc2VsZWN0ZWRTdGFydERhdGUoKSk7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3RlZEVuZERhdGUuc2V0KHRoaXMuc2VsZWN0ZWRFbmREYXRlKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlUmFuZ2VTZWxlY3Rpb24oc2VsZWN0ZWREYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlU2VsZWN0aW9uU3RhdGUgPT09ICdzdGFydCcgfHwgIXRoaXMuaW50ZXJuYWxTZWxlY3RlZFN0YXJ0RGF0ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0ZWRTdGFydERhdGUuc2V0KHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0ZWRFbmREYXRlLnNldCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgdGhpcy5yYW5nZVNlbGVjdGlvblN0YXRlID0gJ2VuZCc7XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdCh7IHN0YXJ0RGF0ZTogc2VsZWN0ZWREYXRlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5pbnRlcm5hbFNlbGVjdGVkU3RhcnREYXRlKCkhO1xuICAgICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IHNlbGVjdGVkRGF0ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0ZVNlcnZpY2UuY29tcGFyZShzZWxlY3RlZERhdGUsIHN0YXJ0RGF0ZSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGVkU3RhcnREYXRlLnNldChzZWxlY3RlZERhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3RlZEVuZERhdGUuc2V0KHN0YXJ0RGF0ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlOiBzZWxlY3RlZERhdGUsXG4gICAgICAgICAgICAgICAgICAgIGVuZERhdGU6IHN0YXJ0RGF0ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0ZWRFbmREYXRlLnNldChlbmREYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICBzdGFydERhdGU6IHN0YXJ0RGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZTogZW5kRGF0ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJhbmdlU2VsZWN0aW9uU3RhdGUgPSAnc3RhcnQnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUNhbGVuZGFyRGF5cygpOiBDYWxlbmRhckRhdGVNb2RlbFtdIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudERhdGUoKTtcbiAgICAgICAgY29uc3QgeWVhciA9IGN1cnJlbnQuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBjdXJyZW50LmdldE1vbnRoKCk7XG4gICAgICAgIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgICAgICAgY29uc3QgbGFzdERheU9mTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApO1xuICAgICAgICBjb25zdCBmaXJzdERheU9mV2VlayA9IGZpcnN0RGF5T2ZNb250aC5nZXREYXkoKTtcbiAgICAgICAgY29uc3QgZGF5czogQ2FsZW5kYXJEYXRlTW9kZWxbXSA9IFtdO1xuICAgICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgaWYgKGZpcnN0RGF5T2ZXZWVrID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcHJldk1vbnRoTGFzdERheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHByZXZNb250aExhc3REYXkuZ2V0RGF0ZSgpIC0gZmlyc3REYXlPZldlZWsgKyAxO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBkYXkgPSBzdGFydERhdGU7IGRheSA8PSBwcmV2TW9udGhMYXN0RGF5LmdldERhdGUoKTsgZGF5KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXkpO1xuICAgICAgICAgICAgICAgIGRheXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICAgICAgICAgIGlzQ3VycmVudE1vbnRoOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUb2RheTogdGhpcy5kYXRlU2VydmljZS5hcmVFcXVhbChkYXRlLCB0b2RheSksXG4gICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpc0Rpc2FibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBpc0luUmFuZ2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpc1JhbmdlU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpc1JhbmdlRW5kOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgZGF5ID0gMTsgZGF5IDw9IGxhc3REYXlPZk1vbnRoLmdldERhdGUoKTsgZGF5KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTtcbiAgICAgICAgICAgIGRheXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgICAgICBpc0N1cnJlbnRNb250aDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1RvZGF5OiB0aGlzLmRhdGVTZXJ2aWNlLmFyZUVxdWFsKGRhdGUsIHRvZGF5KSxcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiB0aGlzLmlzRGF0ZVNlbGVjdGVkKGRhdGUpLFxuICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQ6IHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF0ZSksXG4gICAgICAgICAgICAgICAgaXNJblJhbmdlOiB0aGlzLmlzRGF0ZUluUmFuZ2UoZGF0ZSksXG4gICAgICAgICAgICAgICAgaXNSYW5nZVN0YXJ0OiB0aGlzLmlzRGF0ZVJhbmdlU3RhcnQoZGF0ZSksXG4gICAgICAgICAgICAgICAgaXNSYW5nZUVuZDogdGhpcy5pc0RhdGVSYW5nZUVuZChkYXRlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbENlbGxzID0gTWF0aC5jZWlsKGRheXMubGVuZ3RoIC8gNykgKiA3O1xuICAgICAgICBjb25zdCBuZXh0TW9udGhEYXlzID0gdG90YWxDZWxscyAtIGRheXMubGVuZ3RoO1xuXG4gICAgICAgIGZvciAobGV0IGRheSA9IDE7IGRheSA8PSBuZXh0TW9udGhEYXlzOyBkYXkrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgZGF5KTtcbiAgICAgICAgICAgIGRheXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgICAgICBpc0N1cnJlbnRNb250aDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNUb2RheTogdGhpcy5kYXRlU2VydmljZS5hcmVFcXVhbChkYXRlLCB0b2RheSksXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNEaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc0luUmFuZ2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzUmFuZ2VTdGFydDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNSYW5nZUVuZDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRheXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUNhbGVuZGFyTW9udGhzKCk6IENhbGVuZGFyTW9udGhNb2RlbFtdIHtcbiAgICAgICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IHRoaXMuY3VycmVudE1vbnRoKCk7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgbW9udGhOYW1lcyA9IHRoaXMuZGF0ZVNlcnZpY2UuZ2V0TW9udGhOYW1lcygnc2hvcnQnKTtcblxuICAgICAgICByZXR1cm4gbW9udGhOYW1lcy5tYXAoKG5hbWUsIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgbW9udGhJbmRleDogaW5kZXgsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAgICBpc0N1cnJlbnRNb250aDogdG9kYXkuZ2V0RnVsbFllYXIoKSA9PT0gY3VycmVudFllYXIgJiYgdG9kYXkuZ2V0TW9udGgoKSA9PT0gaW5kZXgsXG4gICAgICAgICAgICBpc1NlbGVjdGVkOiBjdXJyZW50TW9udGggPT09IGluZGV4LFxuICAgICAgICAgICAgaXNEaXNhYmxlZDogdGhpcy5pc01vbnRoRGlzYWJsZWQoY3VycmVudFllYXIsIGluZGV4KVxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUNhbGVuZGFyWWVhcnMoKTogQ2FsZW5kYXJZZWFyTW9kZWxbXSB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy55ZWFyUmFuZ2UoKTtcbiAgICAgICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgeWVhcnM6IENhbGVuZGFyWWVhck1vZGVsW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCB5ZWFyID0gcmFuZ2Uuc3RhcnQ7IHllYXIgPD0gcmFuZ2UuZW5kOyB5ZWFyKyspIHtcbiAgICAgICAgICAgIHllYXJzLnB1c2goe1xuICAgICAgICAgICAgICAgIHllYXIsXG4gICAgICAgICAgICAgICAgaXNDdXJyZW50WWVhcjogdG9kYXkuZ2V0RnVsbFllYXIoKSA9PT0geWVhcixcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBjdXJyZW50WWVhciA9PT0geWVhcixcbiAgICAgICAgICAgICAgICBpc0Rpc2FibGVkOiB0aGlzLmlzWWVhckRpc2FibGVkKHllYXIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB5ZWFycztcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRGF0ZVNlbGVjdGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSYW5nZSgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcm5hbFNlbGVjdGVkU3RhcnREYXRlKCkgJiYgdGhpcy5kYXRlU2VydmljZS5hcmVFcXVhbChkYXRlLCB0aGlzLmludGVybmFsU2VsZWN0ZWRTdGFydERhdGUoKSEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAhISh0aGlzLmludGVybmFsU2VsZWN0ZWRFbmREYXRlKCkgJiYgdGhpcy5kYXRlU2VydmljZS5hcmVFcXVhbChkYXRlLCB0aGlzLmludGVybmFsU2VsZWN0ZWRFbmREYXRlKCkhKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFNlbGVjdGVkRGF0ZSgpID8gdGhpcy5kYXRlU2VydmljZS5hcmVFcXVhbChkYXRlLCB0aGlzLmludGVybmFsU2VsZWN0ZWREYXRlKCkhKSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0RhdGVJblJhbmdlKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzUmFuZ2UoKSB8fCAhdGhpcy5pbnRlcm5hbFNlbGVjdGVkU3RhcnREYXRlKCkgfHwgIXRoaXMuaW50ZXJuYWxTZWxlY3RlZEVuZERhdGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVNlcnZpY2UuY29tcGFyZShkYXRlLCB0aGlzLmludGVybmFsU2VsZWN0ZWRTdGFydERhdGUoKSEpID4gMFxuICAgICAgICAgICAgJiYgdGhpcy5kYXRlU2VydmljZS5jb21wYXJlKGRhdGUsIHRoaXMuaW50ZXJuYWxTZWxlY3RlZEVuZERhdGUoKSEpIDwgMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRGF0ZVJhbmdlU3RhcnQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1JhbmdlKCkgJiYgdGhpcy5pbnRlcm5hbFNlbGVjdGVkU3RhcnREYXRlKClcbiAgICAgICAgICAgID8gdGhpcy5kYXRlU2VydmljZS5hcmVFcXVhbChkYXRlLCB0aGlzLmludGVybmFsU2VsZWN0ZWRTdGFydERhdGUoKSEpXG4gICAgICAgICAgICA6IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNEYXRlUmFuZ2VFbmQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1JhbmdlKCkgJiYgdGhpcy5pbnRlcm5hbFNlbGVjdGVkRW5kRGF0ZSgpXG4gICAgICAgICAgICA/IHRoaXMuZGF0ZVNlcnZpY2UuYXJlRXF1YWwoZGF0ZSwgdGhpcy5pbnRlcm5hbFNlbGVjdGVkRW5kRGF0ZSgpISlcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0RhdGVEaXNhYmxlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUoKSAmJiB0aGlzLmRhdGVTZXJ2aWNlLmNvbXBhcmUoZGF0ZSwgdGhpcy5taW5EYXRlKCkhKSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWF4RGF0ZSgpICYmIHRoaXMuZGF0ZVNlcnZpY2UuY29tcGFyZShkYXRlLCB0aGlzLm1heERhdGUoKSEpID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWx0ZXJGbiA9IHRoaXMuZGlzYWJsZWREYXRlc0ZpbHRlcigpO1xuXG4gICAgICAgIGlmICghIWZpbHRlckZuKSB7XG4gICAgICAgICAgICByZXR1cm4gIWZpbHRlckZuKGRhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNb250aERpc2FibGVkKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBmaXJzdERheU9mTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XG4gICAgICAgIGNvbnN0IGxhc3REYXlPZk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKTtcblxuICAgICAgICBpZiAodGhpcy5taW5EYXRlKCkgJiYgdGhpcy5kYXRlU2VydmljZS5jb21wYXJlKGxhc3REYXlPZk1vbnRoLCB0aGlzLm1pbkRhdGUoKSEpIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEodGhpcy5tYXhEYXRlKCkgJiYgdGhpcy5kYXRlU2VydmljZS5jb21wYXJlKGZpcnN0RGF5T2ZNb250aCwgdGhpcy5tYXhEYXRlKCkhKSA+IDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNZZWFyRGlzYWJsZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGZpcnN0RGF5T2ZZZWFyID0gbmV3IERhdGUoeWVhciwgMCwgMSk7XG4gICAgICAgIGNvbnN0IGxhc3REYXlPZlllYXIgPSBuZXcgRGF0ZSh5ZWFyLCAxMSwgMzEpO1xuXG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUoKSAmJiB0aGlzLmRhdGVTZXJ2aWNlLmNvbXBhcmUobGFzdERheU9mWWVhciwgdGhpcy5taW5EYXRlKCkhKSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhKHRoaXMubWF4RGF0ZSgpICYmIHRoaXMuZGF0ZVNlcnZpY2UuY29tcGFyZShmaXJzdERheU9mWWVhciwgdGhpcy5tYXhEYXRlKCkhKSA+IDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlWWVhclJhbmdlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXJyZW50WWVhciA9IHRoaXMuY3VycmVudFllYXIoKTtcbiAgICAgICAgdGhpcy55ZWFyUmFuZ2Uuc2V0KHtcbiAgICAgICAgICAgIHN0YXJ0OiBjdXJyZW50WWVhciAtIDYsXG4gICAgICAgICAgICBlbmQ6IGN1cnJlbnRZZWFyICsgNVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1vdmVZZWFyUmFuZ2Uob2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMueWVhclJhbmdlKCk7XG4gICAgICAgIHRoaXMueWVhclJhbmdlLnNldCh7XG4gICAgICAgICAgICBzdGFydDogY3VycmVudC5zdGFydCArIG9mZnNldCxcbiAgICAgICAgICAgIGVuZDogY3VycmVudC5lbmQgKyBvZmZzZXRcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNhbGVuZGFyXCIgW2NsYXNzLmNhbGVuZGFyLWJvcmRlcl09XCIhc2hvdWxkUmVtb3ZlRXh0ZXJuYWxCb3JkZXIoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkZXJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1naG9zdC1zZWNvbmRhcnlcIiAoY2xpY2spPVwib25QcmV2aW91c0NsaWNrKClcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiaWNvblwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZT1cIm5vbmVcIiBkPVwibTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwibTE1IDYtNiA2IDYgNlwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1naG9zdC1zZWNvbmRhcnkgY2FsZW5kYXItdGl0bGVcIiAoY2xpY2spPVwib25IZWFkZXJDbGljaygpXCI+XG4gICAgICAgICAgICBAc3dpdGNoIChjdXJyZW50VmlldygpKSB7XG4gICAgICAgICAgICAgICAgQGNhc2UgKENhbGVuZGFyVmlld0VudW0uRGF5cykge1xuICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW50TW9udGhOYW1lKCkgfX1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKENhbGVuZGFyVmlld0VudW0uTW9udGhzKSB7XG4gICAgICAgICAgICAgICAgICAgIHt7IGN1cnJlbnRZZWFyKCkgfX1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKENhbGVuZGFyVmlld0VudW0uWWVhcnMpIHtcbiAgICAgICAgICAgICAgICAgICAge3sgeWVhclJhbmdlKCkuc3RhcnQgfX0gLSB7eyB5ZWFyUmFuZ2UoKS5lbmQgfX1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImljb24gbXMtMVwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZT1cIm5vbmVcIiBkPVwibTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwibTYgOSA2IDYgNi02XCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWdob3N0LXNlY29uZGFyeVwiIChjbGljayk9XCJvbk5leHRDbGljaygpXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImljb25cIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2U9XCJub25lXCIgZD1cIm0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIm05IDYgNiA2LTYgNlwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGN1cnJlbnRWaWV3KCkgPT09IENhbGVuZGFyVmlld0VudW0uRGF5cykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItd2Vla2RheXNcIj5cbiAgICAgICAgICAgIEBmb3IgKGRheU5hbWUgb2Ygd2Vla0RheU5hbWVzKCk7IHRyYWNrIGRheU5hbWUpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItd2Vla2RheVwiPnt7IGRheU5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWRheXNcIj5cbiAgICAgICAgICAgIEBmb3IgKGRheSBvZiBjYWxlbmRhckRheXMoKTsgdHJhY2sgZGF5LmRhdGUuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjYWxlbmRhci1kYXlcIiBbY2xhc3MuY2FsZW5kYXItZGF5LW90aGVyLW1vbnRoXT1cIiFkYXkuaXNDdXJyZW50TW9udGhcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY2FsZW5kYXItZGF5LXRvZGF5XT1cImRheS5pc1RvZGF5XCIgW2NsYXNzLmNhbGVuZGFyLWRheS1zZWxlY3RlZF09XCJkYXkuaXNTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jYWxlbmRhci1kYXktaW4tcmFuZ2VdPVwiZGF5LmlzSW5SYW5nZVwiIFtjbGFzcy5jYWxlbmRhci1kYXktcmFuZ2Utc3RhcnRdPVwiZGF5LmlzUmFuZ2VTdGFydFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jYWxlbmRhci1kYXktcmFuZ2UtZW5kXT1cImRheS5pc1JhbmdlRW5kXCIgW2Rpc2FibGVkXT1cImRheS5pc0Rpc2FibGVkXCIgKGNsaWNrKT1cIm9uRGF0ZUNsaWNrKGRheSlcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZGF5LmRhdGUuZ2V0RGF0ZSgpIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoY3VycmVudFZpZXcoKSA9PT0gQ2FsZW5kYXJWaWV3RW51bS5Nb250aHMpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLW1vbnRoc1wiPlxuICAgICAgICAgICAgQGZvciAobW9udGggb2YgY2FsZW5kYXJNb250aHMoKTsgdHJhY2sgbW9udGgubW9udGhJbmRleCkge1xuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2FsZW5kYXItbW9udGhcIiBbY2xhc3MuY2FsZW5kYXItbW9udGgtY3VycmVudF09XCJtb250aC5pc0N1cnJlbnRNb250aFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jYWxlbmRhci1tb250aC1zZWxlY3RlZF09XCJtb250aC5pc1NlbGVjdGVkXCIgW2Rpc2FibGVkXT1cIm1vbnRoLmlzRGlzYWJsZWRcIiAoY2xpY2spPVwib25Nb250aENsaWNrKG1vbnRoKVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBtb250aC5uYW1lIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoY3VycmVudFZpZXcoKSA9PT0gQ2FsZW5kYXJWaWV3RW51bS5ZZWFycykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXIteWVhcnNcIj5cbiAgICAgICAgICAgIEBmb3IgKHllYXIgb2YgY2FsZW5kYXJZZWFycygpOyB0cmFjayB5ZWFyLnllYXIpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNhbGVuZGFyLXllYXJcIiBbY2xhc3MuY2FsZW5kYXIteWVhci1jdXJyZW50XT1cInllYXIuaXNDdXJyZW50WWVhclwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jYWxlbmRhci15ZWFyLXNlbGVjdGVkXT1cInllYXIuaXNTZWxlY3RlZFwiIFtkaXNhYmxlZF09XCJ5ZWFyLmlzRGlzYWJsZWRcIiAoY2xpY2spPVwib25ZZWFyQ2xpY2soeWVhcilcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgeWVhci55ZWFyIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIH1cbjwvZGl2PlxuIl19
|