@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.
Files changed (90) hide show
  1. package/README.md +1 -13
  2. package/calendar/calendar.component.d.ts +58 -122
  3. package/calendar/models/calendar-date.model.d.ts +10 -0
  4. package/calendar/models/calendar-month.model.d.ts +7 -0
  5. package/calendar/models/calendar-selected.model.d.ts +5 -0
  6. package/calendar/models/calendar-year.model.d.ts +6 -0
  7. package/calendar/models/date-range.model.d.ts +0 -4
  8. package/calendar/models/enums/calendar-view.enum.d.ts +5 -0
  9. package/calendar/models/public-api.d.ts +5 -0
  10. package/calendar/upd-calendar.module.d.ts +6 -11
  11. package/card/public-api.d.ts +1 -0
  12. package/card/types/public-api.d.ts +5 -0
  13. package/dropdown/dropdown.component.d.ts +3 -0
  14. package/esm2022/calendar/calendar.component.mjs +288 -217
  15. package/esm2022/calendar/models/calendar-date.model.mjs +2 -0
  16. package/esm2022/calendar/models/calendar-month.model.mjs +2 -0
  17. package/esm2022/calendar/models/calendar-selected.model.mjs +2 -0
  18. package/esm2022/calendar/models/calendar-year.model.mjs +2 -0
  19. package/esm2022/calendar/models/date-range.model.mjs +1 -1
  20. package/esm2022/calendar/models/enums/calendar-view.enum.mjs +7 -0
  21. package/esm2022/calendar/models/public-api.mjs +6 -1
  22. package/esm2022/calendar/upd-calendar.module.mjs +2 -20
  23. package/esm2022/card/public-api.mjs +2 -1
  24. package/esm2022/card/types/public-api.mjs +6 -0
  25. package/esm2022/dropdown/dropdown.component.mjs +23 -7
  26. package/esm2022/form-controls/date-picker/date-picker.component.mjs +45 -60
  27. package/esm2022/form-controls/input/input.component.mjs +3 -3
  28. package/esm2022/popover/popover.directive.mjs +10 -26
  29. package/esm2022/pricing-cards/index.mjs +2 -0
  30. package/esm2022/pricing-cards/models/price-item-feature.model.mjs +2 -0
  31. package/esm2022/pricing-cards/models/price-item-features-group.model.mjs +2 -0
  32. package/esm2022/pricing-cards/models/price-item.model.mjs +2 -0
  33. package/esm2022/pricing-cards/models/public-api.mjs +4 -0
  34. package/esm2022/pricing-cards/pricing-cards.component.mjs +24 -0
  35. package/esm2022/pricing-cards/public-api.mjs +4 -0
  36. package/esm2022/pricing-cards/upd-pricing-cards.module.mjs +36 -0
  37. package/esm2022/pricing-cards/updevs-components-pricing-cards.mjs +5 -0
  38. package/esm2022/table/abstractions/base.column.mjs +30 -44
  39. package/esm2022/table/table.component.mjs +9 -12
  40. package/fesm2022/updevs-components-calendar.mjs +319 -1449
  41. package/fesm2022/updevs-components-calendar.mjs.map +1 -1
  42. package/fesm2022/updevs-components-dropdown.mjs +22 -6
  43. package/fesm2022/updevs-components-dropdown.mjs.map +1 -1
  44. package/fesm2022/updevs-components-form-controls-date-picker.mjs +44 -59
  45. package/fesm2022/updevs-components-form-controls-date-picker.mjs.map +1 -1
  46. package/fesm2022/updevs-components-form-controls-input.mjs +2 -2
  47. package/fesm2022/updevs-components-form-controls-input.mjs.map +1 -1
  48. package/fesm2022/updevs-components-popover.mjs +9 -25
  49. package/fesm2022/updevs-components-popover.mjs.map +1 -1
  50. package/fesm2022/updevs-components-pricing-cards.mjs +64 -0
  51. package/fesm2022/updevs-components-pricing-cards.mjs.map +1 -0
  52. package/fesm2022/updevs-components-table.mjs +38 -55
  53. package/fesm2022/updevs-components-table.mjs.map +1 -1
  54. package/form-controls/date-picker/date-picker.component.d.ts +10 -31
  55. package/package.json +37 -31
  56. package/pricing-cards/index.d.ts +1 -0
  57. package/pricing-cards/models/price-item-feature.model.d.ts +5 -0
  58. package/pricing-cards/models/price-item-features-group.model.d.ts +5 -0
  59. package/pricing-cards/models/price-item.model.d.ts +19 -0
  60. package/pricing-cards/models/public-api.d.ts +3 -0
  61. package/pricing-cards/pricing-cards.component.d.ts +11 -0
  62. package/pricing-cards/public-api.d.ts +3 -0
  63. package/pricing-cards/upd-pricing-cards.module.d.ts +11 -0
  64. package/table/abstractions/base.column.d.ts +4 -0
  65. package/calendar/components/calendar-body/calendar-body.component.d.ts +0 -263
  66. package/calendar/components/calendar-header/calendar-header.component.d.ts +0 -57
  67. package/calendar/components/calendar-month-view/calendar-month-view.component.d.ts +0 -151
  68. package/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +0 -10
  69. package/calendar/components/calendar-year-view/calendar-year-view.component.d.ts +0 -9
  70. package/calendar/models/calendar-cell.model.d.ts +0 -16
  71. package/calendar/services/calendar.service.d.ts +0 -15
  72. package/calendar/tools/events-options.d.ts +0 -12
  73. package/calendar/tools/keyboard-tools.d.ts +0 -9
  74. package/calendar/tools/passive-listeners.d.ts +0 -16
  75. package/calendar/types/calendar-cell-class-function.type.d.ts +0 -3
  76. package/calendar/types/calendar-cell-css-classes.type.d.ts +0 -3
  77. package/calendar/types/modifier-key.type.d.ts +0 -1
  78. package/esm2022/calendar/components/calendar-body/calendar-body.component.mjs +0 -515
  79. package/esm2022/calendar/components/calendar-header/calendar-header.component.mjs +0 -144
  80. package/esm2022/calendar/components/calendar-month-view/calendar-month-view.component.mjs +0 -423
  81. package/esm2022/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -18
  82. package/esm2022/calendar/components/calendar-year-view/calendar-year-view.component.mjs +0 -17
  83. package/esm2022/calendar/models/calendar-cell.model.mjs +0 -18
  84. package/esm2022/calendar/services/calendar.service.mjs +0 -40
  85. package/esm2022/calendar/tools/events-options.mjs +0 -14
  86. package/esm2022/calendar/tools/keyboard-tools.mjs +0 -14
  87. package/esm2022/calendar/tools/passive-listeners.mjs +0 -29
  88. package/esm2022/calendar/types/calendar-cell-class-function.type.mjs +0 -2
  89. package/esm2022/calendar/types/calendar-cell-css-classes.type.mjs +0 -2
  90. package/esm2022/calendar/types/modifier-key.type.mjs +0 -2
