pdm-ui-kit 0.1.21 → 0.1.23

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,71 +1,472 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/common";
4
+ const DEFAULT_VIEW_MONTH = new Date();
5
+ const DAY_MS = 24 * 60 * 60 * 1000;
4
6
  export class PdmCalendarComponent {
5
- constructor() {
6
- this.mode = 'single';
7
- this.month = 6;
8
- this.year = 2025;
9
- this.selectedDay = 25;
10
- this.rangeStartDay = 25;
11
- this.rangeEndDay = 9;
7
+ constructor(cdr) {
8
+ this.cdr = cdr;
9
+ this._value = null;
10
+ this._rangeValue = null;
11
+ this._month = null;
12
+ this.variant = 'single';
12
13
  this.className = '';
14
+ this.disabledDates = [];
15
+ this.minDate = null;
16
+ this.maxDate = null;
17
+ this.isDateDisabled = null;
18
+ this.allowSameDayRange = true;
19
+ this.readonly = false;
20
+ this.valueChange = new EventEmitter();
21
+ this.rangeValueChange = new EventEmitter();
22
+ this.monthChange = new EventEmitter();
23
+ this.dateClick = new EventEmitter();
24
+ this.disabledDateClick = new EventEmitter();
13
25
  this.weekdays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
26
+ this.monthOptions = [
27
+ { value: 0, label: 'Jan' },
28
+ { value: 1, label: 'Feb' },
29
+ { value: 2, label: 'Mar' },
30
+ { value: 3, label: 'Apr' },
31
+ { value: 4, label: 'May' },
32
+ { value: 5, label: 'Jun' },
33
+ { value: 6, label: 'Jul' },
34
+ { value: 7, label: 'Aug' },
35
+ { value: 8, label: 'Sep' },
36
+ { value: 9, label: 'Oct' },
37
+ { value: 10, label: 'Nov' },
38
+ { value: 11, label: 'Dec' }
39
+ ];
40
+ this.trackByIndex = (index) => {
41
+ return index;
42
+ };
43
+ this.trackByDate = (_index, cell) => {
44
+ return this.dateKey(cell.date);
45
+ };
14
46
  }
15
- get leftMonthName() {
16
- return this.monthName(this.month - 1);
17
- }
18
- get rightMonthName() {
19
- const rightMonth = this.month % 12;
20
- return this.monthName(rightMonth);
21
- }
22
- get leftCells() {
23
- return this.buildMonthCells(this.year, this.month - 1, this.selectedDay, this.mode === 'range' ? this.rangeStartDay : undefined, this.mode === 'range' ? 31 : undefined);
24
- }
25
- get rightCells() {
26
- const rightMonth = this.month % 12;
27
- const rightYear = this.month === 12 ? this.year + 1 : this.year;
28
- return this.buildMonthCells(rightYear, rightMonth, this.mode === 'range' ? this.rangeEndDay : undefined, 1, this.mode === 'range' ? this.rangeEndDay : undefined);
29
- }
30
- monthName(monthIndex) {
31
- const safe = ((monthIndex % 12) + 12) % 12;
32
- return new Date(this.year, safe, 1).toLocaleString('en-US', { month: 'long' });
33
- }
34
- buildMonthCells(year, monthIndex, selectedDay, rangeStartDay, rangeEndDay) {
35
- const firstDay = new Date(year, monthIndex, 1);
36
- const startWeekday = firstDay.getDay();
37
- const daysInMonth = new Date(year, monthIndex + 1, 0).getDate();
38
- const cells = [];
39
- for (let i = 0; i < 42; i += 1) {
40
- const dayNumber = i - startWeekday + 1;
41
- const date = new Date(year, monthIndex, dayNumber);
42
- const outside = dayNumber < 1 || dayNumber > daysInMonth;
43
- const day = date.getDate();
44
- const selected = !outside && !!selectedDay && day === selectedDay;
45
- const inRange = !outside && !!rangeStartDay && !!rangeEndDay && day >= rangeStartDay && day <= rangeEndDay;
46
- cells.push({ date, day, outside, selected, inRange });
47
- }
48
- return cells;
47
+ set value(value) {
48
+ this._value = this.normalizeDate(value);
49
+ }
50
+ get value() {
51
+ return this._value;
52
+ }
53
+ set rangeValue(value) {
54
+ this._rangeValue = value
55
+ ? {
56
+ start: this.normalizeDate(value.start),
57
+ end: this.normalizeDate(value.end)
58
+ }
59
+ : null;
60
+ }
61
+ get rangeValue() {
62
+ return this._rangeValue;
63
+ }
64
+ set month(value) {
65
+ this._month = value ? this.startOfMonth(value) : null;
66
+ }
67
+ get month() {
68
+ return this._month;
69
+ }
70
+ get resolvedVariant() {
71
+ return this.variant === 'range' ? 'range' : 'single';
72
+ }
73
+ get visibleMonths() {
74
+ const baseMonth = this.getAnchorMonth();
75
+ if (this.resolvedVariant === 'single') {
76
+ return [
77
+ {
78
+ date: baseMonth,
79
+ title: this.formatMonthYear(baseMonth),
80
+ titleStyle: 'dropdowns',
81
+ dropdownMonth: this.formatMonthShort(baseMonth),
82
+ dropdownYear: String(baseMonth.getFullYear()),
83
+ showPrevButton: true,
84
+ showNextButton: true,
85
+ weeks: this.buildMonthWeeks(baseMonth, false)
86
+ }
87
+ ];
88
+ }
89
+ const nextMonth = this.addMonths(baseMonth, 1);
90
+ return [
91
+ {
92
+ date: baseMonth,
93
+ title: this.formatMonthYear(baseMonth),
94
+ titleStyle: 'plain',
95
+ showPrevButton: true,
96
+ showNextButton: false,
97
+ weeks: this.buildMonthWeeks(baseMonth, true)
98
+ },
99
+ {
100
+ date: nextMonth,
101
+ title: this.formatMonthYear(nextMonth),
102
+ titleStyle: 'plain',
103
+ showPrevButton: false,
104
+ showNextButton: true,
105
+ weeks: this.buildMonthWeeks(nextMonth, true)
106
+ }
107
+ ];
108
+ }
109
+ get singleHeaderMonth() {
110
+ return this.getAnchorMonth().getMonth();
111
+ }
112
+ get singleHeaderYear() {
113
+ return this.getAnchorMonth().getFullYear();
114
+ }
115
+ get yearOptions() {
116
+ const currentYear = this.singleHeaderYear;
117
+ const minYear = this.minDate ? this.minDate.getFullYear() : currentYear - 100;
118
+ const maxYear = this.maxDate ? this.maxDate.getFullYear() : currentYear + 100;
119
+ const years = [];
120
+ for (let year = minYear; year <= maxYear; year += 1) {
121
+ years.push(year);
122
+ }
123
+ return years;
124
+ }
125
+ get rootClasses() {
126
+ return [
127
+ 'border-border bg-background relative rounded-[10px] border p-3 shadow-sm',
128
+ this.resolvedVariant === 'range'
129
+ ? 'inline-flex items-start justify-center gap-4 shrink-0 grow-0 basis-auto'
130
+ : 'inline-flex flex-col gap-4 shrink-0 grow-0 basis-auto',
131
+ this.className
132
+ ];
133
+ }
134
+ get rootStyle() {
135
+ const width = this.resolvedVariant === 'range' ? '488px' : '250px';
136
+ return {
137
+ width,
138
+ minWidth: width,
139
+ maxWidth: width,
140
+ minHeight: '293px',
141
+ flex: '0 0 auto',
142
+ alignSelf: 'flex-start'
143
+ };
144
+ }
145
+ monthPanelClasses(_index) {
146
+ return ['flex flex-col items-start', this.resolvedVariant === 'range' ? 'w-[224px] gap-4' : 'w-full gap-0'];
147
+ }
148
+ headerClasses(month) {
149
+ return ['flex w-full items-center justify-between', month.titleStyle === 'dropdowns' ? '' : 'mb-4'];
150
+ }
151
+ navButtonClasses() {
152
+ return [
153
+ 'flex h-8 w-8 items-center justify-center rounded-md text-foreground',
154
+ 'disabled:pointer-events-none disabled:opacity-40'
155
+ ];
156
+ }
157
+ navPlaceholderClasses() {
158
+ return ['h-7 w-7 shrink-0'];
159
+ }
160
+ dropdownWrapClasses() {
161
+ return ['flex w-40 items-center justify-center gap-2'];
162
+ }
163
+ dropdownClasses(widthClass) {
164
+ return ['flex h-8 items-center justify-center gap-1 px-1', widthClass];
165
+ }
166
+ dropdownSelectClasses() {
167
+ return [
168
+ 'text-foreground h-full bg-transparent text-sm font-medium leading-5',
169
+ 'appearance-none border-0 outline-none ring-0 focus:outline-none focus:ring-0 text-center cursor-pointer'
170
+ ];
171
+ }
172
+ get dropdownSelectStyle() {
173
+ return {
174
+ appearance: 'none',
175
+ WebkitAppearance: 'none',
176
+ MozAppearance: 'none',
177
+ background: 'transparent',
178
+ border: '0',
179
+ boxShadow: 'none',
180
+ outline: '0',
181
+ padding: '0',
182
+ margin: '0'
183
+ };
184
+ }
185
+ calendarGridWrapClasses() {
186
+ return ['flex w-full flex-col items-start'];
187
+ }
188
+ weekdayRowClasses() {
189
+ return ['flex w-full items-center'];
190
+ }
191
+ weekdayCellClasses() {
192
+ return ['text-muted-foreground flex h-[21px] w-8 items-center justify-center rounded-md text-xs leading-4'];
193
+ }
194
+ weekRowClasses() {
195
+ return ['flex w-full items-start pt-2'];
196
+ }
197
+ dayCellClasses(cell) {
198
+ return [
199
+ 'relative flex h-8 w-8 shrink-0 items-center justify-center',
200
+ cell.rangeFill ? 'bg-accent' : '',
201
+ cell.rangeLeftCap ? 'rounded-l-md' : '',
202
+ cell.rangeRightCap ? 'rounded-r-md' : ''
203
+ ];
204
+ }
205
+ dayButtonClasses(cell) {
206
+ return [
207
+ 'relative z-10 flex h-8 w-8 items-center justify-center rounded-md text-sm leading-5',
208
+ cell.selected ? 'bg-primary text-primary-foreground' : cell.rangeFill ? 'text-accent-foreground' : 'text-foreground',
209
+ cell.muted && !cell.rangeFill ? 'opacity-50' : '',
210
+ cell.disabled ? 'cursor-not-allowed opacity-40' : '',
211
+ !cell.disabled && !this.readonly && !cell.selected ? 'hover:bg-accent/70' : ''
212
+ ];
213
+ }
214
+ dayLabelClasses(_cell) {
215
+ return ['font-normal'];
216
+ }
217
+ goToPreviousMonth() {
218
+ this.setAnchorMonth(this.addMonths(this.getAnchorMonth(), -1));
219
+ }
220
+ goToNextMonth() {
221
+ this.setAnchorMonth(this.addMonths(this.getAnchorMonth(), 1));
222
+ }
223
+ onSingleMonthChange(monthValue) {
224
+ const month = Number(monthValue);
225
+ if (Number.isNaN(month) || month < 0 || month > 11) {
226
+ return;
227
+ }
228
+ const anchor = this.getAnchorMonth();
229
+ this.setAnchorMonth(new Date(anchor.getFullYear(), month, 1));
230
+ }
231
+ onSingleYearChange(yearValue) {
232
+ const year = Number(yearValue);
233
+ if (Number.isNaN(year)) {
234
+ return;
235
+ }
236
+ const anchor = this.getAnchorMonth();
237
+ this.setAnchorMonth(new Date(year, anchor.getMonth(), 1));
238
+ }
239
+ onDatePressed(cell) {
240
+ const date = this.cloneDate(cell.date);
241
+ if (cell.disabled) {
242
+ this.disabledDateClick.emit(date);
243
+ return;
244
+ }
245
+ if (this.readonly) {
246
+ return;
247
+ }
248
+ this.dateClick.emit(date);
249
+ if (this.resolvedVariant === 'single') {
250
+ this._value = date;
251
+ this.valueChange.emit(this.cloneDate(date));
252
+ this.syncVisibleMonthToDate(date);
253
+ this.cdr.markForCheck();
254
+ return;
255
+ }
256
+ this.handleRangeSelection(date);
257
+ this.cdr.markForCheck();
258
+ }
259
+ handleRangeSelection(date) {
260
+ const current = this._rangeValue;
261
+ const currentStart = current?.start ? this.cloneDate(current.start) : null;
262
+ const currentEnd = current?.end ? this.cloneDate(current.end) : null;
263
+ if (!currentStart || (currentStart && currentEnd)) {
264
+ this._rangeValue = { start: date, end: null };
265
+ this.rangeValueChange.emit({ start: this.cloneDate(date), end: null });
266
+ this.syncVisibleMonthToDate(date);
267
+ return;
268
+ }
269
+ if (this.isSameDay(currentStart, date) && !this.allowSameDayRange) {
270
+ this._rangeValue = { start: date, end: null };
271
+ this.rangeValueChange.emit({ start: this.cloneDate(date), end: null });
272
+ return;
273
+ }
274
+ const start = this.compareDate(date, currentStart) < 0 ? date : currentStart;
275
+ const end = this.compareDate(date, currentStart) < 0 ? currentStart : date;
276
+ if (this.rangeContainsBlockedDate(start, end)) {
277
+ this.disabledDateClick.emit(this.cloneDate(date));
278
+ return;
279
+ }
280
+ this._rangeValue = { start, end };
281
+ this.rangeValueChange.emit({ start: this.cloneDate(start), end: this.cloneDate(end) });
282
+ this.syncVisibleMonthToDate(start);
283
+ }
284
+ buildMonthWeeks(month, includeRange) {
285
+ const firstOfMonth = this.startOfMonth(month);
286
+ const start = this.startOfWeek(firstOfMonth);
287
+ const end = this.endOfWeek(this.endOfMonth(firstOfMonth));
288
+ const weeks = [];
289
+ let cursor = this.cloneDate(start);
290
+ while (this.compareDate(cursor, end) <= 0) {
291
+ const row = [];
292
+ for (let col = 0; col < 7; col += 1) {
293
+ row.push(this.buildCell(cursor, month, includeRange));
294
+ cursor = this.addDays(cursor, 1);
295
+ }
296
+ weeks.push(row);
297
+ }
298
+ for (const row of weeks) {
299
+ for (let col = 0; col < row.length; col += 1) {
300
+ const cell = row[col];
301
+ if (!cell.inRange) {
302
+ continue;
303
+ }
304
+ const leftInRow = col > 0 ? row[col - 1].inRange : false;
305
+ const rightInRow = col < row.length - 1 ? row[col + 1].inRange : false;
306
+ cell.rangeLeftCap = !leftInRow;
307
+ cell.rangeRightCap = !rightInRow;
308
+ }
309
+ }
310
+ return weeks;
311
+ }
312
+ buildCell(date, visibleMonth, includeRange) {
313
+ const normalized = this.cloneDate(date);
314
+ const inCurrentMonth = normalized.getMonth() === visibleMonth.getMonth() && normalized.getFullYear() === visibleMonth.getFullYear();
315
+ const disabled = this.isBlocked(normalized);
316
+ const selectedSingle = this.resolvedVariant === 'single' && !!this._value && this.isSameDay(normalized, this._value);
317
+ const rangeStart = includeRange && !!this._rangeValue?.start && this.isSameDay(normalized, this._rangeValue.start);
318
+ const rangeEnd = includeRange && !!this._rangeValue?.end && this.isSameDay(normalized, this._rangeValue.end);
319
+ const inRange = includeRange &&
320
+ !!this._rangeValue?.start &&
321
+ !!this._rangeValue?.end &&
322
+ this.compareDate(normalized, this._rangeValue.start) >= 0 &&
323
+ this.compareDate(normalized, this._rangeValue.end) <= 0;
324
+ return {
325
+ date: normalized,
326
+ label: normalized.getDate(),
327
+ muted: !inCurrentMonth,
328
+ disabled,
329
+ selected: selectedSingle || rangeStart || rangeEnd,
330
+ inRange,
331
+ rangeFill: inRange,
332
+ rangeLeftCap: false,
333
+ rangeRightCap: false
334
+ };
335
+ }
336
+ getAnchorMonth() {
337
+ if (this._month) {
338
+ return this.cloneDate(this._month);
339
+ }
340
+ if (this.resolvedVariant === 'single' && this._value) {
341
+ return this.startOfMonth(this._value);
342
+ }
343
+ if (this.resolvedVariant === 'range' && this._rangeValue?.start) {
344
+ return this.startOfMonth(this._rangeValue.start);
345
+ }
346
+ return this.startOfMonth(DEFAULT_VIEW_MONTH);
347
+ }
348
+ setAnchorMonth(month) {
349
+ this._month = this.startOfMonth(month);
350
+ this.monthChange.emit(this.cloneDate(this._month));
351
+ }
352
+ syncVisibleMonthToDate(date) {
353
+ const nextMonth = this.startOfMonth(date);
354
+ if (!this._month || !this.isSameMonth(this._month, nextMonth)) {
355
+ this._month = nextMonth;
356
+ this.monthChange.emit(this.cloneDate(nextMonth));
357
+ }
358
+ }
359
+ isBlocked(date) {
360
+ if (this.minDate && this.compareDate(date, this.minDate) < 0) {
361
+ return true;
362
+ }
363
+ if (this.maxDate && this.compareDate(date, this.maxDate) > 0) {
364
+ return true;
365
+ }
366
+ const blockedSet = new Set((this.disabledDates || []).map((item) => this.dateKey(item)));
367
+ if (blockedSet.has(this.dateKey(date))) {
368
+ return true;
369
+ }
370
+ return !!this.isDateDisabled?.(this.cloneDate(date));
371
+ }
372
+ rangeContainsBlockedDate(start, end) {
373
+ let cursor = this.cloneDate(start);
374
+ while (this.compareDate(cursor, end) <= 0) {
375
+ if (this.isBlocked(cursor)) {
376
+ return true;
377
+ }
378
+ cursor = this.addDays(cursor, 1);
379
+ }
380
+ return false;
381
+ }
382
+ normalizeDate(value) {
383
+ if (!(value instanceof Date) || Number.isNaN(value.getTime())) {
384
+ return null;
385
+ }
386
+ return new Date(value.getFullYear(), value.getMonth(), value.getDate());
387
+ }
388
+ cloneDate(date) {
389
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate());
390
+ }
391
+ startOfMonth(date) {
392
+ return new Date(date.getFullYear(), date.getMonth(), 1);
393
+ }
394
+ endOfMonth(date) {
395
+ return new Date(date.getFullYear(), date.getMonth() + 1, 0);
396
+ }
397
+ startOfWeek(date) {
398
+ return this.addDays(date, -date.getDay());
399
+ }
400
+ endOfWeek(date) {
401
+ return this.addDays(date, 6 - date.getDay());
402
+ }
403
+ addMonths(date, months) {
404
+ return new Date(date.getFullYear(), date.getMonth() + months, 1);
405
+ }
406
+ addDays(date, days) {
407
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);
408
+ }
409
+ compareDate(a, b) {
410
+ return this.dateValue(a) - this.dateValue(b);
411
+ }
412
+ dateValue(date) {
413
+ return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()) / DAY_MS;
414
+ }
415
+ isSameDay(a, b) {
416
+ return this.compareDate(a, b) === 0;
417
+ }
418
+ isSameMonth(a, b) {
419
+ return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();
420
+ }
421
+ dateKey(date) {
422
+ const y = date.getFullYear();
423
+ const m = String(date.getMonth() + 1).padStart(2, '0');
424
+ const d = String(date.getDate()).padStart(2, '0');
425
+ return `${y}-${m}-${d}`;
426
+ }
427
+ formatMonthShort(date) {
428
+ return date.toLocaleString('en-US', { month: 'short' });
429
+ }
430
+ formatMonthYear(date) {
431
+ return date.toLocaleString('en-US', { month: 'long', year: 'numeric' });
49
432
  }
