@skyux/datetime 11.31.0 → 12.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/documentation.json +925 -917
- package/fesm2022/skyux-datetime.mjs +105 -102
- package/fesm2022/skyux-datetime.mjs.map +1 -1
- package/package.json +15 -19
- package/esm2022/index.mjs +0 -23
- package/esm2022/lib/modules/date-pipe/date-pipe.module.mjs +0 -20
- package/esm2022/lib/modules/date-pipe/date.pipe.mjs +0 -68
- package/esm2022/lib/modules/date-pipe/date.service.mjs +0 -94
- package/esm2022/lib/modules/date-pipe/fuzzy-date.pipe.mjs +0 -47
- package/esm2022/lib/modules/date-range-picker/date-range-picker-end-date-resource-key.pipe.mjs +0 -21
- package/esm2022/lib/modules/date-range-picker/date-range-picker-start-date-resource-key.pipe.mjs +0 -21
- package/esm2022/lib/modules/date-range-picker/date-range-picker.component.mjs +0 -445
- package/esm2022/lib/modules/date-range-picker/date-range-picker.module.mjs +0 -17
- package/esm2022/lib/modules/date-range-picker/date-range.service.mjs +0 -95
- package/esm2022/lib/modules/date-range-picker/types/date-range-calculation.mjs +0 -2
- package/esm2022/lib/modules/date-range-picker/types/date-range-calculator-config.mjs +0 -2
- package/esm2022/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.mjs +0 -2
- package/esm2022/lib/modules/date-range-picker/types/date-range-calculator-id.mjs +0 -118
- package/esm2022/lib/modules/date-range-picker/types/date-range-calculator-type.mjs +0 -23
- package/esm2022/lib/modules/date-range-picker/types/date-range-calculator-validate-function.mjs +0 -2
- package/esm2022/lib/modules/date-range-picker/types/date-range-calculator.mjs +0 -71
- package/esm2022/lib/modules/date-range-picker/types/date-range-default-calculator-config.mjs +0 -2
- package/esm2022/lib/modules/date-range-picker/types/date-range-default-calculator-configs.mjs +0 -173
- package/esm2022/lib/modules/date-range-picker/types/date-range-relative-value.mjs +0 -249
- package/esm2022/lib/modules/date-range-picker/types/date-range.mjs +0 -2
- package/esm2022/lib/modules/datepicker/calendar/datepicker-calendar-change.mjs +0 -2
- package/esm2022/lib/modules/datepicker/calendar/datepicker-calendar-inner.component.mjs +0 -383
- package/esm2022/lib/modules/datepicker/calendar/datepicker-calendar-label.pipe.mjs +0 -39
- package/esm2022/lib/modules/datepicker/calendar/datepicker-calendar.component.mjs +0 -100
- package/esm2022/lib/modules/datepicker/calendar/datepicker-calendar.service.mjs +0 -22
- package/esm2022/lib/modules/datepicker/calendar/daypicker-button.component.mjs +0 -23
- package/esm2022/lib/modules/datepicker/calendar/daypicker-cell.component.mjs +0 -129
- package/esm2022/lib/modules/datepicker/calendar/daypicker-context.mjs +0 -2
- package/esm2022/lib/modules/datepicker/calendar/daypicker.component.mjs +0 -221
- package/esm2022/lib/modules/datepicker/calendar/monthpicker.component.mjs +0 -80
- package/esm2022/lib/modules/datepicker/calendar/yearpicker.component.mjs +0 -87
- package/esm2022/lib/modules/datepicker/date-formatter.mjs +0 -38
- package/esm2022/lib/modules/datepicker/datepicker-config.service.mjs +0 -21
- package/esm2022/lib/modules/datepicker/datepicker-custom-date.mjs +0 -2
- package/esm2022/lib/modules/datepicker/datepicker-host.service.mjs +0 -61
- package/esm2022/lib/modules/datepicker/datepicker-input.directive.mjs +0 -526
- package/esm2022/lib/modules/datepicker/datepicker.component.mjs +0 -419
- package/esm2022/lib/modules/datepicker/datepicker.module.mjs +0 -62
- package/esm2022/lib/modules/datepicker/fuzzy/datepicker-input-fuzzy.directive.mjs +0 -516
- package/esm2022/lib/modules/datepicker/fuzzy/fuzzy-date.mjs +0 -2
- package/esm2022/lib/modules/datepicker/fuzzy/fuzzy-date.service.mjs +0 -411
- package/esm2022/lib/modules/shared/sky-datetime-resources.module.mjs +0 -130
- package/esm2022/lib/modules/timepicker/timepicker-time-format-type.mjs +0 -2
- package/esm2022/lib/modules/timepicker/timepicker-time-output.mjs +0 -2
- package/esm2022/lib/modules/timepicker/timepicker.component.mjs +0 -415
- package/esm2022/lib/modules/timepicker/timepicker.directive.mjs +0 -226
- package/esm2022/lib/modules/timepicker/timepicker.module.mjs +0 -37
- package/esm2022/skyux-datetime.mjs +0 -5
- package/esm2022/testing/legacy/datepicker-fixture.mjs +0 -56
- package/esm2022/testing/legacy/timepicker-fixture.mjs +0 -52
- package/esm2022/testing/modules/date-range-picker/date-range-picker-harness.filters.mjs +0 -2
- package/esm2022/testing/modules/date-range-picker/date-range-picker-harness.mjs +0 -193
- package/esm2022/testing/modules/datepicker/datepicker-calendar-harness.filters.mjs +0 -2
- package/esm2022/testing/modules/datepicker/datepicker-calendar-harness.mjs +0 -88
- package/esm2022/testing/modules/datepicker/datepicker-harness.filters.mjs +0 -2
- package/esm2022/testing/modules/datepicker/datepicker-harness.mjs +0 -60
- package/esm2022/testing/modules/datepicker/datepicker-input-harness.mjs +0 -29
- package/esm2022/testing/modules/datepicker/fuzzy-datepicker-input-harness.mjs +0 -29
- package/esm2022/testing/public-api.mjs +0 -6
- package/esm2022/testing/skyux-datetime-testing.mjs +0 -5
@@ -1,526 +0,0 @@
|
|
1
|
-
import { Directive, HostListener, Input, Optional, forwardRef, inject, } from '@angular/core';
|
2
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
3
|
-
import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
|
4
|
-
import moment from 'moment';
|
5
|
-
import { Subject } from 'rxjs';
|
6
|
-
import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
|
7
|
-
import { SkyDateFormatter } from './date-formatter';
|
8
|
-
import { SkyDatepickerHostService } from './datepicker-host.service';
|
9
|
-
import * as i0 from "@angular/core";
|
10
|
-
import * as i1 from "./datepicker-config.service";
|
11
|
-
import * as i2 from "@skyux/i18n";
|
12
|
-
import * as i3 from "./datepicker.component";
|
13
|
-
const SKY_DATEPICKER_VALUE_ACCESSOR = {
|
14
|
-
provide: NG_VALUE_ACCESSOR,
|
15
|
-
useExisting: forwardRef(() => SkyDatepickerInputDirective),
|
16
|
-
multi: true,
|
17
|
-
};
|
18
|
-
const SKY_DATEPICKER_VALIDATOR = {
|
19
|
-
provide: NG_VALIDATORS,
|
20
|
-
useExisting: forwardRef(() => SkyDatepickerInputDirective),
|
21
|
-
multi: true,
|
22
|
-
};
|
23
|
-
export class SkyDatepickerInputDirective {
|
24
|
-
/**
|
25
|
-
* The date format for the input. Place this attribute on the `input` element
|
26
|
-
* to override the default in the `SkyDatepickerConfigService`.
|
27
|
-
* @default "MM/DD/YYYY"
|
28
|
-
*/
|
29
|
-
set dateFormat(value) {
|
30
|
-
/* istanbul ignore else */
|
31
|
-
if (value !== this.#_dateFormat) {
|
32
|
-
this.#_dateFormat = value;
|
33
|
-
this.#applyDateFormat();
|
34
|
-
}
|
35
|
-
}
|
36
|
-
// TODO: Refactor to not have getter logic
|
37
|
-
get dateFormat() {
|
38
|
-
return (this.#_dateFormat ||
|
39
|
-
this.#configService.dateFormat ||
|
40
|
-
this.#preferredShortDateFormat);
|
41
|
-
}
|
42
|
-
/**
|
43
|
-
* Whether to disable the datepicker on template-driven forms. Don't use this input on reactive forms because they may overwrite the input or leave the control out of sync.
|
44
|
-
* To set the disabled state on reactive forms, use the `FormControl` instead.
|
45
|
-
* @default false
|
46
|
-
*/
|
47
|
-
set disabled(value) {
|
48
|
-
this.#_disabled = value || false;
|
49
|
-
this.#datepickerComponent.disabled = value;
|
50
|
-
this.#renderer.setProperty(this.#elementRef.nativeElement, 'disabled', value);
|
51
|
-
}
|
52
|
-
get disabled() {
|
53
|
-
return this.#_disabled;
|
54
|
-
}
|
55
|
-
/**
|
56
|
-
* The latest date that is available in the calendar. Place this attribute on
|
57
|
-
* the `input` element to override the default in `SkyDatepickerConfigService`.
|
58
|
-
*/
|
59
|
-
set maxDate(value) {
|
60
|
-
this.#_maxDate = value;
|
61
|
-
this.#datepickerComponent.maxDate = this.maxDate;
|
62
|
-
this.#onValidatorChange();
|
63
|
-
}
|
64
|
-
// TODO: Refactor to not have getter logic
|
65
|
-
get maxDate() {
|
66
|
-
return this.#_maxDate || this.#configService.maxDate;
|
67
|
-
}
|
68
|
-
/**
|
69
|
-
* The earliest date that is available in the calendar. Place this attribute on
|
70
|
-
* the `input` element to override the default in `SkyDatepickerConfigService`. To avoid validation errors, the time associated with the minimum date must be midnight. This is necessary because the datepicker automatically sets the time on the `Date` object for selected dates to midnight in the current user's time zone.
|
71
|
-
*/
|
72
|
-
set minDate(value) {
|
73
|
-
this.#_minDate = value;
|
74
|
-
this.#datepickerComponent.minDate = this.minDate;
|
75
|
-
this.#onValidatorChange();
|
76
|
-
}
|
77
|
-
// TODO: Refactor to not have getter logic
|
78
|
-
get minDate() {
|
79
|
-
return this.#_minDate || this.#configService.minDate;
|
80
|
-
}
|
81
|
-
/**
|
82
|
-
* The date to open the calendar to initially. Place this attribute on the `input` element to override the default in `SkyDatepickerConfigService`.
|
83
|
-
* @default The current date
|
84
|
-
*/
|
85
|
-
set startAtDate(value) {
|
86
|
-
this.#_startAtDate = value;
|
87
|
-
this.#datepickerComponent.startAtDate = this.startAtDate;
|
88
|
-
}
|
89
|
-
// TODO: Refactor to not have getter logic
|
90
|
-
get startAtDate() {
|
91
|
-
return this.#_startAtDate || this.#configService.startAtDate;
|
92
|
-
}
|
93
|
-
/**
|
94
|
-
* Creates the datepicker input and calendar. Place this directive on an `input` element,
|
95
|
-
* and wrap the input in a `sky-datepicker` component. The value that users select is driven
|
96
|
-
* through the `ngModel` attribute specified on the `input` element.
|
97
|
-
* @required
|
98
|
-
*/
|
99
|
-
set skyDatepickerInput(value) {
|
100
|
-
if (value) {
|
101
|
-
console.warn('[Deprecation warning] You no longer need to provide a template reference variable ' +
|
102
|
-
'to the `skyDatepickerInput` attribute (this will be a breaking change in the next ' +
|
103
|
-
'major version release).\n' +
|
104
|
-
'Do this instead:\n' +
|
105
|
-
'<sky-datepicker>\n <input skyDatepickerInput />\n</sky-datepicker>');
|
106
|
-
}
|
107
|
-
}
|
108
|
-
/**
|
109
|
-
* The starting day of the week in the calendar, where `0` sets the starting day
|
110
|
-
* to Sunday. Place this attribute on the `input` element to override the default
|
111
|
-
* in `SkyDatepickerConfigService`.
|
112
|
-
* @default 0
|
113
|
-
*/
|
114
|
-
set startingDay(value) {
|
115
|
-
this.#_startingDay = value;
|
116
|
-
this.#datepickerComponent.startingDay = this.startingDay;
|
117
|
-
this.#onValidatorChange();
|
118
|
-
}
|
119
|
-
// TODO: Refactor to not have getter logic
|
120
|
-
get startingDay() {
|
121
|
-
return this.#_startingDay || this.#configService.startingDay;
|
122
|
-
}
|
123
|
-
/**
|
124
|
-
* Whether the format of the date value must match the format from the `dateFormat` value.
|
125
|
-
* If this property is `true` and the datepicker input directive cannot find an exact match, then
|
126
|
-
* the input is marked as invalid.
|
127
|
-
* If this property is `false` and the datepicker input directive cannot find an exact match, then
|
128
|
-
* it attempts to format the string based on the [ISO 8601 standard format](https://www.iso.org/iso-8601-date-and-time-format.html).
|
129
|
-
* @default false
|
130
|
-
*/
|
131
|
-
set strict(value) {
|
132
|
-
this.#_strict = value || false;
|
133
|
-
}
|
134
|
-
get strict() {
|
135
|
-
return this.#_strict;
|
136
|
-
}
|
137
|
-
get #value() {
|
138
|
-
return this.#_value;
|
139
|
-
}
|
140
|
-
set #value(value) {
|
141
|
-
this.#updateValue(value);
|
142
|
-
}
|
143
|
-
#control;
|
144
|
-
#dateFormatter;
|
145
|
-
#preferredShortDateFormat;
|
146
|
-
#ngUnsubscribe;
|
147
|
-
#notifyTouched;
|
148
|
-
#_dateFormat;
|
149
|
-
#_disabled;
|
150
|
-
#_maxDate;
|
151
|
-
#_minDate;
|
152
|
-
#_startAtDate;
|
153
|
-
#_startingDay;
|
154
|
-
#_strict;
|
155
|
-
#_value;
|
156
|
-
#changeDetector;
|
157
|
-
#configService;
|
158
|
-
#elementRef;
|
159
|
-
#localeProvider;
|
160
|
-
#renderer;
|
161
|
-
#datepickerComponent;
|
162
|
-
#datepickerHostSvc;
|
163
|
-
constructor(changeDetector, configService, elementRef, localeProvider, renderer, datepickerComponent) {
|
164
|
-
/**
|
165
|
-
* Whether to disable date validation on the datepicker input.
|
166
|
-
* @default false
|
167
|
-
*/
|
168
|
-
this.skyDatepickerNoValidate = false;
|
169
|
-
this.#dateFormatter = new SkyDateFormatter();
|
170
|
-
this.#ngUnsubscribe = new Subject();
|
171
|
-
this.#_disabled = false;
|
172
|
-
this.#_strict = false;
|
173
|
-
this.#datepickerHostSvc = inject(SkyDatepickerHostService, {
|
174
|
-
optional: true,
|
175
|
-
});
|
176
|
-
// istanbul ignore next
|
177
|
-
this.#onChange = (_) => { };
|
178
|
-
// istanbul ignore next
|
179
|
-
this.#onValidatorChange = () => { };
|
180
|
-
if (!datepickerComponent) {
|
181
|
-
throw new Error('You must wrap the `skyDatepickerInput` directive within a ' +
|
182
|
-
'`<sky-datepicker>` component!');
|
183
|
-
}
|
184
|
-
this.#changeDetector = changeDetector;
|
185
|
-
this.#configService = configService;
|
186
|
-
this.#elementRef = elementRef;
|
187
|
-
this.#localeProvider = localeProvider;
|
188
|
-
this.#renderer = renderer;
|
189
|
-
this.#datepickerComponent = datepickerComponent;
|
190
|
-
this.#localeProvider
|
191
|
-
.getLocaleInfo()
|
192
|
-
.pipe(takeUntil(this.#ngUnsubscribe))
|
193
|
-
.subscribe((localeInfo) => {
|
194
|
-
SkyDateFormatter.setLocale(localeInfo.locale);
|
195
|
-
this.#preferredShortDateFormat =
|
196
|
-
SkyDateFormatter.getPreferredShortDateFormat();
|
197
|
-
this.#applyDateFormat();
|
198
|
-
});
|
199
|
-
this.#datepickerHostSvc?.focusout
|
200
|
-
.pipe(takeUntilDestroyed())
|
201
|
-
.subscribe((evt) => {
|
202
|
-
const isFocusingInput = evt.relatedTarget === this.#elementRef.nativeElement;
|
203
|
-
if (!isFocusingInput) {
|
204
|
-
this.#notifyTouched?.();
|
205
|
-
}
|
206
|
-
});
|
207
|
-
}
|
208
|
-
ngOnInit() {
|
209
|
-
const element = this.#elementRef.nativeElement;
|
210
|
-
this.#renderer.addClass(element, 'sky-form-control');
|
211
|
-
}
|
212
|
-
ngAfterContentInit() {
|
213
|
-
this.#datepickerComponent.dateFormat = this.dateFormat;
|
214
|
-
this.#datepickerComponent.dateChange
|
215
|
-
.pipe(distinctUntilChanged())
|
216
|
-
.pipe(takeUntil(this.#ngUnsubscribe))
|
217
|
-
.subscribe((value) => {
|
218
|
-
this.#value = value;
|
219
|
-
});
|
220
|
-
}
|
221
|
-
ngAfterViewInit() {
|
222
|
-
// This is needed to address a bug in Angular 4.
|
223
|
-
// When a control value is set initially, its value is not represented on the view.
|
224
|
-
// See: https://github.com/angular/angular/issues/13792
|
225
|
-
// Of note is the parent check which allows us to determine if the form is reactive.
|
226
|
-
// Without this check there is a changed before checked error
|
227
|
-
/* istanbul ignore else */
|
228
|
-
if (this.#control && this.#control.parent) {
|
229
|
-
setTimeout(() => {
|
230
|
-
this.#control?.setValue(this.#value, {
|
231
|
-
emitEvent: false,
|
232
|
-
});
|
233
|
-
this.#changeDetector.markForCheck();
|
234
|
-
});
|
235
|
-
}
|
236
|
-
}
|
237
|
-
ngOnDestroy() {
|
238
|
-
this.#ngUnsubscribe.next();
|
239
|
-
this.#ngUnsubscribe.complete();
|
240
|
-
}
|
241
|
-
onInputChange(event) {
|
242
|
-
const value = event.target.value;
|
243
|
-
if (this.skyDatepickerNoValidate) {
|
244
|
-
this.#onValueChange(value);
|
245
|
-
return;
|
246
|
-
}
|
247
|
-
// Don't try to parse the string value into a Date value if it is malformed.
|
248
|
-
if (this.#isDateStringValid(value)) {
|
249
|
-
this.#onValueChange(value);
|
250
|
-
return;
|
251
|
-
}
|
252
|
-
this.#_value = value;
|
253
|
-
this.#onChange(value);
|
254
|
-
this.#control?.setErrors({
|
255
|
-
skyDate: {
|
256
|
-
invalid: value,
|
257
|
-
},
|
258
|
-
});
|
259
|
-
}
|
260
|
-
onInput() {
|
261
|
-
this.#control?.markAsDirty();
|
262
|
-
}
|
263
|
-
writeValue(value) {
|
264
|
-
this.#updateValue(value, false);
|
265
|
-
}
|
266
|
-
validate(control) {
|
267
|
-
if (!this.#control) {
|
268
|
-
this.#control = control;
|
269
|
-
// Account for any date conversion that may have occurred prior to validation.
|
270
|
-
if (this.#control.value !== this.#value) {
|
271
|
-
this.#control.patchValue(this.#value, { emitEvent: false });
|
272
|
-
}
|
273
|
-
}
|
274
|
-
if (this.skyDatepickerNoValidate) {
|
275
|
-
return null;
|
276
|
-
}
|
277
|
-
const value = control.value;
|
278
|
-
if (!value) {
|
279
|
-
return null;
|
280
|
-
}
|
281
|
-
if (value instanceof Date) {
|
282
|
-
const isDateValid = this.#dateFormatter.dateIsValid(value);
|
283
|
-
if (!isDateValid) {
|
284
|
-
// Mark the invalid control as touched so that the input's invalid CSS styles appear.
|
285
|
-
// (This is only required when the invalid value is set by the FormControl constructor.)
|
286
|
-
this.#control.markAsTouched();
|
287
|
-
return {
|
288
|
-
skyDate: {
|
289
|
-
invalid: value,
|
290
|
-
},
|
291
|
-
};
|
292
|
-
}
|
293
|
-
const minDate = this.minDate;
|
294
|
-
if (minDate &&
|
295
|
-
this.#dateFormatter.dateIsValid(minDate) &&
|
296
|
-
value < minDate) {
|
297
|
-
return {
|
298
|
-
skyDate: {
|
299
|
-
minDate,
|
300
|
-
minDateFormatted: this.#dateFormatter.format(minDate, this.dateFormat),
|
301
|
-
},
|
302
|
-
};
|
303
|
-
}
|
304
|
-
const maxDate = this.maxDate;
|
305
|
-
if (maxDate &&
|
306
|
-
this.#dateFormatter.dateIsValid(maxDate) &&
|
307
|
-
value > maxDate) {
|
308
|
-
return {
|
309
|
-
skyDate: {
|
310
|
-
maxDate,
|
311
|
-
maxDateFormatted: this.#dateFormatter.format(maxDate, this.dateFormat),
|
312
|
-
},
|
313
|
-
};
|
314
|
-
}
|
315
|
-
}
|
316
|
-
else {
|
317
|
-
// Mark the invalid control as touched so that the input's invalid CSS styles appear.
|
318
|
-
// (This is only required when the invalid value is set by the FormControl constructor.)
|
319
|
-
this.#control.markAsTouched();
|
320
|
-
return {
|
321
|
-
skyDate: {
|
322
|
-
invalid: value,
|
323
|
-
},
|
324
|
-
};
|
325
|
-
}
|
326
|
-
return null;
|
327
|
-
}
|
328
|
-
registerOnChange(fn) {
|
329
|
-
this.#onChange = fn;
|
330
|
-
}
|
331
|
-
registerOnTouched(fn) {
|
332
|
-
this.#notifyTouched = fn;
|
333
|
-
}
|
334
|
-
registerOnValidatorChange(fn) {
|
335
|
-
this.#onValidatorChange = fn;
|
336
|
-
}
|
337
|
-
setDisabledState(disabled) {
|
338
|
-
this.disabled = disabled;
|
339
|
-
this.#datepickerComponent.disabled = disabled;
|
340
|
-
}
|
341
|
-
/**
|
342
|
-
* Detects changes to the underlying input element's value and updates the ngModel accordingly.
|
343
|
-
* This is useful if you need to update the ngModel value before the input element loses focus.
|
344
|
-
*/
|
345
|
-
detectInputValueChange() {
|
346
|
-
this.#onValueChange(this.#elementRef.nativeElement.value);
|
347
|
-
}
|
348
|
-
onFocusout(evt) {
|
349
|
-
if (!this.#datepickerHostSvc?.isFocusingDatepicker(evt)) {
|
350
|
-
this.#notifyTouched?.();
|
351
|
-
}
|
352
|
-
}
|
353
|
-
#applyDateFormat() {
|
354
|
-
this.#datepickerComponent.dateFormat = this.dateFormat;
|
355
|
-
if (this.#value) {
|
356
|
-
const formattedDate = this.#dateFormatter.format(this.#value, this.dateFormat);
|
357
|
-
this.#setInputElementValue(formattedDate);
|
358
|
-
this.#changeDetector.markForCheck();
|
359
|
-
}
|
360
|
-
}
|
361
|
-
#onValueChange(newValue) {
|
362
|
-
this.#value = newValue;
|
363
|
-
}
|
364
|
-
#setInputElementValue(value) {
|
365
|
-
this.#renderer.setProperty(this.#elementRef.nativeElement, 'value', value);
|
366
|
-
}
|
367
|
-
/**
|
368
|
-
* Gets the date value from a value - if possible.
|
369
|
-
* Will not convert unconvertible dates or numbers outside of the current month's number of days.
|
370
|
-
* Returns `undefined` if the value can not be converted.
|
371
|
-
*/
|
372
|
-
#getDateValue(value) {
|
373
|
-
if (value instanceof Date) {
|
374
|
-
return value;
|
375
|
-
}
|
376
|
-
else if (typeof value === 'string') {
|
377
|
-
return this.#getShortcutOrDateValue(value);
|
378
|
-
}
|
379
|
-
return undefined;
|
380
|
-
}
|
381
|
-
/**
|
382
|
-
* Converts a string to a date object if the string is a valid date string.
|
383
|
-
* It will also convert numeric input to a date if that number is within the current month's number of days.
|
384
|
-
* If the string can not be converted, `undefined` be returned.
|
385
|
-
*/
|
386
|
-
#getShortcutOrDateValue(value) {
|
387
|
-
const num = Number(value);
|
388
|
-
if (Number.isInteger(num)) {
|
389
|
-
// We require 8 digits in order to know that we have all information needed to determine what part of the number is the month (2), day (2), and year (4).
|
390
|
-
if (value.length === 8) {
|
391
|
-
const regex = new RegExp(/\b(MM)\b|\b(DD)\b|\b(YY)\b|\b(YYYY)\b/, 'g');
|
392
|
-
const formatTokensOnly = this.dateFormat
|
393
|
-
?.match(regex)
|
394
|
-
?.join('')
|
395
|
-
.replace(new RegExp(/Y+/), 'YYYY');
|
396
|
-
if (formatTokensOnly && formatTokensOnly.length === 8) {
|
397
|
-
const date = this.#dateFormatter.getDateFromString(value, formatTokensOnly, true);
|
398
|
-
if (this.#dateFormatter.dateIsValid(date)) {
|
399
|
-
return date;
|
400
|
-
}
|
401
|
-
}
|
402
|
-
}
|
403
|
-
const now = new Date();
|
404
|
-
const shortcutDate = new Date(now.getFullYear(), now.getMonth(), num);
|
405
|
-
const daysInMonth = shortcutDate.getDate();
|
406
|
-
if (num > 0 && num <= daysInMonth) {
|
407
|
-
return shortcutDate;
|
408
|
-
}
|
409
|
-
}
|
410
|
-
else {
|
411
|
-
const date = this.#dateFormatter.getDateFromString(value, this.dateFormat, this.strict);
|
412
|
-
if (this.#dateFormatter.dateIsValid(date)) {
|
413
|
-
return date;
|
414
|
-
}
|
415
|
-
}
|
416
|
-
return undefined;
|
417
|
-
}
|
418
|
-
/**
|
419
|
-
* Validates the input value to ensure it is formatted correctly.
|
420
|
-
*/
|
421
|
-
#isDateStringValid(value) {
|
422
|
-
if (!value || typeof value !== 'string') {
|
423
|
-
return true;
|
424
|
-
}
|
425
|
-
// Does the value only include digits, dashes, or slashes?
|
426
|
-
const regexp = /^[\d/-]+$/;
|
427
|
-
const isValid = regexp.test(value);
|
428
|
-
if (isValid) {
|
429
|
-
return true;
|
430
|
-
}
|
431
|
-
return moment(value).isValid();
|
432
|
-
}
|
433
|
-
// istanbul ignore next
|
434
|
-
#onChange;
|
435
|
-
// istanbul ignore next
|
436
|
-
#onValidatorChange;
|
437
|
-
/**
|
438
|
-
* Update the value of the form control and input element
|
439
|
-
* @param emitEvent Denotes if we emit an event to the consumer's form control. We do not want to do this if the value is being updated via a `setValue` call or a `patchValue` call as this is already handled by Angular.
|
440
|
-
* In these cases we do not want to fire `onChange` as it will cause extra `valueChange` and `statusChange` events and the status of the form should not be affected by these changes.
|
441
|
-
*/
|
442
|
-
#updateValue(value, emitEvent = true) {
|
443
|
-
if (this.#_value === value) {
|
444
|
-
return;
|
445
|
-
}
|
446
|
-
const isValidDateString = this.#isDateStringValid(value);
|
447
|
-
// If the string value supplied is malformed, do not set the value to its Date equivalent.
|
448
|
-
// (JavaScript's Date parser will convert poorly formatted dates to Date objects, such as "abc 123", which isn't ideal.)
|
449
|
-
if (!isValidDateString) {
|
450
|
-
this.#_value = value;
|
451
|
-
if (emitEvent) {
|
452
|
-
this.#onChange(this.#_value);
|
453
|
-
}
|
454
|
-
else {
|
455
|
-
this.#control?.setValue(this.#_value, { emitEvent: false });
|
456
|
-
}
|
457
|
-
this.#datepickerComponent.selectedDate = this.#_value;
|
458
|
-
this.#setInputElementValue(value);
|
459
|
-
}
|
460
|
-
else {
|
461
|
-
// This value represents the date value for the input if possible.
|
462
|
-
// This value will take into account all shortcut functionality.
|
463
|
-
const dateValue = this.#getDateValue(value);
|
464
|
-
const areDatesEqual = this.#_value instanceof Date &&
|
465
|
-
dateValue &&
|
466
|
-
dateValue.getTime() === this.#_value.getTime();
|
467
|
-
if (dateValue !== this.#_value || !areDatesEqual) {
|
468
|
-
this.#_value = dateValue || value;
|
469
|
-
if (emitEvent) {
|
470
|
-
this.#onChange(this.#_value);
|
471
|
-
}
|
472
|
-
else {
|
473
|
-
this.#control?.setValue(this.#_value, { emitEvent: false });
|
474
|
-
}
|
475
|
-
this.#datepickerComponent.selectedDate = this.#_value;
|
476
|
-
}
|
477
|
-
if (dateValue) {
|
478
|
-
const formattedDateString = this.#dateFormatter.format(dateValue, this.dateFormat);
|
479
|
-
this.#setInputElementValue(formattedDateString);
|
480
|
-
}
|
481
|
-
else {
|
482
|
-
this.#setInputElementValue(value || '');
|
483
|
-
}
|
484
|
-
}
|
485
|
-
}
|
486
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyDatepickerInputDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyDatepickerConfigService }, { token: i0.ElementRef }, { token: i2.SkyAppLocaleProvider }, { token: i0.Renderer2 }, { token: i3.SkyDatepickerComponent, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
487
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: SkyDatepickerInputDirective, isStandalone: true, selector: "[skyDatepickerInput]", inputs: { dateFormat: "dateFormat", disabled: "disabled", maxDate: "maxDate", minDate: "minDate", startAtDate: "startAtDate", skyDatepickerInput: "skyDatepickerInput", skyDatepickerNoValidate: "skyDatepickerNoValidate", startingDay: "startingDay", strict: "strict" }, host: { listeners: { "focusout": "onFocusout($event)", "change": "onInputChange($event)", "input": "onInput()" } }, providers: [SKY_DATEPICKER_VALUE_ACCESSOR, SKY_DATEPICKER_VALIDATOR], ngImport: i0 }); }
|
488
|
-
}
|
489
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyDatepickerInputDirective, decorators: [{
|
490
|
-
type: Directive,
|
491
|
-
args: [{
|
492
|
-
host: {
|
493
|
-
'(focusout)': 'onFocusout($event)',
|
494
|
-
},
|
495
|
-
providers: [SKY_DATEPICKER_VALUE_ACCESSOR, SKY_DATEPICKER_VALIDATOR],
|
496
|
-
selector: '[skyDatepickerInput]',
|
497
|
-
standalone: true,
|
498
|
-
}]
|
499
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.SkyDatepickerConfigService }, { type: i0.ElementRef }, { type: i2.SkyAppLocaleProvider }, { type: i0.Renderer2 }, { type: i3.SkyDatepickerComponent, decorators: [{
|
500
|
-
type: Optional
|
501
|
-
}] }], propDecorators: { dateFormat: [{
|
502
|
-
type: Input
|
503
|
-
}], disabled: [{
|
504
|
-
type: Input
|
505
|
-
}], maxDate: [{
|
506
|
-
type: Input
|
507
|
-
}], minDate: [{
|
508
|
-
type: Input
|
509
|
-
}], startAtDate: [{
|
510
|
-
type: Input
|
511
|
-
}], skyDatepickerInput: [{
|
512
|
-
type: Input
|
513
|
-
}], skyDatepickerNoValidate: [{
|
514
|
-
type: Input
|
515
|
-
}], startingDay: [{
|
516
|
-
type: Input
|
517
|
-
}], strict: [{
|
518
|
-
type: Input
|
519
|
-
}], onInputChange: [{
|
520
|
-
type: HostListener,
|
521
|
-
args: ['change', ['$event']]
|
522
|
-
}], onInput: [{
|
523
|
-
type: HostListener,
|
524
|
-
args: ['input']
|
525
|
-
}] } });
|
526
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0ZXRpbWUvc3JjL2xpYi9tb2R1bGVzL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLFFBQVEsRUFFUixVQUFVLEVBQ1YsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFHTCxhQUFhLEVBQ2IsaUJBQWlCLEdBR2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXBELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7OztBQUdyRSxNQUFNLDZCQUE2QixHQUFHO0lBQ3BDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztJQUMxRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixNQUFNLHdCQUF3QixHQUFHO0lBQy9CLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUM7SUFDMUQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBVUYsTUFBTSxPQUFPLDJCQUEyQjtJQVN0Qzs7OztPQUlHO0lBQ0gsSUFDVyxVQUFVLENBQUMsS0FBeUI7UUFDN0MsMEJBQTBCO1FBQzFCLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxJQUFXLFVBQVU7UUFDbkIsT0FBTyxDQUNMLElBQUksQ0FBQyxZQUFZO1lBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVTtZQUM5QixJQUFJLENBQUMseUJBQXlCLENBQy9CLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQ1csUUFBUSxDQUFDLEtBQTBCO1FBQzVDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUMzQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQzlCLFVBQVUsRUFDVixLQUFLLENBQ04sQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNXLE9BQU8sQ0FBQyxLQUF1QjtRQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFFakQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNXLE9BQU8sQ0FBQyxLQUF1QjtRQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFFakQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNXLFdBQVcsQ0FBQyxLQUF1QjtRQUM1QyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDM0QsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQ1csa0JBQWtCLENBQzNCLEtBQThDO1FBRTlDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixPQUFPLENBQUMsSUFBSSxDQUNWLG9GQUFvRjtnQkFDbEYsb0ZBQW9GO2dCQUNwRiwyQkFBMkI7Z0JBQzNCLG9CQUFvQjtnQkFDcEIscUVBQXFFLENBQ3hFLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQVNEOzs7OztPQUtHO0lBQ0gsSUFDVyxXQUFXLENBQUMsS0FBeUI7UUFDOUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRXpELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQ1csTUFBTSxDQUFDLEtBQTBCO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsUUFBUSxDQUE4QjtJQUN0QyxjQUFjLENBQTBCO0lBQ3hDLHlCQUF5QixDQUFxQjtJQUM5QyxjQUFjLENBQXVCO0lBQ3JDLGNBQWMsQ0FBMkI7SUFFekMsWUFBWSxDQUFxQjtJQUNqQyxVQUFVLENBQVM7SUFDbkIsU0FBUyxDQUFtQjtJQUM1QixTQUFTLENBQW1CO0lBQzVCLGFBQWEsQ0FBbUI7SUFDaEMsYUFBYSxDQUFxQjtJQUNsQyxRQUFRLENBQVM7SUFDakIsT0FBTyxDQUFNO0lBRWIsZUFBZSxDQUFvQjtJQUNuQyxjQUFjLENBQTZCO0lBQzNDLFdBQVcsQ0FBYTtJQUN4QixlQUFlLENBQXVCO0lBQ3RDLFNBQVMsQ0FBWTtJQUNyQixvQkFBb0IsQ0FBeUI7SUFFcEMsa0JBQWtCLENBRXhCO0lBRUgsWUFDRSxjQUFpQyxFQUNqQyxhQUF5QyxFQUN6QyxVQUFzQixFQUN0QixjQUFvQyxFQUNwQyxRQUFtQixFQUNQLG1CQUE0QztRQW5GMUQ7OztXQUdHO1FBRUksNEJBQXVCLEdBQXdCLEtBQUssQ0FBQztRQStDNUQsbUJBQWMsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFFeEMsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBSXJDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFLbkIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQVVSLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRTtZQUM3RCxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztRQTJVSCx1QkFBdUI7UUFDdkIsY0FBUyxHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDM0IsdUJBQXVCO1FBQ3ZCLHVCQUFrQixHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQXBVNUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FDYiw0REFBNEQ7Z0JBQzFELCtCQUErQixDQUNsQyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxtQkFBbUIsQ0FBQztRQUVoRCxJQUFJLENBQUMsZUFBZTthQUNqQixhQUFhLEVBQUU7YUFDZixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUNwQyxTQUFTLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN4QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyx5QkFBeUI7Z0JBQzVCLGdCQUFnQixDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsUUFBUTthQUM5QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUMxQixTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNqQixNQUFNLGVBQWUsR0FDbkIsR0FBRyxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztZQUV2RCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxRQUFRO1FBQ2IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFFL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDdkQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVU7YUFDakMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7YUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDcEMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sZUFBZTtRQUNwQixnREFBZ0Q7UUFDaEQsbUZBQW1GO1FBQ25GLHVEQUF1RDtRQUN2RCxvRkFBb0Y7UUFDcEYsNkRBQTZEO1FBQzdELDBCQUEwQjtRQUMxQixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQ25DLFNBQVMsRUFBRSxLQUFLO2lCQUNqQixDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUdNLGFBQWEsQ0FBQyxLQUFVO1FBQzdCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBRWpDLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRCLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDO1lBQ3ZCLE9BQU8sRUFBRTtnQkFDUCxPQUFPLEVBQUUsS0FBSzthQUNmO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUdNLE9BQU87UUFDWixJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFTSxVQUFVLENBQUMsS0FBVTtRQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU0sUUFBUSxDQUFDLE9BQXdCO1FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDeEIsOEVBQThFO1lBQzlFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDOUQsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFZLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFFckMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxLQUFLLFlBQVksSUFBSSxFQUFFLENBQUM7WUFDMUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFM0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNqQixxRkFBcUY7Z0JBQ3JGLHdGQUF3RjtnQkFDeEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFFOUIsT0FBTztvQkFDTCxPQUFPLEVBQUU7d0JBQ1AsT0FBTyxFQUFFLEtBQUs7cUJBQ2Y7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBRTdCLElBQ0UsT0FBTztnQkFDUCxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7Z0JBQ3hDLEtBQUssR0FBRyxPQUFPLEVBQ2YsQ0FBQztnQkFDRCxPQUFPO29CQUNMLE9BQU8sRUFBRTt3QkFDUCxPQUFPO3dCQUNQLGdCQUFnQixFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUMxQyxPQUFPLEVBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FDaEI7cUJBQ0Y7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBRTdCLElBQ0UsT0FBTztnQkFDUCxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7Z0JBQ3hDLEtBQUssR0FBRyxPQUFPLEVBQ2YsQ0FBQztnQkFDRCxPQUFPO29CQUNMLE9BQU8sRUFBRTt3QkFDUCxPQUFPO3dCQUNQLGdCQUFnQixFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUMxQyxPQUFPLEVBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FDaEI7cUJBQ0Y7aUJBQ0YsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLHFGQUFxRjtZQUNyRix3RkFBd0Y7WUFDeEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUU5QixPQUFPO2dCQUNMLE9BQU8sRUFBRTtvQkFDUCxPQUFPLEVBQUUsS0FBSztpQkFDZjthQUNGLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsRUFBd0I7UUFDOUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVNLGlCQUFpQixDQUFDLEVBQWM7UUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVNLHlCQUF5QixDQUFDLEVBQWM7UUFDN0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsUUFBaUI7UUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHNCQUFzQjtRQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFUyxVQUFVLENBQUMsR0FBZTtRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEQsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDdkQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQzlDLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxDQUFDLFVBQVUsQ0FDaEIsQ0FBQztZQUNGLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLFFBQWdCO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFhO1FBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxLQUFjO1FBQzFCLElBQUksS0FBSyxZQUFZLElBQUksRUFBRSxDQUFDO1lBQzFCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQzthQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsdUJBQXVCLENBQUMsS0FBYTtRQUNuQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUIseUpBQXlKO1lBQ3pKLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFVBQVU7b0JBQ3RDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQztvQkFDZCxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7cUJBQ1QsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUVyQyxJQUFJLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FDaEQsS0FBSyxFQUNMLGdCQUFnQixFQUNoQixJQUFJLENBQ0wsQ0FBQztvQkFDRixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7d0JBQzFDLE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdEUsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzNDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sWUFBWSxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQ2hELEtBQUssRUFDTCxJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxNQUFNLENBQ1osQ0FBQztZQUNGLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDMUMsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQixDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCwwREFBMEQ7UUFDMUQsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDO1FBQzNCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbkMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsU0FBUyxDQUFrQjtJQUMzQix1QkFBdUI7SUFDdkIsa0JBQWtCLENBQVk7SUFFOUI7Ozs7T0FJRztJQUNILFlBQVksQ0FBQyxLQUFVLEVBQUUsU0FBUyxHQUFHLElBQUk7UUFDdkMsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFekQsMEZBQTBGO1FBQzFGLHdIQUF3SDtRQUN4SCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9CLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUV0RCxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQzthQUFNLENBQUM7WUFDTixrRUFBa0U7WUFDbEUsZ0VBQWdFO1lBQ2hFLE1BQU0sU0FBUyxHQUFxQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTlELE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMsT0FBTyxZQUFZLElBQUk7Z0JBQzVCLFNBQVM7Z0JBQ1QsU0FBUyxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFakQsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsSUFBSSxLQUFLLENBQUM7Z0JBQ2xDLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9CLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQzlELENBQUM7Z0JBRUQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3hELENBQUM7WUFFRCxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQ3BELFNBQVMsRUFDVCxJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO2dCQUNGLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2xELENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzsrR0E3a0JVLDJCQUEyQjttR0FBM0IsMkJBQTJCLG1jQUozQixDQUFDLDZCQUE2QixFQUFFLHdCQUF3QixDQUFDOzs0RkFJekQsMkJBQTJCO2tCQVJ2QyxTQUFTO21CQUFDO29CQUNULElBQUksRUFBRTt3QkFDSixZQUFZLEVBQUUsb0JBQW9CO3FCQUNuQztvQkFDRCxTQUFTLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRSx3QkFBd0IsQ0FBQztvQkFDcEUsUUFBUSxFQUFFLHNCQUFzQjtvQkFDaEMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzswQkE4TUksUUFBUTt5Q0E5TEEsVUFBVTtzQkFEcEIsS0FBSztnQkF3QkssUUFBUTtzQkFEbEIsS0FBSztnQkFvQkssT0FBTztzQkFEakIsS0FBSztnQkFrQkssT0FBTztzQkFEakIsS0FBSztnQkFrQkssV0FBVztzQkFEckIsS0FBSztnQkFrQkssa0JBQWtCO3NCQUQ1QixLQUFLO2dCQW9CQyx1QkFBdUI7c0JBRDdCLEtBQUs7Z0JBVUssV0FBVztzQkFEckIsS0FBSztnQkFzQkssTUFBTTtzQkFEaEIsS0FBSztnQkE4SEMsYUFBYTtzQkFEbkIsWUFBWTt1QkFBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBMEIzQixPQUFPO3NCQURiLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgUmVuZGVyZXIyLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvcixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2t5QXBwTG9jYWxlUHJvdmlkZXIgfSBmcm9tICdAc2t5dXgvaTE4bic7XG5cbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreURhdGVGb3JtYXR0ZXIgfSBmcm9tICcuL2RhdGUtZm9ybWF0dGVyJztcbmltcG9ydCB7IFNreURhdGVwaWNrZXJDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9kYXRlcGlja2VyLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IFNreURhdGVwaWNrZXJIb3N0U2VydmljZSB9IGZyb20gJy4vZGF0ZXBpY2tlci1ob3N0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5RGF0ZXBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vZGF0ZXBpY2tlci5jb21wb25lbnQnO1xuXG5jb25zdCBTS1lfREFURVBJQ0tFUl9WQUxVRV9BQ0NFU1NPUiA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNreURhdGVwaWNrZXJJbnB1dERpcmVjdGl2ZSksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuY29uc3QgU0tZX0RBVEVQSUNLRVJfVkFMSURBVE9SID0ge1xuICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTa3lEYXRlcGlja2VySW5wdXREaXJlY3RpdmUpLFxuICBtdWx0aTogdHJ1ZSxcbn07XG5cbkBEaXJlY3RpdmUoe1xuICBob3N0OiB7XG4gICAgJyhmb2N1c291dCknOiAnb25Gb2N1c291dCgkZXZlbnQpJyxcbiAgfSxcbiAgcHJvdmlkZXJzOiBbU0tZX0RBVEVQSUNLRVJfVkFMVUVfQUNDRVNTT1IsIFNLWV9EQVRFUElDS0VSX1ZBTElEQVRPUl0sXG4gIHNlbGVjdG9yOiAnW3NreURhdGVwaWNrZXJJbnB1dF0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lEYXRlcGlja2VySW5wdXREaXJlY3RpdmVcbiAgaW1wbGVtZW50c1xuICAgIE9uSW5pdCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIFZhbGlkYXRvclxue1xuICAvKipcbiAgICogVGhlIGRhdGUgZm9ybWF0IGZvciB0aGUgaW5wdXQuIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnRcbiAgICogdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW4gdGhlIGBTa3lEYXRlcGlja2VyQ29uZmlnU2VydmljZWAuXG4gICAqIEBkZWZhdWx0IFwiTU0vREQvWVlZWVwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRhdGVGb3JtYXQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLiNfZGF0ZUZvcm1hdCkge1xuICAgICAgdGhpcy4jX2RhdGVGb3JtYXQgPSB2YWx1ZTtcbiAgICAgIHRoaXMuI2FwcGx5RGF0ZUZvcm1hdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIHRvIG5vdCBoYXZlIGdldHRlciBsb2dpY1xuICBwdWJsaWMgZ2V0IGRhdGVGb3JtYXQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy4jX2RhdGVGb3JtYXQgfHxcbiAgICAgIHRoaXMuI2NvbmZpZ1NlcnZpY2UuZGF0ZUZvcm1hdCB8fFxuICAgICAgdGhpcy4jcHJlZmVycmVkU2hvcnREYXRlRm9ybWF0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgdGhlIGRhdGVwaWNrZXIgb24gdGVtcGxhdGUtZHJpdmVuIGZvcm1zLiBEb24ndCB1c2UgdGhpcyBpbnB1dCBvbiByZWFjdGl2ZSBmb3JtcyBiZWNhdXNlIHRoZXkgbWF5IG92ZXJ3cml0ZSB0aGUgaW5wdXQgb3IgbGVhdmUgdGhlIGNvbnRyb2wgb3V0IG9mIHN5bmMuXG4gICAqIFRvIHNldCB0aGUgZGlzYWJsZWQgc3RhdGUgb24gcmVhY3RpdmUgZm9ybXMsIHVzZSB0aGUgYEZvcm1Db250cm9sYCBpbnN0ZWFkLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19kaXNhYmxlZCA9IHZhbHVlIHx8IGZhbHNlO1xuICAgIHRoaXMuI2RhdGVwaWNrZXJDb21wb25lbnQuZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLiNyZW5kZXJlci5zZXRQcm9wZXJ0eShcbiAgICAgIHRoaXMuI2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICdkaXNhYmxlZCcsXG4gICAgICB2YWx1ZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jX2Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBsYXRlc3QgZGF0ZSB0aGF0IGlzIGF2YWlsYWJsZSBpbiB0aGUgY2FsZW5kYXIuIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uXG4gICAqIHRoZSBgaW5wdXRgIGVsZW1lbnQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW4gYFNreURhdGVwaWNrZXJDb25maWdTZXJ2aWNlYC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWF4RGF0ZSh2YWx1ZTogRGF0ZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19tYXhEYXRlID0gdmFsdWU7XG4gICAgdGhpcy4jZGF0ZXBpY2tlckNvbXBvbmVudC5tYXhEYXRlID0gdGhpcy5tYXhEYXRlO1xuXG4gICAgdGhpcy4jb25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIHRvIG5vdCBoYXZlIGdldHRlciBsb2dpY1xuICBwdWJsaWMgZ2V0IG1heERhdGUoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI19tYXhEYXRlIHx8IHRoaXMuI2NvbmZpZ1NlcnZpY2UubWF4RGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZWFybGllc3QgZGF0ZSB0aGF0IGlzIGF2YWlsYWJsZSBpbiB0aGUgY2FsZW5kYXIuIFBsYWNlIHRoaXMgYXR0cmlidXRlIG9uXG4gICAqIHRoZSBgaW5wdXRgIGVsZW1lbnQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW4gYFNreURhdGVwaWNrZXJDb25maWdTZXJ2aWNlYC4gVG8gYXZvaWQgdmFsaWRhdGlvbiBlcnJvcnMsIHRoZSB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWluaW11bSBkYXRlIG11c3QgYmUgbWlkbmlnaHQuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGRhdGVwaWNrZXIgYXV0b21hdGljYWxseSBzZXRzIHRoZSB0aW1lIG9uIHRoZSBgRGF0ZWAgb2JqZWN0IGZvciBzZWxlY3RlZCBkYXRlcyB0byBtaWRuaWdodCBpbiB0aGUgY3VycmVudCB1c2VyJ3MgdGltZSB6b25lLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBtaW5EYXRlKHZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX21pbkRhdGUgPSB2YWx1ZTtcbiAgICB0aGlzLiNkYXRlcGlja2VyQ29tcG9uZW50Lm1pbkRhdGUgPSB0aGlzLm1pbkRhdGU7XG5cbiAgICB0aGlzLiNvblZhbGlkYXRvckNoYW5nZSgpO1xuICB9XG5cbiAgLy8gVE9ETzogUmVmYWN0b3IgdG8gbm90IGhhdmUgZ2V0dGVyIGxvZ2ljXG4gIHB1YmxpYyBnZXQgbWluRGF0ZSgpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jX21pbkRhdGUgfHwgdGhpcy4jY29uZmlnU2VydmljZS5taW5EYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRlIHRvIG9wZW4gdGhlIGNhbGVuZGFyIHRvIGluaXRpYWxseS4gUGxhY2UgdGhpcyBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBpbiBgU2t5RGF0ZXBpY2tlckNvbmZpZ1NlcnZpY2VgLlxuICAgKiBAZGVmYXVsdCBUaGUgY3VycmVudCBkYXRlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHN0YXJ0QXREYXRlKHZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX3N0YXJ0QXREYXRlID0gdmFsdWU7XG4gICAgdGhpcy4jZGF0ZXBpY2tlckNvbXBvbmVudC5zdGFydEF0RGF0ZSA9IHRoaXMuc3RhcnRBdERhdGU7XG4gIH1cblxuICAvLyBUT0RPOiBSZWZhY3RvciB0byBub3QgaGF2ZSBnZXR0ZXIgbG9naWNcbiAgcHVibGljIGdldCBzdGFydEF0RGF0ZSgpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jX3N0YXJ0QXREYXRlIHx8IHRoaXMuI2NvbmZpZ1NlcnZpY2Uuc3RhcnRBdERhdGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZGF0ZXBpY2tlciBpbnB1dCBhbmQgY2FsZW5kYXIuIFBsYWNlIHRoaXMgZGlyZWN0aXZlIG9uIGFuIGBpbnB1dGAgZWxlbWVudCxcbiAgICogYW5kIHdyYXAgdGhlIGlucHV0IGluIGEgYHNreS1kYXRlcGlja2VyYCBjb21wb25lbnQuIFRoZSB2YWx1ZSB0aGF0IHVzZXJzIHNlbGVjdCBpcyBkcml2ZW5cbiAgICogdGhyb3VnaCB0aGUgYG5nTW9kZWxgIGF0dHJpYnV0ZSBzcGVjaWZpZWQgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICogQHJlcXVpcmVkXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNreURhdGVwaWNrZXJJbnB1dChcbiAgICB2YWx1ZTogU2t5RGF0ZXBpY2tlckNvbXBvbmVudCB8IHVuZGVmaW5lZCB8ICcnLFxuICApIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1tEZXByZWNhdGlvbiB3YXJuaW5nXSBZb3Ugbm8gbG9uZ2VyIG5lZWQgdG8gcHJvdmlkZSBhIHRlbXBsYXRlIHJlZmVyZW5jZSB2YXJpYWJsZSAnICtcbiAgICAgICAgICAndG8gdGhlIGBza3lEYXRlcGlja2VySW5wdXRgIGF0dHJpYnV0ZSAodGhpcyB3aWxsIGJlIGEgYnJlYWtpbmcgY2hhbmdlIGluIHRoZSBuZXh0ICcgK1xuICAgICAgICAgICdtYWpvciB2ZXJzaW9uIHJlbGVhc2UpLlxcbicgK1xuICAgICAgICAgICdEbyB0aGlzIGluc3RlYWQ6XFxuJyArXG4gICAgICAgICAgJzxza3ktZGF0ZXBpY2tlcj5cXG4gIDxpbnB1dCBza3lEYXRlcGlja2VySW5wdXQgLz5cXG48L3NreS1kYXRlcGlja2VyPicsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgZGF0ZSB2YWxpZGF0aW9uIG9uIHRoZSBkYXRlcGlja2VyIGlucHV0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNreURhdGVwaWNrZXJOb1ZhbGlkYXRlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFydGluZyBkYXkgb2YgdGhlIHdlZWsgaW4gdGhlIGNhbGVuZGFyLCB3aGVyZSBgMGAgc2V0cyB0aGUgc3RhcnRpbmcgZGF5XG4gICAqIHRvIFN1bmRheS4gUGxhY2UgdGhpcyBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdFxuICAgKiBpbiBgU2t5RGF0ZXBpY2tlckNvbmZpZ1NlcnZpY2VgLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHN0YXJ0aW5nRGF5KHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfc3RhcnRpbmdEYXkgPSB2YWx1ZTtcbiAgICB0aGlzLiNkYXRlcGlja2VyQ29tcG9uZW50LnN0YXJ0aW5nRGF5ID0gdGhpcy5zdGFydGluZ0RheTtcblxuICAgIHRoaXMuI29uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cblxuICAvLyBUT0RPOiBSZWZhY3RvciB0byBub3QgaGF2ZSBnZXR0ZXIgbG9naWNcbiAgcHVibGljIGdldCBzdGFydGluZ0RheSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLiNfc3RhcnRpbmdEYXkgfHwgdGhpcy4jY29uZmlnU2VydmljZS5zdGFydGluZ0RheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGUgdmFsdWUgbXVzdCBtYXRjaCB0aGUgZm9ybWF0IGZyb20gdGhlIGBkYXRlRm9ybWF0YCB2YWx1ZS5cbiAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAgYW5kIHRoZSBkYXRlcGlja2VyIGlucHV0IGRpcmVjdGl2ZSBjYW5ub3QgZmluZCBhbiBleGFjdCBtYXRjaCwgdGhlblxuICAgKiB0aGUgaW5wdXQgaXMgbWFya2VkIGFzIGludmFsaWQuXG4gICAqIElmIHRoaXMgcHJvcGVydHkgaXMgYGZhbHNlYCBhbmQgdGhlIGRhdGVwaWNrZXIgaW5wdXQgZGlyZWN0aXZlIGNhbm5vdCBmaW5kIGFuIGV4YWN0IG1hdGNoLCB0aGVuXG4gICAqIGl0IGF0dGVtcHRzIHRvIGZvcm1hdCB0aGUgc3RyaW5nIGJhc2VkIG9uIHRoZSBbSVNPIDg2MDEgc3RhbmRhcmQgZm9ybWF0XShodHRwczovL3d3dy5pc28ub3JnL2lzby04NjAxLWRhdGUtYW5kLXRpbWUtZm9ybWF0Lmh0bWwpLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzdHJpY3QodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfc3RyaWN0ID0gdmFsdWUgfHwgZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0cmljdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jX3N0cmljdDtcbiAgfVxuXG4gIGdldCAjdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy4jX3ZhbHVlO1xuICB9XG5cbiAgc2V0ICN2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy4jdXBkYXRlVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgI2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IHVuZGVmaW5lZDtcbiAgI2RhdGVGb3JtYXR0ZXIgPSBuZXcgU2t5RGF0ZUZvcm1hdHRlcigpO1xuICAjcHJlZmVycmVkU2hvcnREYXRlRm9ybWF0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICNuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgI25vdGlmeVRvdWNoZWQ6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuICAjX2RhdGVGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgI19kaXNhYmxlZCA9IGZhbHNlO1xuICAjX21heERhdGU6IERhdGUgfCB1bmRlZmluZWQ7XG4gICNfbWluRGF0ZTogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgI19zdGFydEF0RGF0ZTogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgI19zdGFydGluZ0RheTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAjX3N0cmljdCA9IGZhbHNlO1xuICAjX3ZhbHVlOiBhbnk7XG5cbiAgI2NoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZjtcbiAgI2NvbmZpZ1NlcnZpY2U6IFNreURhdGVwaWNrZXJDb25maWdTZXJ2aWNlO1xuICAjZWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgI2xvY2FsZVByb3ZpZGVyOiBTa3lBcHBMb2NhbGVQcm92aWRlcjtcbiAgI3JlbmRlcmVyOiBSZW5kZXJlcjI7XG4gICNkYXRlcGlja2VyQ29tcG9uZW50OiBTa3lEYXRlcGlja2VyQ29tcG9uZW50O1xuXG4gIHJlYWRvbmx5ICNkYXRlcGlja2VySG9zdFN2YyA9IGluamVjdChTa3lEYXRlcGlja2VySG9zdFNlcnZpY2UsIHtcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIGNvbmZpZ1NlcnZpY2U6IFNreURhdGVwaWNrZXJDb25maWdTZXJ2aWNlLFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgbG9jYWxlUHJvdmlkZXI6IFNreUFwcExvY2FsZVByb3ZpZGVyLFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQE9wdGlvbmFsKCkgZGF0ZXBpY2tlckNvbXBvbmVudD86IFNreURhdGVwaWNrZXJDb21wb25lbnQsXG4gICkge1xuICAgIGlmICghZGF0ZXBpY2tlckNvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnWW91IG11c3Qgd3JhcCB0aGUgYHNreURhdGVwaWNrZXJJbnB1dGAgZGlyZWN0aXZlIHdpdGhpbiBhICcgK1xuICAgICAgICAgICdgPHNreS1kYXRlcGlja2VyPmAgY29tcG9uZW50IScsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3RvciA9IGNoYW5nZURldGVjdG9yO1xuICAgIHRoaXMuI2NvbmZpZ1NlcnZpY2UgPSBjb25maWdTZXJ2aWNlO1xuICAgIHRoaXMuI2VsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgIHRoaXMuI2xvY2FsZVByb3ZpZGVyID0gbG9jYWxlUHJvdmlkZXI7XG4gICAgdGhpcy4jcmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICB0aGlzLiNkYXRlcGlja2VyQ29tcG9uZW50ID0gZGF0ZXBpY2tlckNvbXBvbmVudDtcblxuICAgIHRoaXMuI2xvY2FsZVByb3ZpZGVyXG4gICAgICAuZ2V0TG9jYWxlSW5mbygpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChsb2NhbGVJbmZvKSA9PiB7XG4gICAgICAgIFNreURhdGVGb3JtYXR0ZXIuc2V0TG9jYWxlKGxvY2FsZUluZm8ubG9jYWxlKTtcbiAgICAgICAgdGhpcy4jcHJlZmVycmVkU2hvcnREYXRlRm9ybWF0ID1cbiAgICAgICAgICBTa3lEYXRlRm9ybWF0dGVyLmdldFByZWZlcnJlZFNob3J0RGF0ZUZvcm1hdCgpO1xuICAgICAgICB0aGlzLiNhcHBseURhdGVGb3JtYXQoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy4jZGF0ZXBpY2tlckhvc3RTdmM/LmZvY3Vzb3V0XG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2dCkgPT4ge1xuICAgICAgICBjb25zdCBpc0ZvY3VzaW5nSW5wdXQgPVxuICAgICAgICAgIGV2dC5yZWxhdGVkVGFyZ2V0ID09PSB0aGlzLiNlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKCFpc0ZvY3VzaW5nSW5wdXQpIHtcbiAgICAgICAgICB0aGlzLiNub3RpZnlUb3VjaGVkPy4oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuI2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgIHRoaXMuI3JlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQsICdza3ktZm9ybS1jb250cm9sJyk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuI2RhdGVwaWNrZXJDb21wb25lbnQuZGF0ZUZvcm1hdCA9IHRoaXMuZGF0ZUZvcm1hdDtcbiAgICB0aGlzLiNkYXRlcGlja2VyQ29tcG9uZW50LmRhdGVDaGFuZ2VcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLiN2YWx1ZSA9IHZhbHVlO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGFkZHJlc3MgYSBidWcgaW4gQW5ndWxhciA0LlxuICAgIC8vIFdoZW4gYSBjb250cm9sIHZhbHVlIGlzIHNldCBpbml0aWFsbHksIGl0cyB2YWx1ZSBpcyBub3QgcmVwcmVzZW50ZWQgb24gdGhlIHZpZXcuXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xMzc5MlxuICAgIC8vIE9mIG5vdGUgaXMgdGhlIHBhcmVudCBjaGVjayB3aGljaCBhbGxvd3MgdXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmb3JtIGlzIHJlYWN0aXZlLlxuICAgIC8vIFdpdGhvdXQgdGhpcyBjaGVjayB0aGVyZSBpcyBhIGNoYW5nZWQgYmVmb3JlIGNoZWNrZWQgZXJyb3JcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLiNjb250cm9sICYmIHRoaXMuI2NvbnRyb2wucGFyZW50KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy4jY29udHJvbD8uc2V0VmFsdWUodGhpcy4jdmFsdWUsIHtcbiAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLiNuZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLiNuZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnLCBbJyRldmVudCddKVxuICBwdWJsaWMgb25JbnB1dENoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG5cbiAgICBpZiAodGhpcy5za3lEYXRlcGlja2VyTm9WYWxpZGF0ZSkge1xuICAgICAgdGhpcy4jb25WYWx1ZUNoYW5nZSh2YWx1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdHJ5IHRvIHBhcnNlIHRoZSBzdHJpbmcgdmFsdWUgaW50byBhIERhdGUgdmFsdWUgaWYgaXQgaXMgbWFsZm9ybWVkLlxuICAgIGlmICh0aGlzLiNpc0RhdGVTdHJpbmdWYWxpZCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuI29uVmFsdWVDaGFuZ2UodmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuI192YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuI29uQ2hhbmdlKHZhbHVlKTtcblxuICAgIHRoaXMuI2NvbnRyb2w/LnNldEVycm9ycyh7XG4gICAgICBza3lEYXRlOiB7XG4gICAgICAgIGludmFsaWQ6IHZhbHVlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2lucHV0JylcbiAgcHVibGljIG9uSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy4jY29udHJvbD8ubWFya0FzRGlydHkoKTtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLiN1cGRhdGVWYWx1ZSh2YWx1ZSwgZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuI2NvbnRyb2wpIHtcbiAgICAgIHRoaXMuI2NvbnRyb2wgPSBjb250cm9sO1xuICAgICAgLy8gQWNjb3VudCBmb3IgYW55IGRhdGUgY29udmVyc2lvbiB0aGF0IG1heSBoYXZlIG9jY3VycmVkIHByaW9yIHRvIHZhbGlkYXRpb24uXG4gICAgICBpZiAodGhpcy4jY29udHJvbC52YWx1ZSAhPT0gdGhpcy4jdmFsdWUpIHtcbiAgICAgICAgdGhpcy4jY29udHJvbC5wYXRjaFZhbHVlKHRoaXMuI3ZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2t5RGF0ZXBpY2tlck5vVmFsaWRhdGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlOiB1bmtub3duID0gY29udHJvbC52YWx1ZTtcblxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIGNvbnN0IGlzRGF0ZVZhbGlkID0gdGhpcy4jZGF0ZUZvcm1hdHRlci5kYXRlSXNWYWxpZCh2YWx1ZSk7XG5cbiAgICAgIGlmICghaXNEYXRlVmFsaWQpIHtcbiAgICAgICAgLy8gTWFyayB0aGUgaW52YWxpZCBjb250cm9sIGFzIHRvdWNoZWQgc28gdGhhdCB0aGUgaW5wdXQncyBpbnZhbGlkIENTUyBzdHlsZXMgYXBwZWFyLlxuICAgICAgICAvLyAoVGhpcyBpcyBvbmx5IHJlcXVpcmVkIHdoZW4gdGhlIGludmFsaWQgdmFsdWUgaXMgc2V0IGJ5IHRoZSBGb3JtQ29udHJvbCBjb25zdHJ1Y3Rvci4pXG4gICAgICAgIHRoaXMuI2NvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2t5RGF0ZToge1xuICAgICAgICAgICAgaW52YWxpZDogdmFsdWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWluRGF0ZSA9IHRoaXMubWluRGF0ZTtcblxuICAgICAgaWYgKFxuICAgICAgICBtaW5EYXRlICYmXG4gICAgICAgIHRoaXMuI2RhdGVGb3JtYXR0ZXIuZGF0ZUlzVmFsaWQobWluRGF0ZSkgJiZcbiAgICAgICAgdmFsdWUgPCBtaW5EYXRlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBza3lEYXRlOiB7XG4gICAgICAgICAgICBtaW5EYXRlLFxuICAgICAgICAgICAgbWluRGF0ZUZvcm1hdHRlZDogdGhpcy4jZGF0ZUZvcm1hdHRlci5mb3JtYXQoXG4gICAgICAgICAgICAgIG1pbkRhdGUsXG4gICAgICAgICAgICAgIHRoaXMuZGF0ZUZvcm1hdCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF4RGF0ZSA9IHRoaXMubWF4RGF0ZTtcblxuICAgICAgaWYgKFxuICAgICAgICBtYXhEYXRlICYmXG4gICAgICAgIHRoaXMuI2RhdGVGb3JtYXR0ZXIuZGF0ZUlzVmFsaWQobWF4RGF0ZSkgJiZcbiAgICAgICAgdmFsdWUgPiBtYXhEYXRlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBza3lEYXRlOiB7XG4gICAgICAgICAgICBtYXhEYXRlLFxuICAgICAgICAgICAgbWF4RGF0ZUZvcm1hdHRlZDogdGhpcy4jZGF0ZUZvcm1hdHRlci5mb3JtYXQoXG4gICAgICAgICAgICAgIG1heERhdGUsXG4gICAgICAgICAgICAgIHRoaXMuZGF0ZUZvcm1hdCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTWFyayB0aGUgaW52YWxpZCBjb250cm9sIGFzIHRvdWNoZWQgc28gdGhhdCB0aGUgaW5wdXQncyBpbnZhbGlkIENTUyBzdHlsZXMgYXBwZWFyLlxuICAgICAgLy8gKFRoaXMgaXMgb25seSByZXF1aXJlZCB3aGVuIHRoZSBpbnZhbGlkIHZhbHVlIGlzIHNldCBieSB0aGUgRm9ybUNvbnRyb2wgY29uc3RydWN0b3IuKVxuICAgICAgdGhpcy4jY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNreURhdGU6IHtcbiAgICAgICAgICBpbnZhbGlkOiB2YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy4jb25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuI25vdGlmeVRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy4jb25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIHRoaXMuI2RhdGVwaWNrZXJDb21wb25lbnQuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3RzIGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgaW5wdXQgZWxlbWVudCdzIHZhbHVlIGFuZCB1cGRhdGVzIHRoZSBuZ01vZGVsIGFjY29yZGluZ2x5LlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgbmVlZCB0byB1cGRhdGUgdGhlIG5nTW9kZWwgdmFsdWUgYmVmb3JlIHRoZSBpbnB1dCBlbGVtZW50IGxvc2VzIGZvY3VzLlxuICAgKi9cbiAgcHVibGljIGRldGVjdElucHV0VmFsdWVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy4jb25WYWx1ZUNoYW5nZSh0aGlzLiNlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRm9jdXNvdXQoZXZ0OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLiNkYXRlcGlja2VySG9zdFN2Yz8uaXNGb2N1c2luZ0RhdGVwaWNrZXIoZXZ0KSkge1xuICAgICAgdGhpcy4jbm90aWZ5VG91Y2hlZD8uKCk7XG4gICAgfVxuICB9XG5cbiAgI2FwcGx5RGF0ZUZvcm1hdCgpOiB2b2lkIHtcbiAgICB0aGlzLiNkYXRlcGlja2VyQ29tcG9uZW50LmRhdGVGb3JtYXQgPSB0aGlzLmRhdGVGb3JtYXQ7XG4gICAgaWYgKHRoaXMuI3ZhbHVlKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gdGhpcy4jZGF0ZUZvcm1hdHRlci5mb3JtYXQoXG4gICAgICAgIHRoaXMuI3ZhbHVlLFxuICAgICAgICB0aGlzLmRhdGVGb3JtYXQsXG4gICAgICApO1xuICAgICAgdGhpcy4jc2V0SW5wdXRFbGVtZW50VmFsdWUoZm9ybWF0dGVkRGF0ZSk7XG4gICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAjb25WYWx1ZUNoYW5nZShuZXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWUgPSBuZXdWYWx1ZTtcbiAgfVxuXG4gICNzZXRJbnB1dEVsZW1lbnRWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy4jZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZGF0ZSB2YWx1ZSBmcm9tIGEgdmFsdWUgLSBpZiBwb3NzaWJsZS5cbiAgICogV2lsbCBub3QgY29udmVydCB1bmNvbnZlcnRpYmxlIGRhdGVzIG9yIG51bWJlcnMgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBtb250aCdzIG51bWJlciBvZiBkYXlzLlxuICAgKiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSB2YWx1ZSBjYW4gbm90IGJlIGNvbnZlcnRlZC5cbiAgICovXG4gICNnZXREYXRlVmFsdWUodmFsdWU6IHVua25vd24pOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy4jZ2V0U2hvcnRjdXRPckRhdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBzdHJpbmcgdG8gYSBkYXRlIG9iamVjdCBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgZGF0ZSBzdHJpbmcuXG4gICAqIEl0IHdpbGwgYWxzbyBjb252ZXJ0IG51bWVyaWMgaW5wdXQgdG8gYSBkYXRlIGlmIHRoYXQgbnVtYmVyIGlzIHdpdGhpbiB0aGUgY3VycmVudCBtb250aCdzIG51bWJlciBvZiBkYXlzLlxuICAgKiBJZiB0aGUgc3RyaW5nIGNhbiBub3QgYmUgY29udmVydGVkLCBgdW5kZWZpbmVkYCBiZSByZXR1cm5lZC5cbiAgICovXG4gICNnZXRTaG9ydGN1dE9yRGF0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsdWUpO1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG51bSkpIHtcbiAgICAgIC8vIFdlIHJlcXVpcmUgOCBkaWdpdHMgaW4gb3JkZXIgdG8ga25vdyB0aGF0IHdlIGhhdmUgYWxsIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZXRlcm1pbmUgd2hhdCBwYXJ0IG9mIHRoZSBudW1iZXIgaXMgdGhlIG1vbnRoICgyKSwgZGF5ICgyKSwgYW5kIHllYXIgKDQpLlxuICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gOCkge1xuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoL1xcYihNTSlcXGJ8XFxiKEREKVxcYnxcXGIoWVkpXFxifFxcYihZWVlZKVxcYi8sICdnJyk7XG4gICAgICAgIGNvbnN0IGZvcm1hdFRva2Vuc09ubHkgPSB0aGlzLmRhdGVGb3JtYXRcbiAgICAgICAgICA/Lm1hdGNoKHJlZ2V4KVxuICAgICAgICAgID8uam9pbignJylcbiAgICAgICAgICAucmVwbGFjZShuZXcgUmVnRXhwKC9ZKy8pLCAnWVlZWScpO1xuXG4gICAgICAgIGlmIChmb3JtYXRUb2tlbnNPbmx5ICYmIGZvcm1hdFRva2Vuc09ubHkubGVuZ3RoID09PSA4KSB7XG4gICAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuI2RhdGVGb3JtYXR0ZXIuZ2V0RGF0ZUZyb21TdHJpbmcoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGZvcm1hdFRva2Vuc09ubHksXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHRoaXMuI2RhdGVGb3JtYXR0ZXIuZGF0ZUlzVmFsaWQoZGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IHNob3J0Y3V0RGF0ZSA9IG5ldyBEYXRlKG5vdy5nZXRGdWxsWWVhcigpLCBub3cuZ2V0TW9udGgoKSwgbnVtKTtcbiAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gc2hvcnRjdXREYXRlLmdldERhdGUoKTtcbiAgICAgIGlmIChudW0gPiAwICYmIG51bSA8PSBkYXlzSW5Nb250aCkge1xuICAgICAgICByZXR1cm4gc2hvcnRjdXREYXRlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy4jZGF0ZUZvcm1hdHRlci5nZXREYXRlRnJvbVN0cmluZyhcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHRoaXMuZGF0ZUZvcm1hdCxcbiAgICAgICAgdGhpcy5zdHJpY3QsXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMuI2RhdGVGb3JtYXR0ZXIuZGF0ZUlzVmFsaWQoZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBpbnB1dCB2YWx1ZSB0byBlbnN1cmUgaXQgaXMgZm9ybWF0dGVkIGNvcnJlY3RseS5cbiAgICovXG4gICNpc0RhdGVTdHJpbmdWYWxpZCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBEb2VzIHRoZSB2YWx1ZSBvbmx5IGluY2x1ZGUgZGlnaXRzLCBkYXNoZXMsIG9yIHNsYXNoZXM/XG4gICAgY29uc3QgcmVnZXhwID0gL15bXFxkLy1dKyQvO1xuICAgIGNvbnN0IGlzVmFsaWQgPSByZWdleHAudGVzdCh2YWx1ZSk7XG5cbiAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbWVudCh2YWx1ZSkuaXNWYWxpZCgpO1xuICB9XG5cbiAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgI29uQ2hhbmdlID0gKF86IGFueSkgPT4ge307XG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICNvblZhbGlkYXRvckNoYW5nZSA9ICgpID0+IHt9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBmb3JtIGNvbnRyb2wgYW5kIGlucHV0IGVsZW1lbnRcbiAgICogQHBhcmFtIGVtaXRFdmVudCBEZW5vdGVzIGlmIHdlIGVtaXQgYW4gZXZlbnQgdG8gdGhlIGNvbnN1bWVyJ3MgZm9ybSBjb250cm9sLiBXZSBkbyBub3Qgd2FudCB0byBkbyB0aGlzIGlmIHRoZSB2YWx1ZSBpcyBiZWluZyB1cGRhdGVkIHZpYSBhIGBzZXRWYWx1ZWAgY2FsbCBvciBhIGBwYXRjaFZhbHVlYCBjYWxsIGFzIHRoaXMgaXMgYWxyZWFkeSBoYW5kbGVkIGJ5IEFuZ3VsYXIuXG4gICAqIEluIHRoZXNlIGNhc2VzIHdlIGRvIG5vdCB3YW50IHRvIGZpcmUgYG9uQ2hhbmdlYCBhcyBpdCB3aWxsIGNhdXNlIGV4dHJhIGB2YWx1ZUNoYW5nZWAgYW5kIGBzdGF0dXNDaGFuZ2VgIGV2ZW50cyBhbmQgdGhlIHN0YXR1cyBvZiB0aGUgZm9ybSBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IHRoZXNlIGNoYW5nZXMuXG4gICAqL1xuICAjdXBkYXRlVmFsdWUodmFsdWU6IGFueSwgZW1pdEV2ZW50ID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNfdmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaXNWYWxpZERhdGVTdHJpbmcgPSB0aGlzLiNpc0RhdGVTdHJpbmdWYWxpZCh2YWx1ZSk7XG5cbiAgICAvLyBJZiB0aGUgc3RyaW5nIHZhbHVlIHN1cHBsaWVkIGlzIG1hbGZvcm1lZCwgZG8gbm90IHNldCB0aGUgdmFsdWUgdG8gaXRzIERhdGUgZXF1aXZhbGVudC5cbiAgICAvLyAoSmF2YVNjcmlwdCdzIERhdGUgcGFyc2VyIHdpbGwgY29udmVydCBwb29ybHkgZm9ybWF0dGVkIGRhdGVzIHRvIERhdGUgb2JqZWN0cywgc3VjaCBhcyBcImFiYyAxMjNcIiwgd2hpY2ggaXNuJ3QgaWRlYWwuKVxuICAgIGlmICghaXNWYWxpZERhdGVTdHJpbmcpIHtcbiAgICAgIHRoaXMuI192YWx1ZSA9IHZhbHVlO1xuICAgICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgICB0aGlzLiNvbkNoYW5nZSh0aGlzLiNfdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jY29udHJvbD8uc2V0VmFsdWUodGhpcy4jX3ZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuI2RhdGVwaWNrZXJDb21wb25lbnQuc2VsZWN0ZWREYXRlID0gdGhpcy4jX3ZhbHVlO1xuXG4gICAgICB0aGlzLiNzZXRJbnB1dEVsZW1lbnRWYWx1ZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgZGF0ZSB2YWx1ZSBmb3IgdGhlIGlucHV0IGlmIHBvc3NpYmxlLlxuICAgICAgLy8gVGhpcyB2YWx1ZSB3aWxsIHRha2UgaW50byBhY2NvdW50IGFsbCBzaG9ydGN1dCBmdW5jdGlvbmFsaXR5LlxuICAgICAgY29uc3QgZGF0ZVZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkID0gdGhpcy4jZ2V0RGF0ZVZhbHVlKHZhbHVlKTtcblxuICAgICAgY29uc3QgYXJlRGF0ZXNFcXVhbCA9XG4gICAgICAgIHRoaXMuI192YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiZcbiAgICAgICAgZGF0ZVZhbHVlICYmXG4gICAgICAgIGRhdGVWYWx1ZS5nZXRUaW1lKCkgPT09IHRoaXMuI192YWx1ZS5nZXRUaW1lKCk7XG5cbiAgICAgIGlmIChkYXRlVmFsdWUgIT09IHRoaXMuI192YWx1ZSB8fCAhYXJlRGF0ZXNFcXVhbCkge1xuICAgICAgICB0aGlzLiNfdmFsdWUgPSBkYXRlVmFsdWUgfHwgdmFsdWU7XG4gICAgICAgIGlmIChlbWl0RXZlbnQpIHtcbiAgICAgICAgICB0aGlzLiNvbkNoYW5nZSh0aGlzLiNfdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuI2NvbnRyb2w/LnNldFZhbHVlKHRoaXMuI192YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4jZGF0ZXBpY2tlckNvbXBvbmVudC5zZWxlY3RlZERhdGUgPSB0aGlzLiNfdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRlVmFsdWUpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZVN0cmluZyA9IHRoaXMuI2RhdGVGb3JtYXR0ZXIuZm9ybWF0KFxuICAgICAgICAgIGRhdGVWYWx1ZSxcbiAgICAgICAgICB0aGlzLmRhdGVGb3JtYXQsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuI3NldElucHV0RWxlbWVudFZhbHVlKGZvcm1hdHRlZERhdGVTdHJpbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jc2V0SW5wdXRFbGVtZW50VmFsdWUodmFsdWUgfHwgJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|