@tolle_/tolle-ui 0.0.27-beta → 0.0.29-beta

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.
@@ -1,13 +1,21 @@
1
- import { Component, Input, forwardRef } from '@angular/core';
1
+ import { Component, Input, forwardRef, Output, EventEmitter } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
- import { addMonths, subMonths, startOfMonth, endOfMonth, startOfWeek, endOfWeek, eachDayOfInterval, isSameMonth, isSameDay, isToday, setMonth, setYear, addYears, subYears, isBefore, startOfDay } from 'date-fns';
3
+ import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
4
+ import { addMonths, subMonths, startOfMonth, endOfMonth, startOfWeek, endOfWeek, eachDayOfInterval, isSameMonth, isSameDay, isToday, setMonth, setYear, addYears, subYears, isBefore, startOfDay, format } from 'date-fns';
5
5
  import { cn } from './utils/cn';
6
6
  import * as i0 from "@angular/core";
7
7
  import * as i1 from "@angular/common";
8
8
  export class CalendarComponent {
9
9
  class = '';
10
+ mode = 'date';
10
11
  disablePastDates = false;
12
+ showQuickActions = true;
13
+ minDate;
14
+ maxDate;
15
+ formatMonthFn;
16
+ formatYearFn;
17
+ formatDateFn;
18
+ dateSelect = new EventEmitter();
11
19
  currentView = 'date';
12
20
  viewDate = new Date();
13
21
  selectedDate = null;
@@ -15,87 +23,222 @@ export class CalendarComponent {
15
23
  daysInMonth = [];
16
24
  months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
17
25
  years = [];
26
+ yearRangeStart;
18
27
  navBtnClass = cn('h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100 border border-input rounded-md flex items-center justify-center hover:bg-accent hover:text-accent-foreground transition-all');
28
+ quickActionBtnClass = cn('px-3 py-1.5 text-sm rounded hover:bg-accent text-muted-foreground hover:text-foreground transition-colors');
19
29
  onTouched = () => { };
20
30
  onChange = () => { };
21
31
  cn = cn;
32
+ constructor() {
33
+ this.yearRangeStart = new Date().getFullYear() - 6;
34
+ }
22
35
  ngOnInit() {
36
+ // Initialize based on mode
37
+ if (this.mode === 'month') {
38
+ this.currentView = 'month';
39
+ }
40
+ else if (this.mode === 'year') {
41
+ this.currentView = 'year';
42
+ }
23
43
  this.generateDays();
24
44
  this.generateYears();
25
45
  }
46
+ // Format helpers
47
+ formatMonthYear(date, type) {
48
+ if (type === 'month' && this.formatMonthFn) {
49
+ return this.formatMonthFn(date);
50
+ }
51
+ if (type === 'year' && this.formatYearFn) {
52
+ return this.formatYearFn(date);
53
+ }
54
+ return type === 'month' ? format(date, 'MMMM') : format(date, 'yyyy');
55
+ }
56
+ formatDate(date, type) {
57
+ if (type === 'day' && this.formatDateFn) {
58
+ return this.formatDateFn(date);
59
+ }
60
+ return format(date, type === 'day' ? 'd' : type === 'month' ? 'MMM' : 'yyyy');
61
+ }
26
62
  generateDays() {
63
+ if (this.mode !== 'date')
64
+ return;
27
65
  const start = startOfWeek(startOfMonth(this.viewDate));
28
66
  const end = endOfWeek(endOfMonth(this.viewDate));
29
67
  this.daysInMonth = eachDayOfInterval({ start, end });
30
68
  }
31
69
  generateYears() {
32
70
  const currentYear = this.viewDate.getFullYear();
33
- // Generates a 16-year window centered roughly on current view
34
- this.years = Array.from({ length: 16 }, (_, i) => currentYear - 6 + i);
71
+ if (this.mode === 'year') {
72
+ // For year picker, show a 12-year grid
73
+ this.years = Array.from({ length: 12 }, (_, i) => this.yearRangeStart + i);
74
+ }
75
+ else {
76
+ // For date mode year selector, show 16 years centered on current
77
+ this.years = Array.from({ length: 16 }, (_, i) => currentYear - 6 + i);
78
+ }
35
79
  }
36
80
  setView(view) {
37
81
  this.currentView = view;
38
- // If switching to year view, ensure the year grid is centered on current view year
39
82
  if (view === 'year') {
40
83
  this.generateYears();
41
84
  }
42
85
  }
43
86
  prev() {
44
- if (this.currentView === 'date') {
45
- this.viewDate = subMonths(this.viewDate, 1);
46
- this.generateDays();
87
+ if (this.mode === 'date') {
88
+ if (this.currentView === 'date') {
89
+ this.viewDate = subMonths(this.viewDate, 1);
90
+ this.generateDays();
91
+ }
92
+ else if (this.currentView === 'year') {
93
+ this.viewDate = subYears(this.viewDate, 16);
94
+ this.generateYears();
95
+ }
96
+ else if (this.currentView === 'month') {
97
+ this.viewDate = subYears(this.viewDate, 1);
98
+ }
99
+ }
100
+ else if (this.mode === 'month') {
101
+ this.viewDate = subYears(this.viewDate, 1);
47
102
  }
48
- else if (this.currentView === 'year') {
49
- this.viewDate = subYears(this.viewDate, 16);
103
+ else if (this.mode === 'year') {
104
+ this.yearRangeStart -= 12;
50
105
  this.generateYears();
51
106
  }
52
- else if (this.currentView === 'month') {
53
- this.viewDate = subYears(this.viewDate, 1);
107
+ else if (this.mode === 'month-year') {
108
+ if (this.currentView === 'month') {
109
+ this.viewDate = subYears(this.viewDate, 1);
110
+ }
111
+ else {
112
+ this.yearRangeStart -= 12;
113
+ this.generateYears();
114
+ }
54
115
  }
55
116
  }
56
117
  next() {
57
- if (this.currentView === 'date') {
58
- this.viewDate = addMonths(this.viewDate, 1);
59
- this.generateDays();
118
+ if (this.mode === 'date') {
119
+ if (this.currentView === 'date') {
120
+ this.viewDate = addMonths(this.viewDate, 1);
121
+ this.generateDays();
122
+ }
123
+ else if (this.currentView === 'year') {
124
+ this.viewDate = addYears(this.viewDate, 16);
125
+ this.generateYears();
126
+ }
127
+ else if (this.currentView === 'month') {
128
+ this.viewDate = addYears(this.viewDate, 1);
129
+ }
130
+ }
131
+ else if (this.mode === 'month') {
132
+ this.viewDate = addYears(this.viewDate, 1);
60
133
  }
61
- else if (this.currentView === 'year') {
62
- this.viewDate = addYears(this.viewDate, 16);
134
+ else if (this.mode === 'year') {
135
+ this.yearRangeStart += 12;
63
136
  this.generateYears();
64
137
  }
65
- else if (this.currentView === 'month') {
66
- this.viewDate = addYears(this.viewDate, 1);
138
+ else if (this.mode === 'month-year') {
139
+ if (this.currentView === 'month') {
140
+ this.viewDate = addYears(this.viewDate, 1);
141
+ }
142
+ else {
143
+ this.yearRangeStart += 12;
144
+ this.generateYears();
145
+ }
67
146
  }
68
147
  }
148
+ prevYears() {
149
+ this.yearRangeStart -= 12;
150
+ this.generateYears();
151
+ }
152
+ nextYears() {
153
+ this.yearRangeStart += 12;
154
+ this.generateYears();
155
+ }
69
156
  selectDate(date) {
70
157
  if (this.isDateDisabled(date))
71
158
  return;
72
159
  this.selectedDate = date;
73
- if (!isSameMonth(date, this.viewDate)) {
74
- this.viewDate = date;
75
- this.generateDays();
76
- }
77
160
  this.onChange(date);
78
161
  this.onTouched();
162
+ this.dateSelect.emit(date);
79
163
  }
80
164
  selectMonth(monthIndex) {
81
- this.viewDate = setMonth(this.viewDate, monthIndex);
82
- this.currentView = 'date';
83
- this.generateDays();
165
+ if (this.mode === 'date') {
166
+ this.viewDate = setMonth(this.viewDate, monthIndex);
167
+ this.currentView = 'date';
168
+ this.generateDays();
169
+ }
170
+ else if (this.mode === 'month') {
171
+ this.viewDate = setMonth(this.viewDate, monthIndex);
172
+ this.selectedDate = this.viewDate;
173
+ this.onChange(this.viewDate);
174
+ this.onTouched();
175
+ this.dateSelect.emit(this.viewDate);
176
+ }
84
177
  }
85
178
  selectYear(year) {
86
- this.viewDate = setYear(this.viewDate, year);
87
- this.currentView = 'date'; // Jump straight back to date view for efficiency
88
- this.generateDays();
179
+ if (this.mode === 'date') {
180
+ this.viewDate = setYear(this.viewDate, year);
181
+ this.currentView = 'date';
182
+ this.generateDays();
183
+ }
184
+ else if (this.mode === 'year' || this.mode === 'month') {
185
+ this.viewDate = setYear(this.viewDate, year);
186
+ this.selectedDate = this.viewDate;
187
+ this.onChange(this.viewDate);
188
+ this.onTouched();
189
+ this.dateSelect.emit(this.viewDate);
190
+ }
89
191
  }
90
192
  getDayClass(date) {
91
193
  const isSelected = this.selectedDate && isSameDay(date, this.selectedDate);
92
194
  const isTodayDate = isToday(date);
93
195
  const isOutside = !isSameMonth(date, this.viewDate);
94
196
  const isDisabled = this.isDateDisabled(date);
95
- return cn('h-9 w-9 p-0 font-normal text-sm rounded-md transition-all flex items-center justify-center', !isSelected && !isDisabled && 'hover:bg-accent hover:text-accent-foreground', isSelected && 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground', !isSelected && isTodayDate && 'bg-accent text-accent-foreground', (isOutside || isDisabled) && 'text-muted-foreground opacity-50', isDisabled && 'cursor-not-allowed');
197
+ return cn('h-9 w-9 p-0 font-normal text-sm rounded-md transition-all flex items-center justify-center', !isSelected && !isDisabled && 'hover:bg-accent hover:text-accent-foreground', isSelected && 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground', !isSelected && isTodayDate && 'bg-accent text-accent-foreground', (isOutside || isDisabled) && 'text-muted-foreground opacity-50', isDisabled && 'cursor-not-allowed');
198
+ }
199
+ getMonthClass(monthIndex) {
200
+ const isSelected = this.selectedDate &&
201
+ this.selectedDate.getMonth() === monthIndex &&
202
+ this.selectedDate.getFullYear() === this.viewDate.getFullYear();
203
+ const isCurrent = new Date().getMonth() === monthIndex &&
204
+ new Date().getFullYear() === this.viewDate.getFullYear();
205
+ return cn('text-sm py-2.5 rounded-md transition-colors', isSelected ? 'bg-primary text-primary-foreground hover:bg-primary' :
206
+ isCurrent ? 'border border-primary/30 text-primary' :
207
+ 'hover:bg-accent hover:text-accent-foreground');
208
+ }
209
+ getYearClass(year) {
210
+ const isSelected = this.selectedDate &&
211
+ this.selectedDate.getFullYear() === year;
212
+ const isCurrent = new Date().getFullYear() === year;
213
+ return cn('text-sm py-2 rounded-md transition-colors', isSelected ? 'bg-primary text-primary-foreground hover:bg-primary' :
214
+ isCurrent ? 'border border-primary/30 text-primary' :
215
+ 'hover:bg-accent hover:text-accent-foreground');
96
216
  }
97
217
  isDateDisabled(date) {
98
- return this.disablePastDates ? isBefore(date, startOfDay(new Date())) : false;
218
+ if (this.disablePastDates && isBefore(date, startOfDay(new Date()))) {
219
+ return true;
220
+ }
221
+ if (this.minDate && isBefore(date, this.minDate)) {
222
+ return true;
223
+ }
224
+ if (this.maxDate && isBefore(this.maxDate, date)) {
225
+ return true;
226
+ }
227
+ return false;
228
+ }
229
+ isTodayDisabled() {
230
+ return this.isDateDisabled(new Date());
231
+ }
232
+ selectToday() {
233
+ if (!this.isTodayDisabled()) {
234
+ this.selectDate(new Date());
235
+ }
236
+ }
237
+ clear() {
238
+ this.selectedDate = null;
239
+ this.onChange(null);
240
+ this.onTouched();
241
+ this.dateSelect.emit(null);
99
242
  }
100
243
  // CVA Implementation
101
244
  writeValue(obj) {
@@ -112,27 +255,26 @@ export class CalendarComponent {
112
255
  registerOnChange(fn) { this.onChange = fn; }
113
256
  registerOnTouched(fn) { this.onTouched = fn; }
114
257
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
115
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CalendarComponent, isStandalone: true, selector: "tolle-calendar", inputs: { class: "class", disablePastDates: "disablePastDates" }, providers: [
258
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CalendarComponent, isStandalone: true, selector: "tolle-calendar", inputs: { class: "class", mode: "mode", disablePastDates: "disablePastDates", showQuickActions: "showQuickActions", minDate: "minDate", maxDate: "maxDate", formatMonthFn: "formatMonthFn", formatYearFn: "formatYearFn", formatDateFn: "formatDateFn" }, outputs: { dateSelect: "dateSelect" }, providers: [
116
259
  {
117
260
  provide: NG_VALUE_ACCESSOR,
118
261
  useExisting: forwardRef(() => CalendarComponent),
119
262
  multi: true
120
263
  }
121
264
  ], ngImport: i0, template: `
122
- <div [class]="cn('p-3 border rounded-md bg-background text-popover-foreground shadow-sm inline-block w-fit', class)">
123
-
265
+ <div [class]="cn('p-3 border rounded-md bg-background text-popover-foreground shadow-sm inline-block min-w-fit', class)">
266
+ <!-- Header with Navigation -->
124
267
  <div class="flex items-center justify-between pt-1 pb-4 gap-2">
125
-
268
+ <!-- View Selector -->
126
269
  <div class="flex items-center gap-1">
127
- <button
270
+ <button *ngIf="mode !== 'year'"
128
271
  type="button"
129
272
  (click)="setView('month')"
130
273
  [class]="cn(
131
274
  'text-sm font-semibold px-2 py-1 rounded transition-colors',
132
275
  currentView === 'month' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground'
133
- )"
134
- >
135
- {{ viewDate | date: 'MMMM' }}
276
+ )">
277
+ {{ formatMonthYear(viewDate, 'month') }}
136
278
  </button>
137
279
 
138
280
  <button
@@ -141,12 +283,12 @@ export class CalendarComponent {
141
283
  [class]="cn(
142
284
  'text-sm font-semibold px-2 py-1 rounded transition-colors',
143
285
  currentView === 'year' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground'
144
- )"
145
- >
146
- {{ viewDate | date: 'yyyy' }}
286
+ )">
287
+ {{ formatMonthYear(viewDate, 'year') }}
147
288
  </button>
148
289
  </div>
149
290
 
291
+ <!-- Navigation Buttons -->
150
292
  <div class="flex items-center space-x-1">
151
293
  <button type="button" (click)="prev()" [class]="navBtnClass">
152
294
  <i class="ri-arrow-left-s-line text-lg"></i>
@@ -157,7 +299,8 @@ export class CalendarComponent {
157
299
  </div>
158
300
  </div>
159
301
 
160
- <div *ngIf="currentView === 'date'" class="space-y-2 animate-in fade-in zoom-in-95 duration-200">
302
+ <!-- DATE MODE -->
303
+ <div *ngIf="currentView === 'date' && mode === 'date'" class="space-y-2 animate-in fade-in zoom-in-95 duration-200">
161
304
  <div class="grid grid-cols-7 gap-1 w-full">
162
305
  <span *ngFor="let day of weekDays" class="text-[0.8rem] text-muted-foreground font-normal text-center w-9">
163
306
  {{ day }}
@@ -171,47 +314,66 @@ export class CalendarComponent {
171
314
  [disabled]="isDateDisabled(date)"
172
315
  [class]="getDayClass(date)"
173
316
  >
174
- {{ date | date: 'd' }}
317
+ {{ formatDate(date, 'day') }}
175
318
  </button>
176
319
  </div>
177
320
  </div>
178
321
 
179
- <div *ngIf="currentView === 'month'" class="grid grid-cols-3 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
322
+ <!-- MONTH SELECTOR (for date mode and month mode) -->
323
+ <div *ngIf="(currentView === 'month')"
324
+ class="grid grid-cols-3 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
180
325
  <button
181
326
  *ngFor="let month of months; let i = index"
182
327
  type="button"
183
328
  (click)="selectMonth(i)"
184
- [class]="cn(
185
- 'text-sm py-2.5 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors',
186
- i === viewDate.getMonth() ? 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground' : ''
187
- )"
329
+ [class]="getMonthClass(i)"
188
330
  >
189
331
  {{ month }}
190
332
  </button>
191
333
  </div>
192
334
 
193
- <div *ngIf="currentView === 'year'" class="grid grid-cols-4 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
335
+ <!-- YEAR SELECTOR (for date mode and year mode) -->
336
+ <div *ngIf="(currentView === 'year') "
337
+ class="grid grid-cols-4 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
194
338
  <button
195
339
  *ngFor="let year of years"
196
340
  type="button"
197
341
  (click)="selectYear(year)"
198
- [class]="cn(
199
- 'text-sm py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors',
200
- year === viewDate.getFullYear() ? 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground' : ''
201
- )"
342
+ [class]="getYearClass(year)"
202
343
  >
203
344
  {{ year }}
204
345
  </button>
205
346
  </div>
347
+
348
+ <!-- Quick Actions -->
349
+ <div *ngIf="showQuickActions" class="border-t pt-3 mt-3">
350
+ <div class="flex items-center justify-between gap-2">
351
+ <button
352
+ type="button"
353
+ (click)="selectToday()"
354
+ [class]="quickActionBtnClass"
355
+ [disabled]="isTodayDisabled()"
356
+ >
357
+ Today
358
+ </button>
359
+ <button
360
+ type="button"
361
+ (click)="clear()"
362
+ [class]="quickActionBtnClass"
363
+ >
364
+ Clear
365
+ </button>
366
+ </div>
367
+ </div>
206
368
  </div>
207
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
369
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }] });
208
370
  }
209
371
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CalendarComponent, decorators: [{
210
372
  type: Component,
211
373
  args: [{
212
374
  selector: 'tolle-calendar',
213
375
  standalone: true,
214
- imports: [CommonModule],
376
+ imports: [CommonModule, FormsModule],
215
377
  providers: [
216
378
  {
217
379
  provide: NG_VALUE_ACCESSOR,
@@ -220,20 +382,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
220
382
  }
221
383
  ],
222
384
  template: `
223
- <div [class]="cn('p-3 border rounded-md bg-background text-popover-foreground shadow-sm inline-block w-fit', class)">
224
-
385
+ <div [class]="cn('p-3 border rounded-md bg-background text-popover-foreground shadow-sm inline-block min-w-fit', class)">
386
+ <!-- Header with Navigation -->
225
387
  <div class="flex items-center justify-between pt-1 pb-4 gap-2">
226
-
388
+ <!-- View Selector -->
227
389
  <div class="flex items-center gap-1">
228
- <button
390
+ <button *ngIf="mode !== 'year'"
229
391
  type="button"
230
392
  (click)="setView('month')"
231
393
  [class]="cn(
232
394
  'text-sm font-semibold px-2 py-1 rounded transition-colors',
233
395
  currentView === 'month' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground'
234
- )"
235
- >
236
- {{ viewDate | date: 'MMMM' }}
396
+ )">
397
+ {{ formatMonthYear(viewDate, 'month') }}
237
398
  </button>
238
399
 
239
400
  <button
@@ -242,12 +403,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
242
403
  [class]="cn(
243
404
  'text-sm font-semibold px-2 py-1 rounded transition-colors',
244
405
  currentView === 'year' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground'
245
- )"
246
- >
247
- {{ viewDate | date: 'yyyy' }}
406
+ )">
407
+ {{ formatMonthYear(viewDate, 'year') }}
248
408
  </button>
249
409
  </div>
250
410
 
411
+ <!-- Navigation Buttons -->
251
412
  <div class="flex items-center space-x-1">
252
413
  <button type="button" (click)="prev()" [class]="navBtnClass">
253
414
  <i class="ri-arrow-left-s-line text-lg"></i>
@@ -258,7 +419,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
258
419
  </div>
259
420
  </div>
260
421
 
261
- <div *ngIf="currentView === 'date'" class="space-y-2 animate-in fade-in zoom-in-95 duration-200">
422
+ <!-- DATE MODE -->
423
+ <div *ngIf="currentView === 'date' && mode === 'date'" class="space-y-2 animate-in fade-in zoom-in-95 duration-200">
262
424
  <div class="grid grid-cols-7 gap-1 w-full">
263
425
  <span *ngFor="let day of weekDays" class="text-[0.8rem] text-muted-foreground font-normal text-center w-9">
264
426
  {{ day }}
@@ -272,44 +434,79 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
272
434
  [disabled]="isDateDisabled(date)"
273
435
  [class]="getDayClass(date)"
274
436
  >
275
- {{ date | date: 'd' }}
437
+ {{ formatDate(date, 'day') }}
276
438
  </button>
277
439
  </div>
278
440
  </div>
279
441
 
280
- <div *ngIf="currentView === 'month'" class="grid grid-cols-3 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
442
+ <!-- MONTH SELECTOR (for date mode and month mode) -->
443
+ <div *ngIf="(currentView === 'month')"
444
+ class="grid grid-cols-3 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
281
445
  <button
282
446
  *ngFor="let month of months; let i = index"
283
447
  type="button"
284
448
  (click)="selectMonth(i)"
285
- [class]="cn(
286
- 'text-sm py-2.5 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors',
287
- i === viewDate.getMonth() ? 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground' : ''
288
- )"
449
+ [class]="getMonthClass(i)"
289
450
  >
290
451
  {{ month }}
291
452
  </button>
292
453
  </div>
293
454
 
294
- <div *ngIf="currentView === 'year'" class="grid grid-cols-4 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
455
+ <!-- YEAR SELECTOR (for date mode and year mode) -->
456
+ <div *ngIf="(currentView === 'year') "
457
+ class="grid grid-cols-4 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
295
458
  <button
296
459
  *ngFor="let year of years"
297
460
  type="button"
298
461
  (click)="selectYear(year)"
299
- [class]="cn(
300
- 'text-sm py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors',
301
- year === viewDate.getFullYear() ? 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground' : ''
302
- )"
462
+ [class]="getYearClass(year)"
303
463
  >
304
464
  {{ year }}
305
465
  </button>
306
466
  </div>
467
+
468
+ <!-- Quick Actions -->
469
+ <div *ngIf="showQuickActions" class="border-t pt-3 mt-3">
470
+ <div class="flex items-center justify-between gap-2">
471
+ <button
472
+ type="button"
473
+ (click)="selectToday()"
474
+ [class]="quickActionBtnClass"
475
+ [disabled]="isTodayDisabled()"
476
+ >
477
+ Today
478
+ </button>
479
+ <button
480
+ type="button"
481
+ (click)="clear()"
482
+ [class]="quickActionBtnClass"
483
+ >
484
+ Clear
485
+ </button>
486
+ </div>
487
+ </div>
307
488
  </div>
308
489
  `
309
490
  }]
310
- }], propDecorators: { class: [{
491
+ }], ctorParameters: () => [], propDecorators: { class: [{
492
+ type: Input
493
+ }], mode: [{
311
494
  type: Input
312
495
  }], disablePastDates: [{
313
496
  type: Input
497
+ }], showQuickActions: [{
498
+ type: Input
499
+ }], minDate: [{
500
+ type: Input
501
+ }], maxDate: [{
502
+ type: Input
503
+ }], formatMonthFn: [{
504
+ type: Input
505
+ }], formatYearFn: [{
506
+ type: Input
507
+ }], formatDateFn: [{
508
+ type: Input
509
+ }], dateSelect: [{
510
+ type: Output
314
511
  }] } });
315
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9jYWxlbmRhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQVUsVUFBVSxFQUNyQyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxTQUFTLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQzlDLFdBQVcsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUN0RCxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUNoRixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7QUFxR2hDLE1BQU0sT0FBTyxpQkFBaUI7SUFDbkIsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUVsQyxXQUFXLEdBQThCLE1BQU0sQ0FBQztJQUNoRCxRQUFRLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUM1QixZQUFZLEdBQWdCLElBQUksQ0FBQztJQUVqQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RCxXQUFXLEdBQVcsRUFBRSxDQUFDO0lBQ3pCLE1BQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVB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Q0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxpQkFBaUIsQ0FBQyxFQUFPLElBQVUsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dHQS9IOUMsaUJBQWlCOzRGQUFqQixpQkFBaUIsK0hBL0ZqQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUM7Z0JBQ2hELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRiwwQkFDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzRlQsMkRBOUZTLFlBQVk7OzRGQWdHWCxpQkFBaUI7a0JBbkc3QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQzs0QkFDaEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7b0JBQ0QsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNGVDtpQkFDRjs4QkFFVSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGFkZE1vbnRocywgc3ViTW9udGhzLCBzdGFydE9mTW9udGgsIGVuZE9mTW9udGgsXG4gIHN0YXJ0T2ZXZWVrLCBlbmRPZldlZWssIGVhY2hEYXlPZkludGVydmFsLCBpc1NhbWVNb250aCxcbiAgaXNTYW1lRGF5LCBpc1RvZGF5LCBzZXRNb250aCwgc2V0WWVhciwgYWRkWWVhcnMsIHN1YlllYXJzLCBpc0JlZm9yZSwgc3RhcnRPZkRheVxufSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1jYWxlbmRhcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENhbGVuZGFyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNuKCdwLTMgYm9yZGVyIHJvdW5kZWQtbWQgYmctYmFja2dyb3VuZCB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBzaGFkb3ctc20gaW5saW5lLWJsb2NrIHctZml0JywgY2xhc3MpXCI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHQtMSBwYi00IGdhcC0yXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0VmlldygnbW9udGgnKVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiY24oXG4gICAgICAgICAgICAgICd0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgcHgtMiBweS0xIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMnLFxuICAgICAgICAgICAgICBjdXJyZW50VmlldyA9PT0gJ21vbnRoJyA/ICdiZy1zZWNvbmRhcnkgdGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZCcgOiAnaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQnXG4gICAgICAgICAgICApXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB2aWV3RGF0ZSB8IGRhdGU6ICdNTU1NJyB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0VmlldygneWVhcicpXCJcbiAgICAgICAgICAgIFtjbGFzc109XCJjbihcbiAgICAgICAgICAgICAgJ3RleHQtc20gZm9udC1zZW1pYm9sZCBweC0yIHB5LTEgcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycycsXG4gICAgICAgICAgICAgIGN1cnJlbnRWaWV3ID09PSAneWVhcicgPyAnYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQnIDogJ2hvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJ1xuICAgICAgICAgICAgKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdmlld0RhdGUgfCBkYXRlOiAneXl5eScgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMVwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJwcmV2KClcIiBbY2xhc3NdPVwibmF2QnRuQ2xhc3NcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwicmktYXJyb3ctbGVmdC1zLWxpbmUgdGV4dC1sZ1wiPjwvaT5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibmV4dCgpXCIgW2NsYXNzXT1cIm5hdkJ0bkNsYXNzXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInJpLWFycm93LXJpZ2h0LXMtbGluZSB0ZXh0LWxnXCI+PC9pPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFZpZXcgPT09ICdkYXRlJ1wiIGNsYXNzPVwic3BhY2UteS0yIGFuaW1hdGUtaW4gZmFkZS1pbiB6b29tLWluLTk1IGR1cmF0aW9uLTIwMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBnYXAtMSB3LWZ1bGxcIj5cbiAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtEYXlzXCIgY2xhc3M9XCJ0ZXh0LVswLjhyZW1dIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBmb250LW5vcm1hbCB0ZXh0LWNlbnRlciB3LTlcIj5cbiAgICAgICAgICAgIHt7IGRheSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IGdhcC0xIHctZnVsbFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXRlIG9mIGRheXNJbk1vbnRoXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERhdGUoZGF0ZSlcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGF0ZURpc2FibGVkKGRhdGUpXCJcbiAgICAgICAgICAgIFtjbGFzc109XCJnZXREYXlDbGFzcyhkYXRlKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZGF0ZSB8IGRhdGU6ICdkJyB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFZpZXcgPT09ICdtb250aCdcIiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTMgZ2FwLTIgdy02NCBhbmltYXRlLWluIGZhZGUtaW4gem9vbS1pbi05NSBkdXJhdGlvbi0yMDBcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RNb250aChpKVwiXG4gICAgICAgICAgW2NsYXNzXT1cImNuKFxuICAgICAgICAgICAgJ3RleHQtc20gcHktMi41IHJvdW5kZWQtbWQgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQgdHJhbnNpdGlvbi1jb2xvcnMnLFxuICAgICAgICAgICAgaSA9PT0gdmlld0RhdGUuZ2V0TW9udGgoKSA/ICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGhvdmVyOmJnLXByaW1hcnkgaG92ZXI6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQnIDogJydcbiAgICAgICAgICApXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IG1vbnRoIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50VmlldyA9PT0gJ3llYXInXCIgY2xhc3M9XCJncmlkIGdyaWQtY29scy00IGdhcC0yIHctNjQgYW5pbWF0ZS1pbiBmYWRlLWluIHpvb20taW4tOTUgZHVyYXRpb24tMjAwXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgeWVhciBvZiB5ZWFyc1wiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFllYXIoeWVhcilcIlxuICAgICAgICAgIFtjbGFzc109XCJjbihcbiAgICAgICAgICAgICd0ZXh0LXNtIHB5LTIgcm91bmRlZC1tZCBob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycycsXG4gICAgICAgICAgICB5ZWFyID09PSB2aWV3RGF0ZS5nZXRGdWxsWWVhcigpID8gJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgaG92ZXI6YmctcHJpbWFyeSBob3Zlcjp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCcgOiAnJ1xuICAgICAgICAgIClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgeWVhciB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIEBJbnB1dCgpIGRpc2FibGVQYXN0RGF0ZXMgPSBmYWxzZTtcblxuICBjdXJyZW50VmlldzogJ2RhdGUnIHwgJ21vbnRoJyB8ICd5ZWFyJyA9ICdkYXRlJztcbiAgdmlld0RhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xuICBzZWxlY3RlZERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcblxuICB3ZWVrRGF5cyA9IFsnU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXTtcbiAgZGF5c0luTW9udGg6IERhdGVbXSA9IFtdO1xuICBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107XG4gIHllYXJzOiBudW1iZXJbXSA9IFtdO1xuXG4gIG5hdkJ0bkNsYXNzID0gY24oJ2gtNyB3LTcgYmctdHJhbnNwYXJlbnQgcC0wIG9wYWNpdHktNTAgaG92ZXI6b3BhY2l0eS0xMDAgYm9yZGVyIGJvcmRlci1pbnB1dCByb3VuZGVkLW1kIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tYWxsJyk7XG5cbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gIHByb3RlY3RlZCBjbiA9IGNuO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gIH1cblxuICBnZW5lcmF0ZURheXMoKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBzdGFydE9mV2VlayhzdGFydE9mTW9udGgodGhpcy52aWV3RGF0ZSkpO1xuICAgIGNvbnN0IGVuZCA9IGVuZE9mV2VlayhlbmRPZk1vbnRoKHRoaXMudmlld0RhdGUpKTtcbiAgICB0aGlzLmRheXNJbk1vbnRoID0gZWFjaERheU9mSW50ZXJ2YWwoeyBzdGFydCwgZW5kIH0pO1xuICB9XG5cbiAgZ2VuZXJhdGVZZWFycygpIHtcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IHRoaXMudmlld0RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAvLyBHZW5lcmF0ZXMgYSAxNi15ZWFyIHdpbmRvdyBjZW50ZXJlZCByb3VnaGx5IG9uIGN1cnJlbnQgdmlld1xuICAgIHRoaXMueWVhcnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxNiB9LCAoXywgaSkgPT4gY3VycmVudFllYXIgLSA2ICsgaSk7XG4gIH1cblxuICBzZXRWaWV3KHZpZXc6ICdkYXRlJyB8ICdtb250aCcgfCAneWVhcicpIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdmlldztcbiAgICAvLyBJZiBzd2l0Y2hpbmcgdG8geWVhciB2aWV3LCBlbnN1cmUgdGhlIHllYXIgZ3JpZCBpcyBjZW50ZXJlZCBvbiBjdXJyZW50IHZpZXcgeWVhclxuICAgIGlmICh2aWV3ID09PSAneWVhcicpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVZZWFycygpO1xuICAgIH1cbiAgfVxuXG4gIHByZXYoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdkYXRlJykge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IHN1Yk1vbnRocyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAneWVhcicpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBzdWJZZWFycyh0aGlzLnZpZXdEYXRlLCAxNik7XG4gICAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBzdWJZZWFycyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICB9XG4gIH1cblxuICBuZXh0KCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnZGF0ZScpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBhZGRNb250aHModGhpcy52aWV3RGF0ZSwgMSk7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gYWRkWWVhcnModGhpcy52aWV3RGF0ZSwgMTYpO1xuICAgICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnbW9udGgnKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gYWRkWWVhcnModGhpcy52aWV3RGF0ZSwgMSk7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0RGF0ZShkYXRlOiBEYXRlKSB7XG4gICAgaWYgKHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF0ZSkpIHJldHVybjtcblxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gZGF0ZTtcbiAgICBpZiAoIWlzU2FtZU1vbnRoKGRhdGUsIHRoaXMudmlld0RhdGUpKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gZGF0ZTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5vbkNoYW5nZShkYXRlKTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgc2VsZWN0TW9udGgobW9udGhJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy52aWV3RGF0ZSA9IHNldE1vbnRoKHRoaXMudmlld0RhdGUsIG1vbnRoSW5kZXgpO1xuICAgIHRoaXMuY3VycmVudFZpZXcgPSAnZGF0ZSc7XG4gICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgfVxuXG4gIHNlbGVjdFllYXIoeWVhcjogbnVtYmVyKSB7XG4gICAgdGhpcy52aWV3RGF0ZSA9IHNldFllYXIodGhpcy52aWV3RGF0ZSwgeWVhcik7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9ICdkYXRlJzsgLy8gSnVtcCBzdHJhaWdodCBiYWNrIHRvIGRhdGUgdmlldyBmb3IgZWZmaWNpZW5jeVxuICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gIH1cblxuICBnZXREYXlDbGFzcyhkYXRlOiBEYXRlKSB7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWREYXRlICYmIGlzU2FtZURheShkYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgY29uc3QgaXNUb2RheURhdGUgPSBpc1RvZGF5KGRhdGUpO1xuICAgIGNvbnN0IGlzT3V0c2lkZSA9ICFpc1NhbWVNb250aChkYXRlLCB0aGlzLnZpZXdEYXRlKTtcbiAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKTtcblxuICAgIHJldHVybiBjbihcbiAgICAgICdoLTkgdy05IHAtMCBmb250LW5vcm1hbCB0ZXh0LXNtIHJvdW5kZWQtbWQgdHJhbnNpdGlvbi1hbGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXInLFxuICAgICAgIWlzU2VsZWN0ZWQgJiYgIWlzRGlzYWJsZWQgJiYgJ2hvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJyxcbiAgICAgIGlzU2VsZWN0ZWQgJiYgJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgaG92ZXI6YmctcHJpbWFyeSBob3Zlcjp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBmb2N1czpiZy1wcmltYXJ5IGZvY3VzOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJyxcbiAgICAgICFpc1NlbGVjdGVkICYmIGlzVG9kYXlEYXRlICYmICdiZy1hY2NlbnQgdGV4dC1hY2NlbnQtZm9yZWdyb3VuZCcsXG4gICAgICAoaXNPdXRzaWRlIHx8IGlzRGlzYWJsZWQpICYmICd0ZXh0LW11dGVkLWZvcmVncm91bmQgb3BhY2l0eS01MCcsXG4gICAgICBpc0Rpc2FibGVkICYmICdjdXJzb3Itbm90LWFsbG93ZWQnXG4gICAgKTtcbiAgfVxuXG4gIGlzRGF0ZURpc2FibGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlUGFzdERhdGVzID8gaXNCZWZvcmUoZGF0ZSwgc3RhcnRPZkRheShuZXcgRGF0ZSgpKSkgOiBmYWxzZTtcbiAgfVxuXG4gIC8vIENWQSBJbXBsZW1lbnRhdGlvblxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gICAgaWYgKG9iaikge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG9iaik7XG4gICAgICBpZiAoIWlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XG4gICAgICAgIHRoaXMudmlld0RhdGUgPSBkYXRlO1xuICAgICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgICAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7IHRoaXMub25DaGFuZ2UgPSBmbjsgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7IHRoaXMub25Ub3VjaGVkID0gZm47IH1cbn1cbiJdfQ==
512
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9jYWxlbmRhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQVUsVUFBVSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQzNELE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFDTCxTQUFTLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQzlDLFdBQVcsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUN0RCxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFDekQsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQzdCLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7OztBQTBIaEMsTUFBTSxPQUFPLGlCQUFpQjtJQUNuQixLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ1gsSUFBSSxHQUFpQixNQUFNLENBQUM7SUFDNUIsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUN4QixPQUFPLENBQVE7SUFDZixPQUFPLENBQVE7SUFDZixhQUFhLENBQTBCO0lBQ3ZDLFlBQVksQ0FBMEI7SUFDdEMsWUFBWSxDQUEwQjtJQUVyQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztJQUV2RCxXQUFXLEdBQThCLE1BQU0sQ0FBQztJQUNoRCxRQUFRLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUM1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QUUsZ0JBQWdCO29CQUMxQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQztvQkFDcEMsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDOzRCQUNoRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtvQkFDRCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlHVDtpQkFDRjt3REFFVSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBmb3J3YXJkUmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgYWRkTW9udGhzLCBzdWJNb250aHMsIHN0YXJ0T2ZNb250aCwgZW5kT2ZNb250aCxcbiAgc3RhcnRPZldlZWssIGVuZE9mV2VlaywgZWFjaERheU9mSW50ZXJ2YWwsIGlzU2FtZU1vbnRoLFxuICBpc1NhbWVEYXksIGlzVG9kYXksIHNldE1vbnRoLCBzZXRZZWFyLCBhZGRZZWFycywgc3ViWWVhcnMsXG4gIGlzQmVmb3JlLCBzdGFydE9mRGF5LCBmb3JtYXQsIHBhcnNlSVNPLCBpc1ZhbGlkLCBpc1NhbWVZZWFyXG59IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5cbmV4cG9ydCB0eXBlIENhbGVuZGFyTW9kZSA9ICdkYXRlJyB8ICdtb250aCcgfCAneWVhcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWNhbGVuZGFyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENhbGVuZGFyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNuKCdwLTMgYm9yZGVyIHJvdW5kZWQtbWQgYmctYmFja2dyb3VuZCB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBzaGFkb3ctc20gaW5saW5lLWJsb2NrIG1pbi13LWZpdCcsIGNsYXNzKVwiPlxuICAgICAgPCEtLSBIZWFkZXIgd2l0aCBOYXZpZ2F0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBwdC0xIHBiLTQgZ2FwLTJcIj5cbiAgICAgICAgPCEtLSBWaWV3IFNlbGVjdG9yIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwibW9kZSAhPT0gJ3llYXInXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNldFZpZXcoJ21vbnRoJylcIlxuICAgICAgICAgICAgW2NsYXNzXT1cImNuKFxuICAgICAgICAgICAgICAndGV4dC1zbSBmb250LXNlbWlib2xkIHB4LTIgcHktMSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICAgICAgICAgY3VycmVudFZpZXcgPT09ICdtb250aCcgPyAnYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQnIDogJ2hvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJ1xuICAgICAgICAgICAgKVwiPlxuICAgICAgICAgICAge3sgZm9ybWF0TW9udGhZZWFyKHZpZXdEYXRlLCAnbW9udGgnKSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0VmlldygneWVhcicpXCJcbiAgICAgICAgICAgIFtjbGFzc109XCJjbihcbiAgICAgICAgICAgICAgJ3RleHQtc20gZm9udC1zZW1pYm9sZCBweC0yIHB5LTEgcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycycsXG4gICAgICAgICAgICAgIGN1cnJlbnRWaWV3ID09PSAneWVhcicgPyAnYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQnIDogJ2hvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJ1xuICAgICAgICAgICAgKVwiPlxuICAgICAgICAgICAge3sgZm9ybWF0TW9udGhZZWFyKHZpZXdEYXRlLCAneWVhcicpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTmF2aWdhdGlvbiBCdXR0b25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0xXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInByZXYoKVwiIFtjbGFzc109XCJuYXZCdG5DbGFzc1wiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJyaS1hcnJvdy1sZWZ0LXMtbGluZSB0ZXh0LWxnXCI+PC9pPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJuZXh0KClcIiBbY2xhc3NdPVwibmF2QnRuQ2xhc3NcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwicmktYXJyb3ctcmlnaHQtcy1saW5lIHRleHQtbGdcIj48L2k+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gREFURSBNT0RFIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImN1cnJlbnRWaWV3ID09PSAnZGF0ZScgJiYgbW9kZSA9PT0gJ2RhdGUnXCIgY2xhc3M9XCJzcGFjZS15LTIgYW5pbWF0ZS1pbiBmYWRlLWluIHpvb20taW4tOTUgZHVyYXRpb24tMjAwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IGdhcC0xIHctZnVsbFwiPlxuICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla0RheXNcIiBjbGFzcz1cInRleHQtWzAuOHJlbV0gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGZvbnQtbm9ybWFsIHRleHQtY2VudGVyIHctOVwiPlxuICAgICAgICAgICAge3sgZGF5IH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgZ2FwLTEgdy1mdWxsXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRhdGUgb2YgZGF5c0luTW9udGhcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShkYXRlKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEYXRlRGlzYWJsZWQoZGF0ZSlcIlxuICAgICAgICAgICAgW2NsYXNzXT1cImdldERheUNsYXNzKGRhdGUpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBmb3JtYXREYXRlKGRhdGUsICdkYXknKSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIE1PTlRIIFNFTEVDVE9SIChmb3IgZGF0ZSBtb2RlIGFuZCBtb250aCBtb2RlKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIoY3VycmVudFZpZXcgPT09ICdtb250aCcpXCJcbiAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy0zIGdhcC0yIHctNjQgYW5pbWF0ZS1pbiBmYWRlLWluIHpvb20taW4tOTUgZHVyYXRpb24tMjAwXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgbW9udGggb2YgbW9udGhzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TW9udGgoaSlcIlxuICAgICAgICAgIFtjbGFzc109XCJnZXRNb250aENsYXNzKGkpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IG1vbnRoIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gWUVBUiBTRUxFQ1RPUiAoZm9yIGRhdGUgbW9kZSBhbmQgeWVhciBtb2RlKSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIoY3VycmVudFZpZXcgPT09ICd5ZWFyJykgXCJcbiAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy00IGdhcC0yIHctNjQgYW5pbWF0ZS1pbiBmYWRlLWluIHpvb20taW4tOTUgZHVyYXRpb24tMjAwXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgeWVhciBvZiB5ZWFyc1wiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFllYXIoeWVhcilcIlxuICAgICAgICAgIFtjbGFzc109XCJnZXRZZWFyQ2xhc3MoeWVhcilcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgeWVhciB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFF1aWNrIEFjdGlvbnMgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd1F1aWNrQWN0aW9uc1wiIGNsYXNzPVwiYm9yZGVyLXQgcHQtMyBtdC0zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTJcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUb2RheSgpXCJcbiAgICAgICAgICAgIFtjbGFzc109XCJxdWlja0FjdGlvbkJ0bkNsYXNzXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1RvZGF5RGlzYWJsZWQoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgVG9kYXlcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigpXCJcbiAgICAgICAgICAgIFtjbGFzc109XCJxdWlja0FjdGlvbkJ0bkNsYXNzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBDbGVhclxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIEBJbnB1dCgpIG1vZGU6IENhbGVuZGFyTW9kZSA9ICdkYXRlJztcbiAgQElucHV0KCkgZGlzYWJsZVBhc3REYXRlcyA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93UXVpY2tBY3Rpb25zID0gdHJ1ZTtcbiAgQElucHV0KCkgbWluRGF0ZT86IERhdGU7XG4gIEBJbnB1dCgpIG1heERhdGU/OiBEYXRlO1xuICBASW5wdXQoKSBmb3JtYXRNb250aEZuPzogKGRhdGU6IERhdGUpID0+IHN0cmluZztcbiAgQElucHV0KCkgZm9ybWF0WWVhckZuPzogKGRhdGU6IERhdGUpID0+IHN0cmluZztcbiAgQElucHV0KCkgZm9ybWF0RGF0ZUZuPzogKGRhdGU6IERhdGUpID0+IHN0cmluZztcblxuICBAT3V0cHV0KCkgZGF0ZVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IG51bGw+KCk7XG5cbiAgY3VycmVudFZpZXc6ICdkYXRlJyB8ICdtb250aCcgfCAneWVhcicgPSAnZGF0ZSc7XG4gIHZpZXdEYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcbiAgc2VsZWN0ZWREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgd2Vla0RheXMgPSBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ107XG4gIGRheXNJbk1vbnRoOiBEYXRlW10gPSBbXTtcbiAgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuICB5ZWFyczogbnVtYmVyW10gPSBbXTtcbiAgeWVhclJhbmdlU3RhcnQ6IG51bWJlcjtcblxuICBuYXZCdG5DbGFzcyA9IGNuKCdoLTcgdy03IGJnLXRyYW5zcGFyZW50IHAtMCBvcGFjaXR5LTUwIGhvdmVyOm9wYWNpdHktMTAwIGJvcmRlciBib3JkZXItaW5wdXQgcm91bmRlZC1tZCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWFsbCcpO1xuICBxdWlja0FjdGlvbkJ0bkNsYXNzID0gY24oJ3B4LTMgcHktMS41IHRleHQtc20gcm91bmRlZCBob3ZlcjpiZy1hY2NlbnQgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGhvdmVyOnRleHQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycycpO1xuXG4gIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBwcm90ZWN0ZWQgY24gPSBjbjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnllYXJSYW5nZVN0YXJ0ID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0gNjtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIEluaXRpYWxpemUgYmFzZWQgb24gbW9kZVxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnbW9udGgnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAneWVhcicpIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAneWVhcic7XG4gICAgfVxuXG4gICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgfVxuXG4gIC8vIEZvcm1hdCBoZWxwZXJzXG4gIGZvcm1hdE1vbnRoWWVhcihkYXRlOiBEYXRlLCB0eXBlOiAnbW9udGgnIHwgJ3llYXInKTogc3RyaW5nIHtcbiAgICBpZiAodHlwZSA9PT0gJ21vbnRoJyAmJiB0aGlzLmZvcm1hdE1vbnRoRm4pIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdE1vbnRoRm4oZGF0ZSk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAneWVhcicgJiYgdGhpcy5mb3JtYXRZZWFyRm4pIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdFllYXJGbihkYXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGUgPT09ICdtb250aCcgPyBmb3JtYXQoZGF0ZSwgJ01NTU0nKSA6IGZvcm1hdChkYXRlLCAneXl5eScpO1xuICB9XG5cbiAgZm9ybWF0RGF0ZShkYXRlOiBEYXRlLCB0eXBlOiAnZGF5JyB8ICdtb250aCcgfCAneWVhcicpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlID09PSAnZGF5JyAmJiB0aGlzLmZvcm1hdERhdGVGbikge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZUZuKGRhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gZm9ybWF0KGRhdGUsIHR5cGUgPT09ICdkYXknID8gJ2QnIDogdHlwZSA9PT0gJ21vbnRoJyA/ICdNTU0nIDogJ3l5eXknKTtcbiAgfVxuXG4gIGdlbmVyYXRlRGF5cygpIHtcbiAgICBpZiAodGhpcy5tb2RlICE9PSAnZGF0ZScpIHJldHVybjtcblxuICAgIGNvbnN0IHN0YXJ0ID0gc3RhcnRPZldlZWsoc3RhcnRPZk1vbnRoKHRoaXMudmlld0RhdGUpKTtcbiAgICBjb25zdCBlbmQgPSBlbmRPZldlZWsoZW5kT2ZNb250aCh0aGlzLnZpZXdEYXRlKSk7XG4gICAgdGhpcy5kYXlzSW5Nb250aCA9IGVhY2hEYXlPZkludGVydmFsKHsgc3RhcnQsIGVuZCB9KTtcbiAgfVxuXG4gIGdlbmVyYXRlWWVhcnMoKSB7XG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLnZpZXdEYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAneWVhcicpIHtcbiAgICAgIC8vIEZvciB5ZWFyIHBpY2tlciwgc2hvdyBhIDEyLXllYXIgZ3JpZFxuICAgICAgdGhpcy55ZWFycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDEyIH0sIChfLCBpKSA9PiB0aGlzLnllYXJSYW5nZVN0YXJ0ICsgaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBkYXRlIG1vZGUgeWVhciBzZWxlY3Rvciwgc2hvdyAxNiB5ZWFycyBjZW50ZXJlZCBvbiBjdXJyZW50XG4gICAgICB0aGlzLnllYXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTYgfSwgKF8sIGkpID0+IGN1cnJlbnRZZWFyIC0gNiArIGkpO1xuICAgIH1cbiAgfVxuXG4gIHNldFZpZXcodmlldzogJ2RhdGUnIHwgJ21vbnRoJyB8ICd5ZWFyJykge1xuICAgIHRoaXMuY3VycmVudFZpZXcgPSB2aWV3O1xuICAgIGlmICh2aWV3ID09PSAneWVhcicpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVZZWFycygpO1xuICAgIH1cbiAgfVxuXG4gIHByZXYoKSB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RhdGUnKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ2RhdGUnKSB7XG4gICAgICAgIHRoaXMudmlld0RhdGUgPSBzdWJNb250aHModGhpcy52aWV3RGF0ZSwgMSk7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd5ZWFyJykge1xuICAgICAgICB0aGlzLnZpZXdEYXRlID0gc3ViWWVhcnModGhpcy52aWV3RGF0ZSwgMTYpO1xuICAgICAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJykge1xuICAgICAgICB0aGlzLnZpZXdEYXRlID0gc3ViWWVhcnModGhpcy52aWV3RGF0ZSwgMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBzdWJZZWFycyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ3llYXInKSB7XG4gICAgICB0aGlzLnllYXJSYW5nZVN0YXJ0IC09IDEyO1xuICAgICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICdtb250aC15ZWFyJykge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgICAgdGhpcy52aWV3RGF0ZSA9IHN1YlllYXJzKHRoaXMudmlld0RhdGUsIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy55ZWFyUmFuZ2VTdGFydCAtPSAxMjtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmV4dCgpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZGF0ZScpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnZGF0ZScpIHtcbiAgICAgICAgdGhpcy52aWV3RGF0ZSA9IGFkZE1vbnRocyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInKSB7XG4gICAgICAgIHRoaXMudmlld0RhdGUgPSBhZGRZZWFycyh0aGlzLnZpZXdEYXRlLCAxNik7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVZZWFycygpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnbW9udGgnKSB7XG4gICAgICAgIHRoaXMudmlld0RhdGUgPSBhZGRZZWFycyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ21vbnRoJykge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IGFkZFllYXJzKHRoaXMudmlld0RhdGUsIDEpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAneWVhcicpIHtcbiAgICAgIHRoaXMueWVhclJhbmdlU3RhcnQgKz0gMTI7XG4gICAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ21vbnRoLXllYXInKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJykge1xuICAgICAgICB0aGlzLnZpZXdEYXRlID0gYWRkWWVhcnModGhpcy52aWV3RGF0ZSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnllYXJSYW5nZVN0YXJ0ICs9IDEyO1xuICAgICAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcmV2WWVhcnMoKSB7XG4gICAgdGhpcy55ZWFyUmFuZ2VTdGFydCAtPSAxMjtcbiAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgfVxuXG4gIG5leHRZZWFycygpIHtcbiAgICB0aGlzLnllYXJSYW5nZVN0YXJ0ICs9IDEyO1xuICAgIHRoaXMuZ2VuZXJhdGVZZWFycygpO1xuICB9XG5cbiAgc2VsZWN0RGF0ZShkYXRlOiBEYXRlKSB7XG4gICAgaWYgKHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF0ZSkpIHJldHVybjtcblxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gZGF0ZTtcbiAgICB0aGlzLm9uQ2hhbmdlKGRhdGUpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5kYXRlU2VsZWN0LmVtaXQoZGF0ZSk7XG4gIH1cblxuICBzZWxlY3RNb250aChtb250aEluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZGF0ZScpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBzZXRNb250aCh0aGlzLnZpZXdEYXRlLCBtb250aEluZGV4KTtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnZGF0ZSc7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnbW9udGgnKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gc2V0TW9udGgodGhpcy52aWV3RGF0ZSwgbW9udGhJbmRleCk7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9ICB0aGlzLnZpZXdEYXRlO1xuICAgICAgdGhpcy5vbkNoYW5nZSggdGhpcy52aWV3RGF0ZSk7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgdGhpcy5kYXRlU2VsZWN0LmVtaXQoIHRoaXMudmlld0RhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdFllYXIoeWVhcjogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RhdGUnKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gc2V0WWVhcih0aGlzLnZpZXdEYXRlLCB5ZWFyKTtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnZGF0ZSc7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAneWVhcicgfHwgdGhpcy5tb2RlID09PSAnbW9udGgnKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gc2V0WWVhcih0aGlzLnZpZXdEYXRlLCB5ZWFyKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gIHRoaXMudmlld0RhdGU7XG4gICAgICB0aGlzLm9uQ2hhbmdlKCB0aGlzLnZpZXdEYXRlKTtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICB0aGlzLmRhdGVTZWxlY3QuZW1pdCggdGhpcy52aWV3RGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGF5Q2xhc3MoZGF0ZTogRGF0ZSkge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkRGF0ZSAmJiBpc1NhbWVEYXkoZGF0ZSwgdGhpcy5zZWxlY3RlZERhdGUpO1xuICAgIGNvbnN0IGlzVG9kYXlEYXRlID0gaXNUb2RheShkYXRlKTtcbiAgICBjb25zdCBpc091dHNpZGUgPSAhaXNTYW1lTW9udGgoZGF0ZSwgdGhpcy52aWV3RGF0ZSk7XG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF0ZSk7XG5cbiAgICByZXR1cm4gY24oXG4gICAgICAnaC05IHctOSBwLTAgZm9udC1ub3JtYWwgdGV4dC1zbSByb3VuZGVkLW1kIHRyYW5zaXRpb24tYWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyJyxcbiAgICAgICFpc1NlbGVjdGVkICYmICFpc0Rpc2FibGVkICYmICdob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCcsXG4gICAgICBpc1NlbGVjdGVkICYmICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGhvdmVyOmJnLXByaW1hcnkgaG92ZXI6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQnLFxuICAgICAgIWlzU2VsZWN0ZWQgJiYgaXNUb2RheURhdGUgJiYgJ2JnLWFjY2VudCB0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJyxcbiAgICAgIChpc091dHNpZGUgfHwgaXNEaXNhYmxlZCkgJiYgJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCBvcGFjaXR5LTUwJyxcbiAgICAgIGlzRGlzYWJsZWQgJiYgJ2N1cnNvci1ub3QtYWxsb3dlZCdcbiAgICApO1xuICB9XG5cbiAgZ2V0TW9udGhDbGFzcyhtb250aEluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZERhdGUgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlLmdldE1vbnRoKCkgPT09IG1vbnRoSW5kZXggJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlLmdldEZ1bGxZZWFyKCkgPT09IHRoaXMudmlld0RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBpc0N1cnJlbnQgPSBuZXcgRGF0ZSgpLmdldE1vbnRoKCkgPT09IG1vbnRoSW5kZXggJiZcbiAgICAgIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gICAgcmV0dXJuIGNuKFxuICAgICAgJ3RleHQtc20gcHktMi41IHJvdW5kZWQtbWQgdHJhbnNpdGlvbi1jb2xvcnMnLFxuICAgICAgaXNTZWxlY3RlZCA/ICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGhvdmVyOmJnLXByaW1hcnknIDpcbiAgICAgICAgaXNDdXJyZW50ID8gJ2JvcmRlciBib3JkZXItcHJpbWFyeS8zMCB0ZXh0LXByaW1hcnknIDpcbiAgICAgICAgICAnaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQnXG4gICAgKTtcbiAgfVxuXG4gIGdldFllYXJDbGFzcyh5ZWFyOiBudW1iZXIpIHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZERhdGUgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlLmdldEZ1bGxZZWFyKCkgPT09IHllYXI7XG4gICAgY29uc3QgaXNDdXJyZW50ID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpID09PSB5ZWFyO1xuXG4gICAgcmV0dXJuIGNuKFxuICAgICAgJ3RleHQtc20gcHktMiByb3VuZGVkLW1kIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgIGlzU2VsZWN0ZWQgPyAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBob3ZlcjpiZy1wcmltYXJ5JyA6XG4gICAgICAgIGlzQ3VycmVudCA/ICdib3JkZXIgYm9yZGVyLXByaW1hcnkvMzAgdGV4dC1wcmltYXJ5JyA6XG4gICAgICAgICAgJ2hvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJ1xuICAgICk7XG4gIH1cblxuICBpc0RhdGVEaXNhYmxlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZVBhc3REYXRlcyAmJiBpc0JlZm9yZShkYXRlLCBzdGFydE9mRGF5KG5ldyBEYXRlKCkpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgaXNCZWZvcmUoZGF0ZSwgdGhpcy5taW5EYXRlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLm1heERhdGUgJiYgaXNCZWZvcmUodGhpcy5tYXhEYXRlLCBkYXRlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzVG9kYXlEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0RhdGVEaXNhYmxlZChuZXcgRGF0ZSgpKTtcbiAgfVxuXG4gIHNlbGVjdFRvZGF5KCkge1xuICAgIGlmICghdGhpcy5pc1RvZGF5RGlzYWJsZWQoKSkge1xuICAgICAgdGhpcy5zZWxlY3REYXRlKG5ldyBEYXRlKCkpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcbiAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5kYXRlU2VsZWN0LmVtaXQobnVsbCk7XG4gIH1cblxuICAvLyBDVkEgSW1wbGVtZW50YXRpb25cbiAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xuICAgIGlmIChvYmopIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShvYmopO1xuICAgICAgaWYgKCFpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBkYXRlO1xuICAgICAgICB0aGlzLnZpZXdEYXRlID0gZGF0ZTtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQgeyB0aGlzLm9uQ2hhbmdlID0gZm47IH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQgeyB0aGlzLm9uVG91Y2hlZCA9IGZuOyB9XG59XG4iXX0=