50
433
  }
51
- PdmCalendarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmCalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
52
- PdmCalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmCalendarComponent, selector: "pdm-calendar", inputs: { mode: "mode", month: "month", year: "year", selectedDay: "selectedDay", rangeStartDay: "rangeStartDay", rangeEndDay: "rangeEndDay", className: "className" }, ngImport: i0, template: "<section\n [ngClass]=\"[\n 'rounded-lg border border-border bg-background p-3 shadow-sm',\n mode === 'range' ? 'w-full max-w-2xl' : 'w-full max-w-sm',\n className\n ]\"\n>\n <div [ngClass]=\"['grid gap-4', mode === 'range' ? 'grid-cols-2' : 'grid-cols-1']\">\n <div class=\"space-y-4\">\n <header class=\"flex items-center justify-between\">\n <button type=\"button\" class=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\">\u2039</button>\n <div [ngClass]=\"['flex items-center justify-center gap-1', mode === 'range' ? 'w-full' : 'w-full']\">\n <ng-container *ngIf=\"mode === 'single'; else monthText\">\n <span class=\"inline-flex h-8 items-center rounded-md border border-border px-2 text-sm font-medium text-foreground shadow-sm\">Jun</span>\n <span class=\"inline-flex h-8 items-center rounded-md border border-border px-2 text-sm font-medium text-foreground shadow-sm\">2025</span>\n </ng-container>\n <ng-template #monthText>\n <span class=\"text-sm font-medium text-foreground\">{{ leftMonthName }} {{ year }}</span>\n </ng-template>\n </div>\n <button type=\"button\" class=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\">{{ mode === 'range' ? '' : '\u203A' }}</button>\n </header>\n\n <div>\n <div class=\"grid grid-cols-7\">\n <span *ngFor=\"let day of weekdays\" class=\"inline-flex h-5 items-center justify-center text-xs font-normal text-muted-foreground\">{{ day }}</span>\n </div>\n <div class=\"mt-2 grid grid-cols-7 gap-y-2\">\n <button\n *ngFor=\"let cell of leftCells\"\n type=\"button\"\n [ngClass]=\"[\n 'inline-flex h-8 w-8 items-center justify-center rounded-md text-sm font-normal transition-colors hover:bg-accent hover:text-accent-foreground',\n cell.outside ? 'text-muted-foreground opacity-50' : 'text-foreground',\n cell.inRange ? 'bg-accent text-accent-foreground' : '',\n cell.selected ? 'bg-primary text-primary-foreground' : ''\n ]\"\n >\n {{ cell.day }}\n </button>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"mode === 'range'\" class=\"space-y-4\">\n <header class=\"flex items-center justify-between\">\n <span class=\"text-sm font-medium text-foreground\">{{ rightMonthName }} {{ month === 12 ? year + 1 : year }}</span>\n <button type=\"button\" class=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\">\u203A</button>\n </header>\n\n <div>\n <div class=\"grid grid-cols-7\">\n <span *ngFor=\"let day of weekdays\" class=\"inline-flex h-5 items-center justify-center text-xs font-normal text-muted-foreground\">{{ day }}</span>\n </div>\n <div class=\"mt-2 grid grid-cols-7 gap-y-2\">\n <button\n *ngFor=\"let cell of rightCells\"\n type=\"button\"\n [ngClass]=\"[\n 'inline-flex h-8 w-8 items-center justify-center rounded-md text-sm font-normal transition-colors hover:bg-accent hover:text-accent-foreground',\n cell.outside ? 'text-muted-foreground opacity-50' : 'text-foreground',\n cell.inRange ? 'bg-accent text-accent-foreground' : '',\n cell.selected ? 'bg-primary text-primary-foreground' : ''\n ]\"\n >\n {{ cell.day }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</section>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
434
+ PdmCalendarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmCalendarComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
435
+ PdmCalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmCalendarComponent, selector: "pdm-calendar", inputs: { variant: "variant", className: "className", disabledDates: "disabledDates", minDate: "minDate", maxDate: "maxDate", isDateDisabled: "isDateDisabled", allowSameDayRange: "allowSameDayRange", readonly: "readonly", value: "value", rangeValue: "rangeValue", month: "month" }, outputs: { valueChange: "valueChange", rangeValueChange: "rangeValueChange", monthChange: "monthChange", dateClick: "dateClick", disabledDateClick: "disabledDateClick" }, ngImport: i0, template: "<div [ngClass]=\"rootClasses\" [ngStyle]=\"rootStyle\">\n <div *ngFor=\"let month of visibleMonths; let monthIndex = index; trackBy: trackByIndex\" [ngClass]=\"monthPanelClasses(monthIndex)\">\n <div [ngClass]=\"headerClasses(month)\">\n <button\n *ngIf=\"month.showPrevButton; else prevPlaceholder\"\n type=\"button\"\n [ngClass]=\"navButtonClasses()\"\n aria-label=\"Previous month\"\n (click)=\"goToPreviousMonth()\"\n [disabled]=\"readonly\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\">\n <path d=\"m15 18-6-6 6-6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n <ng-template #prevPlaceholder>\n <div [ngClass]=\"navPlaceholderClasses()\" aria-hidden=\"true\"></div>\n </ng-template>\n\n <ng-container *ngIf=\"month.titleStyle === 'dropdowns'; else plainTitle\">\n <div [ngClass]=\"dropdownWrapClasses()\">\n <div [ngClass]=\"dropdownClasses('w-[72px]')\">\n <select\n [ngClass]=\"dropdownSelectClasses()\"\n [ngStyle]=\"dropdownSelectStyle\"\n [value]=\"singleHeaderMonth\"\n aria-label=\"Month\"\n (change)=\"onSingleMonthChange($any($event.target).value)\"\n >\n <option *ngFor=\"let monthOption of monthOptions\" [value]=\"monthOption.value\">{{ monthOption.label }}</option>\n </select>\n <svg viewBox=\"0 0 24 24\" class=\"h-3 w-3 text-foreground\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\">\n <path d=\"m6 9 6 6 6-6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </div>\n <div [ngClass]=\"dropdownClasses('w-[82px]')\">\n <select\n [ngClass]=\"dropdownSelectClasses()\"\n [ngStyle]=\"dropdownSelectStyle\"\n [value]=\"singleHeaderYear\"\n aria-label=\"Year\"\n (change)=\"onSingleYearChange($any($event.target).value)\"\n >\n <option *ngFor=\"let year of yearOptions\" [value]=\"year\">{{ year }}</option>\n </select>\n <svg viewBox=\"0 0 24 24\" class=\"h-3 w-3 text-foreground\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\">\n <path d=\"m6 9 6 6 6-6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </div>\n </div>\n </ng-container>\n\n <ng-template #plainTitle>\n <div class=\"flex min-w-0 flex-1 items-center justify-center\">\n <p class=\"text-foreground text-center text-sm font-medium leading-5\">\n {{ month.title }}\n </p>\n </div>\n </ng-template>\n\n <button\n *ngIf=\"month.showNextButton; else nextPlaceholder\"\n type=\"button\"\n [ngClass]=\"navButtonClasses()\"\n aria-label=\"Next month\"\n (click)=\"goToNextMonth()\"\n [disabled]=\"readonly\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\">\n <path d=\"m9 18 6-6-6-6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n <ng-template #nextPlaceholder>\n <div [ngClass]=\"navPlaceholderClasses()\" aria-hidden=\"true\"></div>\n </ng-template>\n </div>\n\n <div [ngClass]=\"calendarGridWrapClasses()\">\n <div [ngClass]=\"weekdayRowClasses()\">\n <div *ngFor=\"let day of weekdays; trackBy: trackByIndex\" [ngClass]=\"weekdayCellClasses()\">\n <span>{{ day }}</span>\n </div>\n </div>\n\n <div *ngFor=\"let week of month.weeks; trackBy: trackByIndex\" [ngClass]=\"weekRowClasses()\">\n <div *ngFor=\"let cell of week; trackBy: trackByDate\" [ngClass]=\"dayCellClasses(cell)\">\n <button\n type=\"button\"\n [ngClass]=\"dayButtonClasses(cell)\"\n [disabled]=\"readonly\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-disabled]=\"cell.disabled || readonly\"\n [attr.title]=\"cell.date | date : 'yyyy-MM-dd'\"\n (click)=\"onDatePressed(cell)\"\n >\n <span [ngClass]=\"dayLabelClasses(cell)\">{{ cell.label }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
53
436
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmCalendarComponent, decorators: [{
54
437
  type: Component,
55
- args: [{ selector: 'pdm-calendar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section\n [ngClass]=\"[\n 'rounded-lg border border-border bg-background p-3 shadow-sm',\n mode === 'range' ? 'w-full max-w-2xl' : 'w-full max-w-sm',\n className\n ]\"\n>\n <div [ngClass]=\"['grid gap-4', mode === 'range' ? 'grid-cols-2' : 'grid-cols-1']\">\n <div class=\"space-y-4\">\n <header class=\"flex items-center justify-between\">\n <button type=\"button\" class=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\">\u2039</button>\n <div [ngClass]=\"['flex items-center justify-center gap-1', mode === 'range' ? 'w-full' : 'w-full']\">\n <ng-container *ngIf=\"mode === 'single'; else monthText\">\n <span class=\"inline-flex h-8 items-center rounded-md border border-border px-2 text-sm font-medium text-foreground shadow-sm\">Jun</span>\n <span class=\"inline-flex h-8 items-center rounded-md border border-border px-2 text-sm font-medium text-foreground shadow-sm\">2025</span>\n </ng-container>\n <ng-template #monthText>\n <span class=\"text-sm font-medium text-foreground\">{{ leftMonthName }} {{ year }}</span>\n </ng-template>\n </div>\n <button type=\"button\" class=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\">{{ mode === 'range' ? '' : '\u203A' }}</button>\n </header>\n\n <div>\n <div class=\"grid grid-cols-7\">\n <span *ngFor=\"let day of weekdays\" class=\"inline-flex h-5 items-center justify-center text-xs font-normal text-muted-foreground\">{{ day }}</span>\n </div>\n <div class=\"mt-2 grid grid-cols-7 gap-y-2\">\n <button\n *ngFor=\"let cell of leftCells\"\n type=\"button\"\n [ngClass]=\"[\n 'inline-flex h-8 w-8 items-center justify-center rounded-md text-sm font-normal transition-colors hover:bg-accent hover:text-accent-foreground',\n cell.outside ? 'text-muted-foreground opacity-50' : 'text-foreground',\n cell.inRange ? 'bg-accent text-accent-foreground' : '',\n cell.selected ? 'bg-primary text-primary-foreground' : ''\n ]\"\n >\n {{ cell.day }}\n </button>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"mode === 'range'\" class=\"space-y-4\">\n <header class=\"flex items-center justify-between\">\n <span class=\"text-sm font-medium text-foreground\">{{ rightMonthName }} {{ month === 12 ? year + 1 : year }}</span>\n <button type=\"button\" class=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\">\u203A</button>\n </header>\n\n <div>\n <div class=\"grid grid-cols-7\">\n <span *ngFor=\"let day of weekdays\" class=\"inline-flex h-5 items-center justify-center text-xs font-normal text-muted-foreground\">{{ day }}</span>\n </div>\n <div class=\"mt-2 grid grid-cols-7 gap-y-2\">\n <button\n *ngFor=\"let cell of rightCells\"\n type=\"button\"\n [ngClass]=\"[\n 'inline-flex h-8 w-8 items-center justify-center rounded-md text-sm font-normal transition-colors hover:bg-accent hover:text-accent-foreground',\n cell.outside ? 'text-muted-foreground opacity-50' : 'text-foreground',\n cell.inRange ? 'bg-accent text-accent-foreground' : '',\n cell.selected ? 'bg-primary text-primary-foreground' : ''\n ]\"\n >\n {{ cell.day }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</section>\n" }]
56
- }], propDecorators: { mode: [{
438
+ args: [{ selector: 'pdm-calendar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"rootClasses\" [ngStyle]=\"rootStyle\">\n <div *ngFor=\"let month of visibleMonths; let monthIndex = index; trackBy: trackByIndex\" [ngClass]=\"monthPanelClasses(monthIndex)\">\n <div [ngClass]=\"headerClasses(month)\">\n <button\n *ngIf=\"month.showPrevButton; else prevPlaceholder\"\n type=\"button\"\n [ngClass]=\"navButtonClasses()\"\n aria-label=\"Previous month\"\n (click)=\"goToPreviousMonth()\"\n [disabled]=\"readonly\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\">\n <path d=\"m15 18-6-6 6-6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n <ng-template #prevPlaceholder>\n <div [ngClass]=\"navPlaceholderClasses()\" aria-hidden=\"true\"></div>\n </ng-template>\n\n <ng-container *ngIf=\"month.titleStyle === 'dropdowns'; else plainTitle\">\n <div [ngClass]=\"dropdownWrapClasses()\">\n <div [ngClass]=\"dropdownClasses('w-[72px]')\">\n <select\n [ngClass]=\"dropdownSelectClasses()\"\n [ngStyle]=\"dropdownSelectStyle\"\n [value]=\"singleHeaderMonth\"\n aria-label=\"Month\"\n (change)=\"onSingleMonthChange($any($event.target).value)\"\n >\n <option *ngFor=\"let monthOption of monthOptions\" [value]=\"monthOption.value\">{{ monthOption.label }}</option>\n </select>\n <svg viewBox=\"0 0 24 24\" class=\"h-3 w-3 text-foreground\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\">\n <path d=\"m6 9 6 6 6-6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </div>\n <div [ngClass]=\"dropdownClasses('w-[82px]')\">\n <select\n [ngClass]=\"dropdownSelectClasses()\"\n [ngStyle]=\"dropdownSelectStyle\"\n [value]=\"singleHeaderYear\"\n aria-label=\"Year\"\n (change)=\"onSingleYearChange($any($event.target).value)\"\n >\n <option *ngFor=\"let year of yearOptions\" [value]=\"year\">{{ year }}</option>\n </select>\n <svg viewBox=\"0 0 24 24\" class=\"h-3 w-3 text-foreground\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\">\n <path d=\"m6 9 6 6 6-6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </div>\n </div>\n </ng-container>\n\n <ng-template #plainTitle>\n <div class=\"flex min-w-0 flex-1 items-center justify-center\">\n <p class=\"text-foreground text-center text-sm font-medium leading-5\">\n {{ month.title }}\n </p>\n </div>\n </ng-template>\n\n <button\n *ngIf=\"month.showNextButton; else nextPlaceholder\"\n type=\"button\"\n [ngClass]=\"navButtonClasses()\"\n aria-label=\"Next month\"\n (click)=\"goToNextMonth()\"\n [disabled]=\"readonly\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\">\n <path d=\"m9 18 6-6-6-6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n <ng-template #nextPlaceholder>\n <div [ngClass]=\"navPlaceholderClasses()\" aria-hidden=\"true\"></div>\n </ng-template>\n </div>\n\n <div [ngClass]=\"calendarGridWrapClasses()\">\n <div [ngClass]=\"weekdayRowClasses()\">\n <div *ngFor=\"let day of weekdays; trackBy: trackByIndex\" [ngClass]=\"weekdayCellClasses()\">\n <span>{{ day }}</span>\n </div>\n </div>\n\n <div *ngFor=\"let week of month.weeks; trackBy: trackByIndex\" [ngClass]=\"weekRowClasses()\">\n <div *ngFor=\"let cell of week; trackBy: trackByDate\" [ngClass]=\"dayCellClasses(cell)\">\n <button\n type=\"button\"\n [ngClass]=\"dayButtonClasses(cell)\"\n [disabled]=\"readonly\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-disabled]=\"cell.disabled || readonly\"\n [attr.title]=\"cell.date | date : 'yyyy-MM-dd'\"\n (click)=\"onDatePressed(cell)\"\n >\n <span [ngClass]=\"dayLabelClasses(cell)\">{{ cell.label }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
439
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { variant: [{
57
440
  type: Input
58
- }], month: [{
441
+ }], className: [{
59
442
  type: Input
60
- }], year: [{
443
+ }], disabledDates: [{
61
444
  type: Input
62
- }], selectedDay: [{
445
+ }], minDate: [{
63
446
  type: Input
64
- }], rangeStartDay: [{
447
+ }], maxDate: [{
65
448
  type: Input
66
- }], rangeEndDay: [{
449
+ }], isDateDisabled: [{
67
450
  type: Input
68
- }], className: [{
451
+ }], allowSameDayRange: [{
452
+ type: Input
453
+ }], readonly: [{
454
+ type: Input
455
+ }], valueChange: [{
456
+ type: Output
457
+ }], rangeValueChange: [{
458
+ type: Output
459
+ }], monthChange: [{
460
+ type: Output
461
+ }], dateClick: [{
462
+ type: Output
463
+ }], disabledDateClick: [{
464
+ type: Output
465
+ }], value: [{
466
+ type: Input
467
+ }], rangeValue: [{
468
+ type: Input
469
+ }], month: [{
69
470
  type: Input
70
471
  }] } });
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBaUIxRSxNQUFNLE9BQU8sb0JBQW9CO0lBTGpDO1FBTVcsU0FBSSxHQUFvQixRQUFRLENBQUM7UUFDakMsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUNWLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDWixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBRWYsYUFBUSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FrRGhFO0lBaERDLElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJ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O0lBQ2YsQ0FBQzs7aUhBMURVLG9CQUFvQjtxR0FBcEIsb0JBQW9CLDROQ2pCakMsa2dJQXdFQTsyRkR2RGEsb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLGNBQWMsbUJBRVAsdUJBQXVCLENBQUMsTUFBTTs4QkFHdEMsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCB0eXBlIFBkbUNhbGVuZGFyTW9kZSA9ICdzaW5nbGUnIHwgJ3JhbmdlJztcblxuaW50ZXJmYWNlIENhbGVuZGFyQ2VsbCB7XG4gIGRhdGU6IERhdGU7XG4gIGRheTogbnVtYmVyO1xuICBvdXRzaWRlOiBib29sZWFuO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgaW5SYW5nZTogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRtLWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgUGRtQ2FsZW5kYXJDb21wb25lbnQge1xuICBASW5wdXQoKSBtb2RlOiBQZG1DYWxlbmRhck1vZGUgPSAnc2luZ2xlJztcbiAgQElucHV0KCkgbW9udGggPSA2O1xuICBASW5wdXQoKSB5ZWFyID0gMjAyNTtcbiAgQElucHV0KCkgc2VsZWN0ZWREYXkgPSAyNTtcbiAgQElucHV0KCkgcmFuZ2VTdGFydERheSA9IDI1O1xuICBASW5wdXQoKSByYW5nZUVuZERheSA9IDk7XG4gIEBJbnB1dCgpIGNsYXNzTmFtZSA9ICcnO1xuXG4gIHJlYWRvbmx5IHdlZWtkYXlzID0gWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddO1xuXG4gIGdldCBsZWZ0TW9udGhOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubW9udGhOYW1lKHRoaXMubW9udGggLSAxKTtcbiAgfVxuXG4gIGdldCByaWdodE1vbnRoTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJpZ2h0TW9udGggPSB0aGlzLm1vbnRoICUgMTI7XG4gICAgcmV0dXJuIHRoaXMubW9udGhOYW1lKHJpZ2h0TW9udGgpO1xuICB9XG5cbiAgZ2V0IGxlZnRDZWxscygpOiBDYWxlbmRhckNlbGxbXSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRNb250aENlbGxzKHRoaXMueWVhciwgdGhpcy5tb250aCAtIDEsIHRoaXMuc2VsZWN0ZWREYXksIHRoaXMubW9kZSA9PT0gJ3JhbmdlJyA/IHRoaXMucmFuZ2VTdGFydERheSA6IHVuZGVmaW5lZCwgdGhpcy5tb2RlID09PSAncmFuZ2UnID8gMzEgOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgZ2V0IHJpZ2h0Q2VsbHMoKTogQ2FsZW5kYXJDZWxsW10ge1xuICAgIGNvbnN0IHJpZ2h0TW9udGggPSB0aGlzLm1vbnRoICUgMTI7XG4gICAgY29uc3QgcmlnaHRZZWFyID0gdGhpcy5tb250aCA9PT0gMTIgPyB0aGlzLnllYXIgKyAxIDogdGhpcy55ZWFyO1xuICAgIHJldHVybiB0aGlzLmJ1aWxkTW9udGhDZWxscyhyaWdodFllYXIsIHJpZ2h0TW9udGgsIHRoaXMubW9kZSA9PT0gJ3JhbmdlJyA/IHRoaXMucmFuZ2VFbmREYXkgOiB1bmRlZmluZWQsIDEsIHRoaXMubW9kZSA9PT0gJ3JhbmdlJyA/IHRoaXMucmFuZ2VFbmREYXkgOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBtb250aE5hbWUobW9udGhJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBzYWZlID0gKChtb250aEluZGV4ICUgMTIpICsgMTIpICUgMTI7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMueWVhciwgc2FmZSwgMSkudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ2xvbmcnIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZE1vbnRoQ2VsbHMoXG4gICAgeWVhcjogbnVtYmVyLFxuICAgIG1vbnRoSW5kZXg6IG51bWJlcixcbiAgICBzZWxlY3RlZERheT86IG51bWJlcixcbiAgICByYW5nZVN0YXJ0RGF5PzogbnVtYmVyLFxuICAgIHJhbmdlRW5kRGF5PzogbnVtYmVyXG4gICk6IENhbGVuZGFyQ2VsbFtdIHtcbiAgICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoSW5kZXgsIDEpO1xuICAgIGNvbnN0IHN0YXJ0V2Vla2RheSA9IGZpcnN0RGF5LmdldERheSgpO1xuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGhJbmRleCArIDEsIDApLmdldERhdGUoKTtcbiAgICBjb25zdCBjZWxsczogQ2FsZW5kYXJDZWxsW10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDI7IGkgKz0gMSkge1xuICAgICAgY29uc3QgZGF5TnVtYmVyID0gaSAtIHN0YXJ0V2Vla2RheSArIDE7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGhJbmRleCwgZGF5TnVtYmVyKTtcbiAgICAgIGNvbnN0IG91dHNpZGUgPSBkYXlOdW1iZXIgPCAxIHx8IGRheU51bWJlciA+IGRheXNJbk1vbnRoO1xuICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9ICFvdXRzaWRlICYmICEhc2VsZWN0ZWREYXkgJiYgZGF5ID09PSBzZWxlY3RlZERheTtcbiAgICAgIGNvbnN0IGluUmFuZ2UgPSAhb3V0c2lkZSAmJiAhIXJhbmdlU3RhcnREYXkgJiYgISFyYW5nZUVuZERheSAmJiBkYXkgPj0gcmFuZ2VTdGFydERheSAmJiBkYXkgPD0gcmFuZ2VFbmREYXk7XG4gICAgICBjZWxscy5wdXNoKHsgZGF0ZSwgZGF5LCBvdXRzaWRlLCBzZWxlY3RlZCwgaW5SYW5nZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2VsbHM7XG4gIH1cbn1cblxuIiwiPHNlY3Rpb25cbiAgW25nQ2xhc3NdPVwiW1xuICAgICdyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItYm9yZGVyIGJnLWJhY2tncm91bmQgcC0zIHNoYWRvdy1zbScsXG4gICAgbW9kZSA9PT0gJ3JhbmdlJyA/ICd3LWZ1bGwgbWF4LXctMnhsJyA6ICd3LWZ1bGwgbWF4LXctc20nLFxuICAgIGNsYXNzTmFtZVxuICBdXCJcbj5cbiAgPGRpdiBbbmdDbGFzc109XCJbJ2dyaWQgZ2FwLTQnLCBtb2RlID09PSAncmFuZ2UnID8gJ2dyaWQtY29scy0yJyA6ICdncmlkLWNvbHMtMSddXCI+XG4gICAgPGRpdiBjbGFzcz1cInNwYWNlLXktNFwiPlxuICAgICAgPGhlYWRlciBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImlubGluZS1mbGV4IGgtOCB3LTggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbWQgdGV4dC1mb3JlZ3JvdW5kIGhvdmVyOmJnLWFjY2VudCBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTIgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC1iYWNrZ3JvdW5kXCI+4oC5PC9idXR0b24+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiWydmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMScsIG1vZGUgPT09ICdyYW5nZScgPyAndy1mdWxsJyA6ICd3LWZ1bGwnXVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlID09PSAnc2luZ2xlJzsgZWxzZSBtb250aFRleHRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5saW5lLWZsZXggaC04IGl0ZW1zLWNlbnRlciByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItYm9yZGVyIHB4LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWZvcmVncm91bmQgc2hhZG93LXNtXCI+SnVuPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmxpbmUtZmxleCBoLTggaXRlbXMtY2VudGVyIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgcHgtMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZCBzaGFkb3ctc21cIj4yMDI1PC9zcGFuPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbW9udGhUZXh0PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZFwiPnt7IGxlZnRNb250aE5hbWUgfX0ge3sgeWVhciB9fTwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpbmxpbmUtZmxleCBoLTggdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIHRleHQtZm9yZWdyb3VuZCBob3ZlcjpiZy1hY2NlbnQgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0yIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtYmFja2dyb3VuZFwiPnt7IG1vZGUgPT09ICdyYW5nZScgPyAnJyA6ICfigLonIH19PC9idXR0b24+XG4gICAgICA8L2hlYWRlcj5cblxuICAgICAgPGRpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTdcIj5cbiAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtkYXlzXCIgY2xhc3M9XCJpbmxpbmUtZmxleCBoLTUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQteHMgZm9udC1ub3JtYWwgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e3sgZGF5IH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgZ3JpZCBncmlkLWNvbHMtNyBnYXAteS0yXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNlbGwgb2YgbGVmdENlbGxzXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgICAnaW5saW5lLWZsZXggaC04IHctOCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1tZCB0ZXh0LXNtIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJyxcbiAgICAgICAgICAgICAgY2VsbC5vdXRzaWRlID8gJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCBvcGFjaXR5LTUwJyA6ICd0ZXh0LWZvcmVncm91bmQnLFxuICAgICAgICAgICAgICBjZWxsLmluUmFuZ2UgPyAnYmctYWNjZW50IHRleHQtYWNjZW50LWZvcmVncm91bmQnIDogJycsXG4gICAgICAgICAgICAgIGNlbGwuc2VsZWN0ZWQgPyAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCcgOiAnJ1xuICAgICAgICAgICAgXVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgY2VsbC5kYXkgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJtb2RlID09PSAncmFuZ2UnXCIgY2xhc3M9XCJzcGFjZS15LTRcIj5cbiAgICAgIDxoZWFkZXIgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZFwiPnt7IHJpZ2h0TW9udGhOYW1lIH19IHt7IG1vbnRoID09PSAxMiA/IHllYXIgKyAxIDogeWVhciB9fTwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpbmxpbmUtZmxleCBoLTggdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIHRleHQtZm9yZWdyb3VuZCBob3ZlcjpiZy1hY2NlbnQgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0yIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtYmFja2dyb3VuZFwiPuKAujwvYnV0dG9uPlxuICAgICAgPC9oZWFkZXI+XG5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy03XCI+XG4gICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrZGF5c1wiIGNsYXNzPVwiaW5saW5lLWZsZXggaC01IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LXhzIGZvbnQtbm9ybWFsIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IGRheSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIGdyaWQgZ3JpZC1jb2xzLTcgZ2FwLXktMlwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjZWxsIG9mIHJpZ2h0Q2VsbHNcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgICAgICAgICdpbmxpbmUtZmxleCBoLTggdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIHRleHQtc20gZm9udC1ub3JtYWwgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQnLFxuICAgICAgICAgICAgICBjZWxsLm91dHNpZGUgPyAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kIG9wYWNpdHktNTAnIDogJ3RleHQtZm9yZWdyb3VuZCcsXG4gICAgICAgICAgICAgIGNlbGwuaW5SYW5nZSA/ICdiZy1hY2NlbnQgdGV4dC1hY2NlbnQtZm9yZWdyb3VuZCcgOiAnJyxcbiAgICAgICAgICAgICAgY2VsbC5zZWxlY3RlZCA/ICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJyA6ICcnXG4gICAgICAgICAgICBdXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBjZWxsLmRheSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvc2VjdGlvbj5cbiJdfQ==
472
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBZ0NuSCxNQUFNLGtCQUFrQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7QUFDdEMsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBT25DLE1BQU0sT0FBTyxvQkFBb0I7SUFLL0IsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFKbEMsV0FBTSxHQUFnQixJQUFJLENBQUM7UUFDM0IsZ0JBQVcsR0FBNEIsSUFBSSxDQUFDO1FBQzVDLFdBQU0sR0FBZ0IsSUFBSSxDQUFDO1FBSTFCLFlBQU8sR0FBZ0MsUUFBUSxDQUFDO1FBQ2hELGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUMzQixZQUFPLEdBQWdCLElBQUksQ0FBQztRQUM1QixZQUFPLEdBQWdCLElBQUksQ0FBQztRQUM1QixtQkFBYyxHQUFxQyxJQUFJLENBQUM7UUFDeEQsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFaEIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBQzlDLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUEyQixDQUFDO1FBQy9ELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVEs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O3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFHSCxLQUFLO3NCQURSLEtBQUs7Z0JBU0YsVUFBVTtzQkFEYixLQUFLO2dCQWNGLEtBQUs7c0JBRFIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgUGRtQ2FsZW5kYXJWYXJpYW50ID0gJ3NpbmdsZScgfCAncmFuZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBkbUNhbGVuZGFyUmFuZ2Uge1xuICBzdGFydDogRGF0ZSB8IG51bGw7XG4gIGVuZDogRGF0ZSB8IG51bGw7XG59XG5cbmludGVyZmFjZSBQZG1DYWxlbmRhckNlbGwge1xuICBkYXRlOiBEYXRlO1xuICBsYWJlbDogbnVtYmVyO1xuICBtdXRlZDogYm9vbGVhbjtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHNlbGVjdGVkOiBib29sZWFuO1xuICBpblJhbmdlOiBib29sZWFuO1xuICByYW5nZUZpbGw6IGJvb2xlYW47XG4gIHJhbmdlTGVmdENhcDogYm9vbGVhbjtcbiAgcmFuZ2VSaWdodENhcDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFBkbUNhbGVuZGFyTW9udGhWaWV3IHtcbiAgZGF0ZTogRGF0ZTtcbiAgdGl0bGU6IHN0cmluZztcbiAgdGl0bGVTdHlsZTogJ2Ryb3Bkb3ducycgfCAncGxhaW4nO1xuICBkcm9wZG93bk1vbnRoPzogc3RyaW5nO1xuICBkcm9wZG93blllYXI/OiBzdHJpbmc7XG4gIHNob3dQcmV2QnV0dG9uOiBib29sZWFuO1xuICBzaG93TmV4dEJ1dHRvbjogYm9vbGVhbjtcbiAgd2Vla3M6IHJlYWRvbmx5IChyZWFkb25seSBQZG1DYWxlbmRhckNlbGxbXSlbXTtcbn1cblxuY29uc3QgREVGQVVMVF9WSUVXX01PTlRIID0gbmV3IERhdGUoKTtcbmNvbnN0IERBWV9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BkbS1jYWxlbmRhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFBkbUNhbGVuZGFyQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBfdmFsdWU6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcmFuZ2VWYWx1ZTogUGRtQ2FsZW5kYXJSYW5nZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9tb250aDogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBASW5wdXQoKSB2YXJpYW50OiBQZG1DYWxlbmRhclZhcmlhbnQgfCBzdHJpbmcgPSAnc2luZ2xlJztcbiAgQElucHV0KCkgY2xhc3NOYW1lID0gJyc7XG4gIEBJbnB1dCgpIGRpc2FibGVkRGF0ZXM6IERhdGVbXSA9IFtdO1xuICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG1heERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgaXNEYXRlRGlzYWJsZWQ6ICgoZGF0ZTogRGF0ZSkgPT4gYm9vbGVhbikgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgYWxsb3dTYW1lRGF5UmFuZ2UgPSB0cnVlO1xuICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IG51bGw+KCk7XG4gIEBPdXRwdXQoKSByYW5nZVZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQZG1DYWxlbmRhclJhbmdlIHwgbnVsbD4oKTtcbiAgQE91dHB1dCgpIG1vbnRoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuICBAT3V0cHV0KCkgZGF0ZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuICBAT3V0cHV0KCkgZGlzYWJsZWREYXRlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG5cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHZhbHVlOiBEYXRlIHwgbnVsbCkge1xuICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5ub3JtYWxpemVEYXRlKHZhbHVlKTtcbiAgfVxuICBnZXQgdmFsdWUoKTogRGF0ZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCByYW5nZVZhbHVlKHZhbHVlOiBQZG1DYWxlbmRhclJhbmdlIHwgbnVsbCkge1xuICAgIHRoaXMuX3JhbmdlVmFsdWUgPSB2YWx1ZVxuICAgICAgPyB7XG4gICAgICAgICAgc3RhcnQ6IHRoaXMubm9ybWFsaXplRGF0ZSh2YWx1ZS5zdGFydCksXG4gICAgICAgICAgZW5kOiB0aGlzLm5vcm1hbGl6ZURhdGUodmFsdWUuZW5kKVxuICAgICAgICB9XG4gICAgICA6IG51bGw7XG4gIH1cbiAgZ2V0IHJhbmdlVmFsdWUoKTogUGRtQ2FsZW5kYXJSYW5nZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZVZhbHVlO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IG1vbnRoKHZhbHVlOiBEYXRlIHwgbnVsbCkge1xuICAgIHRoaXMuX21vbnRoID0gdmFsdWUgPyB0aGlzLnN0YXJ0T2ZNb250aCh2YWx1ZSkgOiBudWxsO1xuICB9XG4gIGdldCBtb250aCgpOiBEYXRlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21vbnRoO1xuICB9XG5cbiAgcmVhZG9ubHkgd2Vla2RheXMgPSBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ10gYXMgY29uc3Q7XG4gIHJlYWRvbmx5IG1vbnRoT3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiAwLCBsYWJlbDogJ0phbicgfSxcbiAgICB7IHZhbHVlOiAxLCBsYWJlbDogJ0ZlYicgfSxcbiAgICB7IHZhbHVlOiAyLCBsYWJlbDogJ01hcicgfSxcbiAgICB7IHZhbHVlOiAzLCBsYWJlbDogJ0FwcicgfSxcbiAgICB7IHZhbHVlOiA0LCBsYWJlbDogJ01heScgfSxcbiAgICB7IHZhbHVlOiA1LCBsYWJlbDogJ0p1bicgfSxcbiAgICB7IHZhbHVlOiA2LCBsYWJlbDogJ0p1bCcgfSxcbiAgICB7IHZhbHVlOiA3LCBsYWJlbDogJ0F1ZycgfSxcbiAgICB7IHZhbHVlOiA4LCBsYWJlbDogJ1NlcCcgfSxcbiAgICB7IHZhbHVlOiA5LCBsYWJlbDogJ09jdCcgfSxcbiAgICB7IHZhbHVlOiAxMCwgbGFiZWw6ICdOb3YnIH0sXG4gICAgeyB2YWx1ZTogMTEsIGxhYmVsOiAnRGVjJyB9XG4gIF0gYXMgY29uc3Q7XG5cbiAgZ2V0IHJlc29sdmVkVmFyaWFudCgpOiBQZG1DYWxlbmRhclZhcmlhbnQge1xuICAgIHJldHVybiB0aGlzLnZhcmlhbnQgPT09ICdyYW5nZScgPyAncmFuZ2UnIDogJ3NpbmdsZSc7XG4gIH1cblxuICBnZXQgdmlzaWJsZU1vbnRocygpOiByZWFkb25seSBQZG1DYWxlbmRhck1vbnRoVmlld1tdIHtcbiAgICBjb25zdCBiYXNlTW9udGggPSB0aGlzLmdldEFuY2hvck1vbnRoKCk7XG5cbiAgICBpZiAodGhpcy5yZXNvbHZlZFZhcmlhbnQgPT09ICdzaW5nbGUnKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgZGF0ZTogYmFzZU1vbnRoLFxuICAgICAgICAgIHRpdGxlOiB0aGlzLmZvcm1hdE1vbnRoWWVhcihiYXNlTW9udGgpLFxuICAgICAgICAgIHRpdGxlU3R5bGU6ICdkcm9wZG93bnMnLFxuICAgICAgICAgIGRyb3Bkb3duTW9udGg6IHRoaXMuZm9ybWF0TW9udGhTaG9ydChiYXNlTW9udGgpLFxuICAgICAgICAgIGRyb3Bkb3duWWVhcjogU3RyaW5nKGJhc2VNb250aC5nZXRGdWxsWWVhcigpKSxcbiAgICAgICAgICBzaG93UHJldkJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICBzaG93TmV4dEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICB3ZWVrczogdGhpcy5idWlsZE1vbnRoV2Vla3MoYmFzZU1vbnRoLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0TW9udGggPSB0aGlzLmFkZE1vbnRocyhiYXNlTW9udGgsIDEpO1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGRhdGU6IGJhc2VNb250aCxcbiAgICAgICAgdGl0bGU6IHRoaXMuZm9ybWF0TW9udGhZZWFyKGJhc2VNb250aCksXG4gICAgICAgIHRpdGxlU3R5bGU6ICdwbGFpbicsXG4gICAgICAgIHNob3dQcmV2QnV0dG9uOiB0cnVlLFxuICAgICAgICBzaG93TmV4dEJ1dHRvbjogZmFsc2UsXG4gICAgICAgIHdlZWtzOiB0aGlzLmJ1aWxkTW9udGhXZWVrcyhiYXNlTW9udGgsIHRydWUpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBkYXRlOiBuZXh0TW9udGgsXG4gICAgICAgIHRpdGxlOiB0aGlzLmZvcm1hdE1vbnRoWWVhcihuZXh0TW9udGgpLFxuICAgICAgICB0aXRsZVN0eWxlOiAncGxhaW4nLFxuICAgICAgICBzaG93UHJldkJ1dHRvbjogZmFsc2UsXG4gICAgICAgIHNob3dOZXh0QnV0dG9uOiB0cnVlLFxuICAgICAgICB3ZWVrczogdGhpcy5idWlsZE1vbnRoV2Vla3MobmV4dE1vbnRoLCB0cnVlKVxuICAgICAgfVxuICAgIF07XG4gIH1cblxuICBnZXQgc2luZ2xlSGVhZGVyTW9udGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbmNob3JNb250aCgpLmdldE1vbnRoKCk7XG4gIH1cblxuICBnZXQgc2luZ2xlSGVhZGVyWWVhcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldEFuY2hvck1vbnRoKCkuZ2V0RnVsbFllYXIoKTtcbiAgfVxuXG4gIGdldCB5ZWFyT3B0aW9ucygpOiByZWFkb25seSBudW1iZXJbXSB7XG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLnNpbmdsZUhlYWRlclllYXI7XG4gICAgY29uc3QgbWluWWVhciA9IHRoaXMubWluRGF0ZSA/IHRoaXMubWluRGF0ZS5nZXRGdWxsWWVhcigpIDogY3VycmVudFllYXIgLSAxMDA7XG4gICAgY29uc3QgbWF4WWVhciA9IHRoaXMubWF4RGF0ZSA/IHRoaXMubWF4RGF0ZS5nZXRGdWxsWWVhcigpIDogY3VycmVudFllYXIgKyAxMDA7XG4gICAgY29uc3QgeWVhcnM6IG51bWJlcltdID0gW107XG5cbiAgICBmb3IgKGxldCB5ZWFyID0gbWluWWVhcjsgeWVhciA8PSBtYXhZZWFyOyB5ZWFyICs9IDEpIHtcbiAgICAgIHllYXJzLnB1c2goeWVhcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHllYXJzO1xuICB9XG5cbiAgZ2V0IHJvb3RDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2JvcmRlci1ib3JkZXIgYmctYmFja2dyb3VuZCByZWxhdGl2ZSByb3VuZGVkLVsxMHB4XSBib3JkZXIgcC0zIHNoYWRvdy1zbScsXG4gICAgICB0aGlzLnJlc29sdmVkVmFyaWFudCA9PT0gJ3JhbmdlJ1xuICAgICAgICA/ICdpbmxpbmUtZmxleCBpdGVtcy1zdGFydCBqdXN0aWZ5LWNlbnRlciBnYXAtNCBzaHJpbmstMCBncm93LTAgYmFzaXMtYXV0bydcbiAgICAgICAgOiAnaW5saW5lLWZsZXggZmxleC1jb2wgZ2FwLTQgc2hyaW5rLTAgZ3Jvdy0wIGJhc2lzLWF1dG8nLFxuICAgICAgdGhpcy5jbGFzc05hbWVcbiAgICBdO1xuICB9XG5cbiAgZ2V0IHJvb3RTdHlsZSgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMucmVzb2x2ZWRWYXJpYW50ID09PSAncmFuZ2UnID8gJzQ4OHB4JyA6ICcyNTBweCc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGgsXG4gICAgICBtaW5XaWR0aDogd2lkdGgsXG4gICAgICBtYXhXaWR0aDogd2lkdGgsXG4gICAgICBtaW5IZWlnaHQ6ICcyOTNweCcsXG4gICAgICBmbGV4OiAnMCAwIGF1dG8nLFxuICAgICAgYWxpZ25TZWxmOiAnZmxleC1zdGFydCdcbiAgICB9O1xuICB9XG5cbiAgbW9udGhQYW5lbENsYXNzZXMoX2luZGV4OiBudW1iZXIpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnZmxleCBmbGV4LWNvbCBpdGVtcy1zdGFydCcsIHRoaXMucmVzb2x2ZWRWYXJpYW50ID09PSAncmFuZ2UnID8gJ3ctWzIyNHB4XSBnYXAtNCcgOiAndy1mdWxsIGdhcC0wJ107XG4gIH1cblxuICBoZWFkZXJDbGFzc2VzKG1vbnRoOiBQZG1DYWxlbmRhck1vbnRoVmlldyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuJywgbW9udGgudGl0bGVTdHlsZSA9PT0gJ2Ryb3Bkb3ducycgPyAnJyA6ICdtYi00J107XG4gIH1cblxuICBuYXZCdXR0b25DbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2ZsZXggaC04IHctOCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1tZCB0ZXh0LWZvcmVncm91bmQnLFxuICAgICAgJ2Rpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmUgZGlzYWJsZWQ6b3BhY2l0eS00MCdcbiAgICBdO1xuICB9XG5cbiAgbmF2UGxhY2Vob2xkZXJDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydoLTcgdy03IHNocmluay0wJ107XG4gIH1cblxuICBkcm9wZG93bldyYXBDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydmbGV4IHctNDAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0yJ107XG4gIH1cblxuICBkcm9wZG93bkNsYXNzZXMod2lkdGhDbGFzczogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ2ZsZXggaC04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMSBweC0xJywgd2lkdGhDbGFzc107XG4gIH1cblxuICBkcm9wZG93blNlbGVjdENsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAndGV4dC1mb3JlZ3JvdW5kIGgtZnVsbCBiZy10cmFuc3BhcmVudCB0ZXh0LXNtIGZvbnQtbWVkaXVtIGxlYWRpbmctNScsXG4gICAgICAnYXBwZWFyYW5jZS1ub25lIGJvcmRlci0wIG91dGxpbmUtbm9uZSByaW5nLTAgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMCB0ZXh0LWNlbnRlciBjdXJzb3ItcG9pbnRlcidcbiAgICBdO1xuICB9XG5cbiAgZ2V0IGRyb3Bkb3duU2VsZWN0U3R5bGUoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcGVhcmFuY2U6ICdub25lJyxcbiAgICAgIFdlYmtpdEFwcGVhcmFuY2U6ICdub25lJyxcbiAgICAgIE1vekFwcGVhcmFuY2U6ICdub25lJyxcbiAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICBib3JkZXI6ICcwJyxcbiAgICAgIGJveFNoYWRvdzogJ25vbmUnLFxuICAgICAgb3V0bGluZTogJzAnLFxuICAgICAgcGFkZGluZzogJzAnLFxuICAgICAgbWFyZ2luOiAnMCdcbiAgICB9O1xuICB9XG5cbiAgY2FsZW5kYXJHcmlkV3JhcENsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ2ZsZXggdy1mdWxsIGZsZXgtY29sIGl0ZW1zLXN0YXJ0J107XG4gIH1cblxuICB3ZWVrZGF5Um93Q2xhc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyJ107XG4gIH1cblxuICB3ZWVrZGF5Q2VsbENsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCBmbGV4IGgtWzIxcHhdIHctOCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1tZCB0ZXh0LXhzIGxlYWRpbmctNCddO1xuICB9XG5cbiAgd2Vla1Jvd0NsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ2ZsZXggdy1mdWxsIGl0ZW1zLXN0YXJ0IHB0LTInXTtcbiAgfVxuXG4gIGRheUNlbGxDbGFzc2VzKGNlbGw6IFBkbUNhbGVuZGFyQ2VsbCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ3JlbGF0aXZlIGZsZXggaC04IHctOCBzaHJpbmstMCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXInLFxuICAgICAgY2VsbC5yYW5nZUZpbGwgPyAnYmctYWNjZW50JyA6ICcnLFxuICAgICAgY2VsbC5yYW5nZUxlZnRDYXAgPyAncm91bmRlZC1sLW1kJyA6ICcnLFxuICAgICAgY2VsbC5yYW5nZVJpZ2h0Q2FwID8gJ3JvdW5kZWQtci1tZCcgOiAnJ1xuICAgIF07XG4gIH1cblxuICBkYXlCdXR0b25DbGFzc2VzKGNlbGw6IFBkbUNhbGVuZGFyQ2VsbCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ3JlbGF0aXZlIHotMTAgZmxleCBoLTggdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIHRleHQtc20gbGVhZGluZy01JyxcbiAgICAgIGNlbGwuc2VsZWN0ZWQgPyAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCcgOiBjZWxsLnJhbmdlRmlsbCA/ICd0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJyA6ICd0ZXh0LWZvcmVncm91bmQnLFxuICAgICAgY2VsbC5tdXRlZCAmJiAhY2VsbC5yYW5nZUZpbGwgPyAnb3BhY2l0eS01MCcgOiAnJyxcbiAgICAgIGNlbGwuZGlzYWJsZWQgPyAnY3Vyc29yLW5vdC1hbGxvd2VkIG9wYWNpdHktNDAnIDogJycsXG4gICAgICAhY2VsbC5kaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSAmJiAhY2VsbC5zZWxlY3RlZCA/ICdob3ZlcjpiZy1hY2NlbnQvNzAnIDogJydcbiAgICBdO1xuICB9XG5cbiAgZGF5TGFiZWxDbGFzc2VzKF9jZWxsOiBQZG1DYWxlbmRhckNlbGwpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnZm9udC1ub3JtYWwnXTtcbiAgfVxuXG4gIHRyYWNrQnlJbmRleCA9IChpbmRleDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICB0cmFja0J5RGF0ZSA9IChfaW5kZXg6IG51bWJlciwgY2VsbDogUGRtQ2FsZW5kYXJDZWxsKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRlS2V5KGNlbGwuZGF0ZSk7XG4gIH1cblxuICBnb1RvUHJldmlvdXNNb250aCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldEFuY2hvck1vbnRoKHRoaXMuYWRkTW9udGhzKHRoaXMuZ2V0QW5jaG9yTW9udGgoKSwgLTEpKTtcbiAgfVxuXG4gIGdvVG9OZXh0TW9udGgoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRBbmNob3JNb250aCh0aGlzLmFkZE1vbnRocyh0aGlzLmdldEFuY2hvck1vbnRoKCksIDEpKTtcbiAgfVxuXG4gIG9uU2luZ2xlTW9udGhDaGFuZ2UobW9udGhWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbW9udGggPSBOdW1iZXIobW9udGhWYWx1ZSk7XG4gICAgaWYgKE51bWJlci5pc05hTihtb250aCkgfHwgbW9udGggPCAwIHx8IG1vbnRoID4gMTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbmNob3IgPSB0aGlzLmdldEFuY2hvck1vbnRoKCk7XG4gICAgdGhpcy5zZXRBbmNob3JNb250aChuZXcgRGF0ZShhbmNob3IuZ2V0RnVsbFllYXIoKSwgbW9udGgsIDEpKTtcbiAgfVxuXG4gIG9uU2luZ2xlWWVhckNoYW5nZSh5ZWFyVmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHllYXIgPSBOdW1iZXIoeWVhclZhbHVlKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHllYXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYW5jaG9yID0gdGhpcy5nZXRBbmNob3JNb250aCgpO1xuICAgIHRoaXMuc2V0QW5jaG9yTW9udGgobmV3IERhdGUoeWVhciwgYW5jaG9yLmdldE1vbnRoKCksIDEpKTtcbiAgfVxuXG4gIG9uRGF0ZVByZXNzZWQoY2VsbDogUGRtQ2FsZW5kYXJDZWxsKTogdm9pZCB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuY2xvbmVEYXRlKGNlbGwuZGF0ZSk7XG5cbiAgICBpZiAoY2VsbC5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5kaXNhYmxlZERhdGVDbGljay5lbWl0KGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlYWRvbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kYXRlQ2xpY2suZW1pdChkYXRlKTtcblxuICAgIGlmICh0aGlzLnJlc29sdmVkVmFyaWFudCA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gZGF0ZTtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLmNsb25lRGF0ZShkYXRlKSk7XG4gICAgICB0aGlzLnN5bmNWaXNpYmxlTW9udGhUb0RhdGUoZGF0ZSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZVJhbmdlU2VsZWN0aW9uKGRhdGUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSYW5nZVNlbGVjdGlvbihkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuX3JhbmdlVmFsdWU7XG4gICAgY29uc3QgY3VycmVudFN0YXJ0ID0gY3VycmVudD8uc3RhcnQgPyB0aGlzLmNsb25lRGF0ZShjdXJyZW50LnN0YXJ0KSA6IG51bGw7XG4gICAgY29uc3QgY3VycmVudEVuZCA9IGN1cnJlbnQ/LmVuZCA/IHRoaXMuY2xvbmVEYXRlKGN1cnJlbnQuZW5kKSA6IG51bGw7XG5cbiAgICBpZiAoIWN1cnJlbnRTdGFydCB8fCAoY3VycmVudFN0YXJ0ICYmIGN1cnJlbnRFbmQpKSB7XG4gICAgICB0aGlzLl9yYW5nZVZhbHVlID0geyBzdGFydDogZGF0ZSwgZW5kOiBudWxsIH07XG4gICAgICB0aGlzLnJhbmdlVmFsdWVDaGFuZ2UuZW1pdCh7IHN0YXJ0OiB0aGlzLmNsb25lRGF0ZShkYXRlKSwgZW5kOiBudWxsIH0pO1xuICAgICAgdGhpcy5zeW5jVmlzaWJsZU1vbnRoVG9EYXRlKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU2FtZURheShjdXJyZW50U3RhcnQsIGRhdGUpICYmICF0aGlzLmFsbG93U2FtZURheVJhbmdlKSB7XG4gICAgICB0aGlzLl9yYW5nZVZhbHVlID0geyBzdGFydDogZGF0ZSwgZW5kOiBudWxsIH07XG4gICAgICB0aGlzLnJhbmdlVmFsdWVDaGFuZ2UuZW1pdCh7IHN0YXJ0OiB0aGlzLmNsb25lRGF0ZShkYXRlKSwgZW5kOiBudWxsIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jb21wYXJlRGF0ZShkYXRlLCBjdXJyZW50U3RhcnQpIDwgMCA/IGRhdGUgOiBjdXJyZW50U3RhcnQ7XG4gICAgY29uc3QgZW5kID0gdGhpcy5jb21wYXJlRGF0ZShkYXRlLCBjdXJyZW50U3RhcnQpIDwgMCA/IGN1cnJlbnRTdGFydCA6IGRhdGU7XG5cbiAgICBpZiAodGhpcy5yYW5nZUNvbnRhaW5zQmxvY2tlZERhdGUoc3RhcnQsIGVuZCkpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWREYXRlQ2xpY2suZW1pdCh0aGlzLmNsb25lRGF0ZShkYXRlKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmFuZ2VWYWx1ZSA9IHsgc3RhcnQsIGVuZCB9O1xuICAgIHRoaXMucmFuZ2VWYWx1ZUNoYW5nZS5lbWl0KHsgc3RhcnQ6IHRoaXMuY2xvbmVEYXRlKHN0YXJ0KSwgZW5kOiB0aGlzLmNsb25lRGF0ZShlbmQpIH0pO1xuICAgIHRoaXMuc3luY1Zpc2libGVNb250aFRvRGF0ZShzdGFydCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTW9udGhXZWVrcyhtb250aDogRGF0ZSwgaW5jbHVkZVJhbmdlOiBib29sZWFuKTogcmVhZG9ubHkgKHJlYWRvbmx5IFBkbUNhbGVuZGFyQ2VsbFtdKVtdIHtcbiAgICBjb25zdCBmaXJzdE9mTW9udGggPSB0aGlzLnN0YXJ0T2ZNb250aChtb250aCk7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXJ0T2ZXZWVrKGZpcnN0T2ZNb250aCk7XG4gICAgY29uc3QgZW5kID0gdGhpcy5lbmRPZldlZWsodGhpcy5lbmRPZk1vbnRoKGZpcnN0T2ZNb250aCkpO1xuICAgIGNvbnN0IHdlZWtzOiBQZG1DYWxlbmRhckNlbGxbXVtdID0gW107XG5cbiAgICBsZXQgY3Vyc29yID0gdGhpcy5jbG9uZURhdGUoc3RhcnQpO1xuICAgIHdoaWxlICh0aGlzLmNvbXBhcmVEYXRlKGN1cnNvciwgZW5kKSA8PSAwKSB7XG4gICAgICBjb25zdCByb3c6IFBkbUNhbGVuZGFyQ2VsbFtdID0gW107XG5cbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IDc7IGNvbCArPSAxKSB7XG4gICAgICAgIHJvdy5wdXNoKHRoaXMuYnVpbGRDZWxsKGN1cnNvciwgbW9udGgsIGluY2x1ZGVSYW5nZSkpO1xuICAgICAgICBjdXJzb3IgPSB0aGlzLmFkZERheXMoY3Vyc29yLCAxKTtcbiAgICAgIH1cblxuICAgICAgd2Vla3MucHVzaChyb3cpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHdlZWtzKSB7XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCByb3cubGVuZ3RoOyBjb2wgKz0gMSkge1xuICAgICAgICBjb25zdCBjZWxsID0gcm93W2NvbF07XG4gICAgICAgIGlmICghY2VsbC5pblJhbmdlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsZWZ0SW5Sb3cgPSBjb2wgPiAwID8gcm93W2NvbCAtIDFdLmluUmFuZ2UgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgcmlnaHRJblJvdyA9IGNvbCA8IHJvdy5sZW5ndGggLSAxID8gcm93W2NvbCArIDFdLmluUmFuZ2UgOiBmYWxzZTtcblxuICAgICAgICBjZWxsLnJhbmdlTGVmdENhcCA9ICFsZWZ0SW5Sb3c7XG4gICAgICAgIGNlbGwucmFuZ2VSaWdodENhcCA9ICFyaWdodEluUm93O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB3ZWVrcztcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDZWxsKGRhdGU6IERhdGUsIHZpc2libGVNb250aDogRGF0ZSwgaW5jbHVkZVJhbmdlOiBib29sZWFuKTogUGRtQ2FsZW5kYXJDZWxsIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5jbG9uZURhdGUoZGF0ZSk7XG4gICAgY29uc3QgaW5DdXJyZW50TW9udGggPSBub3JtYWxpemVkLmdldE1vbnRoKCkgPT09IHZpc2libGVNb250aC5nZXRNb250aCgpICYmIG5vcm1hbGl6ZWQuZ2V0RnVsbFllYXIoKSA9PT0gdmlzaWJsZU1vbnRoLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgZGlzYWJsZWQgPSB0aGlzLmlzQmxvY2tlZChub3JtYWxpemVkKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkU2luZ2xlID0gdGhpcy5yZXNvbHZlZFZhcmlhbnQgPT09ICdzaW5nbGUnICYmICEhdGhpcy5fdmFsdWUgJiYgdGhpcy5pc1NhbWVEYXkobm9ybWFsaXplZCwgdGhpcy5fdmFsdWUpO1xuICAgIGNvbnN0IHJhbmdlU3RhcnQgPSBpbmNsdWRlUmFuZ2UgJiYgISF0aGlzLl9yYW5nZVZhbHVlPy5zdGFydCAmJiB0aGlzLmlzU2FtZURheShub3JtYWxpemVkLCB0aGlzLl9yYW5nZVZhbHVlLnN0YXJ0KTtcbiAgICBjb25zdCByYW5nZUVuZCA9IGluY2x1ZGVSYW5nZSAmJiAhIXRoaXMuX3JhbmdlVmFsdWU/LmVuZCAmJiB0aGlzLmlzU2FtZURheShub3JtYWxpemVkLCB0aGlzLl9yYW5nZVZhbHVlLmVuZCk7XG4gICAgY29uc3QgaW5SYW5nZSA9XG4gICAgICBpbmNsdWRlUmFuZ2UgJiZcbiAgICAgICEhdGhpcy5fcmFuZ2VWYWx1ZT8uc3RhcnQgJiZcbiAgICAgICEhdGhpcy5fcmFuZ2VWYWx1ZT8uZW5kICYmXG4gICAgICB0aGlzLmNvbXBhcmVEYXRlKG5vcm1hbGl6ZWQsIHRoaXMuX3JhbmdlVmFsdWUuc3RhcnQpID49IDAgJiZcbiAgICAgIHRoaXMuY29tcGFyZURhdGUobm9ybWFsaXplZCwgdGhpcy5fcmFuZ2VWYWx1ZS5lbmQpIDw9IDA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0ZTogbm9ybWFsaXplZCxcbiAgICAgIGxhYmVsOiBub3JtYWxpemVkLmdldERhdGUoKSxcbiAgICAgIG11dGVkOiAhaW5DdXJyZW50TW9udGgsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIHNlbGVjdGVkOiBzZWxlY3RlZFNpbmdsZSB8fCByYW5nZVN0YXJ0IHx8IHJhbmdlRW5kLFxuICAgICAgaW5SYW5nZSxcbiAgICAgIHJhbmdlRmlsbDogaW5SYW5nZSxcbiAgICAgIHJhbmdlTGVmdENhcDogZmFsc2UsXG4gICAgICByYW5nZVJpZ2h0Q2FwOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEFuY2hvck1vbnRoKCk6IERhdGUge1xuICAgIGlmICh0aGlzLl9tb250aCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xvbmVEYXRlKHRoaXMuX21vbnRoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNvbHZlZFZhcmlhbnQgPT09ICdzaW5nbGUnICYmIHRoaXMuX3ZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFydE9mTW9udGgodGhpcy5fdmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc29sdmVkVmFyaWFudCA9PT0gJ3JhbmdlJyAmJiB0aGlzLl9yYW5nZVZhbHVlPy5zdGFydCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZk1vbnRoKHRoaXMuX3JhbmdlVmFsdWUuc3RhcnQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YXJ0T2ZNb250aChERUZBVUxUX1ZJRVdfTU9OVEgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBbmNob3JNb250aChtb250aDogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuX21vbnRoID0gdGhpcy5zdGFydE9mTW9udGgobW9udGgpO1xuICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh0aGlzLmNsb25lRGF0ZSh0aGlzLl9tb250aCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jVmlzaWJsZU1vbnRoVG9EYXRlKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0TW9udGggPSB0aGlzLnN0YXJ0T2ZNb250aChkYXRlKTtcbiAgICBpZiAoIXRoaXMuX21vbnRoIHx8ICF0aGlzLmlzU2FtZU1vbnRoKHRoaXMuX21vbnRoLCBuZXh0TW9udGgpKSB7XG4gICAgICB0aGlzLl9tb250aCA9IG5leHRNb250aDtcbiAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh0aGlzLmNsb25lRGF0ZShuZXh0TW9udGgpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzQmxvY2tlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWluRGF0ZSAmJiB0aGlzLmNvbXBhcmVEYXRlKGRhdGUsIHRoaXMubWluRGF0ZSkgPCAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXhEYXRlICYmIHRoaXMuY29tcGFyZURhdGUoZGF0ZSwgdGhpcy5tYXhEYXRlKSA+IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGJsb2NrZWRTZXQgPSBuZXcgU2V0KCh0aGlzLmRpc2FibGVkRGF0ZXMgfHwgW10pLm1hcCgoaXRlbSkgPT4gdGhpcy5kYXRlS2V5KGl0ZW0pKSk7XG4gICAgaWYgKGJsb2NrZWRTZXQuaGFzKHRoaXMuZGF0ZUtleShkYXRlKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiAhIXRoaXMuaXNEYXRlRGlzYWJsZWQ/Lih0aGlzLmNsb25lRGF0ZShkYXRlKSk7XG4gIH1cblxuICBwcml2YXRlIHJhbmdlQ29udGFpbnNCbG9ja2VkRGF0ZShzdGFydDogRGF0ZSwgZW5kOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgbGV0IGN1cnNvciA9IHRoaXMuY2xvbmVEYXRlKHN0YXJ0KTtcblxuICAgIHdoaWxlICh0aGlzLmNvbXBhcmVEYXRlKGN1cnNvciwgZW5kKSA8PSAwKSB7XG4gICAgICBpZiAodGhpcy5pc0Jsb2NrZWQoY3Vyc29yKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGN1cnNvciA9IHRoaXMuYWRkRGF5cyhjdXJzb3IsIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplRGF0ZSh2YWx1ZTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgbnVsbCB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB8fCBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlLmdldEZ1bGxZZWFyKCksIHZhbHVlLmdldE1vbnRoKCksIHZhbHVlLmdldERhdGUoKSk7XG4gIH1cblxuICBwcml2YXRlIGNsb25lRGF0ZShkYXRlOiBEYXRlKTogRGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0T2ZNb250aChkYXRlOiBEYXRlKTogRGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCAxKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5kT2ZNb250aChkYXRlOiBEYXRlKTogRGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgMCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0T2ZXZWVrKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5hZGREYXlzKGRhdGUsIC1kYXRlLmdldERheSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5kT2ZXZWVrKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5hZGREYXlzKGRhdGUsIDYgLSBkYXRlLmdldERheSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTW9udGhzKGRhdGU6IERhdGUsIG1vbnRoczogbnVtYmVyKTogRGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpICsgbW9udGhzLCAxKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRGF5cyhkYXRlOiBEYXRlLCBkYXlzOiBudW1iZXIpOiBEYXRlIHtcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpICsgZGF5cyk7XG4gIH1cblxuICBwcml2YXRlIGNvbXBhcmVEYXRlKGE6IERhdGUsIGI6IERhdGUpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRhdGVWYWx1ZShhKSAtIHRoaXMuZGF0ZVZhbHVlKGIpO1xuICB9XG5cbiAgcHJpdmF0ZSBkYXRlVmFsdWUoZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIERhdGUuVVRDKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSkgLyBEQVlfTVM7XG4gIH1cblxuICBwcml2YXRlIGlzU2FtZURheShhOiBEYXRlLCBiOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGFyZURhdGUoYSwgYikgPT09IDA7XG4gIH1cblxuICBwcml2YXRlIGlzU2FtZU1vbnRoKGE6IERhdGUsIGI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYS5nZXRGdWxsWWVhcigpID09PSBiLmdldEZ1bGxZZWFyKCkgJiYgYS5nZXRNb250aCgpID09PSBiLmdldE1vbnRoKCk7XG4gIH1cblxuICBwcml2YXRlIGRhdGVLZXkoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBtID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgZCA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCR7eX0tJHttfS0ke2R9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TW9udGhTaG9ydChkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7IG1vbnRoOiAnc2hvcnQnIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRNb250aFllYXIoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ2xvbmcnLCB5ZWFyOiAnbnVtZXJpYycgfSk7XG4gIH1cbn1cbiIsIjxkaXYgW25nQ2xhc3NdPVwicm9vdENsYXNzZXNcIiBbbmdTdHlsZV09XCJyb290U3R5bGVcIj5cbiAgPGRpdiAqbmdGb3I9XCJsZXQgbW9udGggb2YgdmlzaWJsZU1vbnRoczsgbGV0IG1vbnRoSW5kZXggPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCIgW25nQ2xhc3NdPVwibW9udGhQYW5lbENsYXNzZXMobW9udGhJbmRleClcIj5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cImhlYWRlckNsYXNzZXMobW9udGgpXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwibW9udGguc2hvd1ByZXZCdXR0b247IGVsc2UgcHJldlBsYWNlaG9sZGVyXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIm5hdkJ1dHRvbkNsYXNzZXMoKVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJQcmV2aW91cyBtb250aFwiXG4gICAgICAgIChjbGljayk9XCJnb1RvUHJldmlvdXNNb250aCgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInJlYWRvbmx5XCJcbiAgICAgID5cbiAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgY2xhc3M9XCJoLTQgdy00XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgPHBhdGggZD1cIm0xNSAxOC02LTYgNi02XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG5nLXRlbXBsYXRlICNwcmV2UGxhY2Vob2xkZXI+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwibmF2UGxhY2Vob2xkZXJDbGFzc2VzKClcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb250aC50aXRsZVN0eWxlID09PSAnZHJvcGRvd25zJzsgZWxzZSBwbGFpblRpdGxlXCI+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZHJvcGRvd25XcmFwQ2xhc3NlcygpXCI+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJkcm9wZG93bkNsYXNzZXMoJ3ctWzcycHhdJylcIj5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZHJvcGRvd25TZWxlY3RDbGFzc2VzKClcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJkcm9wZG93blNlbGVjdFN0eWxlXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInNpbmdsZUhlYWRlck1vbnRoXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk1vbnRoXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNpbmdsZU1vbnRoQ2hhbmdlKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbW9udGhPcHRpb24gb2YgbW9udGhPcHRpb25zXCIgW3ZhbHVlXT1cIm1vbnRoT3B0aW9uLnZhbHVlXCI+e3sgbW9udGhPcHRpb24ubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgY2xhc3M9XCJoLTMgdy0zIHRleHQtZm9yZWdyb3VuZFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwibTYgOSA2IDYgNi02XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9wYXRoPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJkcm9wZG93bkNsYXNzZXMoJ3ctWzgycHhdJylcIj5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZHJvcGRvd25TZWxlY3RDbGFzc2VzKClcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJkcm9wZG93blNlbGVjdFN0eWxlXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInNpbmdsZUhlYWRlclllYXJcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiWWVhclwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TaW5nbGVZZWFyQ2hhbmdlKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgeWVhciBvZiB5ZWFyT3B0aW9uc1wiIFt2YWx1ZV09XCJ5ZWFyXCI+e3sgeWVhciB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBjbGFzcz1cImgtMyB3LTMgdGV4dC1mb3JlZ3JvdW5kXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJtNiA5IDYgNiA2LTZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48L3BhdGg+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRpdGxlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBtaW4tdy0wIGZsZXgtMSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cInRleHQtZm9yZWdyb3VuZCB0ZXh0LWNlbnRlciB0ZXh0LXNtIGZvbnQtbWVkaXVtIGxlYWRpbmctNVwiPlxuICAgICAgICAgICAge3sgbW9udGgudGl0bGUgfX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIm1vbnRoLnNob3dOZXh0QnV0dG9uOyBlbHNlIG5leHRQbGFjZWhvbGRlclwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbbmdDbGFzc109XCJuYXZCdXR0b25DbGFzc2VzKClcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiTmV4dCBtb250aFwiXG4gICAgICAgIChjbGljayk9XCJnb1RvTmV4dE1vbnRoKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwicmVhZG9ubHlcIlxuICAgICAgPlxuICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBjbGFzcz1cImgtNCB3LTRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICA8cGF0aCBkPVwibTkgMTggNi02LTYtNlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjwvcGF0aD5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbmV4dFBsYWNlaG9sZGVyPlxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIm5hdlBsYWNlaG9sZGVyQ2xhc3NlcygpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBbbmdDbGFzc109XCJjYWxlbmRhckdyaWRXcmFwQ2xhc3NlcygpXCI+XG4gICAgICA8ZGl2IFtuZ0NsYXNzXT1cIndlZWtkYXlSb3dDbGFzc2VzKClcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtkYXlzOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIiBbbmdDbGFzc109XCJ3ZWVrZGF5Q2VsbENsYXNzZXMoKVwiPlxuICAgICAgICAgIDxzcGFuPnt7IGRheSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgd2VlayBvZiBtb250aC53ZWVrczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCIgW25nQ2xhc3NdPVwid2Vla1Jvd0NsYXNzZXMoKVwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjZWxsIG9mIHdlZWs7IHRyYWNrQnk6IHRyYWNrQnlEYXRlXCIgW25nQ2xhc3NdPVwiZGF5Q2VsbENsYXNzZXMoY2VsbClcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImRheUJ1dHRvbkNsYXNzZXMoY2VsbClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJlYWRvbmx5XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiY2VsbC5zZWxlY3RlZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImNlbGwuZGlzYWJsZWQgfHwgcmVhZG9ubHlcIlxuICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiY2VsbC5kYXRlIHwgZGF0ZSA6ICd5eXl5LU1NLWRkJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25EYXRlUHJlc3NlZChjZWxsKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiZGF5TGFiZWxDbGFzc2VzKGNlbGwpXCI+e3sgY2VsbC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==