@@ -1,423 +0,0 @@
1
- import { ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild, effect, inject } from '@angular/core';
2
- import { DateService } from '@updevs/sdk/core';
3
- import { BaseComponent } from '@updevs/sdk/layout';
4
- import { TranslocoService } from '@jsverse/transloco';
5
- import { startWith } from 'rxjs';
6
- import { CalendarBodyComponent } from '../calendar-body/calendar-body.component';
7
- import { DateRangeModel } from '../../models/date-range.model';
8
- import { CalendarCellModel } from '../../models/calendar-cell.model';
9
- import { KeyboardTools } from '../../tools/keyboard-tools';
10
- import { CalendarRangeStrategyService } from '../../services/calendar-range-strategy.service';
11
- import { CalendarSignalsService } from '../../services/calendar-signals.service';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "../calendar-header/calendar-header.component";
14
- import * as i2 from "../calendar-body/calendar-body.component";
15
- const daysPerWeek = 7;
16
- let uniqueIdCounter = 0;
17
- export class CalendarMonthViewComponent extends BaseComponent {
18
- /**
19
- * The date to display in this month view (everything other than the month and year is ignored).
20
- */
21
- get activeDate() {
22
- return this.calendarSignalsService.activeDate();
23
- }
24
- set activeDate(value) {
25
- this.updateActiveDate(value);
26
- }
27
- /** The currently selected date. */
28
- get selected() {
29
- return this.calendarSignalsService.selectedDate();
30
- }
31
- set selected(value) {
32
- let currValue;
33
- if (value instanceof DateRangeModel) {
34
- currValue = value;
35
- }
36
- else {
37
- currValue = this.dateService.getValidOrUndefined(this.dateService.deserialize(value));
38
- }
39
- this.calendarSignalsService.selectedDate = currValue;
40
- this.setRanges(currValue);
41
- }
42
- /** The minimum selectable date. */
43
- get minDate() {
44
- return this._minDate;
45
- }
46
- set minDate(value) {
47
- this._minDate = this.dateService.getValidOrUndefined(this.dateService.deserialize(value));
48
- }
49
- /** The maximum selectable date. */
50
- get maxDate() {
51
- return this._maxDate;
52
- }
53
- set maxDate(value) {
54
- this._maxDate = this.dateService.getValidOrUndefined(this.dateService.deserialize(value));
55
- }
56
- constructor() {
57
- super();
58
- /**
59
- * First day of week.
60
- * Zero-based starting from Sunday.
61
- * Default: 0 - Sunday.
62
- */
63
- this.firstDayOfWeek = 0;
64
- /** Whether the user is currently selecting a range of dates. */
65
- this.isRange = false;
66
- /** Emits when a new date is selected. */
67
- this.selectedChange = new EventEmitter();
68
- /** Emits when any date is selected. */
69
- this.userSelection = new EventEmitter();
70
- /** Emits when the user initiates a date range drag via mouse or touch. */
71
- this.dragStarted = new EventEmitter();
72
- /**
73
- * Emits when the user completes or cancels a date range drag.
74
- * Emits null when the drag was canceled or the newly selected date range if completed.
75
- */
76
- this.dragEnded = new EventEmitter();
77
- /** Emits when any date is activated. */
78
- this.activeDateChange = new EventEmitter();
79
- /** Grid of calendar cells representing the dates of the month. */
80
- this.weeks = [];
81
- /** The number of blank cells in the first row before the 1st of the month. */
82
- this.firstWeekOffset = 0;
83
- /** The names of the weekdays. */
84
- this.weekdays = [];
85
- /** Flag used to filter out space/enter keyup events that originated outside of the view. */
86
- this._selectionKeyPressed = false;
87
- this.translocoService = inject(TranslocoService);
88
- this.changeDetectorRef = inject(ChangeDetectorRef);
89
- this.dateService = inject(DateService);
90
- this.calendarSignalsService = inject(CalendarSignalsService);
91
- this.calendarRangeStrategy = inject(CalendarRangeStrategyService);
92
- effect(() => this.updateActiveDate(this.calendarSignalsService.activeDate(), true));
93
- }
94
- ngAfterContentInit() {
95
- const langSub = this.translocoService.langChanges$
96
- .pipe(startWith(undefined))
97
- .subscribe(() => this.init());
98
- this.addSubscriptions(langSub);
99
- }
100
- ngOnChanges(changes) {
101
- const comparisonChange = changes['comparisonStart'] || changes['comparisonEnd'];
102
- if (comparisonChange && !comparisonChange.firstChange) {
103
- this.setRanges(this.selected);
104
- }
105
- if (changes['activeDrag'] && !this.activeDrag) {
106
- this.clearPreview();
107
- }
108
- }
109
- /** Handles when a new date is selected. */
110
- dateSelected(event) {
111
- const date = event.value;
112
- const selectedDate = this.getDateFromDayOfMonth(date);
113
- const currSelection = this.calendarSignalsService.selectedDate();
114
- let rangeStartDate;
115
- let rangeEndDate;
116
- if (currSelection instanceof DateRangeModel) {
117
- rangeStartDate = this.getDateInCurrentMonth(currSelection.start);
118
- rangeEndDate = this.getDateInCurrentMonth(currSelection.end);
119
- }
120
- else {
121
- rangeStartDate = rangeEndDate = this.getDateInCurrentMonth(currSelection);
122
- }
123
- if (rangeStartDate !== date || rangeEndDate !== date) {
124
- this.calendarSignalsService.selectedDate = selectedDate;
125
- }
126
- this.userSelection.emit({ value: selectedDate, event: event.event });
127
- this.clearPreview();
128
- this.changeDetectorRef.markForCheck();
129
- }
130
- /** Handles keydown events on the calendar body when calendar is in month view. */
131
- handleCalendarBodyKeydown(event) {
132
- // TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent
133
- // disabled ones from being selected. This may not be ideal, we should look into whether
134
- // navigation should skip over disabled dates, and if so, how to implement that efficiently.
135
- const oldActiveDate = this.activeDate;
136
- let tempActiveDate;
137
- switch (event.key) {
138
- case 'LEFT_ARROW':
139
- tempActiveDate = this.dateService.addDays(this.activeDate, -1);
140
- break;
141
- case 'RIGHT_ARROW':
142
- tempActiveDate = this.dateService.addDays(this.activeDate, 1);
143
- break;
144
- case 'UP_ARROW':
145
- tempActiveDate = this.dateService.addDays(this.activeDate, -7);
146
- break;
147
- case 'DOWN_ARROW':
148
- tempActiveDate = this.dateService.addDays(this.activeDate, 7);
149
- break;
150
- case 'HOME':
151
- tempActiveDate = this.dateService.addDays(this.activeDate, 1 - this.activeDate.getDate());
152
- break;
153
- case 'END':
154
- tempActiveDate = this.dateService.addDays(this.activeDate, this.dateService.getNumDaysInMonth(this.activeDate) -
155
- this.activeDate.getDate());
156
- break;
157
- case 'PAGE_UP':
158
- tempActiveDate = event.altKey
159
- ? this.dateService.addYears(this.activeDate, -1)
160
- : this.dateService.addMonths(this.activeDate, -1);
161
- break;
162
- case 'PAGE_DOWN':
163
- tempActiveDate = event.altKey
164
- ? this.dateService.addYears(this.activeDate, 1)
165
- : this.dateService.addMonths(this.activeDate, 1);
166
- break;
167
- case 'ENTER':
168
- case 'SPACE':
169
- this._selectionKeyPressed = true;
170
- if (this.canSelect(this.activeDate)) {
171
- // Prevent unexpected default actions such as form submission.
172
- // Note that we only prevent the default action here while the selection happens in
173
- // `keyup` below. We can't do the selection here, because it can cause the calendar to
174
- // reopen if focus is restored immediately. We also can't call `preventDefault` on `keyup`
175
- // because it's too late (see #23305).
176
- event.preventDefault();
177
- }
178
- return;
179
- case 'ESCAPE':
180
- // Abort the current range selection if the user presses escape mid-selection.
181
- if (this.previewEnd !== undefined && !KeyboardTools.hasModifierKey(event)) {
182
- this.clearPreview();
183
- // If a drag is in progress, cancel the drag without changing the
184
- // current selection.
185
- if (this.activeDrag) {
186
- this.dragEnded.emit({ value: undefined, event });
187
- }
188
- else {
189
- this.selectedChange.emit(undefined);
190
- this.userSelection.emit({ value: undefined, event });
191
- }
192
- event.preventDefault();
193
- event.stopPropagation(); // Prevents the overlay from closing.
194
- }
195
- return;
196
- default:
197
- // Don't prevent default or focus active cell on keys that we don't explicitly handle.
198
- return;
199
- }
200
- if (this.dateService.compare(oldActiveDate, this.activeDate)) {
201
- this.calendarSignalsService.activeDate = tempActiveDate;
202
- this.focusActiveCellAfterViewChecked();
203
- }
204
- // Prevent unexpected default actions such as form submission.
205
- event.preventDefault();
206
- }
207
- /** Handles keyup events on the calendar body when calendar is in month view. */
208
- handleCalendarBodyKeyup(event) {
209
- if (event.key === 'SPACE' || event.key === 'ENTER') {
210
- if (this._selectionKeyPressed && this.canSelect(this.activeDate)) {
211
- this.dateSelected({ value: this.activeDate.getDate(), event });
212
- }
213
- this._selectionKeyPressed = false;
214
- }
215
- }
216
- /** Initializes this month view. */
217
- init() {
218
- this.setRanges(this.selected);
219
- this.todayDate = this.getCellCompareValue(new Date());
220
- this.monthLabel = this.dateService.getMonthNames('short')[this.activeDate.getMonth()].toLocaleUpperCase();
221
- const firstOfMonth = this.dateService.create(this.activeDate.getFullYear(), this.activeDate.getMonth(), 1);
222
- this.firstWeekOffset = (daysPerWeek + firstOfMonth.getDay() - this.firstDayOfWeek) % daysPerWeek;
223
- this.initWeekdays();
224
- this.createWeekCells();
225
- this.changeDetectorRef.markForCheck();
226
- }
227
- /** Focuses the active cell after the microtask queue is empty. */
228
- focusActiveCell(movePreview) {
229
- this._matCalendarBody.focusActiveCell(movePreview);
230
- }
231
- /** Focuses the active cell after change detection has run and the microtask queue is empty. */
232
- focusActiveCellAfterViewChecked() {
233
- this._matCalendarBody.scheduleFocusActiveCellAfterViewChecked();
234
- }
235
- /** Called when the user has activated a new cell and the preview needs to be updated. */
236
- previewChanged({ value: cell }) {
237
- if (!this.selected) {
238
- return;
239
- }
240
- if (this.isRange && !(this.selected instanceof DateRangeModel)) {
241
- this.selected = new DateRangeModel(this.selected);
242
- }
243
- // We can assume that this will be a range, because preview
244
- // events aren't fired for single date selections.
245
- const value = cell ? cell.rawValue : undefined;
246
- const previewRange = this.calendarRangeStrategy.createPreview(value, this.selected);
247
- this.previewStart = this.getCellCompareValue(previewRange.start);
248
- this.previewEnd = this.getCellCompareValue(previewRange.end);
249
- if (!!this.activeDrag && !!value) {
250
- const dragRange = this.calendarRangeStrategy.createDrag?.(this.activeDrag.value, this.selected, value);
251
- if (!!dragRange) {
252
- this.previewStart = this.getCellCompareValue(dragRange.start);
253
- this.previewEnd = this.getCellCompareValue(dragRange.end);
254
- }
255
- }
256
- // Note that here we need to use `detectChanges`, rather than `markForCheck`, because
257
- // the way `_focusActiveCell` is set up at the moment makes it fire at the wrong time
258
- // when navigating one month back using the keyboard which will cause this handler
259
- // to throw a "changed after checked" error when updating the preview state.
260
- this.changeDetectorRef.detectChanges();
261
- }
262
- /**
263
- * Called when the user has ended a drag. If the drag/drop was successful,
264
- * computes and emits the new range selection.
265
- */
266
- _dragEnded(event) {
267
- if (!this.activeDrag) {
268
- return;
269
- }
270
- if (event.value) {
271
- // Propagate drag effect
272
- const dragDropResult = this.calendarRangeStrategy?.createDrag?.(this.activeDrag.value, this.selected, event.value);
273
- this.dragEnded.emit({ value: dragDropResult ?? undefined, event: event.event });
274
- }
275
- else {
276
- this.dragEnded.emit({ value: undefined, event: event.event });
277
- }
278
- }
279
- updateActiveDate(value, isFromEffect = false) {
280
- this.oldActiveDate = this.oldActiveDate || value;
281
- const validDate = this.dateService.getValidOrUndefined(this.dateService.deserialize(value)) || new Date();
282
- if (!isFromEffect) {
283
- this.calendarSignalsService.activeDate = this.dateService.clamp(validDate, this.minDate, this.maxDate);
284
- }
285
- if (!this.isSameMonthAndYearAsActiveDate(this.oldActiveDate, this.calendarSignalsService.activeDate())) {
286
- this.init();
287
- }
288
- this.oldActiveDate = value;
289
- this.activeDateChange.emit(this.calendarSignalsService.activeDate());
290
- }
291
- /**
292
- * Takes a day of the month and returns a new date in the same month and year as the currently
293
- * active date. The returned date will have the same day of the month as the argument date.
294
- */
295
- getDateFromDayOfMonth(dayOfMonth) {
296
- return this.dateService.create(this.activeDate.getFullYear(), this.activeDate.getMonth(), dayOfMonth);
297
- }
298
- /** Initializes the weekdays. */
299
- initWeekdays() {
300
- const firstDayOfWeek = this.firstDayOfWeek;
301
- const narrowWeekdays = this.dateService.getDayOfWeekNames('narrow');
302
- const longWeekdays = this.dateService.getDayOfWeekNames('long');
303
- // Rotate the labels for days of the week based on the configured first day of the week.
304
- const weekdays = longWeekdays.map((long, i) => ({ long, narrow: narrowWeekdays[i], id: uniqueIdCounter++ }));
305
- this.weekdays = weekdays.slice(firstDayOfWeek).concat(weekdays.slice(0, firstDayOfWeek));
306
- }
307
- /** Creates MatCalendarCells for the dates in this month. */
308
- createWeekCells() {
309
- const daysInMonth = this.dateService.getNumDaysInMonth(this.activeDate);
310
- const dateNames = this.dateService.getDateNames();
311
- this.weeks = [[]];
312
- for (let i = 0, cell = this.firstWeekOffset; i < daysInMonth; i++, cell++) {
313
- if (cell === daysPerWeek) {
314
- this.weeks.push([]);
315
- cell = 0;
316
- }
317
- const date = this.dateService.create(this.activeDate.getFullYear(), this.activeDate.getMonth(), i + 1);
318
- const isEnabled = this.shouldEnableDate(date);
319
- const ariaLabel = this.dateService.format(date, { year: 'numeric', month: 'long', day: 'numeric' });
320
- const cellClasses = this.dateClass ? this.dateClass(date, 'month') : undefined;
321
- this.weeks[this.weeks.length - 1].push(new CalendarCellModel(i + 1, dateNames[i], ariaLabel, isEnabled, cellClasses, this.getCellCompareValue(date), date));
322
- }
323
- }
324
- /** Date filter for the month */
325
- shouldEnableDate(date) {
326
- return !!date &&
327
- (!this.minDate || this.dateService.compare(date, this.minDate) >= 0) &&
328
- (!this.maxDate || this.dateService.compare(date, this.maxDate) <= 0) &&
329
- (!this.dateFilter || this.dateFilter(date));
330
- }
331
- /**
332
- * Gets the date in this month that the given Date falls on.
333
- * Returns null if the given Date is in another month.
334
- */
335
- getDateInCurrentMonth(date) {
336
- return !!date && this.isSameMonthAndYearAsActiveDate(date, this.calendarSignalsService.activeDate())
337
- ? date.getDate()
338
- : undefined;
339
- }
340
- /** Checks whether the 2 dates are non-null and fall within the same month of the same year. */
341
- isSameMonthAndYearAsActiveDate(d1, d2) {
342
- return (!!d1 && !!d2 && d1.getMonth() === d2.getMonth() && d1.getFullYear() === d2.getFullYear());
343
- }
344
- /** Gets the value that will be used to one cell to another. */
345
- getCellCompareValue(date) {
346
- if (!!date) {
347
- // We use the time since the Unix epoch to compare dates in this view, rather than the
348
- // cell values, because we need to support ranges that span across multiple months/years.
349
- const year = date.getFullYear();
350
- const month = date.getMonth();
351
- const day = date.getDate();
352
- return new Date(year, month, day).getTime();
353
- }
354
- return undefined;
355
- }
356
- /** Sets the current range based on a model value. */
357
- setRanges(selectedValue) {
358
- if (selectedValue instanceof DateRangeModel) {
359
- this.rangeStart = this.getCellCompareValue(selectedValue.start);
360
- this.rangeEnd = this.getCellCompareValue(selectedValue.end);
361
- this.isRange = true;
362
- }
363
- else {
364
- this.rangeStart = this.rangeEnd = this.getCellCompareValue(selectedValue);
365
- }
366
- this.comparisonRangeStart = this.getCellCompareValue(this.comparisonStart);
367
- this.comparisonRangeEnd = this.getCellCompareValue(this.comparisonEnd);
368
- }
369
- /** Gets whether a date can be selected in the month view. */
370
- canSelect(date) {
371
- return !this.dateFilter || this.dateFilter(date);
372
- }
373
- /** Clears out preview state. */
374
- clearPreview() {
375
- this.previewStart = this.previewEnd = undefined;
376
- }
377
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarMonthViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
378
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: CalendarMonthViewComponent, selector: "upd-calendar-month-view", inputs: { activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate", dateFilter: "dateFilter", dateClass: "dateClass", comparisonStart: "comparisonStart", comparisonEnd: "comparisonEnd", startDateAccessibleName: "startDateAccessibleName", endDateAccessibleName: "endDateAccessibleName", firstDayOfWeek: "firstDayOfWeek", activeDrag: "activeDrag", isRange: "isRange" }, outputs: { selectedChange: "selectedChange", userSelection: "userSelection", dragStarted: "dragStarted", dragEnded: "dragEnded", activeDateChange: "activeDateChange" }, viewQueries: [{ propertyName: "_matCalendarBody", first: true, predicate: CalendarBodyComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<upd-calendar-header></upd-calendar-header>\n<div class=\"container mt-2\">\n <div class=\"row seven-cols\">\n @for (day of weekdays; track day.id) {\n <div class=\"col-1 p-1 d-flex justify-content-center align-items-center\">\n <span class=\"visually-hidden\">{{ day.long }}</span>\n <span aria-hidden=\"true\">{{ day.narrow }}</span>\n </div>\n }\n </div>\n</div>\n<upd-calendar-body [label]=\"monthLabel\" [rows]=\"weeks\" [todayValue]=\"todayDate!\" [startValue]=\"rangeStart!\"\n [endValue]=\"rangeEnd!\" [comparisonStart]=\"comparisonRangeStart\" [comparisonEnd]=\"comparisonRangeEnd\"\n [previewStart]=\"previewStart\" [previewEnd]=\"previewEnd\" [isRange]=\"isRange\" [labelMinRequiredCells]=\"3\"\n [activeCell]=\"activeDate.getDate() - 1\" [startDateAccessibleName]=\"startDateAccessibleName\"\n [endDateAccessibleName]=\"endDateAccessibleName\" (selectedValueChange)=\"dateSelected($event)\"\n (previewChange)=\"previewChanged($event)\" (dragStarted)=\"dragStarted.emit($event)\" (dragEnded)=\"_dragEnded($event)\"\n (keyup)=\"handleCalendarBodyKeyup($event)\" (keydown)=\"handleCalendarBodyKeydown($event)\">\n</upd-calendar-body>\n", styles: ["@media (min-width: 768px){.seven-cols .col-1{width:100%}.seven-cols .col-6{width:85.7142857143%}}@media (min-width: 992px){.seven-cols .col-1{width:14.2857142857%}.seven-cols .col-2{width:28.5714285714%}.seven-cols .col-3{width:42.8571428571%}.seven-cols .col-4{width:57.1428571429%}.seven-cols .col-5{width:71.4285714286%}.seven-cols .col-6{width:85.7142857143%}.seven-cols .col-7{width:100%}}@media (min-width: 1200px){.seven-cols .col-1{width:14.2857142857%}.seven-cols .col-2{width:28.5714285714%}.seven-cols .col-3{width:42.8571428571%}.seven-cols .col-4{width:57.1428571429%}.seven-cols .col-5{width:71.4285714286%}.seven-cols .col-6{width:85.7142857143%}.seven-cols .col-7{width:100%}}\n"], dependencies: [{ kind: "component", type: i1.CalendarHeaderComponent, selector: "upd-calendar-header" }, { kind: "component", type: i2.CalendarBodyComponent, selector: "upd-calendar-body", inputs: ["label", "rows", "todayValue", "startValue", "endValue", "labelMinRequiredCells", "numCols", "activeCell", "isRange", "cellAspectRatio", "comparisonStart", "comparisonEnd", "previewStart", "previewEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedValueChange", "previewChange", "dragStarted", "dragEnded"] }] }); }
379
- }
380
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarMonthViewComponent, decorators: [{
381
- type: Component,
382
- args: [{ selector: 'upd-calendar-month-view', template: "<upd-calendar-header></upd-calendar-header>\n<div class=\"container mt-2\">\n <div class=\"row seven-cols\">\n @for (day of weekdays; track day.id) {\n <div class=\"col-1 p-1 d-flex justify-content-center align-items-center\">\n <span class=\"visually-hidden\">{{ day.long }}</span>\n <span aria-hidden=\"true\">{{ day.narrow }}</span>\n </div>\n }\n </div>\n</div>\n<upd-calendar-body [label]=\"monthLabel\" [rows]=\"weeks\" [todayValue]=\"todayDate!\" [startValue]=\"rangeStart!\"\n [endValue]=\"rangeEnd!\" [comparisonStart]=\"comparisonRangeStart\" [comparisonEnd]=\"comparisonRangeEnd\"\n [previewStart]=\"previewStart\" [previewEnd]=\"previewEnd\" [isRange]=\"isRange\" [labelMinRequiredCells]=\"3\"\n [activeCell]=\"activeDate.getDate() - 1\" [startDateAccessibleName]=\"startDateAccessibleName\"\n [endDateAccessibleName]=\"endDateAccessibleName\" (selectedValueChange)=\"dateSelected($event)\"\n (previewChange)=\"previewChanged($event)\" (dragStarted)=\"dragStarted.emit($event)\" (dragEnded)=\"_dragEnded($event)\"\n (keyup)=\"handleCalendarBodyKeyup($event)\" (keydown)=\"handleCalendarBodyKeydown($event)\">\n</upd-calendar-body>\n", styles: ["@media (min-width: 768px){.seven-cols .col-1{width:100%}.seven-cols .col-6{width:85.7142857143%}}@media (min-width: 992px){.seven-cols .col-1{width:14.2857142857%}.seven-cols .col-2{width:28.5714285714%}.seven-cols .col-3{width:42.8571428571%}.seven-cols .col-4{width:57.1428571429%}.seven-cols .col-5{width:71.4285714286%}.seven-cols .col-6{width:85.7142857143%}.seven-cols .col-7{width:100%}}@media (min-width: 1200px){.seven-cols .col-1{width:14.2857142857%}.seven-cols .col-2{width:28.5714285714%}.seven-cols .col-3{width:42.8571428571%}.seven-cols .col-4{width:57.1428571429%}.seven-cols .col-5{width:71.4285714286%}.seven-cols .col-6{width:85.7142857143%}.seven-cols .col-7{width:100%}}\n"] }]
383
- }], ctorParameters: () => [], propDecorators: { _matCalendarBody: [{
384
- type: ViewChild,
385
- args: [CalendarBodyComponent]
386
- }], activeDate: [{
387
- type: Input
388
- }], selected: [{
389
- type: Input
390
- }], minDate: [{
391
- type: Input
392
- }], maxDate: [{
393
- type: Input
394
- }], dateFilter: [{
395
- type: Input
396
- }], dateClass: [{
397
- type: Input
398
- }], comparisonStart: [{
399
- type: Input
400
- }], comparisonEnd: [{
401
- type: Input
402
- }], startDateAccessibleName: [{
403
- type: Input
404
- }], endDateAccessibleName: [{
405
- type: Input
406
- }], firstDayOfWeek: [{
407
- type: Input
408
- }], activeDrag: [{
409
- type: Input
410
- }], isRange: [{
411
- type: Input
412
- }], selectedChange: [{
413
- type: Output
414
- }], userSelection: [{
415
- type: Output
416
- }], dragStarted: [{
417
- type: Output
418
- }], dragEnded: [{
419
- type: Output
420
- }], activeDateChange: [{
421
- type: Output
422
- }] } });
423
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGgtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvY2FsZW5kYXIvc3JjL2NvbXBvbmVudHMvY2FsZW5kYXItbW9udGgtdmlldy9jYWxlbmRhci1tb250aC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci1tb250aC12aWV3L2NhbGVuZGFyLW1vbnRoLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR2pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDOUYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7QUFFakYs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M0IsTUFBTTtnQkFHWSxnQkFBZ0I7c0JBQWxDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkLFxuICAgIGVmZmVjdCxcbiAgICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPcHRpb25hbFR5cGUgfSBmcm9tICdAdXBkZXZzL3Nkay90eXBlcyc7XG5pbXBvcnQgeyBEYXRlU2VydmljZSB9IGZyb20gJ0B1cGRldnMvc2RrL2NvcmUnO1xuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCB9IGZyb20gJ0B1cGRldnMvc2RrL2xheW91dCc7XG5pbXBvcnQgeyBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSAnQGpzdmVyc2UvdHJhbnNsb2NvJztcbmltcG9ydCB7IHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBDYWxlbmRhclVzZXJFdmVudE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhbGVuZGFyLXVzZXItZXZlbnQubW9kZWwnO1xuaW1wb3J0IHsgQ2FsZW5kYXJCb2R5Q29tcG9uZW50IH0gZnJvbSAnLi4vY2FsZW5kYXItYm9keS9jYWxlbmRhci1ib2R5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9kYXRlLXJhbmdlLm1vZGVsJztcbmltcG9ydCB7IENhbGVuZGFyQ2VsbE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhbGVuZGFyLWNlbGwubW9kZWwnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDZWxsQ2xhc3NGdW5jdGlvblR5cGUgfSBmcm9tICcuLi8uLi90eXBlcy9jYWxlbmRhci1jZWxsLWNsYXNzLWZ1bmN0aW9uLnR5cGUnO1xuaW1wb3J0IHsgS2V5Ym9hcmRUb29scyB9IGZyb20gJy4uLy4uL3Rvb2xzL2tleWJvYXJkLXRvb2xzJztcbmltcG9ydCB7IENhbGVuZGFyUmFuZ2VTdHJhdGVneVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYWxlbmRhci1yYW5nZS1zdHJhdGVneS5zZXJ2aWNlJztcbmltcG9ydCB7IENhbGVuZGFyU2lnbmFsc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYWxlbmRhci1zaWduYWxzLnNlcnZpY2UnO1xuXG5jb25zdCBkYXlzUGVyV2VlayA9IDc7XG5cbmxldCB1bmlxdWVJZENvdW50ZXIgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3VwZC1jYWxlbmRhci1tb250aC12aWV3JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItbW9udGgtdmlldy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2NhbGVuZGFyLW1vbnRoLXZpZXcuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyTW9udGhWaWV3Q29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uQ2hhbmdlcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGJvZHkgb2YgY2FsZW5kYXIgdGFibGVcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKENhbGVuZGFyQm9keUNvbXBvbmVudCkgX21hdENhbGVuZGFyQm9keSE6IENhbGVuZGFyQm9keUNvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRvIGRpc3BsYXkgaW4gdGhpcyBtb250aCB2aWV3IChldmVyeXRoaW5nIG90aGVyIHRoYW4gdGhlIG1vbnRoIGFuZCB5ZWFyIGlzIGlnbm9yZWQpLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGFjdGl2ZURhdGUoKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuYWN0aXZlRGF0ZSgpO1xuICAgIH1cbiAgICBzZXQgYWN0aXZlRGF0ZSh2YWx1ZTogRGF0ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZURhdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGUuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgc2VsZWN0ZWQoKTogRGF0ZVJhbmdlTW9kZWwgfCBPcHRpb25hbFR5cGU8RGF0ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLnNlbGVjdGVkRGF0ZSgpO1xuICAgIH1cbiAgICBzZXQgc2VsZWN0ZWQodmFsdWU6IERhdGVSYW5nZU1vZGVsIHwgT3B0aW9uYWxUeXBlPERhdGU+KSB7XG4gICAgICAgIGxldCBjdXJyVmFsdWU6IERhdGVSYW5nZU1vZGVsIHwgT3B0aW9uYWxUeXBlPERhdGU+O1xuXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGVSYW5nZU1vZGVsKSB7XG4gICAgICAgICAgICBjdXJyVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJWYWx1ZSA9IHRoaXMuZGF0ZVNlcnZpY2UuZ2V0VmFsaWRPclVuZGVmaW5lZCh0aGlzLmRhdGVTZXJ2aWNlLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2Uuc2VsZWN0ZWREYXRlID0gY3VyclZhbHVlO1xuXG4gICAgICAgIHRoaXMuc2V0UmFuZ2VzKGN1cnJWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBtaW5pbXVtIHNlbGVjdGFibGUgZGF0ZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBtaW5EYXRlKCk6IE9wdGlvbmFsVHlwZTxEYXRlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5EYXRlO1xuICAgIH1cbiAgICBzZXQgbWluRGF0ZSh2YWx1ZTogT3B0aW9uYWxUeXBlPERhdGU+KSB7XG4gICAgICAgIHRoaXMuX21pbkRhdGUgPSB0aGlzLmRhdGVTZXJ2aWNlLmdldFZhbGlkT3JVbmRlZmluZWQodGhpcy5kYXRlU2VydmljZS5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgbWF4aW11bSBzZWxlY3RhYmxlIGRhdGUuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgbWF4RGF0ZSgpOiBPcHRpb25hbFR5cGU8RGF0ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4RGF0ZTtcbiAgICB9XG4gICAgc2V0IG1heERhdGUodmFsdWU6IE9wdGlvbmFsVHlwZTxEYXRlPikge1xuICAgICAgICB0aGlzLl9tYXhEYXRlID0gdGhpcy5kYXRlU2VydmljZS5nZXRWYWxpZE9yVW5kZWZpbmVkKHRoaXMuZGF0ZVNlcnZpY2UuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdXNlZCB0byBmaWx0ZXIgd2hpY2ggZGF0ZXMgYXJlIHNlbGVjdGFibGUuICovXG4gICAgQElucHV0KCkgZGF0ZUZpbHRlcj86IChkYXRlOiBEYXRlKSA9PiBib29sZWFuO1xuXG4gICAgLyoqIEZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIGN1c3RvbSBDU1MgY2xhc3NlcyB0byBkYXRlcy4gKi9cbiAgICBASW5wdXQoKSBkYXRlQ2xhc3M/OiBDYWxlbmRhckNlbGxDbGFzc0Z1bmN0aW9uVHlwZTtcblxuICAgIC8qKiBTdGFydCBvZiB0aGUgY29tcGFyaXNvbiByYW5nZS4gKi9cbiAgICBASW5wdXQoKSBjb21wYXJpc29uU3RhcnQ/OiBEYXRlO1xuXG4gICAgLyoqIEVuZCBvZiB0aGUgY29tcGFyaXNvbiByYW5nZS4gKi9cbiAgICBASW5wdXQoKSBjb21wYXJpc29uRW5kPzogRGF0ZTtcblxuICAgIC8qKiBBUklBIEFjY2Vzc2libGUgbmFtZSBvZiB0aGUgYDxpbnB1dCBtYXRTdGFydERhdGUvPmAgKi9cbiAgICBASW5wdXQoKSBzdGFydERhdGVBY2Nlc3NpYmxlTmFtZT86IHN0cmluZztcblxuICAgIC8qKiBBUklBIEFjY2Vzc2libGUgbmFtZSBvZiB0aGUgYDxpbnB1dCBtYXRFbmREYXRlLz5gICovXG4gICAgQElucHV0KCkgZW5kRGF0ZUFjY2Vzc2libGVOYW1lPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRmlyc3QgZGF5IG9mIHdlZWsuXG4gICAgICogWmVyby1iYXNlZCBzdGFydGluZyBmcm9tIFN1bmRheS5cbiAgICAgKiBEZWZhdWx0OiAwIC0gU3VuZGF5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGZpcnN0RGF5T2ZXZWVrID0gMDtcblxuICAgIC8qKiBPcmlnaW4gb2YgYWN0aXZlIGRyYWcsIG9yIG51bGwgd2hlbiBkcmFnZ2luZyBpcyBub3QgYWN0aXZlLiAqL1xuICAgIEBJbnB1dCgpIGFjdGl2ZURyYWc/OiBDYWxlbmRhclVzZXJFdmVudE1vZGVsPERhdGU+O1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgaXMgY3VycmVudGx5IHNlbGVjdGluZyBhIHJhbmdlIG9mIGRhdGVzLiAqL1xuICAgIEBJbnB1dCgpIGlzUmFuZ2UgPSBmYWxzZTtcblxuICAgIC8qKiBFbWl0cyB3aGVuIGEgbmV3IGRhdGUgaXMgc2VsZWN0ZWQuICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxPcHRpb25hbFR5cGU8RGF0ZT4+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiBhbnkgZGF0ZSBpcyBzZWxlY3RlZC4gKi9cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgdXNlclNlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJVc2VyRXZlbnRNb2RlbDxPcHRpb25hbFR5cGU8RGF0ZT4+PigpO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIHVzZXIgaW5pdGlhdGVzIGEgZGF0ZSByYW5nZSBkcmFnIHZpYSBtb3VzZSBvciB0b3VjaC4gKi9cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgZHJhZ1N0YXJ0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENhbGVuZGFyVXNlckV2ZW50TW9kZWw8RGF0ZT4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyB3aGVuIHRoZSB1c2VyIGNvbXBsZXRlcyBvciBjYW5jZWxzIGEgZGF0ZSByYW5nZSBkcmFnLlxuICAgICAqIEVtaXRzIG51bGwgd2hlbiB0aGUgZHJhZyB3YXMgY2FuY2VsZWQgb3IgdGhlIG5ld2x5IHNlbGVjdGVkIGRhdGUgcmFuZ2UgaWYgY29tcGxldGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByZWFkb25seSBkcmFnRW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENhbGVuZGFyVXNlckV2ZW50TW9kZWw8T3B0aW9uYWxUeXBlPERhdGVSYW5nZU1vZGVsPj4+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiBhbnkgZGF0ZSBpcyBhY3RpdmF0ZWQuICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGFjdGl2ZURhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG5cbiAgICAvKiogVGhlIGxhYmVsIGZvciB0aGlzIG1vbnRoIChlLmcuIFwiSmFudWFyeSAyMDE3XCIpLiAqL1xuICAgIG1vbnRoTGFiZWwhOiBzdHJpbmc7XG5cbiAgICAvKiogR3JpZCBvZiBjYWxlbmRhciBjZWxscyByZXByZXNlbnRpbmcgdGhlIGRhdGVzIG9mIHRoZSBtb250aC4gKi9cbiAgICB3ZWVrczogQ2FsZW5kYXJDZWxsTW9kZWxbXVtdID0gW107XG5cbiAgICAvKiogVGhlIG51bWJlciBvZiBibGFuayBjZWxscyBpbiB0aGUgZmlyc3Qgcm93IGJlZm9yZSB0aGUgMXN0IG9mIHRoZSBtb250aC4gKi9cbiAgICBmaXJzdFdlZWtPZmZzZXQgPSAwO1xuXG4gICAgLyoqIFN0YXJ0IHZhbHVlIG9mIHRoZSBjdXJyZW50bHktc2hvd24gZGF0ZSByYW5nZS4gKi9cbiAgICByYW5nZVN0YXJ0PzogbnVtYmVyO1xuXG4gICAgLyoqIEVuZCB2YWx1ZSBvZiB0aGUgY3VycmVudGx5LXNob3duIGRhdGUgcmFuZ2UuICovXG4gICAgcmFuZ2VFbmQ/OiBudW1iZXI7XG5cbiAgICAvKiogU3RhcnQgdmFsdWUgb2YgdGhlIGN1cnJlbnRseS1zaG93biBjb21wYXJpc29uIGRhdGUgcmFuZ2UuICovXG4gICAgY29tcGFyaXNvblJhbmdlU3RhcnQ/OiBudW1iZXI7XG5cbiAgICAvKiogRW5kIHZhbHVlIG9mIHRoZSBjdXJyZW50bHktc2hvd24gY29tcGFyaXNvbiBkYXRlIHJhbmdlLiAqL1xuICAgIGNvbXBhcmlzb25SYW5nZUVuZD86IG51bWJlcjtcblxuICAgIC8qKiBTdGFydCBvZiB0aGUgcHJldmlldyByYW5nZS4gKi9cbiAgICBwcmV2aWV3U3RhcnQ/OiBudW1iZXI7XG5cbiAgICAvKiogRW5kIG9mIHRoZSBwcmV2aWV3IHJhbmdlLiAqL1xuICAgIHByZXZpZXdFbmQ/OiBudW1iZXI7XG5cbiAgICAvKiogVGhlIGRhdGUgb2YgdGhlIG1vbnRoIHRoYXQgdG9kYXkgZmFsbHMgb24uIE51bGwgaWYgdG9kYXkgaXMgaW4gYW5vdGhlciBtb250aC4gKi9cbiAgICB0b2RheURhdGU/OiBudW1iZXI7XG5cbiAgICAvKiogVGhlIG5hbWVzIG9mIHRoZSB3ZWVrZGF5cy4gKi9cbiAgICB3ZWVrZGF5czogeyBsb25nOiBzdHJpbmc7IG5hcnJvdzogc3RyaW5nOyBpZDogbnVtYmVyIH1bXSA9IFtdO1xuXG4gICAgLyoqIEZsYWcgdXNlZCB0byBmaWx0ZXIgb3V0IHNwYWNlL2VudGVyIGtleXVwIGV2ZW50cyB0aGF0IG9yaWdpbmF0ZWQgb3V0c2lkZSBvZiB0aGUgdmlldy4gKi9cbiAgICBwcml2YXRlIF9zZWxlY3Rpb25LZXlQcmVzc2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbWluRGF0ZT86IERhdGU7XG4gICAgcHJpdmF0ZSBfbWF4RGF0ZT86IERhdGU7XG4gICAgcHJpdmF0ZSBvbGRBY3RpdmVEYXRlPzogRGF0ZTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsb2NvU2VydmljZSA9IGluamVjdChUcmFuc2xvY29TZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGVTZXJ2aWNlID0gaW5qZWN0KERhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhbGVuZGFyU2lnbmFsc1NlcnZpY2UgPSBpbmplY3QoQ2FsZW5kYXJTaWduYWxzU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWxlbmRhclJhbmdlU3RyYXRlZ3kgPSBpbmplY3QoQ2FsZW5kYXJSYW5nZVN0cmF0ZWd5U2VydmljZSk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgZWZmZWN0KCgpID0+IHRoaXMudXBkYXRlQWN0aXZlRGF0ZSh0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuYWN0aXZlRGF0ZSgpLCB0cnVlKSk7XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBsYW5nU3ViID0gdGhpcy50cmFuc2xvY29TZXJ2aWNlLmxhbmdDaGFuZ2VzJFxuICAgICAgICAgICAgLnBpcGUoc3RhcnRXaXRoKHVuZGVmaW5lZCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuaW5pdCgpKTtcbiAgICAgICAgdGhpcy5hZGRTdWJzY3JpcHRpb25zKGxhbmdTdWIpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29tcGFyaXNvbkNoYW5nZSA9IGNoYW5nZXNbJ2NvbXBhcmlzb25TdGFydCddIHx8IGNoYW5nZXNbJ2NvbXBhcmlzb25FbmQnXTtcblxuICAgICAgICBpZiAoY29tcGFyaXNvbkNoYW5nZSAmJiAhY29tcGFyaXNvbkNoYW5nZS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRSYW5nZXModGhpcy5zZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlc1snYWN0aXZlRHJhZyddICYmICF0aGlzLmFjdGl2ZURyYWcpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJQcmV2aWV3KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSGFuZGxlcyB3aGVuIGEgbmV3IGRhdGUgaXMgc2VsZWN0ZWQuICovXG4gICAgZGF0ZVNlbGVjdGVkKGV2ZW50OiBDYWxlbmRhclVzZXJFdmVudE1vZGVsPG51bWJlcj4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IGV2ZW50LnZhbHVlO1xuICAgICAgICBjb25zdCBzZWxlY3RlZERhdGUgPSB0aGlzLmdldERhdGVGcm9tRGF5T2ZNb250aChkYXRlKTtcbiAgICAgICAgY29uc3QgY3VyclNlbGVjdGlvbiA9IHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5zZWxlY3RlZERhdGUoKTtcbiAgICAgICAgbGV0IHJhbmdlU3RhcnREYXRlOiBPcHRpb25hbFR5cGU8bnVtYmVyPjtcbiAgICAgICAgbGV0IHJhbmdlRW5kRGF0ZTogT3B0aW9uYWxUeXBlPG51bWJlcj47XG5cbiAgICAgICAgaWYgKGN1cnJTZWxlY3Rpb24gaW5zdGFuY2VvZiBEYXRlUmFuZ2VNb2RlbCkge1xuICAgICAgICAgICAgcmFuZ2VTdGFydERhdGUgPSB0aGlzLmdldERhdGVJbkN1cnJlbnRNb250aChjdXJyU2VsZWN0aW9uLnN0YXJ0KTtcbiAgICAgICAgICAgIHJhbmdlRW5kRGF0ZSA9IHRoaXMuZ2V0RGF0ZUluQ3VycmVudE1vbnRoKGN1cnJTZWxlY3Rpb24uZW5kKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJhbmdlU3RhcnREYXRlID0gcmFuZ2VFbmREYXRlID0gdGhpcy5nZXREYXRlSW5DdXJyZW50TW9udGgoY3VyclNlbGVjdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2VTdGFydERhdGUgIT09IGRhdGUgfHwgcmFuZ2VFbmREYXRlICE9PSBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2Uuc2VsZWN0ZWREYXRlID0gc2VsZWN0ZWREYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51c2VyU2VsZWN0aW9uLmVtaXQoeyB2YWx1ZTogc2VsZWN0ZWREYXRlLCBldmVudDogZXZlbnQuZXZlbnQgfSk7XG4gICAgICAgIHRoaXMuY2xlYXJQcmV2aWV3KCk7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIEhhbmRsZXMga2V5ZG93biBldmVudHMgb24gdGhlIGNhbGVuZGFyIGJvZHkgd2hlbiBjYWxlbmRhciBpcyBpbiBtb250aCB2aWV3LiAqL1xuICAgIGhhbmRsZUNhbGVuZGFyQm9keUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gVE9ETyhtbWFsZXJiYSk6IFdlIGN1cnJlbnRseSBhbGxvdyBrZXlib2FyZCBuYXZpZ2F0aW9uIHRvIGRpc2FibGVkIGRhdGVzLCBidXQganVzdCBwcmV2ZW50XG4gICAgICAgIC8vIGRpc2FibGVkIG9uZXMgZnJvbSBiZWluZyBzZWxlY3RlZC4gVGhpcyBtYXkgbm90IGJlIGlkZWFsLCB3ZSBzaG91bGQgbG9vayBpbnRvIHdoZXRoZXJcbiAgICAgICAgLy8gbmF2aWdhdGlvbiBzaG91bGQgc2tpcCBvdmVyIGRpc2FibGVkIGRhdGVzLCBhbmQgaWYgc28sIGhvdyB0byBpbXBsZW1lbnQgdGhhdCBlZmZpY2llbnRseS5cblxuICAgICAgICBjb25zdCBvbGRBY3RpdmVEYXRlID0gdGhpcy5hY3RpdmVEYXRlO1xuICAgICAgICBsZXQgdGVtcEFjdGl2ZURhdGU6IE9wdGlvbmFsVHlwZTxEYXRlPjtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnTEVGVF9BUlJPVyc6XG4gICAgICAgICAgICAgICAgdGVtcEFjdGl2ZURhdGUgPSB0aGlzLmRhdGVTZXJ2aWNlLmFkZERheXModGhpcy5hY3RpdmVEYXRlLCAtMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdSSUdIVF9BUlJPVyc6XG4gICAgICAgICAgICAgICAgdGVtcEFjdGl2ZURhdGUgPSB0aGlzLmRhdGVTZXJ2aWNlLmFkZERheXModGhpcy5hY3RpdmVEYXRlLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1VQX0FSUk9XJzpcbiAgICAgICAgICAgICAgICB0ZW1wQWN0aXZlRGF0ZSA9IHRoaXMuZGF0ZVNlcnZpY2UuYWRkRGF5cyh0aGlzLmFjdGl2ZURhdGUsIC03KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0RPV05fQVJST1cnOlxuICAgICAgICAgICAgICAgIHRlbXBBY3RpdmVEYXRlID0gdGhpcy5kYXRlU2VydmljZS5hZGREYXlzKHRoaXMuYWN0aXZlRGF0ZSwgNyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdIT01FJzpcbiAgICAgICAgICAgICAgICB0ZW1wQWN0aXZlRGF0ZSA9IHRoaXMuZGF0ZVNlcnZpY2UuYWRkRGF5cyh0aGlzLmFjdGl2ZURhdGUsIDEgLSB0aGlzLmFjdGl2ZURhdGUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VORCc6XG4gICAgICAgICAgICAgICAgdGVtcEFjdGl2ZURhdGUgPSB0aGlzLmRhdGVTZXJ2aWNlLmFkZERheXMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU2VydmljZS5nZXROdW1EYXlzSW5Nb250aCh0aGlzLmFjdGl2ZURhdGUpIC1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlLmdldERhdGUoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdQQUdFX1VQJzpcbiAgICAgICAgICAgICAgICB0ZW1wQWN0aXZlRGF0ZSA9IGV2ZW50LmFsdEtleVxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZGF0ZVNlcnZpY2UuYWRkWWVhcnModGhpcy5hY3RpdmVEYXRlLCAtMSlcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmRhdGVTZXJ2aWNlLmFkZE1vbnRocyh0aGlzLmFjdGl2ZURhdGUsIC0xKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1BBR0VfRE9XTic6XG4gICAgICAgICAgICAgICAgdGVtcEFjdGl2ZURhdGUgPSBldmVudC5hbHRLZXlcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmRhdGVTZXJ2aWNlLmFkZFllYXJzKHRoaXMuYWN0aXZlRGF0ZSwgMSlcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmRhdGVTZXJ2aWNlLmFkZE1vbnRocyh0aGlzLmFjdGl2ZURhdGUsIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRU5URVInOlxuICAgICAgICAgICAgY2FzZSAnU1BBQ0UnOlxuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbktleVByZXNzZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuU2VsZWN0KHRoaXMuYWN0aXZlRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCB1bmV4cGVjdGVkIGRlZmF1bHQgYWN0aW9ucyBzdWNoIGFzIGZvcm0gc3VibWlzc2lvbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIG9ubHkgcHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24gaGVyZSB3aGlsZSB0aGUgc2VsZWN0aW9uIGhhcHBlbnMgaW5cbiAgICAgICAgICAgICAgICAgICAgLy8gYGtleXVwYCBiZWxvdy4gV2UgY2FuJ3QgZG8gdGhlIHNlbGVjdGlvbiBoZXJlLCBiZWNhdXNlIGl0IGNhbiBjYXVzZSB0aGUgY2FsZW5kYXIgdG9cbiAgICAgICAgICAgICAgICAgICAgLy8gcmVvcGVuIGlmIGZvY3VzIGlzIHJlc3RvcmVkIGltbWVkaWF0ZWx5LiBXZSBhbHNvIGNhbid0IGNhbGwgYHByZXZlbnREZWZhdWx0YCBvbiBga2V5dXBgXG4gICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQncyB0b28gbGF0ZSAoc2VlICMyMzMwNSkuXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ0VTQ0FQRSc6XG4gICAgICAgICAgICAgICAgLy8gQWJvcnQgdGhlIGN1cnJlbnQgcmFuZ2Ugc2VsZWN0aW9uIGlmIHRoZSB1c2VyIHByZXNzZXMgZXNjYXBlIG1pZC1zZWxlY3Rpb24uXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldmlld0VuZCAhPT0gdW5kZWZpbmVkICYmICFLZXlib2FyZFRvb2xzLmhhc01vZGlmaWVyS2V5KGV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyUHJldmlldygpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGRyYWcgaXMgaW4gcHJvZ3Jlc3MsIGNhbmNlbCB0aGUgZHJhZyB3aXRob3V0IGNoYW5naW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlRHJhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnRW5kZWQuZW1pdCh7IHZhbHVlOiB1bmRlZmluZWQsIGV2ZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJTZWxlY3Rpb24uZW1pdCh7IHZhbHVlOiB1bmRlZmluZWQsIGV2ZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBQcmV2ZW50cyB0aGUgb3ZlcmxheSBmcm9tIGNsb3NpbmcuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgcHJldmVudCBkZWZhdWx0IG9yIGZvY3VzIGFjdGl2ZSBjZWxsIG9uIGtleXMgdGhhdCB3ZSBkb24ndCBleHBsaWNpdGx5IGhhbmRsZS5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kYXRlU2VydmljZS5jb21wYXJlKG9sZEFjdGl2ZURhdGUsIHRoaXMuYWN0aXZlRGF0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlID0gdGVtcEFjdGl2ZURhdGU7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQWN0aXZlQ2VsbEFmdGVyVmlld0NoZWNrZWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZXZlbnQgdW5leHBlY3RlZCBkZWZhdWx0IGFjdGlvbnMgc3VjaCBhcyBmb3JtIHN1Ym1pc3Npb24uXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqIEhhbmRsZXMga2V5dXAgZXZlbnRzIG9uIHRoZSBjYWxlbmRhciBib2R5IHdoZW4gY2FsZW5kYXIgaXMgaW4gbW9udGggdmlldy4gKi9cbiAgICBoYW5kbGVDYWxlbmRhckJvZHlLZXl1cChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnU1BBQ0UnIHx8IGV2ZW50LmtleSA9PT0gJ0VOVEVSJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGlvbktleVByZXNzZWQgJiYgdGhpcy5jYW5TZWxlY3QodGhpcy5hY3RpdmVEYXRlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVNlbGVjdGVkKHsgdmFsdWU6IHRoaXMuYWN0aXZlRGF0ZS5nZXREYXRlKCksIGV2ZW50IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25LZXlQcmVzc2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSW5pdGlhbGl6ZXMgdGhpcyBtb250aCB2aWV3LiAqL1xuICAgIGluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0UmFuZ2VzKHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLnRvZGF5RGF0ZSA9IHRoaXMuZ2V0Q2VsbENvbXBhcmVWYWx1ZShuZXcgRGF0ZSgpKTtcbiAgICAgICAgdGhpcy5tb250aExhYmVsID0gdGhpcy5kYXRlU2VydmljZS5nZXRNb250aE5hbWVzKCdzaG9ydCcpW3RoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpXS50b0xvY2FsZVVwcGVyQ2FzZSgpO1xuICAgICAgICBjb25zdCBmaXJzdE9mTW9udGggPSB0aGlzLmRhdGVTZXJ2aWNlLmNyZWF0ZShcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgdGhpcy5hY3RpdmVEYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICAxXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlyc3RXZWVrT2Zmc2V0ID0gKGRheXNQZXJXZWVrICsgZmlyc3RPZk1vbnRoLmdldERheSgpIC0gdGhpcy5maXJzdERheU9mV2VlaykgJSBkYXlzUGVyV2VlaztcblxuICAgICAgICB0aGlzLmluaXRXZWVrZGF5cygpO1xuICAgICAgICB0aGlzLmNyZWF0ZVdlZWtDZWxscygpO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKiBGb2N1c2VzIHRoZSBhY3RpdmUgY2VsbCBhZnRlciB0aGUgbWljcm90YXNrIHF1ZXVlIGlzIGVtcHR5LiAqL1xuICAgIGZvY3VzQWN0aXZlQ2VsbChtb3ZlUHJldmlldz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbWF0Q2FsZW5kYXJCb2R5LmZvY3VzQWN0aXZlQ2VsbChtb3ZlUHJldmlldyk7XG4gICAgfVxuXG4gICAgLyoqIEZvY3VzZXMgdGhlIGFjdGl2ZSBjZWxsIGFmdGVyIGNoYW5nZSBkZXRlY3Rpb24gaGFzIHJ1biBhbmQgdGhlIG1pY3JvdGFzayBxdWV1ZSBpcyBlbXB0eS4gKi9cbiAgICBmb2N1c0FjdGl2ZUNlbGxBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9tYXRDYWxlbmRhckJvZHkuc2NoZWR1bGVGb2N1c0FjdGl2ZUNlbGxBZnRlclZpZXdDaGVja2VkKCk7XG4gICAgfVxuXG4gICAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGhhcyBhY3RpdmF0ZWQgYSBuZXcgY2VsbCBhbmQgdGhlIHByZXZpZXcgbmVlZHMgdG8gYmUgdXBkYXRlZC4gKi9cbiAgICBwcmV2aWV3Q2hhbmdlZCh7IHZhbHVlOiBjZWxsIH06IENhbGVuZGFyVXNlckV2ZW50TW9kZWw8T3B0aW9uYWxUeXBlPENhbGVuZGFyQ2VsbE1vZGVsPj4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1JhbmdlICYmICEodGhpcy5zZWxlY3RlZCBpbnN0YW5jZW9mIERhdGVSYW5nZU1vZGVsKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IG5ldyBEYXRlUmFuZ2VNb2RlbCh0aGlzLnNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGNhbiBhc3N1bWUgdGhhdCB0aGlzIHdpbGwgYmUgYSByYW5nZSwgYmVjYXVzZSBwcmV2aWV3XG4gICAgICAgIC8vIGV2ZW50cyBhcmVuJ3QgZmlyZWQgZm9yIHNpbmdsZSBkYXRlIHNlbGVjdGlvbnMuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gY2VsbCA/IGNlbGwucmF3VmFsdWUhIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBwcmV2aWV3UmFuZ2UgPSB0aGlzLmNhbGVuZGFyUmFuZ2VTdHJhdGVneS5jcmVhdGVQcmV2aWV3KHZhbHVlLCB0aGlzLnNlbGVjdGVkIGFzIERhdGVSYW5nZU1vZGVsKTtcbiAgICAgICAgdGhpcy5wcmV2aWV3U3RhcnQgPSB0aGlzLmdldENlbGxDb21wYXJlVmFsdWUocHJldmlld1JhbmdlLnN0YXJ0KTtcbiAgICAgICAgdGhpcy5wcmV2aWV3RW5kID0gdGhpcy5nZXRDZWxsQ29tcGFyZVZhbHVlKHByZXZpZXdSYW5nZS5lbmQpO1xuXG4gICAgICAgIGlmICghIXRoaXMuYWN0aXZlRHJhZyAmJiAhIXZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBkcmFnUmFuZ2UgPSB0aGlzLmNhbGVuZGFyUmFuZ2VTdHJhdGVneS5jcmVhdGVEcmFnPy4odGhpcy5hY3RpdmVEcmFnLnZhbHVlLCB0aGlzLnNlbGVjdGVkIGFzIERhdGVSYW5nZU1vZGVsLCB2YWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICghIWRyYWdSYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmlld1N0YXJ0ID0gdGhpcy5nZXRDZWxsQ29tcGFyZVZhbHVlKGRyYWdSYW5nZS5zdGFydCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RW5kID0gdGhpcy5nZXRDZWxsQ29tcGFyZVZhbHVlKGRyYWdSYW5nZS5lbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90ZSB0aGF0IGhlcmUgd2UgbmVlZCB0byB1c2UgYGRldGVjdENoYW5nZXNgLCByYXRoZXIgdGhhbiBgbWFya0ZvckNoZWNrYCwgYmVjYXVzZVxuICAgICAgICAvLyB0aGUgd2F5IGBfZm9jdXNBY3RpdmVDZWxsYCBpcyBzZXQgdXAgYXQgdGhlIG1vbWVudCBtYWtlcyBpdCBmaXJlIGF0IHRoZSB3cm9uZyB0aW1lXG4gICAgICAgIC8vIHdoZW4gbmF2aWdhdGluZyBvbmUgbW9udGggYmFjayB1c2luZyB0aGUga2V5Ym9hcmQgd2hpY2ggd2lsbCBjYXVzZSB0aGlzIGhhbmRsZXJcbiAgICAgICAgLy8gdG8gdGhyb3cgYSBcImNoYW5nZWQgYWZ0ZXIgY2hlY2tlZFwiIGVycm9yIHdoZW4gdXBkYXRpbmcgdGhlIHByZXZpZXcgc3RhdGUuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGhhcyBlbmRlZCBhIGRyYWcuIElmIHRoZSBkcmFnL2Ryb3Agd2FzIHN1Y2Nlc3NmdWwsXG4gICAgICogY29tcHV0ZXMgYW5kIGVtaXRzIHRoZSBuZXcgcmFuZ2Ugc2VsZWN0aW9uLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZHJhZ0VuZGVkKGV2ZW50OiBDYWxlbmRhclVzZXJFdmVudE1vZGVsPE9wdGlvbmFsVHlwZTxEYXRlPj4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZURyYWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC52YWx1ZSkge1xuICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRyYWcgZWZmZWN0XG4gICAgICAgICAgICBjb25zdCBkcmFnRHJvcFJlc3VsdCA9IHRoaXMuY2FsZW5kYXJSYW5nZVN0cmF0ZWd5Py5jcmVhdGVEcmFnPy4oXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEcmFnLnZhbHVlLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgYXMgRGF0ZVJhbmdlTW9kZWwsXG4gICAgICAgICAgICAgICAgZXZlbnQudmFsdWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuZHJhZ0VuZGVkLmVtaXQoeyB2YWx1ZTogZHJhZ0Ryb3BSZXN1bHQgPz8gdW5kZWZpbmVkLCBldmVudDogZXZlbnQuZXZlbnQgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdFbmRlZC5lbWl0KHsgdmFsdWU6IHVuZGVmaW5lZCwgZXZlbnQ6IGV2ZW50LmV2ZW50IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVBY3RpdmVEYXRlKHZhbHVlOiBEYXRlLCBpc0Zyb21FZmZlY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9sZEFjdGl2ZURhdGUgPSB0aGlzLm9sZEFjdGl2ZURhdGUgfHwgdmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbGlkRGF0ZSA9IHRoaXMuZGF0ZVNlcnZpY2UuZ2V0VmFsaWRPclVuZGVmaW5lZCh0aGlzLmRhdGVTZXJ2aWNlLmRlc2VyaWFsaXplKHZhbHVlKSkgfHwgbmV3IERhdGUoKTtcblxuICAgICAgICBpZiAoIWlzRnJvbUVmZmVjdCkge1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmFjdGl2ZURhdGUgPSB0aGlzLmRhdGVTZXJ2aWNlLmNsYW1wKHZhbGlkRGF0ZSwgdGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzU2FtZU1vbnRoQW5kWWVhckFzQWN0aXZlRGF0ZSh0aGlzLm9sZEFjdGl2ZURhdGUsIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlKCkpKSB7XG4gICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2xkQWN0aXZlRGF0ZSA9IHZhbHVlO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRha2VzIGEgZGF5IG9mIHRoZSBtb250aCBhbmQgcmV0dXJucyBhIG5ldyBkYXRlIGluIHRoZSBzYW1lIG1vbnRoIGFuZCB5ZWFyIGFzIHRoZSBjdXJyZW50bHlcbiAgICAgKiAgYWN0aXZlIGRhdGUuIFRoZSByZXR1cm5lZCBkYXRlIHdpbGwgaGF2ZSB0aGUgc2FtZSBkYXkgb2YgdGhlIG1vbnRoIGFzIHRoZSBhcmd1bWVudCBkYXRlLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0RGF0ZUZyb21EYXlPZk1vbnRoKGRheU9mTW9udGg6IG51bWJlcik6IERhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlU2VydmljZS5jcmVhdGUodGhpcy5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpLCBkYXlPZk1vbnRoKTtcbiAgICB9XG5cbiAgICAvKiogSW5pdGlhbGl6ZXMgdGhlIHdlZWtkYXlzLiAqL1xuICAgIHByaXZhdGUgaW5pdFdlZWtkYXlzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaXJzdERheU9mV2VlayA9IHRoaXMuZmlyc3REYXlPZldlZWs7XG4gICAgICAgIGNvbnN0IG5hcnJvd1dlZWtkYXlzID0gdGhpcy5kYXRlU2VydmljZS5nZXREYXlPZldlZWtOYW1lcygnbmFycm93Jyk7XG4gICAgICAgIGNvbnN0IGxvbmdXZWVrZGF5cyA9IHRoaXMuZGF0ZVNlcnZpY2UuZ2V0RGF5T2ZXZWVrTmFtZXMoJ2xvbmcnKTtcbiAgICAgICAgLy8gUm90YXRlIHRoZSBsYWJlbHMgZm9yIGRheXMgb2YgdGhlIHdlZWsgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICBjb25zdCB3ZWVrZGF5cyA9IGxvbmdXZWVrZGF5cy5tYXAoKGxvbmcsIGkpID0+ICh7IGxvbmcsIG5hcnJvdzogbmFycm93V2Vla2RheXNbaV0sIGlkOiB1bmlxdWVJZENvdW50ZXIrKyB9KSk7XG4gICAgICAgIHRoaXMud2Vla2RheXMgPSB3ZWVrZGF5cy5zbGljZShmaXJzdERheU9mV2VlaykuY29uY2F0KHdlZWtkYXlzLnNsaWNlKDAsIGZpcnN0RGF5T2ZXZWVrKSk7XG4gICAgfVxuXG4gICAgLyoqIENyZWF0ZXMgTWF0Q2FsZW5kYXJDZWxscyBmb3IgdGhlIGRhdGVzIGluIHRoaXMgbW9udGguICovXG4gICAgcHJpdmF0ZSBjcmVhdGVXZWVrQ2VsbHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gdGhpcy5kYXRlU2VydmljZS5nZXROdW1EYXlzSW5Nb250aCh0aGlzLmFjdGl2ZURhdGUpO1xuICAgICAgICBjb25zdCBkYXRlTmFtZXMgPSB0aGlzLmRhdGVTZXJ2aWNlLmdldERhdGVOYW1lcygpO1xuICAgICAgICB0aGlzLndlZWtzID0gW1tdXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgY2VsbCA9IHRoaXMuZmlyc3RXZWVrT2Zmc2V0OyBpIDwgZGF5c0luTW9udGg7IGkrKywgY2VsbCsrKSB7XG4gICAgICAgICAgICBpZiAoY2VsbCA9PT0gZGF5c1BlcldlZWspIHtcbiAgICAgICAgICAgICAgICB0aGlzLndlZWtzLnB1c2goW10pO1xuICAgICAgICAgICAgICAgIGNlbGwgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlU2VydmljZS5jcmVhdGUodGhpcy5hY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpLCBpICsgMSk7XG4gICAgICAgICAgICBjb25zdCBpc0VuYWJsZWQgPSB0aGlzLnNob3VsZEVuYWJsZURhdGUoZGF0ZSk7XG4gICAgICAgICAgICBjb25zdCBhcmlhTGFiZWwgPSB0aGlzLmRhdGVTZXJ2aWNlLmZvcm1hdChkYXRlLCB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycgfSk7XG4gICAgICAgICAgICBjb25zdCBjZWxsQ2xhc3NlcyA9IHRoaXMuZGF0ZUNsYXNzID8gdGhpcy5kYXRlQ2xhc3MoZGF0ZSwgJ21vbnRoJykgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIHRoaXMud2Vla3NbdGhpcy53ZWVrcy5sZW5ndGggLSAxXS5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBDYWxlbmRhckNlbGxNb2RlbChcbiAgICAgICAgICAgICAgICAgICAgaSArIDEsXG4gICAgICAgICAgICAgICAgICAgIGRhdGVOYW1lc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsLFxuICAgICAgICAgICAgICAgICAgICBpc0VuYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgIGNlbGxDbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENlbGxDb21wYXJlVmFsdWUoZGF0ZSkhLFxuICAgICAgICAgICAgICAgICAgICBkYXRlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBEYXRlIGZpbHRlciBmb3IgdGhlIG1vbnRoICovXG4gICAgcHJpdmF0ZSBzaG91bGRFbmFibGVEYXRlKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhZGF0ZSAmJlxuICAgICAgICAgICAgKCF0aGlzLm1pbkRhdGUgfHwgdGhpcy5kYXRlU2VydmljZS5jb21wYXJlKGRhdGUsIHRoaXMubWluRGF0ZSkgPj0gMCkgJiZcbiAgICAgICAgICAgICghdGhpcy5tYXhEYXRlIHx8IHRoaXMuZGF0ZVNlcnZpY2UuY29tcGFyZShkYXRlLCB0aGlzLm1heERhdGUpIDw9IDApICYmXG4gICAgICAgICAgICAoIXRoaXMuZGF0ZUZpbHRlciB8fCB0aGlzLmRhdGVGaWx0ZXIoZGF0ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGUgaW4gdGhpcyBtb250aCB0aGF0IHRoZSBnaXZlbiBEYXRlIGZhbGxzIG9uLlxuICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgZ2l2ZW4gRGF0ZSBpcyBpbiBhbm90aGVyIG1vbnRoLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0RGF0ZUluQ3VycmVudE1vbnRoKGRhdGU/OiBEYXRlKTogT3B0aW9uYWxUeXBlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gISFkYXRlICYmIHRoaXMuaXNTYW1lTW9udGhBbmRZZWFyQXNBY3RpdmVEYXRlKGRhdGUsIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlKCkpXG4gICAgICAgICAgICA/IGRhdGUuZ2V0RGF0ZSgpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIDIgZGF0ZXMgYXJlIG5vbi1udWxsIGFuZCBmYWxsIHdpdGhpbiB0aGUgc2FtZSBtb250aCBvZiB0aGUgc2FtZSB5ZWFyLiAqL1xuICAgIHByaXZhdGUgaXNTYW1lTW9udGhBbmRZZWFyQXNBY3RpdmVEYXRlKGQxPzogRGF0ZSwgZDI/OiBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoISFkMSAmJiAhIWQyICYmIGQxLmdldE1vbnRoKCkgPT09IGQyLmdldE1vbnRoKCkgJiYgZDEuZ2V0RnVsbFllYXIoKSA9PT0gZDIuZ2V0RnVsbFllYXIoKSk7XG4gICAgfVxuXG4gICAgLyoqIEdldHMgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG9uZSBjZWxsIHRvIGFub3RoZXIuICovXG4gICAgcHJpdmF0ZSBnZXRDZWxsQ29tcGFyZVZhbHVlKGRhdGU/OiBEYXRlKTogT3B0aW9uYWxUeXBlPG51bWJlcj4ge1xuICAgICAgICBpZiAoISFkYXRlKSB7XG4gICAgICAgICAgICAvLyBXZSB1c2UgdGhlIHRpbWUgc2luY2UgdGhlIFVuaXggZXBvY2ggdG8gY29tcGFyZSBkYXRlcyBpbiB0aGlzIHZpZXcsIHJhdGhlciB0aGFuIHRoZVxuICAgICAgICAgICAgLy8gY2VsbCB2YWx1ZXMsIGJlY2F1c2Ugd2UgbmVlZCB0byBzdXBwb3J0IHJhbmdlcyB0aGF0IHNwYW4gYWNyb3NzIG11bHRpcGxlIG1vbnRocy95ZWFycy5cbiAgICAgICAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICAgICAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSkuZ2V0VGltZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKiogU2V0cyB0aGUgY3VycmVudCByYW5nZSBiYXNlZCBvbiBhIG1vZGVsIHZhbHVlLiAqL1xuICAgIHByaXZhdGUgc2V0UmFuZ2VzKHNlbGVjdGVkVmFsdWU6IERhdGVSYW5nZU1vZGVsIHwgT3B0aW9uYWxUeXBlPERhdGU+KTogdm9pZCB7XG4gICAgICAgIGlmIChzZWxlY3RlZFZhbHVlIGluc3RhbmNlb2YgRGF0ZVJhbmdlTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdGFydCA9IHRoaXMuZ2V0Q2VsbENvbXBhcmVWYWx1ZShzZWxlY3RlZFZhbHVlLnN0YXJ0KTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VFbmQgPSB0aGlzLmdldENlbGxDb21wYXJlVmFsdWUoc2VsZWN0ZWRWYWx1ZS5lbmQpO1xuICAgICAgICAgICAgdGhpcy5pc1JhbmdlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdGFydCA9IHRoaXMucmFuZ2VFbmQgPSB0aGlzLmdldENlbGxDb21wYXJlVmFsdWUoc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBhcmlzb25SYW5nZVN0YXJ0ID0gdGhpcy5nZXRDZWxsQ29tcGFyZVZhbHVlKHRoaXMuY29tcGFyaXNvblN0YXJ0KTtcbiAgICAgICAgdGhpcy5jb21wYXJpc29uUmFuZ2VFbmQgPSB0aGlzLmdldENlbGxDb21wYXJlVmFsdWUodGhpcy5jb21wYXJpc29uRW5kKTtcbiAgICB9XG5cbiAgICAvKiogR2V0cyB3aGV0aGVyIGEgZGF0ZSBjYW4gYmUgc2VsZWN0ZWQgaW4gdGhlIG1vbnRoIHZpZXcuICovXG4gICAgcHJpdmF0ZSBjYW5TZWxlY3QoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuZGF0ZUZpbHRlciB8fCB0aGlzLmRhdGVGaWx0ZXIoZGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqIENsZWFycyBvdXQgcHJldmlldyBzdGF0ZS4gKi9cbiAgICBwcml2YXRlIGNsZWFyUHJldmlldygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcmV2aWV3U3RhcnQgPSB0aGlzLnByZXZpZXdFbmQgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuIiwiPHVwZC1jYWxlbmRhci1oZWFkZXI+PC91cGQtY2FsZW5kYXItaGVhZGVyPlxuPGRpdiBjbGFzcz1cImNvbnRhaW5lciBtdC0yXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvdyBzZXZlbi1jb2xzXCI+XG4gICAgICAgIEBmb3IgKGRheSBvZiB3ZWVrZGF5czsgdHJhY2sgZGF5LmlkKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEgcC0xIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+e3sgZGF5LmxvbmcgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3sgZGF5Lm5hcnJvdyB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgPC9kaXY+XG48L2Rpdj5cbjx1cGQtY2FsZW5kYXItYm9keSBbbGFiZWxdPVwibW9udGhMYWJlbFwiIFtyb3dzXT1cIndlZWtzXCIgW3RvZGF5VmFsdWVdPVwidG9kYXlEYXRlIVwiIFtzdGFydFZhbHVlXT1cInJhbmdlU3RhcnQhXCJcbiAgICBbZW5kVmFsdWVdPVwicmFuZ2VFbmQhXCIgW2NvbXBhcmlzb25TdGFydF09XCJjb21wYXJpc29uUmFuZ2VTdGFydFwiIFtjb21wYXJpc29uRW5kXT1cImNvbXBhcmlzb25SYW5nZUVuZFwiXG4gICAgW3ByZXZpZXdTdGFydF09XCJwcmV2aWV3U3RhcnRcIiBbcHJldmlld0VuZF09XCJwcmV2aWV3RW5kXCIgW2lzUmFuZ2VdPVwiaXNSYW5nZVwiIFtsYWJlbE1pblJlcXVpcmVkQ2VsbHNdPVwiM1wiXG4gICAgW2FjdGl2ZUNlbGxdPVwiYWN0aXZlRGF0ZS5nZXREYXRlKCkgLSAxXCIgW3N0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lXT1cInN0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lXCJcbiAgICBbZW5kRGF0ZUFjY2Vzc2libGVOYW1lXT1cImVuZERhdGVBY2Nlc3NpYmxlTmFtZVwiIChzZWxlY3RlZFZhbHVlQ2hhbmdlKT1cImRhdGVTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAocHJldmlld0NoYW5nZSk9XCJwcmV2aWV3Q2hhbmdlZCgkZXZlbnQpXCIgKGRyYWdTdGFydGVkKT1cImRyYWdTdGFydGVkLmVtaXQoJGV2ZW50KVwiIChkcmFnRW5kZWQpPVwiX2RyYWdFbmRlZCgkZXZlbnQpXCJcbiAgICAoa2V5dXApPVwiaGFuZGxlQ2FsZW5kYXJCb2R5S2V5dXAoJGV2ZW50KVwiIChrZXlkb3duKT1cImhhbmRsZUNhbGVuZGFyQm9keUtleWRvd24oJGV2ZW50KVwiPlxuPC91cGQtY2FsZW5kYXItYm9keT5cbiJdfQ==
@@ -1,18 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export const yearsPerPage = 24;
4
- export class CalendarMultiYearViewComponent {
5
- /** Initializes this month view. */
6
- init() {
7
- }
8
- /** Focuses the active cell after the microtask queue is empty. */
9
- focusActiveCell(movePreview) {
10
- }
11
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarMultiYearViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: CalendarMultiYearViewComponent, selector: "upd-calendar-multi-year-view", ngImport: i0, template: "<p>calendar-multi-year-view works!</p>\n", styles: [""] }); }
13
- }
14
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarMultiYearViewComponent, decorators: [{
15
- type: Component,
16
- args: [{ selector: 'upd-calendar-multi-year-view', template: "<p>calendar-multi-year-view works!</p>\n" }]
17
- }] });
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbXVsdGkteWVhci12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci1tdWx0aS15ZWFyLXZpZXcvY2FsZW5kYXItbXVsdGkteWVhci12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci1tdWx0aS15ZWFyLXZpZXcvY2FsZW5kYXItbXVsdGkteWVhci12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTFDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFPL0IsTUFBTSxPQUFPLDhCQUE4QjtJQUN2QyxtQ0FBbUM7SUFDbkMsSUFBSTtJQUVKLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsZUFBZSxDQUFDLFdBQXFCO0lBQ3JDLENBQUM7OEdBUlEsOEJBQThCO2tHQUE5Qiw4QkFBOEIsb0VDVDNDLDBDQUNBOzsyRkRRYSw4QkFBOEI7a0JBTDFDLFNBQVM7K0JBQ0ksOEJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjb25zdCB5ZWFyc1BlclBhZ2UgPSAyNDtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd1cGQtY2FsZW5kYXItbXVsdGkteWVhci12aWV3JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItbXVsdGkteWVhci12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vY2FsZW5kYXItbXVsdGkteWVhci12aWV3LmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBDYWxlbmRhck11bHRpWWVhclZpZXdDb21wb25lbnQge1xuICAgIC8qKiBJbml0aWFsaXplcyB0aGlzIG1vbnRoIHZpZXcuICovXG4gICAgaW5pdCgpOiB2b2lkIHtcblxuICAgIH1cblxuICAgIC8qKiBGb2N1c2VzIHRoZSBhY3RpdmUgY2VsbCBhZnRlciB0aGUgbWljcm90YXNrIHF1ZXVlIGlzIGVtcHR5LiAqL1xuICAgIGZvY3VzQWN0aXZlQ2VsbChtb3ZlUHJldmlldz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB9XG59XG4iLCI8cD5jYWxlbmRhci1tdWx0aS15ZWFyLXZpZXcgd29ya3MhPC9wPlxuIl19
@@ -1,17 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class CalendarYearViewComponent {
4
- /** Initializes this month view. */
5
- init() {
6
- }
7
- /** Focuses the active cell after the microtask queue is empty. */
8
- focusActiveCell(movePreview) {
9
- }
10
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarYearViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: CalendarYearViewComponent, selector: "upd-calendar-year-view", ngImport: i0, template: "<p>calendar-year-view works!</p>\n", styles: [""] }); }
12
- }
13
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarYearViewComponent, decorators: [{
14
- type: Component,
15
- args: [{ selector: 'upd-calendar-year-view', template: "<p>calendar-year-view works!</p>\n" }]
16
- }] });
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIteWVhci12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci15ZWFyLXZpZXcvY2FsZW5kYXIteWVhci12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci15ZWFyLXZpZXcvY2FsZW5kYXIteWVhci12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTzFDLE1BQU0sT0FBTyx5QkFBeUI7SUFDbEMsbUNBQW1DO0lBQ25DLElBQUk7SUFFSixDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLGVBQWUsQ0FBQyxXQUFxQjtJQUNyQyxDQUFDOzhHQVJRLHlCQUF5QjtrR0FBekIseUJBQXlCLDhEQ1B0QyxvQ0FDQTs7MkZETWEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNJLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3VwZC1jYWxlbmRhci15ZWFyLXZpZXcnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci15ZWFyLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9jYWxlbmRhci15ZWFyLXZpZXcuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyWWVhclZpZXdDb21wb25lbnQge1xuICAgIC8qKiBJbml0aWFsaXplcyB0aGlzIG1vbnRoIHZpZXcuICovXG4gICAgaW5pdCgpOiB2b2lkIHtcblxuICAgIH1cblxuICAgIC8qKiBGb2N1c2VzIHRoZSBhY3RpdmUgY2VsbCBhZnRlciB0aGUgbWljcm90YXNrIHF1ZXVlIGlzIGVtcHR5LiAqL1xuICAgIGZvY3VzQWN0aXZlQ2VsbChtb3ZlUHJldmlldz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB9XG59XG4iLCI8cD5jYWxlbmRhci15ZWFyLXZpZXcgd29ya3MhPC9wPlxuIl19
@@ -1,18 +0,0 @@
1
- let uniqueIdCounter = 0;
2
- /**
3
- * An internal class that represents the data corresponding to a single calendar cell.
4
- * @docs-private
5
- */
6
- export class CalendarCellModel {
7
- constructor(value, displayValue, ariaLabel, isEnabled, cssClasses = {}, compareValue = value, rawValue) {
8
- this.value = value;
9
- this.displayValue = displayValue;
10
- this.ariaLabel = ariaLabel;
11
- this.isEnabled = isEnabled;
12
- this.cssClasses = cssClasses;
13
- this.compareValue = compareValue;
14
- this.rawValue = rawValue;
15
- this.id = uniqueIdCounter++;
16
- }
17
- }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItY2VsbC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvbW9kZWxzL2NhbGVuZGFyLWNlbGwubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBRXhCOzs7R0FHRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFHMUIsWUFDVyxLQUFhLEVBQ2IsWUFBb0IsRUFDcEIsU0FBaUIsRUFDakIsU0FBa0IsRUFDbEIsYUFBeUMsRUFBRSxFQUMzQyxlQUFlLEtBQUssRUFDcEIsUUFBZTtRQU5mLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUNwQixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2pCLGNBQVMsR0FBVCxTQUFTLENBQVM7UUFDbEIsZUFBVSxHQUFWLFVBQVUsQ0FBaUM7UUFDM0MsaUJBQVksR0FBWixZQUFZLENBQVE7UUFDcEIsYUFBUSxHQUFSLFFBQVEsQ0FBTztRQVRqQixPQUFFLEdBQUcsZUFBZSxFQUFFLENBQUM7SUFXaEMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FsZW5kYXJDZWxsQ3NzQ2xhc3Nlc1R5cGUgfSBmcm9tICcuLi90eXBlcy9jYWxlbmRhci1jZWxsLWNzcy1jbGFzc2VzLnR5cGUnO1xuXG5sZXQgdW5pcXVlSWRDb3VudGVyID0gMDtcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIGRhdGEgY29ycmVzcG9uZGluZyB0byBhIHNpbmdsZSBjYWxlbmRhciBjZWxsLlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJDZWxsTW9kZWwge1xuICAgIHJlYWRvbmx5IGlkID0gdW5pcXVlSWRDb3VudGVyKys7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHZhbHVlOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBkaXNwbGF5VmFsdWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIGFyaWFMYWJlbDogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgaXNFbmFibGVkOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgY3NzQ2xhc3NlczogQ2FsZW5kYXJDZWxsQ3NzQ2xhc3Nlc1R5cGUgPSB7fSxcbiAgICAgICAgcHVibGljIGNvbXBhcmVWYWx1ZSA9IHZhbHVlLFxuICAgICAgICBwdWJsaWMgcmF3VmFsdWU/OiBEYXRlXG4gICAgKSB7XG4gICAgfVxufVxuIl19