@coreui/angular-pro 5.2.20 → 5.2.21
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/esm2022/lib/calendar/calendar/calendar.component.mjs +312 -410
- package/esm2022/lib/calendar/calendar-month/calendar-class-month.pipe.mjs +3 -2
- package/esm2022/lib/calendar/calendar-month/calendar-class-row.pipe.mjs +2 -4
- package/esm2022/lib/calendar/calendar-month/calendar-day.directive.mjs +2 -2
- package/esm2022/lib/calendar/calendar-month/calendar-month.component.mjs +182 -262
- package/esm2022/lib/calendar/calendar-month/calendar-row.directive.mjs +33 -31
- package/esm2022/lib/calendar/calendar-navigation/calendar-navigation.component.mjs +41 -13
- package/esm2022/lib/calendar/calendar.service.mjs +13 -10
- package/esm2022/lib/calendar/calendar.utils.mjs +19 -12
- package/esm2022/lib/date-picker/date-picker.component.mjs +23 -26
- package/esm2022/lib/date-range-picker/date-range-picker/date-range-picker.component.mjs +193 -295
- package/fesm2022/coreui-angular-pro.mjs +803 -1044
- package/fesm2022/coreui-angular-pro.mjs.map +1 -1
- package/lib/calendar/calendar/calendar.component.d.ts +60 -80
- package/lib/calendar/calendar-month/calendar-class-row.pipe.d.ts +2 -1
- package/lib/calendar/calendar-month/calendar-month.component.d.ts +33 -59
- package/lib/calendar/calendar-month/calendar-row.directive.d.ts +1 -1
- package/lib/calendar/calendar-navigation/calendar-navigation.component.d.ts +16 -6
- package/lib/calendar/calendar.service.d.ts +11 -3
- package/lib/calendar/calendar.utils.d.ts +4 -3
- package/lib/date-picker/date-picker.component.d.ts +9 -10
- package/lib/date-range-picker/date-range-picker/date-range-picker.component.d.ts +65 -94
- package/package.json +2 -2
|
@@ -1,375 +1,344 @@
|
|
|
1
|
-
import { booleanAttribute, Component,
|
|
1
|
+
import { booleanAttribute, Component, computed, DestroyRef, effect, inject, input, model, numberAttribute, output, signal } from '@angular/core';
|
|
2
2
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
3
|
import { NgClass } from '@angular/common';
|
|
4
4
|
import { A11yModule } from '@angular/cdk/a11y';
|
|
5
5
|
import { CalendarService } from '../calendar.service';
|
|
6
|
-
import {
|
|
6
|
+
import { convertToDateObject, equalDates } from '../calendar.utils';
|
|
7
7
|
import { CalendarMonthComponent } from '../calendar-month/calendar-month.component';
|
|
8
8
|
import { CalendarNavigationComponent } from '../calendar-navigation/calendar-navigation.component';
|
|
9
9
|
import { CalendarClassViewPipe } from './calendar-class-view.pipe';
|
|
10
10
|
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "
|
|
12
|
-
import * as i2 from "@angular/cdk/a11y";
|
|
11
|
+
import * as i1 from "@angular/cdk/a11y";
|
|
13
12
|
export class CalendarComponent {
|
|
14
|
-
|
|
15
|
-
constructor(calendarService) {
|
|
16
|
-
this.calendarService = calendarService;
|
|
13
|
+
constructor() {
|
|
17
14
|
this.#destroyRef = inject(DestroyRef);
|
|
18
|
-
this
|
|
19
|
-
this.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
this.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
this.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
this.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
this.
|
|
42
|
-
this.
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
this
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
this.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
this.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
this.
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
this.
|
|
203
|
-
this.
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
this.
|
|
215
|
-
this.
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
this.
|
|
230
|
-
this.
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
set dateFilter(value) {
|
|
248
|
-
this.calendarService.update({ dateFilter: value });
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Set whether days in adjacent months shown before or after the current month are selectable. This only applies if the `showAdjacentDays` option is set to true.
|
|
252
|
-
* @type boolean
|
|
253
|
-
* @default false
|
|
254
|
-
* @since 4.4.10
|
|
255
|
-
*/
|
|
256
|
-
set selectAdjacentDays(value) {
|
|
257
|
-
this.calendarService.update({ selectAdjacentDays: value });
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Set whether to display dates in adjacent months (non-selectable) at the start and end of the current month.
|
|
261
|
-
* @type boolean
|
|
262
|
-
* @default true
|
|
263
|
-
* @since 4.4.10
|
|
264
|
-
*/
|
|
265
|
-
set showAdjacentDays(value) {
|
|
266
|
-
this.calendarService.update({ showAdjacentDays: value ?? true });
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Specify the type of date selection as day, week, month, or year.
|
|
270
|
-
* @type 'day' | 'week' | 'month' | 'year'
|
|
271
|
-
* @default 'day'
|
|
272
|
-
* @since 5.0.0
|
|
273
|
-
*/
|
|
274
|
-
set selectionType(value) {
|
|
275
|
-
this.calendars = ['month', 'year'].includes(value) ? 1 : this.calendars;
|
|
276
|
-
this.#selectionType = value;
|
|
277
|
-
this.view = ['day', 'week'].includes(value) ? 'days' : value === 'month' ? 'months' : 'years';
|
|
278
|
-
this.calendarService.update({ selectionType: value, view: this.view });
|
|
279
|
-
}
|
|
280
|
-
get selectionType() {
|
|
281
|
-
return this.#selectionType;
|
|
282
|
-
}
|
|
283
|
-
// #selectionType = signal<SelectionType>('month');
|
|
284
|
-
#selectionType;
|
|
285
|
-
/**
|
|
286
|
-
* Set whether to display week numbers in the calendar.
|
|
287
|
-
* @type boolean
|
|
288
|
-
* @default false
|
|
289
|
-
* @since 5.0.0
|
|
290
|
-
*/
|
|
291
|
-
set showWeekNumber(value) {
|
|
292
|
-
this.#showWeekNumber.set(value);
|
|
293
|
-
this.calendarService.update({ showWeekNumber: value });
|
|
294
|
-
}
|
|
295
|
-
#showWeekNumber;
|
|
296
|
-
/**
|
|
297
|
-
* Label displayed over week numbers in the calendar.
|
|
298
|
-
* @type string
|
|
299
|
-
* @default undefined
|
|
300
|
-
* @since 5.0.0
|
|
301
|
-
*/
|
|
302
|
-
set weekNumbersLabel(value) {
|
|
303
|
-
this.calendarService.update({ weekNumbersLabel: value });
|
|
304
|
-
}
|
|
305
|
-
// used with calendarService
|
|
306
|
-
set hoverDate(value) {
|
|
307
|
-
this._hoverDate = value;
|
|
308
|
-
this.calendarCellHover.emit(value);
|
|
309
|
-
}
|
|
310
|
-
get hoverDate() {
|
|
311
|
-
return this._hoverDate;
|
|
312
|
-
}
|
|
313
|
-
get hostClasses() {
|
|
314
|
-
const selectionType = this.#selectionType;
|
|
315
|
-
const view = this.view;
|
|
316
|
-
return {
|
|
317
|
-
calendars: true,
|
|
318
|
-
[`select-${selectionType}`]: selectionType && view === 'days',
|
|
319
|
-
'show-week-numbers': this.#showWeekNumber()
|
|
320
|
-
};
|
|
15
|
+
this.#calendarService = inject(CalendarService);
|
|
16
|
+
this.calendarDateChange = output();
|
|
17
|
+
/**
|
|
18
|
+
* Default date of the component
|
|
19
|
+
* @type Date | string
|
|
20
|
+
*/
|
|
21
|
+
this.calendarDateModel = model(new Date(new Date().setDate(1)).setHours(0, 0, 0, 0), {
|
|
22
|
+
alias: 'calendarDate'
|
|
23
|
+
});
|
|
24
|
+
this.calendarDate = computed(() => {
|
|
25
|
+
const date = convertToDateObject(this.calendarDateModel() ?? this.startDate() ?? new Date(), this.selectionType(), 'calendarDate') ?? new Date();
|
|
26
|
+
const calendarDate = new Date(new Date(date.setDate(1)).setHours(0, 0, 0, 0));
|
|
27
|
+
return convertToDateObject(calendarDate, this.selectionType(), 'calendarDate');
|
|
28
|
+
}, { equal: equalDates });
|
|
29
|
+
this.calendarDateEffect = effect(() => {
|
|
30
|
+
this.#calendarService.update({ calendarDate: this.calendarDate() });
|
|
31
|
+
this.calendarDateChange.emit(this.calendarDate());
|
|
32
|
+
}, { allowSignalWrites: true });
|
|
33
|
+
/**
|
|
34
|
+
* The number of calendars that render on desktop devices.
|
|
35
|
+
* @type number
|
|
36
|
+
* default 1
|
|
37
|
+
*/
|
|
38
|
+
this.calendars = input(1, { transform: numberAttribute });
|
|
39
|
+
this.calendarsArray = computed(() => {
|
|
40
|
+
const calendars = ['month', 'year'].includes(this.selectionType()) ? 1 : this.calendars();
|
|
41
|
+
return Array.from({ length: calendars }, (v, i) => i);
|
|
42
|
+
});
|
|
43
|
+
/**
|
|
44
|
+
* Set the format of day name.
|
|
45
|
+
* @default 'numeric'
|
|
46
|
+
* @type DayFormatType
|
|
47
|
+
*/
|
|
48
|
+
this.dayFormat = input('numeric');
|
|
49
|
+
this.dayFormatEffect = effect(() => {
|
|
50
|
+
this.#calendarService.update({ dayFormat: this.dayFormat() });
|
|
51
|
+
}, { allowSignalWrites: true });
|
|
52
|
+
/**
|
|
53
|
+
* Specify the list of dates that cannot be selected.
|
|
54
|
+
* @type (Date | Date[])[]
|
|
55
|
+
*/
|
|
56
|
+
this.disabledDates = input([]);
|
|
57
|
+
this.disabledDatesEffect = effect(() => {
|
|
58
|
+
this.#calendarService.update({ disabledDates: this.disabledDates() });
|
|
59
|
+
}, { allowSignalWrites: true });
|
|
60
|
+
this.endDateChange = output();
|
|
61
|
+
this.startDateChange = output();
|
|
62
|
+
/**
|
|
63
|
+
* Initial selected date.
|
|
64
|
+
* @type (Date | null)
|
|
65
|
+
*/
|
|
66
|
+
this.startDateModel = model(null, { alias: 'startDate' });
|
|
67
|
+
this.startDate = computed(() => {
|
|
68
|
+
const date = this.startDateModel() ?? null;
|
|
69
|
+
return !!date ? convertToDateObject(date, this.selectionType(), 'startDate') : null;
|
|
70
|
+
}, { equal: equalDates });
|
|
71
|
+
/**
|
|
72
|
+
* Initial selected to date (range).
|
|
73
|
+
* @type Date | null
|
|
74
|
+
*/
|
|
75
|
+
this.endDateModel = model(null, { alias: 'endDate' });
|
|
76
|
+
this.endDate = computed(() => {
|
|
77
|
+
const date = this.endDateModel() ?? null;
|
|
78
|
+
return !!date && this.range() ? convertToDateObject(date, this.selectionType(), 'endDate') : null;
|
|
79
|
+
}, { equal: equalDates });
|
|
80
|
+
this.datesEffect = effect(() => {
|
|
81
|
+
this.#calendarService.update({ startDate: this.startDate(), endDate: this.endDate() });
|
|
82
|
+
this.startDateChange.emit(this.startDate());
|
|
83
|
+
this.endDateChange.emit(this.endDate());
|
|
84
|
+
}, { allowSignalWrites: true });
|
|
85
|
+
/**
|
|
86
|
+
* Sets the day of start week.
|
|
87
|
+
* - 0 - Sunday,
|
|
88
|
+
* - 1 - Monday,
|
|
89
|
+
* - 2 - Tuesday,
|
|
90
|
+
* - 3 - Wednesday,
|
|
91
|
+
* - 4 - Thursday,
|
|
92
|
+
* - 5 - Friday,
|
|
93
|
+
* - 6 - Saturday,
|
|
94
|
+
*
|
|
95
|
+
* @type number
|
|
96
|
+
* @default 1
|
|
97
|
+
*/
|
|
98
|
+
this.firstDayOfWeek = input(1);
|
|
99
|
+
this.firstDayOfWeekEffect = effect(() => {
|
|
100
|
+
this.#calendarService.update({ firstDayOfWeek: this.firstDayOfWeek() });
|
|
101
|
+
}, { allowSignalWrites: true });
|
|
102
|
+
/**
|
|
103
|
+
* Sets the default locale for components. If not set, it is inherited from the browser.
|
|
104
|
+
* @default 'default'
|
|
105
|
+
*/
|
|
106
|
+
this.locale = input('default');
|
|
107
|
+
this.localeEffect = effect(() => {
|
|
108
|
+
this.#calendarService.update({ locale: this.locale() });
|
|
109
|
+
}, { allowSignalWrites: true });
|
|
110
|
+
/**
|
|
111
|
+
* Max selectable date.
|
|
112
|
+
*/
|
|
113
|
+
this.maxDateInput = input(null, { alias: 'maxDate' });
|
|
114
|
+
this.maxDateEffect = effect(() => {
|
|
115
|
+
const date = this.maxDateInput();
|
|
116
|
+
const maxDate = !!date ? convertToDateObject(date, undefined, 'maxDate') : null;
|
|
117
|
+
this.#calendarService.update({ maxDate: maxDate });
|
|
118
|
+
}, { allowSignalWrites: true });
|
|
119
|
+
/**
|
|
120
|
+
* Min selectable date.
|
|
121
|
+
*/
|
|
122
|
+
this.minDateInput = input(null, { alias: 'minDate' });
|
|
123
|
+
this.minDateEffect = effect(() => {
|
|
124
|
+
const date = this.minDateInput();
|
|
125
|
+
const minDate = !!date ? convertToDateObject(date, undefined, 'minDate') : null;
|
|
126
|
+
this.#calendarService.update({ minDate: minDate });
|
|
127
|
+
}, { allowSignalWrites: true });
|
|
128
|
+
/**
|
|
129
|
+
* Show navigation.
|
|
130
|
+
* @type boolean
|
|
131
|
+
*/
|
|
132
|
+
this.navigation = input(true, { transform: booleanAttribute });
|
|
133
|
+
/**
|
|
134
|
+
* Reorder year-month navigation, and render year first.
|
|
135
|
+
* @type boolean
|
|
136
|
+
* @default false
|
|
137
|
+
*/
|
|
138
|
+
this.navYearFirst = input(false, { transform: booleanAttribute });
|
|
139
|
+
this.navYearFirstEffect = effect(() => {
|
|
140
|
+
this.#calendarService.update({ navYearFirst: this.navYearFirst() });
|
|
141
|
+
}, { allowSignalWrites: true });
|
|
142
|
+
/**
|
|
143
|
+
* Allow range selection.
|
|
144
|
+
* @type boolean
|
|
145
|
+
* @default false
|
|
146
|
+
*/
|
|
147
|
+
this.range = input(false, { transform: booleanAttribute });
|
|
148
|
+
this.rangeEffect = effect(() => {
|
|
149
|
+
this.#calendarService.update({ range: this.range() });
|
|
150
|
+
}, { allowSignalWrites: true });
|
|
151
|
+
/**
|
|
152
|
+
* Set calendar view.
|
|
153
|
+
* @type 'days' | 'months' | 'years'
|
|
154
|
+
* @default 'days'
|
|
155
|
+
*/
|
|
156
|
+
this.view = model('days');
|
|
157
|
+
this.viewEffect = effect(() => {
|
|
158
|
+
this.#calendarService.update({ view: this.view() });
|
|
159
|
+
}, { allowSignalWrites: true });
|
|
160
|
+
/**
|
|
161
|
+
* Set length or format of day name.
|
|
162
|
+
* @type number | 'long' | 'narrow' | 'short'
|
|
163
|
+
* @default 'short'
|
|
164
|
+
*/
|
|
165
|
+
this.weekdayFormat = input('short');
|
|
166
|
+
this.weekdayFormatEffect = effect(() => {
|
|
167
|
+
this.#calendarService.update({ weekdayFormat: this.weekdayFormat() });
|
|
168
|
+
}, { allowSignalWrites: true });
|
|
169
|
+
this.dateFilter = input();
|
|
170
|
+
this.dateFilterEffect = effect(() => {
|
|
171
|
+
this.#calendarService.update({ dateFilter: this.dateFilter() });
|
|
172
|
+
}, { allowSignalWrites: true });
|
|
173
|
+
/**
|
|
174
|
+
* Set whether days in adjacent months shown before or after the current month are selectable. This only applies if the `showAdjacentDays` option is set to true.
|
|
175
|
+
* @type boolean
|
|
176
|
+
* @default false
|
|
177
|
+
* @since 4.4.10
|
|
178
|
+
*/
|
|
179
|
+
this.selectAdjacentDays = input(false, { transform: booleanAttribute });
|
|
180
|
+
this.selectAdjacentDaysEffect = effect(() => {
|
|
181
|
+
this.#calendarService.update({ selectAdjacentDays: this.selectAdjacentDays() });
|
|
182
|
+
}, { allowSignalWrites: true });
|
|
183
|
+
/**
|
|
184
|
+
* Set whether to display dates in adjacent months (non-selectable) at the start and end of the current month.
|
|
185
|
+
* @type boolean
|
|
186
|
+
* @default true
|
|
187
|
+
* @since 4.4.10
|
|
188
|
+
*/
|
|
189
|
+
this.showAdjacentDays = input(true, { transform: booleanAttribute });
|
|
190
|
+
this.showAdjacentDaysEffect = effect(() => {
|
|
191
|
+
this.#calendarService.update({ showAdjacentDays: this.showAdjacentDays() });
|
|
192
|
+
}, { allowSignalWrites: true });
|
|
193
|
+
/**
|
|
194
|
+
* Specify the type of date selection as day, week, month, or year.
|
|
195
|
+
* @type 'day' | 'week' | 'month' | 'year'
|
|
196
|
+
* @default 'day'
|
|
197
|
+
* @since 5.0.0
|
|
198
|
+
*/
|
|
199
|
+
this.selectionType = input('day');
|
|
200
|
+
this.selectionTypeEffect = effect(() => {
|
|
201
|
+
const selectionType = this.selectionType();
|
|
202
|
+
const view = ['day', 'week'].includes(selectionType) ? 'days' : selectionType === 'month' ? 'months' : 'years';
|
|
203
|
+
this.#calendarService.update({ selectionType: selectionType, view: view });
|
|
204
|
+
}, { allowSignalWrites: true });
|
|
205
|
+
/**
|
|
206
|
+
* Set whether to display week numbers in the calendar.
|
|
207
|
+
* @type boolean
|
|
208
|
+
* @default false
|
|
209
|
+
* @since 5.0.0
|
|
210
|
+
*/
|
|
211
|
+
this.showWeekNumber = input(false, { transform: booleanAttribute });
|
|
212
|
+
this.showWeekNumberEffect = effect(() => {
|
|
213
|
+
this.#calendarService.update({ showWeekNumber: this.showWeekNumber() });
|
|
214
|
+
}, { allowSignalWrites: true });
|
|
215
|
+
/**
|
|
216
|
+
* Label displayed over week numbers in the calendar.
|
|
217
|
+
* @type string
|
|
218
|
+
* @default undefined
|
|
219
|
+
* @since 5.0.0
|
|
220
|
+
*/
|
|
221
|
+
this.weekNumbersLabel = input();
|
|
222
|
+
this.weekNumbersLabelEffect = effect(() => {
|
|
223
|
+
this.#calendarService.update({ weekNumbersLabel: this.weekNumbersLabel() });
|
|
224
|
+
}, { allowSignalWrites: true });
|
|
225
|
+
this.ariaNextMonthLabel = input('Next month');
|
|
226
|
+
this.ariaNextYearLabel = input('Next year');
|
|
227
|
+
this.ariaPrevMonthLabel = input('Previous month');
|
|
228
|
+
this.ariaPrevYearLabel = input('Previous year');
|
|
229
|
+
this.calendarCellHover = output();
|
|
230
|
+
// used with calendarService
|
|
231
|
+
this.hoverDate = signal(null);
|
|
232
|
+
this.hoverDateEffect = effect(() => {
|
|
233
|
+
this.calendarCellHover.emit(this.hoverDate());
|
|
234
|
+
}, { allowSignalWrites: true });
|
|
235
|
+
this.hostClasses = computed(() => {
|
|
236
|
+
const selectionType = this.selectionType();
|
|
237
|
+
const view = this.view();
|
|
238
|
+
return {
|
|
239
|
+
calendars: true,
|
|
240
|
+
[`select-${selectionType}`]: selectionType && view === 'days',
|
|
241
|
+
'show-week-numbers': this.showWeekNumber()
|
|
242
|
+
};
|
|
243
|
+
});
|
|
321
244
|
}
|
|
245
|
+
#destroyRef;
|
|
246
|
+
#calendarService;
|
|
247
|
+
// @ViewChildren(CalendarMonthComponent) calendarMonths!: QueryList<CalendarMonthComponent>;
|
|
322
248
|
ngOnInit() {
|
|
323
|
-
this
|
|
324
|
-
locale: this.locale ?? 'default',
|
|
325
|
-
view: this.view,
|
|
326
|
-
range: this.range,
|
|
327
|
-
selectionType: this.selectionType
|
|
249
|
+
this.#calendarService.update({
|
|
250
|
+
locale: this.locale() ?? 'default',
|
|
251
|
+
view: this.view(),
|
|
252
|
+
range: this.range(),
|
|
253
|
+
selectionType: this.selectionType()
|
|
328
254
|
// showAdjacentDays: this.showAdjacentDays,
|
|
329
255
|
// selectAdjacentDays: this.selectAdjacentDays
|
|
330
256
|
});
|
|
331
257
|
}
|
|
258
|
+
ngAfterViewInit() {
|
|
259
|
+
setTimeout(() => {
|
|
260
|
+
this.calendarStateSubscribe();
|
|
261
|
+
});
|
|
262
|
+
}
|
|
332
263
|
calendarStateSubscribe() {
|
|
333
|
-
|
|
264
|
+
const inputs = [
|
|
265
|
+
'dateFilter',
|
|
266
|
+
'dayFormat',
|
|
267
|
+
'disabledDates',
|
|
268
|
+
'firstDayOfWeek',
|
|
269
|
+
'locale',
|
|
270
|
+
'maxDate',
|
|
271
|
+
'minDate',
|
|
272
|
+
'navYearFirst',
|
|
273
|
+
'range',
|
|
274
|
+
'selectAdjacentDays',
|
|
275
|
+
'selectionType',
|
|
276
|
+
'showAdjacentDays',
|
|
277
|
+
'showWeekNumber',
|
|
278
|
+
'weekdayFormat',
|
|
279
|
+
'weekNumbersLabel'
|
|
280
|
+
];
|
|
281
|
+
// const models = ['startDate', 'endDate', 'calendarDate'];
|
|
282
|
+
this.#calendarService.calendarState$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((state) => {
|
|
334
283
|
const keys = Object.keys(state);
|
|
335
284
|
for (const key of keys) {
|
|
336
285
|
if (key in this) {
|
|
286
|
+
if (inputs.includes(key)) {
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
// if (models.includes(key) && state[key] !== undefined) {
|
|
290
|
+
// const model = `${key}Model`;
|
|
291
|
+
// // @ts-ignore
|
|
292
|
+
// this[model].set(state[key]);
|
|
293
|
+
// }
|
|
294
|
+
if (key === 'startDate') {
|
|
295
|
+
this.startDateModel.set(state[key]);
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
if (key === 'endDate') {
|
|
299
|
+
this.endDateModel.set(state[key]);
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
if (key === 'calendarDate') {
|
|
303
|
+
this.calendarDateModel.set(state[key]);
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
if (key === 'view') {
|
|
307
|
+
this.view.set(state[key]);
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
// @ts-ignore
|
|
311
|
+
const isWritableSignal = typeof this[key] === 'function' && typeof this[key].set === 'function';
|
|
312
|
+
// @ts-ignore
|
|
313
|
+
const isReadonlySignal = typeof this[key] === 'function' && typeof this[key].set === 'undefined';
|
|
337
314
|
// @ts-ignore
|
|
338
|
-
if (this[key] !== state[key]) {
|
|
315
|
+
if (isWritableSignal && !isReadonlySignal ? this[key]() !== state[key] : this[key] !== state[key]) {
|
|
339
316
|
// @ts-ignore
|
|
340
|
-
this[key] = state[key];
|
|
341
|
-
|
|
342
|
-
setTimeout(() => {
|
|
343
|
-
this.startDateChange.emit(this._startDate);
|
|
344
|
-
});
|
|
345
|
-
continue;
|
|
346
|
-
}
|
|
347
|
-
if (key === 'endDate') {
|
|
348
|
-
setTimeout(() => {
|
|
349
|
-
this.endDateChange.emit(this._endDate);
|
|
350
|
-
});
|
|
351
|
-
}
|
|
317
|
+
isWritableSignal ? this[key].set(state[key]) : (this[key] = state[key]);
|
|
318
|
+
// this[key] = state[key];
|
|
352
319
|
}
|
|
353
320
|
}
|
|
354
321
|
}
|
|
355
322
|
});
|
|
356
323
|
}
|
|
357
324
|
setCalendarPage(years, months = 0, setMonth) {
|
|
358
|
-
const
|
|
359
|
-
const
|
|
325
|
+
const calendarDate = this.calendarDate();
|
|
326
|
+
const year = calendarDate.getFullYear();
|
|
327
|
+
const month = calendarDate.getMonth();
|
|
360
328
|
const d = new Date(year, month, 1);
|
|
361
329
|
years && d.setFullYear(d.getFullYear() + years);
|
|
362
330
|
months && d.setMonth(d.getMonth() + months);
|
|
363
331
|
typeof setMonth === 'number' && d.setMonth(setMonth);
|
|
364
|
-
this.
|
|
332
|
+
this.calendarDateModel.set(d);
|
|
365
333
|
}
|
|
366
334
|
handleNavigationClick(direction, years = false) {
|
|
335
|
+
const view = this.view();
|
|
367
336
|
if (direction === 'prev') {
|
|
368
337
|
if (years) {
|
|
369
|
-
this.setCalendarPage(
|
|
338
|
+
this.setCalendarPage(view === 'years' ? -10 : -1);
|
|
370
339
|
return;
|
|
371
340
|
}
|
|
372
|
-
if (
|
|
341
|
+
if (view !== 'days') {
|
|
373
342
|
this.setCalendarPage(-1);
|
|
374
343
|
return;
|
|
375
344
|
}
|
|
@@ -378,10 +347,10 @@ export class CalendarComponent {
|
|
|
378
347
|
}
|
|
379
348
|
if (direction === 'next') {
|
|
380
349
|
if (years) {
|
|
381
|
-
this.setCalendarPage(
|
|
350
|
+
this.setCalendarPage(view === 'years' ? 10 : 1);
|
|
382
351
|
return;
|
|
383
352
|
}
|
|
384
|
-
if (
|
|
353
|
+
if (view !== 'days') {
|
|
385
354
|
this.setCalendarPage(1);
|
|
386
355
|
return;
|
|
387
356
|
}
|
|
@@ -394,85 +363,18 @@ export class CalendarComponent {
|
|
|
394
363
|
* @type void
|
|
395
364
|
*/
|
|
396
365
|
clearDates() {
|
|
397
|
-
this
|
|
398
|
-
this.calendarService.update({ startDate: null });
|
|
366
|
+
this.#calendarService.update({ startDate: null, endDate: null });
|
|
399
367
|
}
|
|
400
368
|
handleFocusChange($event) {
|
|
401
369
|
if ($event === null) {
|
|
402
|
-
this
|
|
370
|
+
this.#calendarService.update({ hoverDate: null });
|
|
403
371
|
}
|
|
404
372
|
}
|
|
405
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CalendarComponent, deps: [
|
|
406
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: CalendarComponent, isStandalone: true, selector: "c-calendar", inputs: {
|
|
373
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
374
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: CalendarComponent, isStandalone: true, selector: "c-calendar", inputs: { calendarDateModel: { classPropertyName: "calendarDateModel", publicName: "calendarDate", isSignal: true, isRequired: false, transformFunction: null }, calendars: { classPropertyName: "calendars", publicName: "calendars", isSignal: true, isRequired: false, transformFunction: null }, dayFormat: { classPropertyName: "dayFormat", publicName: "dayFormat", isSignal: true, isRequired: false, transformFunction: null }, disabledDates: { classPropertyName: "disabledDates", publicName: "disabledDates", isSignal: true, isRequired: false, transformFunction: null }, startDateModel: { classPropertyName: "startDateModel", publicName: "startDate", isSignal: true, isRequired: false, transformFunction: null }, endDateModel: { classPropertyName: "endDateModel", publicName: "endDate", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, maxDateInput: { classPropertyName: "maxDateInput", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, minDateInput: { classPropertyName: "minDateInput", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, navigation: { classPropertyName: "navigation", publicName: "navigation", isSignal: true, isRequired: false, transformFunction: null }, navYearFirst: { classPropertyName: "navYearFirst", publicName: "navYearFirst", isSignal: true, isRequired: false, transformFunction: null }, range: { classPropertyName: "range", publicName: "range", isSignal: true, isRequired: false, transformFunction: null }, view: { classPropertyName: "view", publicName: "view", isSignal: true, isRequired: false, transformFunction: null }, weekdayFormat: { classPropertyName: "weekdayFormat", publicName: "weekdayFormat", isSignal: true, isRequired: false, transformFunction: null }, dateFilter: { classPropertyName: "dateFilter", publicName: "dateFilter", isSignal: true, isRequired: false, transformFunction: null }, selectAdjacentDays: { classPropertyName: "selectAdjacentDays", publicName: "selectAdjacentDays", isSignal: true, isRequired: false, transformFunction: null }, showAdjacentDays: { classPropertyName: "showAdjacentDays", publicName: "showAdjacentDays", isSignal: true, isRequired: false, transformFunction: null }, selectionType: { classPropertyName: "selectionType", publicName: "selectionType", isSignal: true, isRequired: false, transformFunction: null }, showWeekNumber: { classPropertyName: "showWeekNumber", publicName: "showWeekNumber", isSignal: true, isRequired: false, transformFunction: null }, weekNumbersLabel: { classPropertyName: "weekNumbersLabel", publicName: "weekNumbersLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaNextMonthLabel: { classPropertyName: "ariaNextMonthLabel", publicName: "ariaNextMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaNextYearLabel: { classPropertyName: "ariaNextYearLabel", publicName: "ariaNextYearLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaPrevMonthLabel: { classPropertyName: "ariaPrevMonthLabel", publicName: "ariaPrevMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaPrevYearLabel: { classPropertyName: "ariaPrevYearLabel", publicName: "ariaPrevYearLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { calendarDateChange: "calendarDateChange", calendarDateModel: "calendarDateChange", endDateChange: "endDateChange", startDateChange: "startDateChange", startDateModel: "startDateChange", endDateModel: "endDateChange", view: "viewChange", calendarCellHover: "calendarCellHover" }, host: { properties: { "class": "hostClasses()" }, classAttribute: "calendar" }, providers: [CalendarService], exportAs: ["cCalendar"], ngImport: i0, template: "@for (calendar of calendarsArray(); track calendar; let i = $index) {\n <div [ngClass]=\"view() | calendarClassView\">\n <c-calendar-navigation\n (navigationClick)=\"handleNavigationClick($event.direction, $event.years)\"\n [pageIndex]=\"i\"\n [navigation]=\"navigation()\"\n [ariaNextMonthLabel]=\"ariaNextMonthLabel()\"\n [ariaNextYearLabel]=\"ariaNextYearLabel()\"\n [ariaPrevMonthLabel]=\"ariaPrevMonthLabel()\"\n [ariaPrevYearLabel]=\"ariaPrevYearLabel()\"\n />\n\n <c-calendar-month\n [pageIndex]=\"i\"\n cdkMonitorSubtreeFocus\n (cdkFocusChange)=\"handleFocusChange($event)\"\n />\n </div>\n}\n", styles: [".btn-transparent:focus-visible{outline:-webkit-focus-ring-color auto 1px}\n"], dependencies: [{ kind: "component", type: CalendarNavigationComponent, selector: "c-calendar-navigation", inputs: ["pageIndex", "navigation", "ariaNextMonthLabel", "ariaNextYearLabel", "ariaPrevMonthLabel", "ariaPrevYearLabel"], outputs: ["navigationClick"] }, { kind: "pipe", type: CalendarClassViewPipe, name: "calendarClassView" }, { kind: "component", type: CalendarMonthComponent, selector: "c-calendar-month", inputs: ["pageIndex"], exportAs: ["cCalendarMonth"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i1.CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }] }); }
|
|
407
375
|
}
|
|
408
376
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CalendarComponent, decorators: [{
|
|
409
377
|
type: Component,
|
|
410
|
-
args: [{ selector: 'c-calendar', exportAs: 'cCalendar', providers: [CalendarService], standalone: true, imports: [CalendarNavigationComponent, CalendarClassViewPipe, CalendarMonthComponent, NgClass, A11yModule], template: "@for (calendar of calendarsArray; track calendar; let i = $index) {\n <div [ngClass]=\"view | calendarClassView\">\n <c-calendar-navigation\n (navigationClick)=\"handleNavigationClick($event.direction, $event.years)\"\n [
|
|
411
|
-
}]
|
|
412
|
-
type: Input
|
|
413
|
-
}], calendars: [{
|
|
414
|
-
type: Input,
|
|
415
|
-
args: [{ transform: numberAttribute }]
|
|
416
|
-
}], dayFormat: [{
|
|
417
|
-
type: Input
|
|
418
|
-
}], disabledDates: [{
|
|
419
|
-
type: Input
|
|
420
|
-
}], startDate: [{
|
|
421
|
-
type: Input
|
|
422
|
-
}], endDate: [{
|
|
423
|
-
type: Input
|
|
424
|
-
}], firstDayOfWeek: [{
|
|
425
|
-
type: Input,
|
|
426
|
-
args: [{ transform: numberAttribute }]
|
|
427
|
-
}], locale: [{
|
|
428
|
-
type: Input
|
|
429
|
-
}], maxDate: [{
|
|
430
|
-
type: Input
|
|
431
|
-
}], minDate: [{
|
|
432
|
-
type: Input
|
|
433
|
-
}], navigation: [{
|
|
434
|
-
type: Input,
|
|
435
|
-
args: [{ transform: booleanAttribute }]
|
|
436
|
-
}], navYearFirst: [{
|
|
437
|
-
type: Input,
|
|
438
|
-
args: [{ transform: booleanAttribute }]
|
|
439
|
-
}], range: [{
|
|
440
|
-
type: Input,
|
|
441
|
-
args: [{ transform: booleanAttribute }]
|
|
442
|
-
}], view: [{
|
|
443
|
-
type: Input
|
|
444
|
-
}], weekdayFormat: [{
|
|
445
|
-
type: Input
|
|
446
|
-
}], dateFilter: [{
|
|
447
|
-
type: Input
|
|
448
|
-
}], selectAdjacentDays: [{
|
|
449
|
-
type: Input,
|
|
450
|
-
args: [{ transform: booleanAttribute }]
|
|
451
|
-
}], showAdjacentDays: [{
|
|
452
|
-
type: Input,
|
|
453
|
-
args: [{ transform: booleanAttribute }]
|
|
454
|
-
}], selectionType: [{
|
|
455
|
-
type: Input
|
|
456
|
-
}], showWeekNumber: [{
|
|
457
|
-
type: Input,
|
|
458
|
-
args: [{ transform: booleanAttribute }]
|
|
459
|
-
}], weekNumbersLabel: [{
|
|
460
|
-
type: Input
|
|
461
|
-
}], calendarCellHover: [{
|
|
462
|
-
type: Output
|
|
463
|
-
}], calendarDateChange: [{
|
|
464
|
-
type: Output
|
|
465
|
-
}], endDateChange: [{
|
|
466
|
-
type: Output
|
|
467
|
-
}], startDateChange: [{
|
|
468
|
-
type: Output
|
|
469
|
-
}], viewChange: [{
|
|
470
|
-
type: Output
|
|
471
|
-
}], hostClasses: [{
|
|
472
|
-
type: HostBinding,
|
|
473
|
-
args: ['class']
|
|
474
|
-
}], calendarMonths: [{
|
|
475
|
-
type: ViewChildren,
|
|
476
|
-
args: [CalendarMonthComponent]
|
|
477
|
-
}] } });
|
|
478
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9jYWxlbmRhci9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL2NhbGVuZGFyL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBQ0wsZUFBZSxFQUVmLE1BQU0sRUFFTixNQUFNLEVBQ04sWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFlLE1BQU0sbUJBQW1CLENBQUM7QUFFNUQsT0FBTyxFQUFFLGVBQWUsRUFBbUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2SCxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzdELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ25HLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7O0FBV25FLE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsV0FBVyxDQUFzQjtJQUVqQyxZQUFvQixlQUFnQztRQUFoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFGcEQsZ0JBQVcsR0FBRyxNQUFNLENB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QUUsZ0JBQWdCLEVBQUU7Z0JBY3pCLGdCQUFnQjtzQkFBNUIsS0FBSztnQkFJSSxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQWVILFdBQVc7c0JBRGQsV0FBVzt1QkFBQyxPQUFPO2dCQVdrQixjQUFjO3NCQUFuRCxZQUFZO3VCQUFDLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgbnVtYmVyQXR0cmlidXRlLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBzaWduYWwsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQTExeU1vZHVsZSwgRm9jdXNPcmlnaW4gfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5cbmltcG9ydCB7IENhbGVuZGFyU2VydmljZSwgRGF0ZUZpbHRlclR5cGUsIERheUZvcm1hdFR5cGUsIFNlbGVjdGlvblR5cGUsIFdlZWtkYXlGb3JtYXRUeXBlIH0gZnJvbSAnLi4vY2FsZW5kYXIuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRDYWxlbmRhckRhdGUsIHRyeURhdGUgfSBmcm9tICcuLi9jYWxlbmRhci51dGlscyc7XG5pbXBvcnQgeyBDYWxlbmRhck1vbnRoQ29tcG9uZW50IH0gZnJvbSAnLi4vY2FsZW5kYXItbW9udGgvY2FsZW5kYXItbW9udGguY29tcG9uZW50JztcbmltcG9ydCB7IENhbGVuZGFyTmF2aWdhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2NhbGVuZGFyLW5hdmlnYXRpb24vY2FsZW5kYXItbmF2aWdhdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDbGFzc1ZpZXdQaXBlIH0gZnJvbSAnLi9jYWxlbmRhci1jbGFzcy12aWV3LnBpcGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjLWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXIuY29tcG9uZW50LnNjc3MnXSxcbiAgZXhwb3J0QXM6ICdjQ2FsZW5kYXInLFxuICBwcm92aWRlcnM6IFtDYWxlbmRhclNlcnZpY2VdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ2FsZW5kYXJOYXZpZ2F0aW9uQ29tcG9uZW50LCBDYWxlbmRhckNsYXNzVmlld1BpcGUsIENhbGVuZGFyTW9udGhDb21wb25lbnQsIE5nQ2xhc3MsIEExMXlNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgI2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjYWxlbmRhclNlcnZpY2U6IENhbGVuZGFyU2VydmljZSkge1xuICAgIHRoaXMuY2FsZW5kYXJTdGF0ZVN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgZGF0ZSBvZiB0aGUgY29tcG9uZW50XG4gICAqIEB0eXBlICBEYXRlIHwgc3RyaW5nXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgY2FsZW5kYXJEYXRlKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgLy8gY29uc3QgX3ZhbHVlID0gbmV3IERhdGUodHJ5RGF0ZSgodmFsdWUgPz8gdGhpcy5zdGFydERhdGUgPz8gbmV3IERhdGUoKSksICdjYWxlbmRhckRhdGUnKSk7XG4gICAgY29uc3QgX3ZhbHVlID0gbmV3IERhdGUodHJ5RGF0ZSh2YWx1ZSA/PyB0aGlzLnN0YXJ0RGF0ZSwgJ2NhbGVuZGFyRGF0ZScpKTtcbiAgICAvLyBpZiAoIWlzRGF0ZUJldHdlZW5NaW5NYXgoX3ZhbHVlLCB0aGlzLm1pbkRhdGUsIHRoaXMubWF4RGF0ZSkpIHtcbiAgICAvLyAgIC8vIF92YWx1ZSA9IF92YWx1ZSA8ICh0aGlzLm1pbkRhdGUgPz8gMCkgPyB0aGlzLm1pbkRhdGUgPz8gdGhpcy5tYXhEYXRlID8/IF92YWx1ZSA6IHRoaXMubWF4RGF0ZSA/PyB0aGlzLm1pbkRhdGUgPz8gX3ZhbHVlO1xuICAgIC8vICAgLy8gcmV0dXJuO1xuICAgIC8vICAgX3ZhbHVlID0gdGhpcy5fY2FsZW5kYXJEYXRlO1xuICAgIC8vIH1cbiAgICBpZiAoISFfdmFsdWUgJiYgdGhpcy5fY2FsZW5kYXJEYXRlLmdldFRpbWUoKSAhPT0gX3ZhbHVlLmdldFRpbWUoKSkge1xuICAgICAgY29uc3QgX2NhbGVuZGFyRGF0ZSA9IG5ldyBEYXRlKG5ldyBEYXRlKF92YWx1ZS5zZXREYXRlKDEpKS5zZXRIb3VycygwLCAwLCAwLCAwKSk7XG4gICAgICB0aGlzLl9jYWxlbmRhckRhdGUgPSBfY2FsZW5kYXJEYXRlO1xuICAgICAgdGhpcy5jYWxlbmRhckRhdGVDaGFuZ2UuZW1pdChfY2FsZW5kYXJEYXRlKTtcbiAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IGNhbGVuZGFyRGF0ZTogX2NhbGVuZGFyRGF0ZSB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQgY2FsZW5kYXJEYXRlKCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLl9jYWxlbmRhckRhdGU7XG4gIH1cblxuICBwcml2YXRlIF9jYWxlbmRhckRhdGU6IERhdGUgPSB0cnlEYXRlKG5ldyBEYXRlKCkpO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGNhbGVuZGFycyB0aGF0IHJlbmRlciBvbiBkZXNrdG9wIGRldmljZXMuXG4gICAqIEB0eXBlIG51bWJlclxuICAgKiBkZWZhdWx0IDFcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHNldCBjYWxlbmRhcnModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2NhbGVuZGFycyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGNhbGVuZGFycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jYWxlbmRhcnM7XG4gIH1cblxuICBwcml2YXRlIF9jYWxlbmRhcnM6IG51bWJlciA9IDE7XG5cbiAgZ2V0IGNhbGVuZGFyc0FycmF5KCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0aGlzLmNhbGVuZGFycyB9LCAodiwgaSkgPT4gaSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBmb3JtYXQgb2YgZGF5IG5hbWUuXG4gICAqIEBkZWZhdWx0ICdudW1lcmljJ1xuICAgKiBAdHlwZSBEYXlGb3JtYXRUeXBlXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgZGF5Rm9ybWF0KHZhbHVlOiBEYXlGb3JtYXRUeXBlKSB7XG4gICAgdGhpcy5fZGF5Rm9ybWF0ID0gdmFsdWU7XG4gICAgdGhpcy5jYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgZGF5Rm9ybWF0OiB0aGlzLl9kYXlGb3JtYXQgfSk7XG4gIH1cblxuICBnZXQgZGF5Rm9ybWF0KCkge1xuICAgIHJldHVybiB0aGlzLl9kYXlGb3JtYXQ7XG4gIH1cblxuICBwcml2YXRlIF9kYXlGb3JtYXQ6IERheUZvcm1hdFR5cGUgPSAnbnVtZXJpYyc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgZGF0ZXMgdGhhdCBjYW5ub3QgYmUgc2VsZWN0ZWQuXG4gICAqIEB0eXBlICBEYXRlW10gfCBEYXRlW11bXVxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVkRGF0ZXModmFsdWU6IChEYXRlW10gfCBEYXRlKVtdKSB7XG4gICAgdGhpcy5fZGlzYWJsZWREYXRlcyA9IHZhbHVlO1xuICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IGRpc2FibGVkRGF0ZXM6IHRoaXMuX2Rpc2FibGVkRGF0ZXMgfSk7XG4gIH1cblxuICBnZXQgZGlzYWJsZWREYXRlcygpOiAoRGF0ZVtdIHwgRGF0ZSlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkRGF0ZXM7XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlZERhdGVzOiAoRGF0ZVtdIHwgRGF0ZSlbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIHNlbGVjdGVkIGRhdGUuXG4gICAqIEB0eXBlICAoRGF0ZSB8IG51bGwpXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgc3RhcnREYXRlKHZhbHVlOiBEYXRlIHwgbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRhdGUgPSAhIXZhbHVlID8gdHJ5RGF0ZSh2YWx1ZSwgJ3N0YXJ0RGF0ZScpIDogbnVsbDtcbiAgICBpZiAodGhpcy5fc3RhcnREYXRlPy5nZXRUaW1lKCkgIT09IGRhdGU/LmdldFRpbWUoKSkge1xuICAgICAgdGhpcy5fc3RhcnREYXRlID0gZGF0ZTtcbiAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IHN0YXJ0RGF0ZTogdGhpcy5fc3RhcnREYXRlIH0pO1xuICAgICAgaWYgKCF0aGlzLnJhbmdlIHx8ICF0aGlzLl9zdGFydERhdGUgfHwgKHRoaXMuZW5kRGF0ZSAmJiB0aGlzLl9zdGFydERhdGUgPiB0aGlzLmVuZERhdGUpKSB7XG4gICAgICAgIHRoaXMuZW5kRGF0ZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHN0YXJ0RGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnREYXRlO1xuICB9XG5cbiAgX3N0YXJ0RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIHNlbGVjdGVkIHRvIGRhdGUgKHJhbmdlKS5cbiAgICogQHR5cGUgRGF0ZSB8IG51bGxcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBlbmREYXRlKHZhbHVlOiBEYXRlIHwgbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRhdGUgPSAhIXZhbHVlID8gdHJ5RGF0ZSh2YWx1ZSwgJ2VuZERhdGUnKSA6IG51bGw7XG4gICAgaWYgKHRoaXMuX2VuZERhdGU/LmdldFRpbWUoKSAhPT0gZGF0ZT8uZ2V0VGltZSgpKSB7XG4gICAgICB0aGlzLl9lbmREYXRlID0gZGF0ZTtcbiAgICAgIC8vIHRoaXMuX2VuZERhdGUgPSB0aGlzLnJhbmdlID8gdGhpcy5fZW5kRGF0ZSA6IG51bGw7XG4gICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS51cGRhdGUoeyBlbmREYXRlOiB0aGlzLl9lbmREYXRlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBlbmREYXRlKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlID8gdGhpcy5fZW5kRGF0ZSA6IG51bGw7XG4gIH1cblxuICBfZW5kRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkYXkgb2Ygc3RhcnQgd2Vlay5cbiAgICogLSAwIC0gU3VuZGF5LFxuICAgKiAtIDEgLSBNb25kYXksXG4gICAqIC0gMiAtIFR1ZXNkYXksXG4gICAqIC0gMyAtIFdlZG5lc2RheSxcbiAgICogLSA0IC0gVGh1cnNkYXksXG4gICAqIC0gNSAtIEZyaWRheSxcbiAgICogLSA2IC0gU2F0dXJkYXksXG4gICAqXG4gICAqIEB0eXBlIG51bWJlclxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBzZXQgZmlyc3REYXlPZldlZWsodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2ZpcnN0RGF5T2ZXZWVrID0gdmFsdWU7XG4gIH1cblxuICBnZXQgZmlyc3REYXlPZldlZWsoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZmlyc3REYXlPZldlZWs7XG4gIH1cblxuICBwcml2YXRlIF9maXJzdERheU9mV2VlazogbnVtYmVyID0gMTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgZGVmYXVsdCBsb2NhbGUgZm9yIGNvbXBvbmVudHMuIElmIG5vdCBzZXQsIGl0IGlzIGluaGVyaXRlZCBmcm9tIHRoZSBicm93c2VyLlxuICAgKiBAZGVmYXVsdCAnZGVmYXVsdCdcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBsb2NhbGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2xvY2FsZSA9IHZhbHVlO1xuICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IGxvY2FsZTogdmFsdWUgfSk7XG4gIH1cblxuICBnZXQgbG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gIH1cblxuICBwcml2YXRlIF9sb2NhbGU6IHN0cmluZyA9ICdkZWZhdWx0JztcblxuICAvKipcbiAgICogTWF4IHNlbGVjdGFibGUgZGF0ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBtYXhEYXRlKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX21heERhdGUgPSAhIXZhbHVlID8gdHJ5RGF0ZSh2YWx1ZSwgJ21heERhdGUnKSA6IG51bGw7XG4gICAgdGhpcy5jYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgbWF4RGF0ZTogdGhpcy5fbWF4RGF0ZSB9KTtcbiAgfVxuXG4gIGdldCBtYXhEYXRlKCk6IERhdGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4RGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgX21heERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogTWluIHNlbGVjdGFibGUgZGF0ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBtaW5EYXRlKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX21pbkRhdGUgPSB2YWx1ZSA/IHRyeURhdGUodmFsdWUsICdtaW5EYXRlJykgOiBudWxsO1xuICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IG1pbkRhdGU6IHRoaXMuX21pbkRhdGUgfSk7XG4gIH1cblxuICBnZXQgbWluRGF0ZSgpOiBEYXRlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21pbkRhdGU7XG4gIH1cblxuICBwcml2YXRlIF9taW5EYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFNob3cgbmF2aWdhdGlvbi5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHNldCBuYXZpZ2F0aW9uKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fbmF2aWdhdGlvbiA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IG5hdmlnYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb247XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogUmVvcmRlciB5ZWFyLW1vbnRoIG5hdmlnYXRpb24sIGFuZCByZW5kZXIgeWVhciBmaXJzdC5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHNldCBuYXZZZWFyRmlyc3QodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9uYXZZZWFyRmlyc3QgPSB2YWx1ZTtcbiAgICB0aGlzLmNhbGVuZGFyU2VydmljZS51cGRhdGUoeyBuYXZZZWFyRmlyc3Q6IHRoaXMuX25hdlllYXJGaXJzdCB9KTtcbiAgfVxuXG4gIGdldCBuYXZZZWFyRmlyc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hdlllYXJGaXJzdDtcbiAgfVxuXG4gIHByaXZhdGUgX25hdlllYXJGaXJzdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBbGxvdyByYW5nZSBzZWxlY3Rpb24uXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBzZXQgcmFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9yYW5nZSA9IHZhbHVlO1xuICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IHJhbmdlOiB0aGlzLl9yYW5nZSB9KTtcbiAgfVxuXG4gIGdldCByYW5nZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmFuZ2U7XG4gIH1cblxuICBwcml2YXRlIF9yYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXQgY2FsZW5kYXIgdmlldy5cbiAgICogQHR5cGUgJ2RheXMnIHwgJ21vbnRocycgfCAneWVhcnMnXG4gICAqIEBkZWZhdWx0ICdkYXlzJ1xuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IHZpZXcodmFsdWUpIHtcbiAgICAvLyBpZiAoIVsnZGF5cycsICd3ZWVrcyddLmluY2x1ZGVzKHRoaXMuc2VsZWN0aW9uVHlwZSkpIHtcbiAgICAvLyAgIHZhbHVlID0gdGhpcy5zZWxlY3Rpb25UeXBlID09PSAnbW9udGgnID8gJ21vbnRocycgOiAneWVhcnMnO1xuICAgIC8vIH1cbiAgICB0aGlzLl92aWV3ID0gdmFsdWU7XG4gICAgdGhpcy5jYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgdmlldzogdmFsdWUgfSk7XG4gIH1cblxuICBnZXQgdmlldygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlldztcbiAgfVxuXG4gIHByaXZhdGUgX3ZpZXc6ICdkYXlzJyB8ICdtb250aHMnIHwgJ3llYXJzJyA9ICdkYXlzJztcblxuICAvKipcbiAgICogU2V0IGxlbmd0aCBvciBmb3JtYXQgb2YgZGF5IG5hbWUuXG4gICAqIEB0eXBlIG51bWJlciB8ICdsb25nJyB8ICduYXJyb3cnIHwgJ3Nob3J0J1xuICAgKiBAZGVmYXVsdCAnc2hvcnQnXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgd2Vla2RheUZvcm1hdCh2YWx1ZTogV2Vla2RheUZvcm1hdFR5cGUpIHtcbiAgICB0aGlzLl93ZWVrZGF5Rm9ybWF0ID0gdmFsdWU7XG4gICAgdGhpcy5jYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgd2Vla2RheUZvcm1hdDogdGhpcy5fd2Vla2RheUZvcm1hdCB9KTtcbiAgfVxuXG4gIGdldCB3ZWVrZGF5Rm9ybWF0KCkge1xuICAgIHJldHVybiB0aGlzLl93ZWVrZGF5Rm9ybWF0O1xuICB9XG5cbiAgcHJpdmF0ZSBfd2Vla2RheUZvcm1hdDogV2Vla2RheUZvcm1hdFR5cGUgPSAnc2hvcnQnO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkYXRlRmlsdGVyKHZhbHVlOiBEYXRlRmlsdGVyVHlwZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IGRhdGVGaWx0ZXI6IHZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIGRheXMgaW4gYWRqYWNlbnQgbW9udGhzIHNob3duIGJlZm9yZSBvciBhZnRlciB0aGUgY3VycmVudCBtb250aCBhcmUgc2VsZWN0YWJsZS4gVGhpcyBvbmx5IGFwcGxpZXMgaWYgdGhlIGBzaG93QWRqYWNlbnREYXlzYCBvcHRpb24gaXMgc2V0IHRvIHRydWUuXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQHNpbmNlIDQuNC4xMFxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHNldCBzZWxlY3RBZGphY2VudERheXModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNhbGVuZGFyU2VydmljZS51cGRhdGUoeyBzZWxlY3RBZGphY2VudERheXM6IHZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIHRvIGRpc3BsYXkgZGF0ZXMgaW4gYWRqYWNlbnQgbW9udGhzIChub24tc2VsZWN0YWJsZSkgYXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGN1cnJlbnQgbW9udGguXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAc2luY2UgNC40LjEwXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgc2V0IHNob3dBZGphY2VudERheXModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNhbGVuZGFyU2VydmljZS51cGRhdGUoeyBzaG93QWRqYWNlbnREYXlzOiB2YWx1ZSA/PyB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHR5cGUgb2YgZGF0ZSBzZWxlY3Rpb24gYXMgZGF5LCB3ZWVrLCBtb250aCwgb3IgeWVhci5cbiAgICogQHR5cGUgJ2RheScgfCAnd2VlaycgfCAnbW9udGgnIHwgJ3llYXInXG4gICAqIEBkZWZhdWx0ICdkYXknXG4gICAqIEBzaW5jZSA1LjAuMFxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IHNlbGVjdGlvblR5cGUodmFsdWU6IFNlbGVjdGlvblR5cGUpIHtcbiAgICB0aGlzLmNhbGVuZGFycyA9IFsnbW9udGgnLCAneWVhciddLmluY2x1ZGVzKHZhbHVlKSA/IDEgOiB0aGlzLmNhbGVuZGFycztcbiAgICB0aGlzLiNzZWxlY3Rpb25UeXBlID0gdmFsdWU7XG4gICAgdGhpcy52aWV3ID0gWydkYXknLCAnd2VlayddLmluY2x1ZGVzKHZhbHVlKSA/ICdkYXlzJyA6IHZhbHVlID09PSAnbW9udGgnID8gJ21vbnRocycgOiAneWVhcnMnO1xuICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IHNlbGVjdGlvblR5cGU6IHZhbHVlLCB2aWV3OiB0aGlzLnZpZXcgfSk7XG4gIH1cblxuICBnZXQgc2VsZWN0aW9uVHlwZSgpOiBTZWxlY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy4jc2VsZWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8vICNzZWxlY3Rpb25UeXBlID0gc2lnbmFsPFNlbGVjdGlvblR5cGU+KCdtb250aCcpO1xuICAjc2VsZWN0aW9uVHlwZSA9ICdkYXknIGFzIFNlbGVjdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIHRvIGRpc3BsYXkgd2VlayBudW1iZXJzIGluIHRoZSBjYWxlbmRhci5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAc2luY2UgNS4wLjBcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBzZXQgc2hvd1dlZWtOdW1iZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLiNzaG93V2Vla051bWJlci5zZXQodmFsdWUpO1xuICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IHNob3dXZWVrTnVtYmVyOiB2YWx1ZSB9KTtcbiAgfVxuXG4gICNzaG93V2Vla051bWJlciA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLyoqXG4gICAqIExhYmVsIGRpc3BsYXllZCBvdmVyIHdlZWsgbnVtYmVycyBpbiB0aGUgY2FsZW5kYXIuXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICogQHNpbmNlIDUuMC4wXG4gICAqL1xuICBASW5wdXQoKSBzZXQgd2Vla051bWJlcnNMYWJlbCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5jYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgd2Vla051bWJlcnNMYWJlbDogdmFsdWUgfSk7XG4gIH1cblxuICBAT3V0cHV0KCkgY2FsZW5kYXJDZWxsSG92ZXI6IEV2ZW50RW1pdHRlcjxEYXRlIHwgbnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCBudWxsPigpO1xuICBAT3V0cHV0KCkgY2FsZW5kYXJEYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG4gIEBPdXRwdXQoKSBlbmREYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RGF0ZSB8IG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlIHwgbnVsbD4oKTtcbiAgQE91dHB1dCgpIHN0YXJ0RGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPERhdGUgfCBudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IG51bGw+KCk7XG4gIEBPdXRwdXQoKSB2aWV3Q2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8vIHVzZWQgd2l0aCBjYWxlbmRhclNlcnZpY2VcbiAgc2V0IGhvdmVyRGF0ZSh2YWx1ZTogRGF0ZSB8IG51bGwpIHtcbiAgICB0aGlzLl9ob3ZlckRhdGUgPSB2YWx1ZTtcbiAgICB0aGlzLmNhbGVuZGFyQ2VsbEhvdmVyLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGhvdmVyRGF0ZSgpOiBEYXRlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2hvdmVyRGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2hvdmVyRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzZXMoKTogYW55IHtcbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlID0gdGhpcy4jc2VsZWN0aW9uVHlwZTtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3O1xuICAgIHJldHVybiB7XG4gICAgICBjYWxlbmRhcnM6IHRydWUsXG4gICAgICBbYHNlbGVjdC0ke3NlbGVjdGlvblR5cGV9YF06IHNlbGVjdGlvblR5cGUgJiYgdmlldyA9PT0gJ2RheXMnLFxuICAgICAgJ3Nob3ctd2Vlay1udW1iZXJzJzogdGhpcy4jc2hvd1dlZWtOdW1iZXIoKVxuICAgIH07XG4gIH1cblxuICBAVmlld0NoaWxkcmVuKENhbGVuZGFyTW9udGhDb21wb25lbnQpIGNhbGVuZGFyTW9udGhzITogUXVlcnlMaXN0PENhbGVuZGFyTW9udGhDb21wb25lbnQ+O1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7XG4gICAgICBsb2NhbGU6IHRoaXMubG9jYWxlID8/ICdkZWZhdWx0JyxcbiAgICAgIHZpZXc6IHRoaXMudmlldyxcbiAgICAgIHJhbmdlOiB0aGlzLnJhbmdlLFxuICAgICAgc2VsZWN0aW9uVHlwZTogdGhpcy5zZWxlY3Rpb25UeXBlXG4gICAgICAvLyBzaG93QWRqYWNlbnREYXlzOiB0aGlzLnNob3dBZGphY2VudERheXMsXG4gICAgICAvLyBzZWxlY3RBZGphY2VudERheXM6IHRoaXMuc2VsZWN0QWRqYWNlbnREYXlzXG4gICAgfSk7XG4gIH1cblxuICBjYWxlbmRhclN0YXRlU3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLmNhbGVuZGFyU3RhdGUkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuI2Rlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc3RhdGUpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAoa2V5IGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgaWYgKHRoaXNba2V5XSAhPT0gc3RhdGVba2V5XSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpc1trZXldID0gc3RhdGVba2V5XTtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdzdGFydERhdGUnKSB7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlQ2hhbmdlLmVtaXQodGhpcy5fc3RhcnREYXRlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ2VuZERhdGUnKSB7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kRGF0ZUNoYW5nZS5lbWl0KHRoaXMuX2VuZERhdGUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldENhbGVuZGFyUGFnZSh5ZWFyczogbnVtYmVyLCBtb250aHMgPSAwLCBzZXRNb250aD86IG51bWJlcikge1xuICAgIGNvbnN0IHllYXIgPSB0aGlzLmNhbGVuZGFyRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jYWxlbmRhckRhdGUuZ2V0TW9udGgoKTtcbiAgICBjb25zdCBkID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xuXG4gICAgeWVhcnMgJiYgZC5zZXRGdWxsWWVhcihkLmdldEZ1bGxZZWFyKCkgKyB5ZWFycyk7XG4gICAgbW9udGhzICYmIGQuc2V0TW9udGgoZC5nZXRNb250aCgpICsgbW9udGhzKTtcbiAgICB0eXBlb2Ygc2V0TW9udGggPT09ICdudW1iZXInICYmIGQuc2V0TW9udGgoc2V0TW9udGgpO1xuXG4gICAgdGhpcy5jYWxlbmRhckRhdGUgPSBkO1xuICB9XG5cbiAgaGFuZGxlTmF2aWdhdGlvbkNsaWNrKGRpcmVjdGlvbjogJ3ByZXYnIHwgJ25leHQnLCB5ZWFycyA9IGZhbHNlKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3ByZXYnKSB7XG4gICAgICBpZiAoeWVhcnMpIHtcbiAgICAgICAgdGhpcy5zZXRDYWxlbmRhclBhZ2UodGhpcy52aWV3ID09PSAneWVhcnMnID8gLTEwIDogLTEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnZpZXcgIT09ICdkYXlzJykge1xuICAgICAgICB0aGlzLnNldENhbGVuZGFyUGFnZSgtMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRDYWxlbmRhclBhZ2UoMCwgLTEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZGlyZWN0aW9uID09PSAnbmV4dCcpIHtcbiAgICAgIGlmICh5ZWFycykge1xuICAgICAgICB0aGlzLnNldENhbGVuZGFyUGFnZSh0aGlzLnZpZXcgPT09ICd5ZWFycycgPyAxMCA6IDEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnZpZXcgIT09ICdkYXlzJykge1xuICAgICAgICB0aGlzLnNldENhbGVuZGFyUGFnZSgxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldENhbGVuZGFyUGFnZSgwLCAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgc3RhcnREYXRlIGFuZCBlbmREYXRlXG4gICAqIEB0eXBlIHZvaWRcbiAgICovXG4gIHB1YmxpYyBjbGVhckRhdGVzKCkge1xuICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IGVuZERhdGU6IG51bGwgfSk7XG4gICAgdGhpcy5jYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgc3RhcnREYXRlOiBudWxsIH0pO1xuICB9XG5cbiAgaGFuZGxlRm9jdXNDaGFuZ2UoJGV2ZW50OiBGb2N1c09yaWdpbikge1xuICAgIGlmICgkZXZlbnQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IGhvdmVyRGF0ZTogbnVsbCB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2V0Q2FsZW5kYXJEYXRlID0gZ2V0Q2FsZW5kYXJEYXRlO1xufVxuIiwiQGZvciAoY2FsZW5kYXIgb2YgY2FsZW5kYXJzQXJyYXk7IHRyYWNrIGNhbGVuZGFyOyBsZXQgaSA9ICRpbmRleCkge1xuICA8ZGl2IFtuZ0NsYXNzXT1cInZpZXcgfCBjYWxlbmRhckNsYXNzVmlld1wiPlxuICAgIDxjLWNhbGVuZGFyLW5hdmlnYXRpb25cbiAgICAgIChuYXZpZ2F0aW9uQ2xpY2spPVwiaGFuZGxlTmF2aWdhdGlvbkNsaWNrKCRldmVudC5kaXJlY3Rpb24sICRldmVudC55ZWFycylcIlxuICAgICAgW2FkZE1vbnRoc109XCJpXCJcbiAgICAgIFtuYXZpZ2F0aW9uXT1cIm5hdmlnYXRpb25cIlxuICAgIC8+XG5cbiAgICA8Yy1jYWxlbmRhci1tb250aFxuICAgICAgW2FkZE1vbnRoc109XCJpXCJcbiAgICAgIFtmaXJzdERheU9mV2Vla109XCJmaXJzdERheU9mV2Vla1wiXG4gICAgICBbd2Vla2RheUZvcm1hdF09XCJ3ZWVrZGF5Rm9ybWF0XCJcbiAgICAgIGNka01vbml0b3JTdWJ0cmVlRm9jdXNcbiAgICAgIChjZGtGb2N1c0NoYW5nZSk9XCJoYW5kbGVGb2N1c0NoYW5nZSgkZXZlbnQpXCJcbiAgICAvPlxuICA8L2Rpdj5cbn1cbiJdfQ==
|
|
378
|
+
args: [{ selector: 'c-calendar', exportAs: 'cCalendar', providers: [CalendarService], standalone: true, imports: [CalendarNavigationComponent, CalendarClassViewPipe, CalendarMonthComponent, NgClass, A11yModule], host: { class: 'calendar', '[class]': 'hostClasses()' }, template: "@for (calendar of calendarsArray(); track calendar; let i = $index) {\n <div [ngClass]=\"view() | calendarClassView\">\n <c-calendar-navigation\n (navigationClick)=\"handleNavigationClick($event.direction, $event.years)\"\n [pageIndex]=\"i\"\n [navigation]=\"navigation()\"\n [ariaNextMonthLabel]=\"ariaNextMonthLabel()\"\n [ariaNextYearLabel]=\"ariaNextYearLabel()\"\n [ariaPrevMonthLabel]=\"ariaPrevMonthLabel()\"\n [ariaPrevYearLabel]=\"ariaPrevYearLabel()\"\n />\n\n <c-calendar-month\n [pageIndex]=\"i\"\n cdkMonitorSubtreeFocus\n (cdkFocusChange)=\"handleFocusChange($event)\"\n />\n </div>\n}\n", styles: [".btn-transparent:focus-visible{outline:-webkit-focus-ring-color auto 1px}\n"] }]
|
|
379
|
+
}] });
|
|
380
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9jYWxlbmRhci9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL2NhbGVuZGFyL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLGVBQWUsRUFFZixNQUFNLEVBQ04sTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFlLE1BQU0sbUJBQW1CLENBQUM7QUFFNUQsT0FBTyxFQUNMLGVBQWUsRUFNaEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDbkcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztBQVluRSxNQUFNLE9BQU8saUJBQWlCO0lBVjlCO1FBV1csZ0JBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakMscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxD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c0JBQXNCLGtIQUFFLE9BQU8sbUZBQUUsVUFBVTs7MkZBRzlGLGlCQUFpQjtrQkFWN0IsU0FBUzsrQkFDRSxZQUFZLFlBR1osV0FBVyxhQUNWLENBQUMsZUFBZSxDQUFDLGNBQ2hCLElBQUksV0FDUCxDQUFDLDJCQUEyQixFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFDcEcsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBib29sZWFuQXR0cmlidXRlLFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBEZXN0cm95UmVmLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIE9uSW5pdCxcbiAgb3V0cHV0LFxuICBzaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEExMXlNb2R1bGUsIEZvY3VzT3JpZ2luIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuXG5pbXBvcnQge1xuICBDYWxlbmRhclNlcnZpY2UsXG4gIERhdGVGaWx0ZXJUeXBlLFxuICBEYXlGb3JtYXRUeXBlLFxuICBEYXlzT2ZXZWVrLFxuICBTZWxlY3Rpb25UeXBlLFxuICBXZWVrZGF5Rm9ybWF0VHlwZVxufSBmcm9tICcuLi9jYWxlbmRhci5zZXJ2aWNlJztcbmltcG9ydCB7IGNvbnZlcnRUb0RhdGVPYmplY3QsIGVxdWFsRGF0ZXMgfSBmcm9tICcuLi9jYWxlbmRhci51dGlscyc7XG5pbXBvcnQgeyBDYWxlbmRhck1vbnRoQ29tcG9uZW50IH0gZnJvbSAnLi4vY2FsZW5kYXItbW9udGgvY2FsZW5kYXItbW9udGguY29tcG9uZW50JztcbmltcG9ydCB7IENhbGVuZGFyTmF2aWdhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2NhbGVuZGFyLW5hdmlnYXRpb24vY2FsZW5kYXItbmF2aWdhdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDbGFzc1ZpZXdQaXBlIH0gZnJvbSAnLi9jYWxlbmRhci1jbGFzcy12aWV3LnBpcGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjLWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXIuY29tcG9uZW50LnNjc3MnXSxcbiAgZXhwb3J0QXM6ICdjQ2FsZW5kYXInLFxuICBwcm92aWRlcnM6IFtDYWxlbmRhclNlcnZpY2VdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ2FsZW5kYXJOYXZpZ2F0aW9uQ29tcG9uZW50LCBDYWxlbmRhckNsYXNzVmlld1BpcGUsIENhbGVuZGFyTW9udGhDb21wb25lbnQsIE5nQ2xhc3MsIEExMXlNb2R1bGVdLFxuICBob3N0OiB7IGNsYXNzOiAnY2FsZW5kYXInLCAnW2NsYXNzXSc6ICdob3N0Q2xhc3NlcygpJyB9XG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgcmVhZG9ubHkgI2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHJlYWRvbmx5ICNjYWxlbmRhclNlcnZpY2UgPSBpbmplY3QoQ2FsZW5kYXJTZXJ2aWNlKTtcblxuICByZWFkb25seSBjYWxlbmRhckRhdGVDaGFuZ2UgPSBvdXRwdXQ8RGF0ZT4oKTtcblxuICAvKipcbiAgICogRGVmYXVsdCBkYXRlIG9mIHRoZSBjb21wb25lbnRcbiAgICogQHR5cGUgIERhdGUgfCBzdHJpbmdcbiAgICovXG4gIHJlYWRvbmx5IGNhbGVuZGFyRGF0ZU1vZGVsID0gbW9kZWw8RGF0ZSB8IG51bWJlciB8IHN0cmluZz4obmV3IERhdGUobmV3IERhdGUoKS5zZXREYXRlKDEpKS5zZXRIb3VycygwLCAwLCAwLCAwKSwge1xuICAgIGFsaWFzOiAnY2FsZW5kYXJEYXRlJ1xuICB9KTtcblxuICByZWFkb25seSBjYWxlbmRhckRhdGUgPSBjb21wdXRlZChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRlID1cbiAgICAgICAgY29udmVydFRvRGF0ZU9iamVjdChcbiAgICAgICAgICB0aGlzLmNhbGVuZGFyRGF0ZU1vZGVsKCkgPz8gdGhpcy5zdGFydERhdGUoKSA/PyBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uVHlwZSgpLFxuICAgICAgICAgICdjYWxlbmRhckRhdGUnXG4gICAgICAgICkgPz8gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IGNhbGVuZGFyRGF0ZSA9IG5ldyBEYXRlKG5ldyBEYXRlKGRhdGUuc2V0RGF0ZSgxKSkuc2V0SG91cnMoMCwgMCwgMCwgMCkpO1xuICAgICAgcmV0dXJuIGNvbnZlcnRUb0RhdGVPYmplY3QoY2FsZW5kYXJEYXRlLCB0aGlzLnNlbGVjdGlvblR5cGUoKSwgJ2NhbGVuZGFyRGF0ZScpO1xuICAgIH0sXG4gICAgeyBlcXVhbDogZXF1YWxEYXRlcyB9XG4gICk7XG5cbiAgcmVhZG9ubHkgY2FsZW5kYXJEYXRlRWZmZWN0ID0gZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIHRoaXMuI2NhbGVuZGFyU2VydmljZS51cGRhdGUoeyBjYWxlbmRhckRhdGU6IHRoaXMuY2FsZW5kYXJEYXRlKCkgfSk7XG4gICAgICB0aGlzLmNhbGVuZGFyRGF0ZUNoYW5nZS5lbWl0KHRoaXMuY2FsZW5kYXJEYXRlKCkpO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICk7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY2FsZW5kYXJzIHRoYXQgcmVuZGVyIG9uIGRlc2t0b3AgZGV2aWNlcy5cbiAgICogQHR5cGUgbnVtYmVyXG4gICAqIGRlZmF1bHQgMVxuICAgKi9cbiAgcmVhZG9ubHkgY2FsZW5kYXJzID0gaW5wdXQoMSwgeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KTtcblxuICByZWFkb25seSBjYWxlbmRhcnNBcnJheSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjYWxlbmRhcnMgPSBbJ21vbnRoJywgJ3llYXInXS5pbmNsdWRlcyh0aGlzLnNlbGVjdGlvblR5cGUoKSkgPyAxIDogdGhpcy5jYWxlbmRhcnMoKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY2FsZW5kYXJzIH0sICh2LCBpKSA9PiBpKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZm9ybWF0IG9mIGRheSBuYW1lLlxuICAgKiBAZGVmYXVsdCAnbnVtZXJpYydcbiAgICogQHR5cGUgRGF5Rm9ybWF0VHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgZGF5Rm9ybWF0ID0gaW5wdXQ8RGF5Rm9ybWF0VHlwZT4oJ251bWVyaWMnKTtcblxuICByZWFkb25seSBkYXlGb3JtYXRFZmZlY3QgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IGRheUZvcm1hdDogdGhpcy5kYXlGb3JtYXQoKSB9KTtcbiAgICB9LFxuICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICApO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSBsaXN0IG9mIGRhdGVzIHRoYXQgY2Fubm90IGJlIHNlbGVjdGVkLlxuICAgKiBAdHlwZSAoRGF0ZSB8IERhdGVbXSlbXVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZWREYXRlcyA9IGlucHV0PChEYXRlW10gfCBEYXRlKVtdPihbXSk7XG5cbiAgcmVhZG9ubHkgZGlzYWJsZWREYXRlc0VmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgZGlzYWJsZWREYXRlczogdGhpcy5kaXNhYmxlZERhdGVzKCkgfSk7XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgKTtcblxuICByZWFkb25seSBlbmREYXRlQ2hhbmdlID0gb3V0cHV0PERhdGUgfCBudWxsPigpO1xuICByZWFkb25seSBzdGFydERhdGVDaGFuZ2UgPSBvdXRwdXQ8RGF0ZSB8IG51bGw+KCk7XG5cbiAgLyoqXG4gICAqIEluaXRpYWwgc2VsZWN0ZWQgZGF0ZS5cbiAgICogQHR5cGUgIChEYXRlIHwgbnVsbClcbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0RGF0ZU1vZGVsID0gbW9kZWw8RGF0ZSB8IG51bWJlciB8IHN0cmluZyB8IG51bGw+KG51bGwsIHsgYWxpYXM6ICdzdGFydERhdGUnIH0pO1xuXG4gIHJlYWRvbmx5IHN0YXJ0RGF0ZSA9IGNvbXB1dGVkKFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLnN0YXJ0RGF0ZU1vZGVsKCkgPz8gbnVsbDtcbiAgICAgIHJldHVybiAhIWRhdGUgPyBjb252ZXJ0VG9EYXRlT2JqZWN0KGRhdGUsIHRoaXMuc2VsZWN0aW9uVHlwZSgpLCAnc3RhcnREYXRlJykgOiBudWxsO1xuICAgIH0sXG4gICAgeyBlcXVhbDogZXF1YWxEYXRlcyB9XG4gICk7XG5cbiAgLyoqXG4gICAqIEluaXRpYWwgc2VsZWN0ZWQgdG8gZGF0ZSAocmFuZ2UpLlxuICAgKiBAdHlwZSBEYXRlIHwgbnVsbFxuICAgKi9cbiAgcmVhZG9ubHkgZW5kRGF0ZU1vZGVsID0gbW9kZWw8RGF0ZSB8IG51bWJlciB8IHN0cmluZyB8IG51bGw+KG51bGwsIHsgYWxpYXM6ICdlbmREYXRlJyB9KTtcblxuICByZWFkb25seSBlbmREYXRlID0gY29tcHV0ZWQoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZW5kRGF0ZU1vZGVsKCkgPz8gbnVsbDtcbiAgICAgIHJldHVybiAhIWRhdGUgJiYgdGhpcy5yYW5nZSgpID8gY29udmVydFRvRGF0ZU9iamVjdChkYXRlLCB0aGlzLnNlbGVjdGlvblR5cGUoKSwgJ2VuZERhdGUnKSA6IG51bGw7XG4gICAgfSxcbiAgICB7IGVxdWFsOiBlcXVhbERhdGVzIH1cbiAgKTtcblxuICByZWFkb25seSBkYXRlc0VmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgc3RhcnREYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpLCBlbmREYXRlOiB0aGlzLmVuZERhdGUoKSB9KTtcbiAgICAgIHRoaXMuc3RhcnREYXRlQ2hhbmdlLmVtaXQodGhpcy5zdGFydERhdGUoKSk7XG4gICAgICB0aGlzLmVuZERhdGVDaGFuZ2UuZW1pdCh0aGlzLmVuZERhdGUoKSk7XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgKTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgZGF5IG9mIHN0YXJ0IHdlZWsuXG4gICAqIC0gMCAtIFN1bmRheSxcbiAgICogLSAxIC0gTW9uZGF5LFxuICAgKiAtIDIgLSBUdWVzZGF5LFxuICAgKiAtIDMgLSBXZWRuZXNkYXksXG4gICAqIC0gNCAtIFRodXJzZGF5LFxuICAgKiAtIDUgLSBGcmlkYXksXG4gICAqIC0gNiAtIFNhdHVyZGF5LFxuICAgKlxuICAgKiBAdHlwZSBudW1iZXJcbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgcmVhZG9ubHkgZmlyc3REYXlPZldlZWsgPSBpbnB1dDxEYXlzT2ZXZWVrPigxKTtcblxuICByZWFkb25seSBmaXJzdERheU9mV2Vla0VmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgZmlyc3REYXlPZldlZWs6IHRoaXMuZmlyc3REYXlPZldlZWsoKSB9KTtcbiAgICB9LFxuICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICApO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkZWZhdWx0IGxvY2FsZSBmb3IgY29tcG9uZW50cy4gSWYgbm90IHNldCwgaXQgaXMgaW5oZXJpdGVkIGZyb20gdGhlIGJyb3dzZXIuXG4gICAqIEBkZWZhdWx0ICdkZWZhdWx0J1xuICAgKi9cbiAgcmVhZG9ubHkgbG9jYWxlID0gaW5wdXQ8c3RyaW5nPignZGVmYXVsdCcpO1xuXG4gIHJlYWRvbmx5IGxvY2FsZUVmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgbG9jYWxlOiB0aGlzLmxvY2FsZSgpIH0pO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICk7XG5cbiAgLyoqXG4gICAqIE1heCBzZWxlY3RhYmxlIGRhdGUuXG4gICAqL1xuICByZWFkb25seSBtYXhEYXRlSW5wdXQgPSBpbnB1dDxEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbD4obnVsbCwgeyBhbGlhczogJ21heERhdGUnIH0pO1xuXG4gIHJlYWRvbmx5IG1heERhdGVFZmZlY3QgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0ZSA9IHRoaXMubWF4RGF0ZUlucHV0KCk7XG4gICAgICBjb25zdCBtYXhEYXRlID0gISFkYXRlID8gY29udmVydFRvRGF0ZU9iamVjdChkYXRlLCB1bmRlZmluZWQsICdtYXhEYXRlJykgOiBudWxsO1xuICAgICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IG1heERhdGU6IG1heERhdGUgfSk7XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgKTtcblxuICAvKipcbiAgICogTWluIHNlbGVjdGFibGUgZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IG1pbkRhdGVJbnB1dCA9IGlucHV0PERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsPihudWxsLCB7IGFsaWFzOiAnbWluRGF0ZScgfSk7XG5cbiAgcmVhZG9ubHkgbWluRGF0ZUVmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5taW5EYXRlSW5wdXQoKTtcbiAgICAgIGNvbnN0IG1pbkRhdGUgPSAhIWRhdGUgPyBjb252ZXJ0VG9EYXRlT2JqZWN0KGRhdGUsIHVuZGVmaW5lZCwgJ21pbkRhdGUnKSA6IG51bGw7XG4gICAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgbWluRGF0ZTogbWluRGF0ZSB9KTtcbiAgICB9LFxuICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICApO1xuXG4gIC8qKlxuICAgKiBTaG93IG5hdmlnYXRpb24uXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICovXG4gIHJlYWRvbmx5IG5hdmlnYXRpb24gPSBpbnB1dCh0cnVlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuICAvKipcbiAgICogUmVvcmRlciB5ZWFyLW1vbnRoIG5hdmlnYXRpb24sIGFuZCByZW5kZXIgeWVhciBmaXJzdC5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgbmF2WWVhckZpcnN0ID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXG4gIHJlYWRvbmx5IG5hdlllYXJGaXJzdEVmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgbmF2WWVhckZpcnN0OiB0aGlzLm5hdlllYXJGaXJzdCgpIH0pO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICk7XG5cbiAgLyoqXG4gICAqIEFsbG93IHJhbmdlIHNlbGVjdGlvbi5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcmFuZ2UgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG5cbiAgcmVhZG9ubHkgcmFuZ2VFZmZlY3QgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IHJhbmdlOiB0aGlzLnJhbmdlKCkgfSk7XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgKTtcblxuICAvKipcbiAgICogU2V0IGNhbGVuZGFyIHZpZXcuXG4gICAqIEB0eXBlICdkYXlzJyB8ICdtb250aHMnIHwgJ3llYXJzJ1xuICAgKiBAZGVmYXVsdCAnZGF5cydcbiAgICovXG4gIHJlYWRvbmx5IHZpZXcgPSBtb2RlbDwnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycyc+KCdkYXlzJyk7XG5cbiAgcmVhZG9ubHkgdmlld0VmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgdmlldzogdGhpcy52aWV3KCkgfSk7XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgKTtcblxuICAvKipcbiAgICogU2V0IGxlbmd0aCBvciBmb3JtYXQgb2YgZGF5IG5hbWUuXG4gICAqIEB0eXBlIG51bWJlciB8ICdsb25nJyB8ICduYXJyb3cnIHwgJ3Nob3J0J1xuICAgKiBAZGVmYXVsdCAnc2hvcnQnXG4gICAqL1xuICByZWFkb25seSB3ZWVrZGF5Rm9ybWF0ID0gaW5wdXQ8V2Vla2RheUZvcm1hdFR5cGU+KCdzaG9ydCcpO1xuXG4gIHJlYWRvbmx5IHdlZWtkYXlGb3JtYXRFZmZlY3QgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IHdlZWtkYXlGb3JtYXQ6IHRoaXMud2Vla2RheUZvcm1hdCgpIH0pO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZUZpbHRlciA9IGlucHV0PERhdGVGaWx0ZXJUeXBlPigpO1xuXG4gIHJlYWRvbmx5IGRhdGVGaWx0ZXJFZmZlY3QgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IGRhdGVGaWx0ZXI6IHRoaXMuZGF0ZUZpbHRlcigpIH0pO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICk7XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIGRheXMgaW4gYWRqYWNlbnQgbW9udGhzIHNob3duIGJlZm9yZSBvciBhZnRlciB0aGUgY3VycmVudCBtb250aCBhcmUgc2VsZWN0YWJsZS4gVGhpcyBvbmx5IGFwcGxpZXMgaWYgdGhlIGBzaG93QWRqYWNlbnREYXlzYCBvcHRpb24gaXMgc2V0IHRvIHRydWUuXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQHNpbmNlIDQuNC4xMFxuICAgKi9cbiAgcmVhZG9ubHkgc2VsZWN0QWRqYWNlbnREYXlzID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXG4gIHJlYWRvbmx5IHNlbGVjdEFkamFjZW50RGF5c0VmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgc2VsZWN0QWRqYWNlbnREYXlzOiB0aGlzLnNlbGVjdEFkamFjZW50RGF5cygpIH0pO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICk7XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIHRvIGRpc3BsYXkgZGF0ZXMgaW4gYWRqYWNlbnQgbW9udGhzIChub24tc2VsZWN0YWJsZSkgYXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGN1cnJlbnQgbW9udGguXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAc2luY2UgNC40LjEwXG4gICAqL1xuICByZWFkb25seSBzaG93QWRqYWNlbnREYXlzID0gaW5wdXQodHJ1ZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG5cbiAgcmVhZG9ubHkgc2hvd0FkamFjZW50RGF5c0VmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgc2hvd0FkamFjZW50RGF5czogdGhpcy5zaG93QWRqYWNlbnREYXlzKCkgfSk7XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgKTtcblxuICAvKipcbiAgICogU3BlY2lmeSB0aGUgdHlwZSBvZiBkYXRlIHNlbGVjdGlvbiBhcyBkYXksIHdlZWssIG1vbnRoLCBvciB5ZWFyLlxuICAgKiBAdHlwZSAnZGF5JyB8ICd3ZWVrJyB8ICdtb250aCcgfCAneWVhcidcbiAgICogQGRlZmF1bHQgJ2RheSdcbiAgICogQHNpbmNlIDUuMC4wXG4gICAqL1xuICByZWFkb25seSBzZWxlY3Rpb25UeXBlID0gaW5wdXQ8U2VsZWN0aW9uVHlwZT4oJ2RheScpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvblR5cGVFZmZlY3QgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uVHlwZSA9IHRoaXMuc2VsZWN0aW9uVHlwZSgpO1xuICAgICAgY29uc3QgdmlldyA9IFsnZGF5JywgJ3dlZWsnXS5pbmNsdWRlcyhzZWxlY3Rpb25UeXBlKSA/ICdkYXlzJyA6IHNlbGVjdGlvblR5cGUgPT09ICdtb250aCcgPyAnbW9udGhzJyA6ICd5ZWFycyc7XG4gICAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgc2VsZWN0aW9uVHlwZTogc2VsZWN0aW9uVHlwZSwgdmlldzogdmlldyB9KTtcbiAgICB9LFxuICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICApO1xuXG4gIC8qKlxuICAgKiBTZXQgd2hldGhlciB0byBkaXNwbGF5IHdlZWsgbnVtYmVycyBpbiB0aGUgY2FsZW5kYXIuXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQHNpbmNlIDUuMC4wXG4gICAqL1xuICByZWFkb25seSBzaG93V2Vla051bWJlciA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcblxuICByZWFkb25seSBzaG93V2Vla051bWJlckVmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgc2hvd1dlZWtOdW1iZXI6IHRoaXMuc2hvd1dlZWtOdW1iZXIoKSB9KTtcbiAgICB9LFxuICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICApO1xuXG4gIC8qKlxuICAgKiBMYWJlbCBkaXNwbGF5ZWQgb3ZlciB3ZWVrIG51bWJlcnMgaW4gdGhlIGNhbGVuZGFyLlxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqIEBzaW5jZSA1LjAuMFxuICAgKi9cbiAgcmVhZG9ubHkgd2Vla051bWJlcnNMYWJlbCA9IGlucHV0PHN0cmluZz4oKTtcblxuICByZWFkb25seSB3ZWVrTnVtYmVyc0xhYmVsRWZmZWN0ID0gZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIHRoaXMuI2NhbGVuZGFyU2VydmljZS51cGRhdGUoeyB3ZWVrTnVtYmVyc0xhYmVsOiB0aGlzLndlZWtOdW1iZXJzTGFiZWwoKSB9KTtcbiAgICB9LFxuICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICApO1xuXG4gIHJlYWRvbmx5IGFyaWFOZXh0TW9udGhMYWJlbCA9IGlucHV0PHN0cmluZz4oJ05leHQgbW9udGgnKTtcbiAgcmVhZG9ubHkgYXJpYU5leHRZZWFyTGFiZWwgPSBpbnB1dDxzdHJpbmc+KCdOZXh0IHllYXInKTtcbiAgcmVhZG9ubHkgYXJpYVByZXZNb250aExhYmVsID0gaW5wdXQ8c3RyaW5nPignUHJldmlvdXMgbW9udGgnKTtcbiAgcmVhZG9ubHkgYXJpYVByZXZZZWFyTGFiZWwgPSBpbnB1dDxzdHJpbmc+KCdQcmV2aW91cyB5ZWFyJyk7XG5cbiAgcmVhZG9ubHkgY2FsZW5kYXJDZWxsSG92ZXIgPSBvdXRwdXQ8RGF0ZSB8IG51bGw+KCk7XG5cbiAgLy8gdXNlZCB3aXRoIGNhbGVuZGFyU2VydmljZVxuICByZWFkb25seSBob3ZlckRhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IGhvdmVyRGF0ZUVmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLmNhbGVuZGFyQ2VsbEhvdmVyLmVtaXQodGhpcy5ob3ZlckRhdGUoKSk7XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgKTtcblxuICByZWFkb25seSBob3N0Q2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlID0gdGhpcy5zZWxlY3Rpb25UeXBlKCk7XG4gICAgY29uc3QgdmlldyA9IHRoaXMudmlldygpO1xuICAgIHJldHVybiB7XG4gICAgICBjYWxlbmRhcnM6IHRydWUsXG4gICAgICBbYHNlbGVjdC0ke3NlbGVjdGlvblR5cGV9YF06IHNlbGVjdGlvblR5cGUgJiYgdmlldyA9PT0gJ2RheXMnLFxuICAgICAgJ3Nob3ctd2Vlay1udW1iZXJzJzogdGhpcy5zaG93V2Vla051bWJlcigpXG4gICAgfSBhcyBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcbiAgfSk7XG5cbiAgLy8gQFZpZXdDaGlsZHJlbihDYWxlbmRhck1vbnRoQ29tcG9uZW50KSBjYWxlbmRhck1vbnRocyE6IFF1ZXJ5TGlzdDxDYWxlbmRhck1vbnRoQ29tcG9uZW50PjtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHtcbiAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUoKSA/PyAnZGVmYXVsdCcsXG4gICAgICB2aWV3OiB0aGlzLnZpZXcoKSxcbiAgICAgIHJhbmdlOiB0aGlzLnJhbmdlKCksXG4gICAgICBzZWxlY3Rpb25UeXBlOiB0aGlzLnNlbGVjdGlvblR5cGUoKVxuICAgICAgLy8gc2hvd0FkamFjZW50RGF5czogdGhpcy5zaG93QWRqYWNlbnREYXlzLFxuICAgICAgLy8gc2VsZWN0QWRqYWNlbnREYXlzOiB0aGlzLnNlbGVjdEFkamFjZW50RGF5c1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jYWxlbmRhclN0YXRlU3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gIH1cblxuICBjYWxlbmRhclN0YXRlU3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgICdkYXRlRmlsdGVyJyxcbiAgICAgICdkYXlGb3JtYXQnLFxuICAgICAgJ2Rpc2FibGVkRGF0ZXMnLFxuICAgICAgJ2ZpcnN0RGF5T2ZXZWVrJyxcbiAgICAgICdsb2NhbGUnLFxuICAgICAgJ21heERhdGUnLFxuICAgICAgJ21pbkRhdGUnLFxuICAgICAgJ25hdlllYXJGaXJzdCcsXG4gICAgICAncmFuZ2UnLFxuICAgICAgJ3NlbGVjdEFkamFjZW50RGF5cycsXG4gICAgICAnc2VsZWN0aW9uVHlwZScsXG4gICAgICAnc2hvd0FkamFjZW50RGF5cycsXG4gICAgICAnc2hvd1dlZWtOdW1iZXInLFxuICAgICAgJ3dlZWtkYXlGb3JtYXQnLFxuICAgICAgJ3dlZWtOdW1iZXJzTGFiZWwnXG4gICAgXTtcbiAgICAvLyBjb25zdCBtb2RlbHMgPSBbJ3N0YXJ0RGF0ZScsICdlbmREYXRlJywgJ2NhbGVuZGFyRGF0ZSddO1xuICAgIHRoaXMuI2NhbGVuZGFyU2VydmljZS5jYWxlbmRhclN0YXRlJC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLiNkZXN0cm95UmVmKSkuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHN0YXRlKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgaWYgKGtleSBpbiB0aGlzKSB7XG4gICAgICAgICAgaWYgKGlucHV0cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gaWYgKG1vZGVscy5pbmNsdWRlcyhrZXkpICYmIHN0YXRlW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vICAgY29uc3QgbW9kZWwgPSBgJHtrZXl9TW9kZWxgO1xuICAgICAgICAgIC8vICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIC8vICAgdGhpc1ttb2RlbF0uc2V0KHN0YXRlW2tleV0pO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgICBpZiAoa2V5ID09PSAnc3RhcnREYXRlJykge1xuICAgICAgICAgICAgdGhpcy5zdGFydERhdGVNb2RlbC5zZXQoc3RhdGVba2V5XSBhcyBEYXRlIHwgbnVsbCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ2VuZERhdGUnKSB7XG4gICAgICAgICAgICB0aGlzLmVuZERhdGVNb2RlbC5zZXQoc3RhdGVba2V5XSBhcyBEYXRlIHwgbnVsbCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ2NhbGVuZGFyRGF0ZScpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJEYXRlTW9kZWwuc2V0KHN0YXRlW2tleV0gYXMgRGF0ZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3ZpZXcnKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcuc2V0KHN0YXRlW2tleV0gYXMgJ2RheXMnIHwgJ21vbnRocycgfCAneWVhcnMnKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdCBpc1dyaXRhYmxlU2lnbmFsID0gdHlwZW9mIHRoaXNba2V5XSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdGhpc1trZXldLnNldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgY29uc3QgaXNSZWFkb25seVNpZ25hbCA9IHR5cGVvZiB0aGlzW2tleV0gPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHRoaXNba2V5XS5zZXQgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBpZiAoaXNXcml0YWJsZVNpZ25hbCAmJiAhaXNSZWFkb25seVNpZ25hbCA/IHRoaXNba2V5XSgpICE9PSBzdGF0ZVtrZXldIDogdGhpc1trZXldICE9PSBzdGF0ZVtrZXldKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpc1dyaXRhYmxlU2lnbmFsID8gdGhpc1trZXldLnNldChzdGF0ZVtrZXldKSA6ICh0aGlzW2tleV0gPSBzdGF0ZVtrZXldKTtcbiAgICAgICAgICAgIC8vIHRoaXNba2V5XSA9IHN0YXRlW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXRDYWxlbmRhclBhZ2UoeWVhcnM6IG51bWJlciwgbW9udGhzID0gMCwgc2V0TW9udGg/OiBudW1iZXIpIHtcbiAgICBjb25zdCBjYWxlbmRhckRhdGUgPSB0aGlzLmNhbGVuZGFyRGF0ZSgpO1xuICAgIGNvbnN0IHllYXIgPSBjYWxlbmRhckRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBtb250aCA9IGNhbGVuZGFyRGF0ZS5nZXRNb250aCgpO1xuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XG5cbiAgICB5ZWFycyAmJiBkLnNldEZ1bGxZZWFyKGQuZ2V0RnVsbFllYXIoKSArIHllYXJzKTtcbiAgICBtb250aHMgJiYgZC5zZXRNb250aChkLmdldE1vbnRoKCkgKyBtb250aHMpO1xuICAgIHR5cGVvZiBzZXRNb250aCA9PT0gJ251bWJlcicgJiYgZC5zZXRNb250aChzZXRNb250aCk7XG5cbiAgICB0aGlzLmNhbGVuZGFyRGF0ZU1vZGVsLnNldChkKTtcbiAgfVxuXG4gIGhhbmRsZU5hdmlnYXRpb25DbGljayhkaXJlY3Rpb246ICdwcmV2JyB8ICduZXh0JywgeWVhcnMgPSBmYWxzZSkge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXcoKTtcbiAgICBpZiAoZGlyZWN0aW9uID09PSAncHJldicpIHtcbiAgICAgIGlmICh5ZWFycykge1xuICAgICAgICB0aGlzLnNldENhbGVuZGFyUGFnZSh2aWV3ID09PSAneWVhcnMnID8gLTEwIDogLTEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh2aWV3ICE9PSAnZGF5cycpIHtcbiAgICAgICAgdGhpcy5zZXRDYWxlbmRhclBhZ2UoLTEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0Q2FsZW5kYXJQYWdlKDAsIC0xKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ25leHQnKSB7XG4gICAgICBpZiAoeWVhcnMpIHtcbiAgICAgICAgdGhpcy5zZXRDYWxlbmRhclBhZ2UodmlldyA9PT0gJ3llYXJzJyA/IDEwIDogMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZpZXcgIT09ICdkYXlzJykge1xuICAgICAgICB0aGlzLnNldENhbGVuZGFyUGFnZSgxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldENhbGVuZGFyUGFnZSgwLCAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgc3RhcnREYXRlIGFuZCBlbmREYXRlXG4gICAqIEB0eXBlIHZvaWRcbiAgICovXG4gIHB1YmxpYyBjbGVhckRhdGVzKCkge1xuICAgIHRoaXMuI2NhbGVuZGFyU2VydmljZS51cGRhdGUoeyBzdGFydERhdGU6IG51bGwsIGVuZERhdGU6IG51bGwgfSk7XG4gIH1cblxuICBoYW5kbGVGb2N1c0NoYW5nZSgkZXZlbnQ6IEZvY3VzT3JpZ2luKSB7XG4gICAgaWYgKCRldmVudCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IGhvdmVyRGF0ZTogbnVsbCB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIkBmb3IgKGNhbGVuZGFyIG9mIGNhbGVuZGFyc0FycmF5KCk7IHRyYWNrIGNhbGVuZGFyOyBsZXQgaSA9ICRpbmRleCkge1xuICA8ZGl2IFtuZ0NsYXNzXT1cInZpZXcoKSB8IGNhbGVuZGFyQ2xhc3NWaWV3XCI+XG4gICAgPGMtY2FsZW5kYXItbmF2aWdhdGlvblxuICAgICAgKG5hdmlnYXRpb25DbGljayk9XCJoYW5kbGVOYXZpZ2F0aW9uQ2xpY2soJGV2ZW50LmRpcmVjdGlvbiwgJGV2ZW50LnllYXJzKVwiXG4gICAgICBbcGFnZUluZGV4XT1cImlcIlxuICAgICAgW25hdmlnYXRpb25dPVwibmF2aWdhdGlvbigpXCJcbiAgICAgIFthcmlhTmV4dE1vbnRoTGFiZWxdPVwiYXJpYU5leHRNb250aExhYmVsKClcIlxuICAgICAgW2FyaWFOZXh0WWVhckxhYmVsXT1cImFyaWFOZXh0WWVhckxhYmVsKClcIlxuICAgICAgW2FyaWFQcmV2TW9udGhMYWJlbF09XCJhcmlhUHJldk1vbnRoTGFiZWwoKVwiXG4gICAgICBbYXJpYVByZXZZZWFyTGFiZWxdPVwiYXJpYVByZXZZZWFyTGFiZWwoKVwiXG4gICAgLz5cblxuICAgIDxjLWNhbGVuZGFyLW1vbnRoXG4gICAgICBbcGFnZUluZGV4XT1cImlcIlxuICAgICAgY2RrTW9uaXRvclN1YnRyZWVGb2N1c1xuICAgICAgKGNka0ZvY3VzQ2hhbmdlKT1cImhhbmRsZUZvY3VzQ2hhbmdlKCRldmVudClcIlxuICAgIC8+XG4gIDwvZGl2PlxufVxuIl19
|