@ethlete/cdk 2.5.0 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/esm2022/lib/components/forms/components/select/components/combobox/components/combobox/combobox.component.mjs +193 -263
  3. package/esm2022/lib/components/forms/components/select/components/select/directives/select/select.directive.mjs +7 -1
  4. package/esm2022/lib/components/forms/components/select/components/select-field/select-field.component.mjs +8 -5
  5. package/esm2022/lib/components/forms/components/select/directives/index.mjs +2 -0
  6. package/esm2022/lib/components/forms/components/select/directives/public-api.mjs +2 -0
  7. package/esm2022/lib/components/forms/components/select/directives/select-field/public-api.mjs +2 -0
  8. package/esm2022/lib/components/forms/components/select/directives/select-field/select-field.directive.mjs +21 -0
  9. package/esm2022/lib/components/forms/components/select/public-api.mjs +2 -1
  10. package/fesm2022/ethlete-cdk.mjs +216 -264
  11. package/fesm2022/ethlete-cdk.mjs.map +1 -1
  12. package/lib/components/forms/components/select/components/combobox/components/combobox/combobox.component.d.ts +10 -31
  13. package/lib/components/forms/components/select/components/select/directives/select/select.directive.d.ts +1 -0
  14. package/lib/components/forms/components/select/components/select-field/select-field.component.d.ts +5 -4
  15. package/lib/components/forms/components/select/directives/index.d.ts +1 -0
  16. package/lib/components/forms/components/select/directives/public-api.d.ts +1 -0
  17. package/lib/components/forms/components/select/directives/select-field/public-api.d.ts +1 -0
  18. package/lib/components/forms/components/select/directives/select-field/select-field.directive.d.ts +8 -0
  19. package/lib/components/forms/components/select/public-api.d.ts +1 -0
  20. package/package.json +2 -2
@@ -1,42 +1,17 @@
1
1
  import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
- import { DOWN_ARROW, ENTER, ESCAPE, TAB, UP_ARROW } from '@angular/cdk/keycodes';
2
+ import { A, DOWN_ARROW, END, ENTER, ESCAPE, HOME, PAGE_DOWN, PAGE_UP, SPACE, TAB, UP_ARROW, } from '@angular/cdk/keycodes';
3
3
  import { AsyncPipe, NgFor, NgIf } from '@angular/common';
4
4
  import { ChangeDetectionStrategy, Component, EventEmitter, InjectionToken, Input, Output, ViewEncapsulation, inject, isDevMode, } from '@angular/core';
5
- import { AnimatedOverlayDirective, LetDirective, clone } from '@ethlete/core';
6
- import { BehaviorSubject, catchError, combineLatest, debounceTime, distinctUntilChanged, map, of, shareReplay, skip, takeUntil, tap, throwError, } from 'rxjs';
5
+ import { AnimatedOverlayDirective, LetDirective, RuntimeError, SelectionModel } from '@ethlete/core';
6
+ import { BehaviorSubject, catchError, combineLatest, debounceTime, distinctUntilChanged, map, skip, skipWhile, takeUntil, tap, throwError, } from 'rxjs';
7
7
  import { ChevronIconComponent } from '../../../../../../../icons';
8
8
  import { INPUT_TOKEN, InputDirective, NativeInputRefDirective } from '../../../../../../directives';
9
9
  import { DecoratedInputBase } from '../../../../../../utils';
10
+ import { SELECT_FIELD_TOKEN } from '../../../../directives';
10
11
  import { ComboboxBodyComponent } from '../../partials';
11
12
  import * as i0 from "@angular/core";
12
13
  import * as i1 from "../../../../../../directives/input/input.directive";
13
14
  import * as i2 from "@ethlete/core";
14
- export class RuntimeError extends Error {
15
- constructor(code, message, data = '__ET_NO_DATA__') {
16
- super(formatRuntimeError(code, message));
17
- this.code = code;
18
- this.data = data;
19
- if (data !== '__ET_NO_DATA__') {
20
- try {
21
- const _data = clone(data);
22
- setTimeout(() => {
23
- console.error(_data);
24
- }, 1);
25
- }
26
- catch {
27
- setTimeout(() => {
28
- console.error(data);
29
- }, 1);
30
- }
31
- }
32
- }
33
- }
34
- export function formatRuntimeError(code, message) {
35
- // prefix code with zeros if it's less than 100
36
- const codeWithZeros = code < 10 ? `00${code}` : code < 100 ? `0${code}` : code;
37
- const fullCode = `ET${codeWithZeros}`;
38
- return `${fullCode}${message ? ': ' + message : ''}`;
39
- }
40
15
  const COMBOBOX_ERRORS = {
41
16
  1: 'Expected options to be an array of objects. This is due to "bindLabel" and "bindValue" being set.',
42
17
  2: 'Expected options to be an array of primitives. This is due to "bindLabel" and "bindValue" not being set or "allowCustomValues" being set to true.',
@@ -66,46 +41,35 @@ const isObjectArray = (value) => {
66
41
  const isEmptyArray = (value) => {
67
42
  return Array.isArray(value) && value.length === 0;
68
43
  };
69
- const isObject = (value) => {
70
- return typeof value === 'object' && value !== null;
71
- };
72
44
  const ComboboxOptionType = {
73
45
  Primitive: 'primitive',
74
46
  Object: 'object',
75
47
  };
76
- const ComboboxInputValueType = {
77
- Single: 'single',
78
- Array: 'array',
79
- };
80
- const getObjectProperty = (obj, prop) => {
81
- const hasDotNotation = prop.includes('.');
82
- if (!hasDotNotation)
83
- return obj[prop];
84
- const props = prop.split('.');
85
- let value = obj;
86
- for (const prop of props) {
87
- if (!isObject(value))
88
- return undefined;
89
- value = value[prop];
90
- }
91
- return value;
92
- };
93
48
  export const COMBOBOX_TOKEN = new InjectionToken('ET_COMBOBOX_TOKEN');
94
49
  class ComboboxComponent extends DecoratedInputBase {
95
50
  //#endregion
96
51
  //#region Inputs
97
52
  get options() {
98
- return this._options$.value;
53
+ return this._selectionModel.getFilteredOptions();
99
54
  }
100
55
  set options(value) {
101
- this._options$.next(value);
102
- }
103
- get initialValue() {
104
- return this._initialValue$.value;
56
+ this._selectionModel.setOptions(value);
105
57
  }
106
58
  set initialValue(value) {
107
- this._initialValue$.next(value);
108
- this._updateSelectedOptionsViaInitialValue();
59
+ this._selectionModel.setSelection(value);
60
+ }
61
+ get filterInternal() {
62
+ return this._filterInternal$.value;
63
+ }
64
+ set filterInternal(value) {
65
+ const val = coerceBooleanProperty(value);
66
+ this._filterInternal$.next(val);
67
+ if (!val) {
68
+ this._selectionModel.setFilter('');
69
+ }
70
+ else {
71
+ this._selectionModel.setFilter(this._currentFilter);
72
+ }
109
73
  }
110
74
  get loading() {
111
75
  return this._loading$.value;
@@ -125,23 +89,14 @@ class ComboboxComponent extends DecoratedInputBase {
125
89
  set placeholder(value) {
126
90
  this._placeholder$.next(value);
127
91
  }
128
- get multiple() {
129
- return this._multiple$.value;
130
- }
131
92
  set multiple(value) {
132
- this._multiple$.next(coerceBooleanProperty(value));
133
- }
134
- get bindLabel() {
135
- return this._bindLabel$.value;
93
+ this._selectionModel.setAllowMultiple(coerceBooleanProperty(value));
136
94
  }
137
95
  set bindLabel(value) {
138
- this._bindLabel$.next(value);
139
- }
140
- get bindValue() {
141
- return this._bindValue$.value;
96
+ this._selectionModel.setLabelBinding(value);
142
97
  }
143
98
  set bindValue(value) {
144
- this._bindValue$.next(value);
99
+ this._selectionModel.setValueBinding(value);
145
100
  }
146
101
  get allowCustomValues() {
147
102
  return this._allowCustomValues$.value;
@@ -151,9 +106,6 @@ class ComboboxComponent extends DecoratedInputBase {
151
106
  }
152
107
  //#endregion
153
108
  //#region Members
154
- get _rawSelectedOptions() {
155
- return this._rawSelectedOptions$.value;
156
- }
157
109
  get _currentFilter() {
158
110
  return this._currentFilter$.value;
159
111
  }
@@ -161,67 +113,30 @@ class ComboboxComponent extends DecoratedInputBase {
161
113
  return this._animatedOverlay.isMounted;
162
114
  }
163
115
  //#endregion
116
+ //#region Computes
117
+ //#endregion
164
118
  //#region Lifecycle
165
119
  constructor() {
166
120
  super();
167
121
  //#region Injects
168
122
  this._input = inject(INPUT_TOKEN);
169
123
  this._animatedOverlay = inject(AnimatedOverlayDirective);
170
- this._options$ = new BehaviorSubject([]);
171
- this.options$ = this._options$.asObservable();
172
- this._initialValue$ = new BehaviorSubject(null);
124
+ this._selectField = inject(SELECT_FIELD_TOKEN);
125
+ this._filterInternal$ = new BehaviorSubject(true);
173
126
  this._loading$ = new BehaviorSubject(false);
174
127
  this.loading$ = this._loading$.asObservable();
175
128
  this._error$ = new BehaviorSubject(null);
176
129
  this._placeholder$ = new BehaviorSubject(null);
177
- this._multiple$ = new BehaviorSubject(false);
178
- this._bindLabel$ = new BehaviorSubject(null);
179
- this._bindValue$ = new BehaviorSubject(null);
180
130
  this._allowCustomValues$ = new BehaviorSubject(false);
181
131
  //#endregion
182
132
  //#region Outputs
183
133
  this.filterChange = new EventEmitter();
184
- this._rawSelectedOptions$ = new BehaviorSubject([]);
185
134
  this._currentFilter$ = new BehaviorSubject('');
186
135
  this._isOpen$ = this._animatedOverlay.isMounted$;
187
- //#endregion
188
- //#region Computes
189
- this._allOptions$ = combineLatest([this._options$, this._rawSelectedOptions$]).pipe(map(([options, rawSelectedOptions]) => [...options, ...rawSelectedOptions]), shareReplay({ bufferSize: 1, refCount: true }));
190
- this.expectedOptionType$ = combineLatest([
191
- this._bindLabel$,
192
- this._bindValue$,
193
- this._allowCustomValues$,
194
- ]).pipe(map(([bindLabel, bindValue, allowCustomValues]) => {
195
- const shouldBeObjects = bindLabel && bindValue && !allowCustomValues;
196
- if (shouldBeObjects) {
197
- return ComboboxOptionType.Object;
198
- }
199
- return ComboboxOptionType.Primitive;
200
- }));
201
- this.expectedInputValueType$ = this._multiple$.pipe(map((multiple) => (multiple ? ComboboxInputValueType.Array : ComboboxInputValueType.Single)));
202
- this.selectedOptions$ = combineLatest([
203
- this._input.value$,
204
- this.expectedInputValueType$,
205
- this._allOptions$,
206
- ]).pipe(map(([inputValue, expectedInputValueType, allOptions]) => {
207
- if (expectedInputValueType === ComboboxInputValueType.Single) {
208
- if (Array.isArray(inputValue)) {
209
- return [];
210
- }
211
- const option = this._findOptionByValue(inputValue, allOptions);
212
- return [option];
213
- }
214
- else if (expectedInputValueType === ComboboxInputValueType.Array) {
215
- if (!Array.isArray(inputValue)) {
216
- return [];
217
- }
218
- const options = inputValue.map((value) => this._findOptionByValue(value, allOptions)).filter((v) => !!v);
219
- if (!options.length)
220
- return [];
221
- return options;
222
- }
223
- return [];
224
- }), map((options) => options.filter((v) => !!v)));
136
+ this._selectionModel = new SelectionModel();
137
+ this.selectedOptions$ = this._selectionModel.selection$;
138
+ this.multiple$ = this._selectionModel.allowMultiple$;
139
+ this.options$ = this._selectionModel.filteredOptions$;
225
140
  this._bindings.push({
226
141
  attribute: 'class.et-combobox--loading',
227
142
  observable: this._loading$,
@@ -234,6 +149,10 @@ class ComboboxComponent extends DecoratedInputBase {
234
149
  attribute: 'class.et-combobox--open',
235
150
  observable: this._isOpen$,
236
151
  });
152
+ this._selectField._bindings.push({
153
+ attribute: 'class.et-select-field--open',
154
+ observable: this._isOpen$,
155
+ });
237
156
  }
238
157
  ngOnInit() {
239
158
  this._initDispatchFilterChanges();
@@ -241,42 +160,24 @@ class ComboboxComponent extends DecoratedInputBase {
241
160
  if (isDevMode()) {
242
161
  this._debugValidateComboboxConfig();
243
162
  }
163
+ this._selectionModel.value$
164
+ .pipe(takeUntil(this._destroy$), tap((value) => {
165
+ this._input._updateValue(value);
166
+ this._setFilterFromInputValue();
167
+ }))
168
+ .subscribe();
244
169
  }
245
170
  //#endregion
246
171
  //#region Public Methods
247
172
  getOptionLabel(option) {
248
- if (!this.bindLabel || !isObject(option)) {
249
- return of(option);
250
- }
251
- return this._bindLabel$.pipe(map((label) => {
252
- if (!label)
253
- return option;
254
- return getObjectProperty(option, label) ?? option;
255
- }));
173
+ return this._selectionModel.getLabel$(option);
256
174
  }
257
175
  getOptionValue(option) {
258
- if (!this.bindValue || !isObject(option)) {
259
- return of(option);
260
- }
261
- return this._bindValue$.pipe(map((value) => {
262
- if (!value)
263
- return option;
264
- return getObjectProperty(option, value) ?? option;
265
- }));
176
+ return this._selectionModel.getValue$(option);
266
177
  }
267
178
  removeSelectedOption(option) {
179
+ this._selectionModel.removeSelectedOption(option);
268
180
  this.input._markAsTouched();
269
- const selectedOptions = this._rawSelectedOptions;
270
- const optionValue = this._getOptionValueSync(option);
271
- const index = selectedOptions.findIndex((v) => {
272
- const val = this._getOptionValueSync(v);
273
- return val === optionValue;
274
- });
275
- if (index === -1)
276
- return;
277
- selectedOptions.splice(index, 1);
278
- this._rawSelectedOptions$.next(selectedOptions);
279
- this._removeOrClearInputValue(optionValue);
280
181
  }
281
182
  open() {
282
183
  // if (!this._selectBodyConfig) return;
@@ -300,70 +201,102 @@ class ComboboxComponent extends DecoratedInputBase {
300
201
  }
301
202
  writeValueFromOption(option) {
302
203
  this.input._markAsTouched();
303
- const optionValue = this._getOptionValueSync(option);
304
- if (this._findOptionByValue(optionValue, this._rawSelectedOptions)) {
305
- if (this.multiple) {
306
- this.removeSelectedOption(option);
307
- this._removeOrClearInputValue(optionValue);
308
- }
309
- return;
204
+ if (this._selectionModel.allowMultiple) {
205
+ this._selectionModel.toggleSelectedOption(option);
206
+ }
207
+ else {
208
+ this._selectionModel.addSelectedOption(option);
310
209
  }
311
- this._setOrAddToInputValue(optionValue);
312
- this._addSelectedOption(option);
313
- if (!this.multiple) {
210
+ if (!this._selectionModel.allowMultiple) {
314
211
  this.close();
315
212
  this._setFilterFromInputValue();
316
213
  }
317
214
  }
318
215
  isOptionSelected(option) {
319
- return combineLatest([this._rawSelectedOptions$, this.getOptionValue(option)]).pipe(map(([selectedOptions, value]) => !!this._findOptionByValue(value, selectedOptions)));
216
+ return this._selectionModel.isSelected$(option);
320
217
  }
321
218
  //#endregion
322
219
  //#region Protected Methods
323
220
  processKeydownEvent(event) {
324
221
  const keyCode = event.keyCode;
325
222
  const isOpen = this._isOpen;
326
- const isMultiple = this.multiple;
223
+ const isMultiple = this._selectionModel.allowMultiple;
327
224
  const canAddCustomValue = this.allowCustomValues;
328
225
  const value = event.target.value;
329
- const hasValue = !!value;
226
+ const hasFilterValue = !!value;
227
+ const result = {};
330
228
  // The user typed a custom value and pressed enter. Add it to the selected options.
331
- if (keyCode === ENTER && canAddCustomValue && hasValue) {
332
- // Don't add the value if it already exists.
333
- if (!this._findOptionByValue(value, this._rawSelectedOptions)) {
334
- this._addSelectedOption(value);
335
- this._setOrAddToInputValue(value);
229
+ if (keyCode === ENTER) {
230
+ if (canAddCustomValue && hasFilterValue) {
231
+ result.optionAction = { type: 'add', option: value };
336
232
  }
337
- if (this.multiple) {
338
- this._updateFilter('');
233
+ else {
234
+ if (isMultiple) {
235
+ // TODO: Toggle the focused option
236
+ }
237
+ else {
238
+ // TODO: Select the focused option
239
+ }
339
240
  }
340
- return;
241
+ if (isMultiple) {
242
+ result.setFilter = '';
243
+ }
244
+ else {
245
+ result.overlayOperation = 'close';
246
+ }
247
+ return this._interpretKeyHandlerResult(result);
248
+ }
249
+ if (keyCode === SPACE) {
250
+ if (isMultiple) {
251
+ result.setFilter = '';
252
+ // TODO: Toggle the focused option
253
+ }
254
+ else {
255
+ result.overlayOperation = 'close';
256
+ // TODO: Select the focused option
257
+ }
258
+ return this._interpretKeyHandlerResult(result);
341
259
  }
342
260
  if (keyCode === ESCAPE) {
343
261
  if (isOpen) {
344
- this.close();
262
+ result.overlayOperation = 'close';
345
263
  }
346
- else {
347
- if (!isMultiple) {
348
- this._removeOrClearInputValue(null);
349
- this._updateFilter('');
350
- return;
351
- }
264
+ else if (!isMultiple) {
265
+ result.setFilter = '';
266
+ result.optionAction = 'clear';
352
267
  }
268
+ return this._interpretKeyHandlerResult(result);
353
269
  }
354
270
  if (keyCode === TAB) {
355
- this.close();
356
- return;
271
+ result.overlayOperation = 'close';
272
+ return this._interpretKeyHandlerResult(result);
357
273
  }
358
274
  if (!isOpen) {
359
- this.open();
275
+ result.overlayOperation = 'open';
360
276
  }
361
277
  if (keyCode === DOWN_ARROW) {
362
- // TODO: Implement
278
+ result.focusAction = 'next';
363
279
  }
364
280
  if (keyCode === UP_ARROW) {
365
- // TODO: Implement
281
+ result.focusAction = 'previous';
282
+ }
283
+ if (keyCode === PAGE_UP) {
284
+ result.focusAction = { type: 'offset', offset: -10 };
285
+ }
286
+ if (keyCode === PAGE_DOWN) {
287
+ result.focusAction = { type: 'offset', offset: 10 };
288
+ }
289
+ if (keyCode === HOME) {
290
+ result.focusAction = 'first';
291
+ }
292
+ if (keyCode === END) {
293
+ result.focusAction = 'last';
366
294
  }
295
+ if (keyCode === A && event.ctrlKey && isMultiple) {
296
+ result.optionAction = 'toggleAll';
297
+ event.preventDefault();
298
+ }
299
+ return this._interpretKeyHandlerResult(result);
367
300
  }
368
301
  processInputEvent(event) {
369
302
  const value = event.target.value;
@@ -372,10 +305,10 @@ class ComboboxComponent extends DecoratedInputBase {
372
305
  handleBlurEvent() {
373
306
  this.input._markAsTouched();
374
307
  this.input._setShouldDisplayError(true);
375
- if (this.multiple)
308
+ if (this._selectionModel.allowMultiple)
376
309
  return;
377
310
  if (this._currentFilter === '') {
378
- this._removeOrClearInputValue(null);
311
+ this._selectionModel.clearSelectedOptions();
379
312
  return;
380
313
  }
381
314
  this._setFilterFromInputValue();
@@ -384,7 +317,7 @@ class ComboboxComponent extends DecoratedInputBase {
384
317
  //#region Private Methods
385
318
  _initDispatchFilterChanges() {
386
319
  this._currentFilter$
387
- .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this._destroy$), tap((v) => this.filterChange.emit(v)))
320
+ .pipe(skipWhile(() => this.filterInternal), debounceTime(300), distinctUntilChanged(), takeUntil(this._destroy$), tap((v) => this.filterChange.emit(v)))
388
321
  .subscribe();
389
322
  }
390
323
  _initRepositionOnValueChanges() {
@@ -392,65 +325,6 @@ class ComboboxComponent extends DecoratedInputBase {
392
325
  .pipe(takeUntil(this._destroy$), debounceTime(0), tap(() => this._animatedOverlay._reposition()))
393
326
  .subscribe();
394
327
  }
395
- _updateSelectedOptionsViaInitialValue() {
396
- if (this.initialValue !== null && this.initialValue !== undefined) {
397
- if (Array.isArray(this.initialValue)) {
398
- this._addSelectedOptions(this.initialValue);
399
- }
400
- else {
401
- this._addSelectedOption(this.initialValue);
402
- }
403
- }
404
- }
405
- _addSelectedOption(option) {
406
- if (this.multiple) {
407
- this._rawSelectedOptions$.next([...this._rawSelectedOptions, option]);
408
- }
409
- else {
410
- this._rawSelectedOptions$.next([option]);
411
- }
412
- }
413
- _addSelectedOptions(options) {
414
- if (!this.multiple) {
415
- return;
416
- }
417
- this._rawSelectedOptions$.next([...this._rawSelectedOptions, ...options]);
418
- }
419
- _findOptionByValue(value, allOptions) {
420
- const option = allOptions.find((option) => {
421
- if (isObject(option) && this.bindValue) {
422
- return getObjectProperty(option, this.bindValue) === value;
423
- }
424
- return option === value;
425
- });
426
- return option;
427
- }
428
- _setOrAddToInputValue(value) {
429
- if (this.multiple) {
430
- if (Array.isArray(this._input.value)) {
431
- this._input._updateValue([...this._input.value, value]);
432
- }
433
- else {
434
- this._input._updateValue([value]);
435
- }
436
- }
437
- else {
438
- this._input._updateValue(value);
439
- }
440
- }
441
- _removeOrClearInputValue(value) {
442
- if (this.multiple) {
443
- if (Array.isArray(this._input.value)) {
444
- this._input._updateValue(this._input.value.filter((v) => v !== value));
445
- }
446
- else {
447
- this._input._updateValue([]);
448
- }
449
- }
450
- else {
451
- this._input._updateValue(null);
452
- }
453
- }
454
328
  _updateFilter(value) {
455
329
  if (this.input.nativeInputRef && this.input.nativeInputRef.element.nativeElement.value !== value) {
456
330
  this.input.nativeInputRef.element.nativeElement.value = value;
@@ -458,52 +332,106 @@ class ComboboxComponent extends DecoratedInputBase {
458
332
  if (this._currentFilter === value)
459
333
  return;
460
334
  this._currentFilter$.next(value);
461
- }
462
- _getOptionValueSync(option) {
463
- if (!this.bindValue || !isObject(option)) {
464
- return option;
335
+ if (this.filterInternal) {
336
+ this._selectionModel.setFilter(value);
465
337
  }
466
- return getObjectProperty(option, this.bindValue) ?? option;
467
- }
468
- _getOptionLabelSync(option) {
469
- if (!this.bindLabel || !isObject(option)) {
470
- return option;
471
- }
472
- return getObjectProperty(option, this.bindLabel) ?? option;
473
338
  }
474
339
  _setFilterFromInputValue() {
475
- if (this.multiple)
340
+ if (this._selectionModel.allowMultiple)
476
341
  return;
477
342
  const value = this.input.value;
478
343
  if (!value || Array.isArray(value)) {
479
344
  this._updateFilter('');
480
345
  return;
481
346
  }
482
- const option = this._findOptionByValue(value, this._rawSelectedOptions);
347
+ const option = this._selectionModel.getOptionByValue(value);
483
348
  if (!option)
484
349
  return;
485
- const label = this._getOptionLabelSync(option);
350
+ const label = this._selectionModel.getLabel(option);
486
351
  if (typeof label !== 'string')
487
352
  return;
488
353
  this._updateFilter(label);
489
354
  }
355
+ _interpretKeyHandlerResult(result) {
356
+ if (result.overlayOperation === 'close') {
357
+ this.close();
358
+ }
359
+ else if (result.overlayOperation === 'open') {
360
+ this.open();
361
+ }
362
+ if (result.setFilter !== undefined) {
363
+ this._updateFilter(result.setFilter);
364
+ }
365
+ if (result.optionAction) {
366
+ if (typeof result.optionAction === 'string') {
367
+ if (result.optionAction === 'clear') {
368
+ this._selectionModel.clearSelectedOptions();
369
+ }
370
+ else if (result.optionAction === 'toggleAll') {
371
+ this._selectionModel.toggleAllSelectedOptions();
372
+ }
373
+ }
374
+ else {
375
+ const { type, option } = result.optionAction;
376
+ if (type === 'add') {
377
+ this._selectionModel.addSelectedOption(option);
378
+ }
379
+ if (type === 'remove') {
380
+ this._selectionModel.removeSelectedOption(option);
381
+ }
382
+ if (type === 'toggle') {
383
+ this._selectionModel.toggleSelectedOption(option);
384
+ }
385
+ }
386
+ }
387
+ if (result.focusAction) {
388
+ if (typeof result.focusAction === 'string') {
389
+ if (result.focusAction === 'first') {
390
+ // TODO: Implement
391
+ }
392
+ if (result.focusAction === 'last') {
393
+ // TODO: Implement
394
+ }
395
+ if (result.focusAction === 'next') {
396
+ // TODO: Implement
397
+ }
398
+ if (result.focusAction === 'previous') {
399
+ // TODO: Implement
400
+ }
401
+ }
402
+ else {
403
+ const { type } = result.focusAction;
404
+ if (type === 'offset') {
405
+ const { offset } = result.focusAction;
406
+ // TODO: Implement
407
+ }
408
+ }
409
+ }
410
+ }
490
411
  //#endregion
491
412
  //#region Dev mode
492
413
  _debugValidateComboboxConfig(isRetry = false) {
493
- this.expectedOptionType$
414
+ combineLatest([this._selectionModel.labelBinding$, this._selectionModel.valueBinding$, this._allowCustomValues$])
494
415
  .pipe(skip(isRetry ? 1 : 0), // Skip if retrying to avoid infinite loop
495
- debounceTime(0), takeUntil(this._destroy$), tap((expectedOptionType) => {
496
- if (isEmptyArray(this.options)) {
416
+ debounceTime(0), takeUntil(this._destroy$), map(([bindLabel, bindValue, allowCustomValues]) => {
417
+ const shouldBeObjects = bindLabel && bindValue && !allowCustomValues;
418
+ if (shouldBeObjects) {
419
+ return ComboboxOptionType.Object;
420
+ }
421
+ return ComboboxOptionType.Primitive;
422
+ }), tap((expectedOptionType) => {
423
+ const options = this._selectionModel.options;
424
+ if (isEmptyArray(options)) {
497
425
  return;
498
426
  }
499
427
  if (expectedOptionType === ComboboxOptionType.Object) {
500
- if (!isObjectArray(this.options)) {
501
- throw comboboxError(1, this.options);
428
+ if (!isObjectArray(options)) {
429
+ throw comboboxError(1, options);
502
430
  }
503
431
  }
504
432
  else if (expectedOptionType === ComboboxOptionType.Primitive) {
505
- if (!isPrimitiveArray(this.options)) {
506
- throw comboboxError(2, this.options);
433
+ if (!isPrimitiveArray(options)) {
434
+ throw comboboxError(2, options);
507
435
  }
508
436
  }
509
437
  }), catchError((e) => {
@@ -513,12 +441,12 @@ class ComboboxComponent extends DecoratedInputBase {
513
441
  .subscribe();
514
442
  }
515
443
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ComboboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
516
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: ComboboxComponent, isStandalone: true, selector: "et-combobox", inputs: { options: "options", initialValue: "initialValue", loading: "loading", error: "error", placeholder: "placeholder", multiple: "multiple", bindLabel: "bindLabel", bindValue: "bindValue", allowCustomValues: "allowCustomValues" }, outputs: { filterChange: "filterChange" }, host: { classAttribute: "et-combobox" }, providers: [
444
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: ComboboxComponent, isStandalone: true, selector: "et-combobox", inputs: { options: "options", initialValue: "initialValue", filterInternal: "filterInternal", loading: "loading", error: "error", placeholder: "placeholder", multiple: "multiple", bindLabel: "bindLabel", bindValue: "bindValue", allowCustomValues: "allowCustomValues" }, outputs: { filterChange: "filterChange" }, host: { classAttribute: "et-combobox" }, providers: [
517
445
  {
518
446
  provide: COMBOBOX_TOKEN,
519
447
  useExisting: ComboboxComponent,
520
448
  },
521
- ], usesInheritance: true, hostDirectives: [{ directive: i1.InputDirective }, { directive: i2.AnimatedOverlayDirective }], ngImport: i0, template: "<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<!-- eslint-disable @angular-eslint/template/use-track-by-function -->\n<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-combobox-wrapper\">\n <ul *ngIf=\"multiple\" class=\"et-combobox-selected-options\">\n <li *ngFor=\"let item of selectedOptions$ | async\" class=\"et-combobox-selected-option\">\n {{ getOptionLabel(item) | async }}\n <span (click)=\"removeSelectedOption(item)\" class=\"et-combobox-selected-option-remove\" tabindex=\"-1\"> x </span>\n </li>\n </ul>\n\n <input\n (keydown)=\"processKeydownEvent($event)\"\n (click)=\"open()\"\n (blur)=\"handleBlurEvent()\"\n (input)=\"processInputEvent($event)\"\n type=\"text\"\n etNativeInputRef\n />\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[data-popper-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[data-popper-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:300px;overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid}.et-combobox-option{display:block}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NativeInputRefDirective, selector: "input[etNativeInputRef], textarea[etNativeInputRef], select[etNativeInputRef], button[etNativeInputRef]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
449
+ ], usesInheritance: true, hostDirectives: [{ directive: i1.InputDirective }, { directive: i2.AnimatedOverlayDirective }], ngImport: i0, template: "<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<!-- eslint-disable @angular-eslint/template/use-track-by-function -->\n<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-combobox-wrapper\">\n <ul *ngIf=\"multiple$ | async\" class=\"et-combobox-selected-options\">\n <li *ngFor=\"let item of selectedOptions$ | async\" class=\"et-combobox-selected-option\">\n {{ getOptionLabel(item) | async }}\n <span (click)=\"removeSelectedOption(item)\" class=\"et-combobox-selected-option-remove\" tabindex=\"-1\"> x </span>\n </li>\n </ul>\n\n <input\n (keydown)=\"processKeydownEvent($event)\"\n (click)=\"open()\"\n (blur)=\"handleBlurEvent()\"\n (input)=\"processInputEvent($event)\"\n type=\"text\"\n etNativeInputRef\n />\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[data-popper-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[data-popper-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:300px;overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid}.et-combobox-option{display:block}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NativeInputRefDirective, selector: "input[etNativeInputRef], textarea[etNativeInputRef], select[etNativeInputRef], button[etNativeInputRef]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
522
450
  }
523
451
  export { ComboboxComponent };
524
452
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: ComboboxComponent, decorators: [{
@@ -530,12 +458,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImpor
530
458
  provide: COMBOBOX_TOKEN,
531
459
  useExisting: ComboboxComponent,
532
460
  },
533
- ], template: "<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<!-- eslint-disable @angular-eslint/template/use-track-by-function -->\n<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-combobox-wrapper\">\n <ul *ngIf=\"multiple\" class=\"et-combobox-selected-options\">\n <li *ngFor=\"let item of selectedOptions$ | async\" class=\"et-combobox-selected-option\">\n {{ getOptionLabel(item) | async }}\n <span (click)=\"removeSelectedOption(item)\" class=\"et-combobox-selected-option-remove\" tabindex=\"-1\"> x </span>\n </li>\n </ul>\n\n <input\n (keydown)=\"processKeydownEvent($event)\"\n (click)=\"open()\"\n (blur)=\"handleBlurEvent()\"\n (input)=\"processInputEvent($event)\"\n type=\"text\"\n etNativeInputRef\n />\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[data-popper-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[data-popper-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:300px;overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid}.et-combobox-option{display:block}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"] }]
461
+ ], template: "<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<!-- eslint-disable @angular-eslint/template/use-track-by-function -->\n<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-combobox-wrapper\">\n <ul *ngIf=\"multiple$ | async\" class=\"et-combobox-selected-options\">\n <li *ngFor=\"let item of selectedOptions$ | async\" class=\"et-combobox-selected-option\">\n {{ getOptionLabel(item) | async }}\n <span (click)=\"removeSelectedOption(item)\" class=\"et-combobox-selected-option-remove\" tabindex=\"-1\"> x </span>\n </li>\n </ul>\n\n <input\n (keydown)=\"processKeydownEvent($event)\"\n (click)=\"open()\"\n (blur)=\"handleBlurEvent()\"\n (input)=\"processInputEvent($event)\"\n type=\"text\"\n etNativeInputRef\n />\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[data-popper-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[data-popper-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:300px;overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid}.et-combobox-option{display:block}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"] }]
534
462
  }], ctorParameters: function () { return []; }, propDecorators: { options: [{
535
463
  type: Input,
536
464
  args: [{ required: true }]
537
465
  }], initialValue: [{
538
466
  type: Input
467
+ }], filterInternal: [{
468
+ type: Input
539
469
  }], loading: [{
540
470
  type: Input
541
471
  }], error: [{
@@ -553,4 +483,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImpor
553
483
  }], filterChange: [{
554
484
  type: Output
555
485
  }] } });
556
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jZGsvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm1zL2NvbXBvbmVudHMvc2VsZWN0L2NvbXBvbmVudHMvY29tYm9ib3gvY29tcG9uZW50cy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvY29tcG9uZW50cy9zZWxlY3QvY29tcG9uZW50cy9jb21ib2JveC9jb21wb25lbnRzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixjQUFjLEVBQ2QsS0FBSyxFQUVMLE1BQU0sRUFDTixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixhQUFhLEVBQ2IsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsRUFBRSxFQUNGLFdBQVcsRUFDWCxJQUFJLEVBQ0osU0FB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LDBYQVBqQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxjQUFjO2dCQUN2QixXQUFXLEVBQUUsaUJBQWlCO2FBQy9CO1NBQ0YsaUpDeEpILHE3QkE2QkEsMDFDRG9IWSxJQUFJLDZGQUFFLHVCQUF1QiwrSUFBRSxTQUFTLDhDQUFFLG9CQUFvQiw0REFBZ0IsS0FBSzs7U0FTbEYsaUJBQWlCOzJGQUFqQixpQkFBaUI7a0JBbkI3QixTQUFTOytCQUNFLGFBQWEsY0FHWCxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksUUFDL0I7d0JBQ0osS0FBSyxFQUFFLGFBQWE7cUJBQ3JCLFdBQ1EsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsa0JBQzlFLENBQUMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEVBQUUsd0JBQXdCLENBQUMsYUFDOUQ7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGNBQWM7NEJBQ3ZCLFdBQVcsbUJBQW1CO3lCQUMvQjtxQkFDRjswRUFhRyxPQUFPO3NCQURWLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQVdyQixZQUFZO3NCQURmLEtBQUs7Z0JBWUYsT0FBTztzQkFEVixLQUFLO2dCQVdGLEtBQUs7c0JBRFIsS0FBSztnQkFVRixXQUFXO3NCQURkLEtBQUs7Z0JBVUYsUUFBUTtzQkFEWCxLQUFLO2dCQVVGLFNBQVM7c0JBRFosS0FBSztnQkFVRixTQUFTO3NCQURaLEtBQUs7Z0JBVUYsaUJBQWlCO3NCQURwQixLQUFLO2dCQWNhLFlBQVk7c0JBRDlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBET1dOX0FSUk9XLCBFTlRFUiwgRVNDQVBFLCBUQUIsIFVQX0FSUk9XIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgaW5qZWN0LFxuICBpc0Rldk1vZGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQW5pbWF0ZWRPdmVybGF5RGlyZWN0aXZlLCBMZXREaXJlY3RpdmUsIGNsb25lIH0gZnJvbSAnQGV0aGxldGUvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNhdGNoRXJyb3IsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG1hcCxcbiAgb2YsXG4gIHNoYXJlUmVwbGF5LFxuICBza2lwLFxuICB0YWtlVW50aWwsXG4gIHRhcCxcbiAgdGhyb3dFcnJvcixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGV2cm9uSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uLy4uL2ljb25zJztcbmltcG9ydCB7IElOUFVUX1RPS0VOLCBJbnB1dERpcmVjdGl2ZSwgTmF0aXZlSW5wdXRSZWZEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7IERlY29yYXRlZElucHV0QmFzZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IENvbWJvYm94Qm9keUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BhcnRpYWxzJztcblxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVFcnJvcjxUIGV4dGVuZHMgbnVtYmVyPiBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIGNvZGU6IFQsIG1lc3NhZ2U6IG51bGwgfCBmYWxzZSB8IHN0cmluZywgcHVibGljIGRhdGE6IHVua25vd24gPSAnX19FVF9OT19EQVRBX18nKSB7XG4gICAgc3VwZXIoZm9ybWF0UnVudGltZUVycm9yPFQ+KGNvZGUsIG1lc3NhZ2UpKTtcblxuICAgIGlmIChkYXRhICE9PSAnX19FVF9OT19EQVRBX18nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBfZGF0YSA9IGNsb25lKGRhdGEpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoX2RhdGEpO1xuICAgICAgICB9LCAxKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGRhdGEpO1xuICAgICAgICB9LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJ1bnRpbWVFcnJvcjxUIGV4dGVuZHMgbnVtYmVyPihjb2RlOiBULCBtZXNzYWdlOiBudWxsIHwgZmFsc2UgfCBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBwcmVmaXggY29kZSB3aXRoIHplcm9zIGlmIGl0J3MgbGVzcyB0aGFuIDEwMFxuICBjb25zdCBjb2RlV2l0aFplcm9zID0gY29kZSA8IDEwID8gYDAwJHtjb2RlfWAgOiBjb2RlIDwgMTAwID8gYDAke2NvZGV9YCA6IGNvZGU7XG5cbiAgY29uc3QgZnVsbENvZGUgPSBgRVQke2NvZGVXaXRoWmVyb3N9YDtcblxuICByZXR1cm4gYCR7ZnVsbENvZGV9JHttZXNzYWdlID8gJzogJyArIG1lc3NhZ2UgOiAnJ31gO1xufVxuXG5jb25zdCBDT01CT0JPWF9FUlJPUlMgPSB7XG4gIDE6ICdFeHBlY3RlZCBvcHRpb25zIHRvIGJlIGFuIGFycmF5IG9mIG9iamVjdHMuIFRoaXMgaXMgZHVlIHRvIFwiYmluZExhYmVsXCIgYW5kIFwiYmluZFZhbHVlXCIgYmVpbmcgc2V0LicsXG4gIDI6ICdFeHBlY3RlZCBvcHRpb25zIHRvIGJlIGFuIGFycmF5IG9mIHByaW1pdGl2ZXMuIFRoaXMgaXMgZHVlIHRvIFwiYmluZExhYmVsXCIgYW5kIFwiYmluZFZhbHVlXCIgbm90IGJlaW5nIHNldCBvciBcImFsbG93Q3VzdG9tVmFsdWVzXCIgYmVpbmcgc2V0IHRvIHRydWUuJyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGNvbWJvYm94RXJyb3IgPSAoY29kZToga2V5b2YgdHlwZW9mIENPTUJPQk9YX0VSUk9SUywgZGF0YTogdW5rbm93bikgPT4ge1xuICBjb25zdCBtZXNzYWdlID0gYDxldC1jb21ib2JveD46ICR7Q09NQk9CT1hfRVJST1JTW2NvZGVdfWA7XG5cbiAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihjb2RlLCBtZXNzYWdlLCBkYXRhKTtcbn07XG5cbmNvbnN0IGlzUHJpbWl0aXZlQXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBmaXJzdCA9IHZhbHVlWzBdO1xuICBjb25zdCBsYXN0ID0gdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV07XG5cbiAgaWYgKCFmaXJzdCB8fCAhbGFzdCkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0eXBlb2YgZmlyc3QgIT09ICdvYmplY3QnICYmIHR5cGVvZiBsYXN0ICE9PSAnb2JqZWN0Jztcbn07XG5cbmNvbnN0IGlzT2JqZWN0QXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZmlyc3QgPSB2YWx1ZVswXTtcbiAgY29uc3QgbGFzdCA9IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdO1xuXG4gIGlmICghZmlyc3QgfHwgIWxhc3QpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHlwZW9mIGZpcnN0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbGFzdCA9PT0gJ29iamVjdCc7XG59O1xuXG5jb25zdCBpc0VtcHR5QXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBbXSA9PiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDA7XG59O1xuXG5jb25zdCBpc09iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGw7XG59O1xuXG5jb25zdCBDb21ib2JveE9wdGlvblR5cGUgPSB7XG4gIFByaW1pdGl2ZTogJ3ByaW1pdGl2ZScsXG4gIE9iamVjdDogJ29iamVjdCcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBDb21ib2JveElucHV0VmFsdWVUeXBlID0ge1xuICBTaW5nbGU6ICdzaW5nbGUnLFxuICBBcnJheTogJ2FycmF5Jyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGdldE9iamVjdFByb3BlcnR5ID0gKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHByb3A6IHN0cmluZykgPT4ge1xuICBjb25zdCBoYXNEb3ROb3RhdGlvbiA9IHByb3AuaW5jbHVkZXMoJy4nKTtcblxuICBpZiAoIWhhc0RvdE5vdGF0aW9uKSByZXR1cm4gb2JqW3Byb3BdO1xuXG4gIGNvbnN0IHByb3BzID0gcHJvcC5zcGxpdCgnLicpO1xuXG4gIGxldCB2YWx1ZTogdW5rbm93biA9IG9iajtcblxuICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIHZhbHVlID0gdmFsdWVbcHJvcF07XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgQ09NQk9CT1hfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW48Q29tYm9ib3hDb21wb25lbnQ+KCdFVF9DT01CT0JPWF9UT0tFTicpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdldC1jb21ib2JveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbWJvYm94LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdldC1jb21ib2JveCcsXG4gIH0sXG4gIGltcG9ydHM6IFtOZ0lmLCBOYXRpdmVJbnB1dFJlZkRpcmVjdGl2ZSwgQXN5bmNQaXBlLCBDaGV2cm9uSWNvbkNvbXBvbmVudCwgTGV0RGlyZWN0aXZlLCBOZ0Zvcl0sXG4gIGhvc3REaXJlY3RpdmVzOiBbeyBkaXJlY3RpdmU6IElucHV0RGlyZWN0aXZlIH0sIEFuaW1hdGVkT3ZlcmxheURpcmVjdGl2ZV0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IENPTUJPQk9YX1RPS0VOLFxuICAgICAgdXNlRXhpc3Rpbmc6IENvbWJvYm94Q29tcG9uZW50LFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbWJvYm94Q29tcG9uZW50IGV4dGVuZHMgRGVjb3JhdGVkSW5wdXRCYXNlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8jcmVnaW9uIEluamVjdHNcblxuICBwcml2YXRlIHJlYWRvbmx5IF9pbnB1dCA9IGluamVjdChJTlBVVF9UT0tFTik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FuaW1hdGVkT3ZlcmxheSA9IGluamVjdDxBbmltYXRlZE92ZXJsYXlEaXJlY3RpdmU8Q29tYm9ib3hCb2R5Q29tcG9uZW50Pj4oQW5pbWF0ZWRPdmVybGF5RGlyZWN0aXZlKTtcblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gSW5wdXRzXG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnMkLnZhbHVlO1xuICB9XG4gIHNldCBvcHRpb25zKHZhbHVlOiB1bmtub3duW10pIHtcbiAgICB0aGlzLl9vcHRpb25zJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9vcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8dW5rbm93bltdPihbXSk7XG4gIHJlYWRvbmx5IG9wdGlvbnMkID0gdGhpcy5fb3B0aW9ucyQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgQElucHV0KClcbiAgZ2V0IGluaXRpYWxWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbFZhbHVlJC52YWx1ZTtcbiAgfVxuICBzZXQgaW5pdGlhbFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5faW5pdGlhbFZhbHVlJC5uZXh0KHZhbHVlKTtcblxuICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkT3B0aW9uc1ZpYUluaXRpYWxWYWx1ZSgpO1xuICB9XG4gIHByaXZhdGUgX2luaXRpYWxWYWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd24+KG51bGwpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nJC52YWx1ZTtcbiAgfVxuICBzZXQgbG9hZGluZyh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fbG9hZGluZyQubmV4dChjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpKTtcbiAgfVxuICBwcml2YXRlIF9sb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICByZWFkb25seSBsb2FkaW5nJCA9IHRoaXMuX2xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBlcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3IkLnZhbHVlO1xuICB9XG4gIHNldCBlcnJvcih2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX2Vycm9yJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd24+KG51bGwpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBwbGFjZWhvbGRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXIkLnZhbHVlO1xuICB9XG4gIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9wbGFjZWhvbGRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBtdWx0aXBsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGUkLnZhbHVlO1xuICB9XG4gIHNldCBtdWx0aXBsZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fbXVsdGlwbGUkLm5leHQoY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKSk7XG4gIH1cbiAgcHJpdmF0ZSBfbXVsdGlwbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgQElucHV0KClcbiAgZ2V0IGJpbmRMYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYmluZExhYmVsJC52YWx1ZTtcbiAgfVxuICBzZXQgYmluZExhYmVsKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fYmluZExhYmVsJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9iaW5kTGFiZWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBASW5wdXQoKVxuICBnZXQgYmluZFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9iaW5kVmFsdWUkLnZhbHVlO1xuICB9XG4gIHNldCBiaW5kVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLl9iaW5kVmFsdWUkLm5leHQodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX2JpbmRWYWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBhbGxvd0N1c3RvbVZhbHVlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dDdXN0b21WYWx1ZXMkLnZhbHVlO1xuICB9XG4gIHNldCBhbGxvd0N1c3RvbVZhbHVlcyh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fYWxsb3dDdXN0b21WYWx1ZXMkLm5leHQoY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKSk7XG4gIH1cbiAgcHJpdmF0ZSBfYWxsb3dDdXN0b21WYWx1ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIE91dHB1dHNcblxuICBAT3V0cHV0KClcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpbHRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBNZW1iZXJzXG5cbiAgcHJpdmF0ZSBnZXQgX3Jhd1NlbGVjdGVkT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zJC52YWx1ZTtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IF9yYXdTZWxlY3RlZE9wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx1bmtub3duW10+KFtdKTtcblxuICBwcml2YXRlIGdldCBfY3VycmVudEZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudEZpbHRlciQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfY3VycmVudEZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gIHByaXZhdGUgZ2V0IF9pc09wZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc01vdW50ZWQ7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfaXNPcGVuJCA9IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc01vdW50ZWQkO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBDb21wdXRlc1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FsbE9wdGlvbnMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fb3B0aW9ucyQsIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucyRdKS5waXBlKFxuICAgIG1hcCgoW29wdGlvbnMsIHJhd1NlbGVjdGVkT3B0aW9uc10pID0+IFsuLi5vcHRpb25zLCAuLi5yYXdTZWxlY3RlZE9wdGlvbnNdKSxcbiAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBleHBlY3RlZE9wdGlvblR5cGUkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5fYmluZExhYmVsJCxcbiAgICB0aGlzLl9iaW5kVmFsdWUkLFxuICAgIHRoaXMuX2FsbG93Q3VzdG9tVmFsdWVzJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtiaW5kTGFiZWwsIGJpbmRWYWx1ZSwgYWxsb3dDdXN0b21WYWx1ZXNdKSA9PiB7XG4gICAgICBjb25zdCBzaG91bGRCZU9iamVjdHMgPSBiaW5kTGFiZWwgJiYgYmluZFZhbHVlICYmICFhbGxvd0N1c3RvbVZhbHVlcztcblxuICAgICAgaWYgKHNob3VsZEJlT2JqZWN0cykge1xuICAgICAgICByZXR1cm4gQ29tYm9ib3hPcHRpb25UeXBlLk9iamVjdDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbWJvYm94T3B0aW9uVHlwZS5QcmltaXRpdmU7XG4gICAgfSksXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV4cGVjdGVkSW5wdXRWYWx1ZVR5cGUkID0gdGhpcy5fbXVsdGlwbGUkLnBpcGUoXG4gICAgbWFwKChtdWx0aXBsZSkgPT4gKG11bHRpcGxlID8gQ29tYm9ib3hJbnB1dFZhbHVlVHlwZS5BcnJheSA6IENvbWJvYm94SW5wdXRWYWx1ZVR5cGUuU2luZ2xlKSksXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkT3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLl9pbnB1dC52YWx1ZSQsXG4gICAgdGhpcy5leHBlY3RlZElucHV0VmFsdWVUeXBlJCxcbiAgICB0aGlzLl9hbGxPcHRpb25zJCxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dFZhbHVlLCBleHBlY3RlZElucHV0VmFsdWVUeXBlLCBhbGxPcHRpb25zXSkgPT4ge1xuICAgICAgaWYgKGV4cGVjdGVkSW5wdXRWYWx1ZVR5cGUgPT09IENvbWJvYm94SW5wdXRWYWx1ZVR5cGUuU2luZ2xlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0VmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZmluZE9wdGlvbkJ5VmFsdWUoaW5wdXRWYWx1ZSwgYWxsT3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIFtvcHRpb25dO1xuICAgICAgfSBlbHNlIGlmIChleHBlY3RlZElucHV0VmFsdWVUeXBlID09PSBDb21ib2JveElucHV0VmFsdWVUeXBlLkFycmF5KSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBpbnB1dFZhbHVlLm1hcCgodmFsdWUpID0+IHRoaXMuX2ZpbmRPcHRpb25CeVZhbHVlKHZhbHVlLCBhbGxPcHRpb25zKSkuZmlsdGVyKCh2KSA9PiAhIXYpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pLFxuICAgIG1hcCgob3B0aW9ucykgPT4gb3B0aW9ucy5maWx0ZXIoKHYpID0+ICEhdikpLFxuICApO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBMaWZlY3ljbGVcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fYmluZGluZ3MucHVzaCh7XG4gICAgICBhdHRyaWJ1dGU6ICdjbGFzcy5ldC1jb21ib2JveC0tbG9hZGluZycsXG4gICAgICBvYnNlcnZhYmxlOiB0aGlzLl9sb2FkaW5nJCxcbiAgICB9KTtcblxuICAgIHRoaXMuX2JpbmRpbmdzLnB1c2goe1xuICAgICAgYXR0cmlidXRlOiAnY2xhc3MuZXQtY29tYm9ib3gtLWVycm9yJyxcbiAgICAgIG9ic2VydmFibGU6IHRoaXMuX2Vycm9yJC5waXBlKG1hcCgodikgPT4gISF2KSksXG4gICAgfSk7XG5cbiAgICB0aGlzLl9iaW5kaW5ncy5wdXNoKHtcbiAgICAgIGF0dHJpYnV0ZTogJ2NsYXNzLmV0LWNvbWJvYm94LS1vcGVuJyxcbiAgICAgIG9ic2VydmFibGU6IHRoaXMuX2lzT3BlbiQsXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0RGlzcGF0Y2hGaWx0ZXJDaGFuZ2VzKCk7XG4gICAgdGhpcy5faW5pdFJlcG9zaXRpb25PblZhbHVlQ2hhbmdlcygpO1xuXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICB0aGlzLl9kZWJ1Z1ZhbGlkYXRlQ29tYm9ib3hDb25maWcoKTtcbiAgICB9XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gUHVibGljIE1ldGhvZHNcblxuICBnZXRPcHRpb25MYWJlbChvcHRpb246IHVua25vd24pIHtcbiAgICBpZiAoIXRoaXMuYmluZExhYmVsIHx8ICFpc09iamVjdChvcHRpb24pKSB7XG4gICAgICByZXR1cm4gb2Yob3B0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYmluZExhYmVsJC5waXBlKFxuICAgICAgbWFwKChsYWJlbCkgPT4ge1xuICAgICAgICBpZiAoIWxhYmVsKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICAgIHJldHVybiBnZXRPYmplY3RQcm9wZXJ0eShvcHRpb24sIGxhYmVsKSA/PyBvcHRpb247XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uOiB1bmtub3duKSB7XG4gICAgaWYgKCF0aGlzLmJpbmRWYWx1ZSB8fCAhaXNPYmplY3Qob3B0aW9uKSkge1xuICAgICAgcmV0dXJuIG9mKG9wdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2JpbmRWYWx1ZSQucGlwZShcbiAgICAgIG1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgICByZXR1cm4gZ2V0T2JqZWN0UHJvcGVydHkob3B0aW9uLCB2YWx1ZSkgPz8gb3B0aW9uO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZVNlbGVjdGVkT3B0aW9uKG9wdGlvbjogdW5rbm93bikge1xuICAgIHRoaXMuaW5wdXQuX21hcmtBc1RvdWNoZWQoKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9ucyA9IHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucztcbiAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMuX2dldE9wdGlvblZhbHVlU3luYyhvcHRpb24pO1xuXG4gICAgY29uc3QgaW5kZXggPSBzZWxlY3RlZE9wdGlvbnMuZmluZEluZGV4KCh2KSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLl9nZXRPcHRpb25WYWx1ZVN5bmModik7XG5cbiAgICAgIHJldHVybiB2YWwgPT09IG9wdGlvblZhbHVlO1xuICAgIH0pO1xuXG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgc2VsZWN0ZWRPcHRpb25zLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICB0aGlzLl9yYXdTZWxlY3RlZE9wdGlvbnMkLm5leHQoc2VsZWN0ZWRPcHRpb25zKTtcblxuICAgIHRoaXMuX3JlbW92ZU9yQ2xlYXJJbnB1dFZhbHVlKG9wdGlvblZhbHVlKTtcbiAgfVxuXG4gIG9wZW4oKSB7XG4gICAgLy8gaWYgKCF0aGlzLl9zZWxlY3RCb2R5Q29uZmlnKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5faXNPcGVuIHx8IHRoaXMuaW5wdXQuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIC8vIHRoaXMuX3NldFNlbGVjdGVkT3B0aW9uQWN0aXZlKCk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5tb3VudCh7XG4gICAgICBjb21wb25lbnQ6IENvbWJvYm94Qm9keUNvbXBvbmVudCxcbiAgICAgIG1pcnJvcldpZHRoOiB0cnVlLFxuICAgICAgLy8gZGF0YTogeyBfYm9keVRlbXBsYXRlOiB0aGlzLl9zZWxlY3RCb2R5Q29uZmlnLnRlbXBsYXRlIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoIWluc3RhbmNlKSByZXR1cm47XG5cbiAgICAvLyB0aGlzLl9zZWxlY3RCb2R5SWQkLm5leHQoaW5zdGFuY2Uuc2VsZWN0Qm9keS5pZCk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzT3BlbikgcmV0dXJuO1xuXG4gICAgdGhpcy5fYW5pbWF0ZWRPdmVybGF5LnVubW91bnQoKTtcblxuICAgIC8vIHRoaXMuX3NlbGVjdEJvZHlJZCQubmV4dChudWxsKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWVGcm9tT3B0aW9uKG9wdGlvbjogdW5rbm93bikge1xuICAgIHRoaXMuaW5wdXQuX21hcmtBc1RvdWNoZWQoKTtcblxuICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5fZ2V0T3B0aW9uVmFsdWVTeW5jKG9wdGlvbik7XG5cbiAgICBpZiAodGhpcy5fZmluZE9wdGlvbkJ5VmFsdWUob3B0aW9uVmFsdWUsIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucykpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWRPcHRpb24ob3B0aW9uKTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlT3JDbGVhcklucHV0VmFsdWUob3B0aW9uVmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0T3JBZGRUb0lucHV0VmFsdWUob3B0aW9uVmFsdWUpO1xuICAgIHRoaXMuX2FkZFNlbGVjdGVkT3B0aW9uKG9wdGlvbik7XG5cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIHRoaXMuX3NldEZpbHRlckZyb21JbnB1dFZhbHVlKCk7XG4gICAgfVxuICB9XG5cbiAgaXNPcHRpb25TZWxlY3RlZChvcHRpb246IHVua25vd24pIHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zJCwgdGhpcy5nZXRPcHRpb25WYWx1ZShvcHRpb24pXSkucGlwZShcbiAgICAgIG1hcCgoW3NlbGVjdGVkT3B0aW9ucywgdmFsdWVdKSA9PiAhIXRoaXMuX2ZpbmRPcHRpb25CeVZhbHVlKHZhbHVlLCBzZWxlY3RlZE9wdGlvbnMpKSxcbiAgICApO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFByb3RlY3RlZCBNZXRob2RzXG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NLZXlkb3duRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcbiAgICBjb25zdCBpc09wZW4gPSB0aGlzLl9pc09wZW47XG4gICAgY29uc3QgaXNNdWx0aXBsZSA9IHRoaXMubXVsdGlwbGU7XG4gICAgY29uc3QgY2FuQWRkQ3VzdG9tVmFsdWUgPSB0aGlzLmFsbG93Q3VzdG9tVmFsdWVzO1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICBjb25zdCBoYXNWYWx1ZSA9ICEhdmFsdWU7XG5cbiAgICAvLyBUaGUgdXNlciB0eXBlZCBhIGN1c3RvbSB2YWx1ZSBhbmQgcHJlc3NlZCBlbnRlci4gQWRkIGl0IHRvIHRoZSBzZWxlY3RlZCBvcHRpb25zLlxuICAgIGlmIChrZXlDb2RlID09PSBFTlRFUiAmJiBjYW5BZGRDdXN0b21WYWx1ZSAmJiBoYXNWYWx1ZSkge1xuICAgICAgLy8gRG9uJ3QgYWRkIHRoZSB2YWx1ZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy5cbiAgICAgIGlmICghdGhpcy5fZmluZE9wdGlvbkJ5VmFsdWUodmFsdWUsIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucykpIHtcbiAgICAgICAgdGhpcy5fYWRkU2VsZWN0ZWRPcHRpb24odmFsdWUpO1xuICAgICAgICB0aGlzLl9zZXRPckFkZFRvSW5wdXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUZpbHRlcignJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gRVNDQVBFKSB7XG4gICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghaXNNdWx0aXBsZSkge1xuICAgICAgICAgIHRoaXMuX3JlbW92ZU9yQ2xlYXJJbnB1dFZhbHVlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZUZpbHRlcignJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGtleUNvZGUgPT09IFRBQikge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNPcGVuKSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gRE9XTl9BUlJPVykge1xuICAgICAgLy8gVE9ETzogSW1wbGVtZW50XG4gICAgfVxuXG4gICAgaWYgKGtleUNvZGUgPT09IFVQX0FSUk9XKSB7XG4gICAgICAvLyBUT0RPOiBJbXBsZW1lbnRcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc0lucHV0RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuXG4gICAgdGhpcy5fdXBkYXRlRmlsdGVyKHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVCbHVyRXZlbnQoKSB7XG4gICAgdGhpcy5pbnB1dC5fbWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMuaW5wdXQuX3NldFNob3VsZERpc3BsYXlFcnJvcih0cnVlKTtcblxuICAgIGlmICh0aGlzLm11bHRpcGxlKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5fY3VycmVudEZpbHRlciA9PT0gJycpIHtcbiAgICAgIHRoaXMuX3JlbW92ZU9yQ2xlYXJJbnB1dFZhbHVlKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3NldEZpbHRlckZyb21JbnB1dFZhbHVlKCk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gUHJpdmF0ZSBNZXRob2RzXG5cbiAgcHJpdmF0ZSBfaW5pdERpc3BhdGNoRmlsdGVyQ2hhbmdlcygpIHtcbiAgICB0aGlzLl9jdXJyZW50RmlsdGVyJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICB0YXAoKHYpID0+IHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQodikpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFJlcG9zaXRpb25PblZhbHVlQ2hhbmdlcygpIHtcbiAgICB0aGlzLmlucHV0LnZhbHVlQ2hhbmdlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5fcmVwb3NpdGlvbigpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVNlbGVjdGVkT3B0aW9uc1ZpYUluaXRpYWxWYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsVmFsdWUgIT09IG51bGwgJiYgdGhpcy5pbml0aWFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5pbml0aWFsVmFsdWUpKSB7XG4gICAgICAgIHRoaXMuX2FkZFNlbGVjdGVkT3B0aW9ucyh0aGlzLmluaXRpYWxWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hZGRTZWxlY3RlZE9wdGlvbih0aGlzLmluaXRpYWxWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYWRkU2VsZWN0ZWRPcHRpb24ob3B0aW9uOiB1bmtub3duKSB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucyQubmV4dChbLi4udGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zLCBvcHRpb25dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zJC5uZXh0KFtvcHRpb25dKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hZGRTZWxlY3RlZE9wdGlvbnMob3B0aW9uczogdW5rbm93bltdKSB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmF3U2VsZWN0ZWRPcHRpb25zJC5uZXh0KFsuLi50aGlzLl9yYXdTZWxlY3RlZE9wdGlvbnMsIC4uLm9wdGlvbnNdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRPcHRpb25CeVZhbHVlKHZhbHVlOiB1bmtub3duLCBhbGxPcHRpb25zOiB1bmtub3duW10pIHtcbiAgICBjb25zdCBvcHRpb24gPSBhbGxPcHRpb25zLmZpbmQoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbikgJiYgdGhpcy5iaW5kVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGdldE9iamVjdFByb3BlcnR5KG9wdGlvbiwgdGhpcy5iaW5kVmFsdWUpID09PSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9wdGlvbiA9PT0gdmFsdWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb3B0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0T3JBZGRUb0lucHV0VmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5faW5wdXQudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuX2lucHV0Ll91cGRhdGVWYWx1ZShbLi4udGhpcy5faW5wdXQudmFsdWUsIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbnB1dC5fdXBkYXRlVmFsdWUoW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lucHV0Ll91cGRhdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlT3JDbGVhcklucHV0VmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5faW5wdXQudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuX2lucHV0Ll91cGRhdGVWYWx1ZSh0aGlzLl9pbnB1dC52YWx1ZS5maWx0ZXIoKHYpID0+IHYgIT09IHZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbnB1dC5fdXBkYXRlVmFsdWUoW10pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pbnB1dC5fdXBkYXRlVmFsdWUobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlRmlsdGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pbnB1dC5uYXRpdmVJbnB1dFJlZiAmJiB0aGlzLmlucHV0Lm5hdGl2ZUlucHV0UmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuaW5wdXQubmF0aXZlSW5wdXRSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRGaWx0ZXIgPT09IHZhbHVlKSByZXR1cm47XG5cbiAgICB0aGlzLl9jdXJyZW50RmlsdGVyJC5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE9wdGlvblZhbHVlU3luYyhvcHRpb246IHVua25vd24pIHtcbiAgICBpZiAoIXRoaXMuYmluZFZhbHVlIHx8ICFpc09iamVjdChvcHRpb24pKSB7XG4gICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRPYmplY3RQcm9wZXJ0eShvcHRpb24sIHRoaXMuYmluZFZhbHVlKSA/PyBvcHRpb247XG4gIH1cblxuICBwcml2YXRlIF9nZXRPcHRpb25MYWJlbFN5bmMob3B0aW9uOiB1bmtub3duKSB7XG4gICAgaWYgKCF0aGlzLmJpbmRMYWJlbCB8fCAhaXNPYmplY3Qob3B0aW9uKSkge1xuICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0T2JqZWN0UHJvcGVydHkob3B0aW9uLCB0aGlzLmJpbmRMYWJlbCkgPz8gb3B0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0RmlsdGVyRnJvbUlucHV0VmFsdWUoKSB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHJldHVybjtcblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbnB1dC52YWx1ZTtcblxuICAgIGlmICghdmFsdWUgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUZpbHRlcignJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZmluZE9wdGlvbkJ5VmFsdWUodmFsdWUsIHRoaXMuX3Jhd1NlbGVjdGVkT3B0aW9ucyk7XG5cbiAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLl9nZXRPcHRpb25MYWJlbFN5bmMob3B0aW9uKTtcblxuICAgIGlmICh0eXBlb2YgbGFiZWwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICB0aGlzLl91cGRhdGVGaWx0ZXIobGFiZWwpO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIERldiBtb2RlXG5cbiAgcHJpdmF0ZSBfZGVidWdWYWxpZGF0ZUNvbWJvYm94Q29uZmlnKGlzUmV0cnkgPSBmYWxzZSkge1xuICAgIHRoaXMuZXhwZWN0ZWRPcHRpb25UeXBlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHNraXAoaXNSZXRyeSA/IDEgOiAwKSwgLy8gU2tpcCBpZiByZXRyeWluZyB0byBhdm9pZCBpbmZpbml0ZSBsb29wXG4gICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgdGFwKChleHBlY3RlZE9wdGlvblR5cGUpID0+IHtcbiAgICAgICAgICBpZiAoaXNFbXB0eUFycmF5KHRoaXMub3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRPcHRpb25UeXBlID09PSBDb21ib2JveE9wdGlvblR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIWlzT2JqZWN0QXJyYXkodGhpcy5vcHRpb25zKSkge1xuICAgICAgICAgICAgICB0aHJvdyBjb21ib2JveEVycm9yKDEsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChleHBlY3RlZE9wdGlvblR5cGUgPT09IENvbWJvYm94T3B0aW9uVHlwZS5QcmltaXRpdmUpIHtcbiAgICAgICAgICAgIGlmICghaXNQcmltaXRpdmVBcnJheSh0aGlzLm9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgIHRocm93IGNvbWJvYm94RXJyb3IoMiwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZGVidWdWYWxpZGF0ZUNvbWJvYm94Q29uZmlnKHRydWUpO1xuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGUpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxufVxuIiwiPCEtLSBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cbjwhLS0gZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL3VzZS10cmFjay1ieS1mdW5jdGlvbiAtLT5cbjxuZy1jb250ZW50IHNlbGVjdD1cIltldElucHV0UHJlZml4XVwiIC8+XG5cbjxkaXYgY2xhc3M9XCJldC1jb21ib2JveC13cmFwcGVyXCI+XG4gIDx1bCAqbmdJZj1cIm11bHRpcGxlXCIgY2xhc3M9XCJldC1jb21ib2JveC1zZWxlY3RlZC1vcHRpb25zXCI+XG4gICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNlbGVjdGVkT3B0aW9ucyQgfCBhc3luY1wiIGNsYXNzPVwiZXQtY29tYm9ib3gtc2VsZWN0ZWQtb3B0aW9uXCI+XG4gICAgICB7eyBnZXRPcHRpb25MYWJlbChpdGVtKSB8IGFzeW5jIH19XG4gICAgICA8c3BhbiAoY2xpY2spPVwicmVtb3ZlU2VsZWN0ZWRPcHRpb24oaXRlbSlcIiBjbGFzcz1cImV0LWNvbWJvYm94LXNlbGVjdGVkLW9wdGlvbi1yZW1vdmVcIiB0YWJpbmRleD1cIi0xXCI+IHggPC9zcGFuPlxuICAgIDwvbGk+XG4gIDwvdWw+XG5cbiAgPGlucHV0XG4gICAgKGtleWRvd24pPVwicHJvY2Vzc0tleWRvd25FdmVudCgkZXZlbnQpXCJcbiAgICAoY2xpY2spPVwib3BlbigpXCJcbiAgICAoYmx1cik9XCJoYW5kbGVCbHVyRXZlbnQoKVwiXG4gICAgKGlucHV0KT1cInByb2Nlc3NJbnB1dEV2ZW50KCRldmVudClcIlxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICBldE5hdGl2ZUlucHV0UmVmXG4gIC8+XG5cbiAgPGV0LWNoZXZyb24taWNvbiBjbGFzcz1cImV0LWNvbWJvYm94LWNoZXZyb25cIiAvPlxuPC9kaXY+XG5cbjxuZy1jb250ZW50IHNlbGVjdD1cIltldElucHV0U3VmZml4XVwiIC8+XG5cbjxuZy10ZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgLz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
486
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jZGsvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm1zL2NvbXBvbmVudHMvc2VsZWN0L2NvbXBvbmVudHMvY29tYm9ib3gvY29tcG9uZW50cy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvY29tcG9uZW50cy9zZWxlY3QvY29tcG9uZW50cy9jb21ib2JveC9jb21wb25lbnRzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQ0wsQ0FBQyxFQUNELFVBQVUsRUFDVixHQUFHLEVBQ0gsS0FBSyxFQUNMLE1BQU0sRUFDTixJQUFJLEVBQ0osU0FBUyxFQUNULE9BQU8sRUFDUCxLQUFLLEVBQ0wsR0FBRyxFQUNILFFBQVEsR0FDVCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixjQUFjLEVBQ2QsS0FBSyxFQUVMLE1BQU0sRUFDTixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckcsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsYUFBYSxF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QURYLEtBQUs7Z0JBTUYsU0FBUztzQkFEWixLQUFLO2dCQU1GLFNBQVM7c0JBRFosS0FBSztnQkFNRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBY2EsWUFBWTtzQkFEOUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7XG4gIEEsXG4gIERPV05fQVJST1csXG4gIEVORCxcbiAgRU5URVIsXG4gIEVTQ0FQRSxcbiAgSE9NRSxcbiAgUEFHRV9ET1dOLFxuICBQQUdFX1VQLFxuICBTUEFDRSxcbiAgVEFCLFxuICBVUF9BUlJPVyxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgaW5qZWN0LFxuICBpc0Rldk1vZGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQW5pbWF0ZWRPdmVybGF5RGlyZWN0aXZlLCBMZXREaXJlY3RpdmUsIFJ1bnRpbWVFcnJvciwgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAZXRobGV0ZS9jb3JlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY2F0Y2hFcnJvcixcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgbWFwLFxuICBza2lwLFxuICBza2lwV2hpbGUsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxuICB0aHJvd0Vycm9yLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENoZXZyb25JY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vLi4vaWNvbnMnO1xuaW1wb3J0IHsgSU5QVVRfVE9LRU4sIElucHV0RGlyZWN0aXZlLCBOYXRpdmVJbnB1dFJlZkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL2RpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgRGVjb3JhdGVkSW5wdXRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgU0VMRUNUX0ZJRUxEX1RPS0VOIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBDb21ib2JveEJvZHlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wYXJ0aWFscyc7XG5cbmNvbnN0IENPTUJPQk9YX0VSUk9SUyA9IHtcbiAgMTogJ0V4cGVjdGVkIG9wdGlvbnMgdG8gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cy4gVGhpcyBpcyBkdWUgdG8gXCJiaW5kTGFiZWxcIiBhbmQgXCJiaW5kVmFsdWVcIiBiZWluZyBzZXQuJyxcbiAgMjogJ0V4cGVjdGVkIG9wdGlvbnMgdG8gYmUgYW4gYXJyYXkgb2YgcHJpbWl0aXZlcy4gVGhpcyBpcyBkdWUgdG8gXCJiaW5kTGFiZWxcIiBhbmQgXCJiaW5kVmFsdWVcIiBub3QgYmVpbmcgc2V0IG9yIFwiYWxsb3dDdXN0b21WYWx1ZXNcIiBiZWluZyBzZXQgdG8gdHJ1ZS4nLFxufSBhcyBjb25zdDtcblxuY29uc3QgY29tYm9ib3hFcnJvciA9IChjb2RlOiBrZXlvZiB0eXBlb2YgQ09NQk9CT1hfRVJST1JTLCBkYXRhOiB1bmtub3duKSA9PiB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgPGV0LWNvbWJvYm94PjogJHtDT01CT0JPWF9FUlJPUlNbY29kZV19YDtcblxuICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpO1xufTtcblxuY29uc3QgaXNQcmltaXRpdmVBcnJheSA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEFycmF5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+ID0+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGZpcnN0ID0gdmFsdWVbMF07XG4gIGNvbnN0IGxhc3QgPSB2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXTtcblxuICBpZiAoIWZpcnN0IHx8ICFsYXN0KSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHR5cGVvZiBmaXJzdCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGxhc3QgIT09ICdvYmplY3QnO1xufTtcblxuY29uc3QgaXNPYmplY3RBcnJheSA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBmaXJzdCA9IHZhbHVlWzBdO1xuICBjb25zdCBsYXN0ID0gdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV07XG5cbiAgaWYgKCFmaXJzdCB8fCAhbGFzdCkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0eXBlb2YgZmlyc3QgPT09ICdvYmplY3QnICYmIHR5cGVvZiBsYXN0ID09PSAnb2JqZWN0Jztcbn07XG5cbmNvbnN0IGlzRW1wdHlBcnJheSA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFtdID0+IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMDtcbn07XG5cbmNvbnN0IENvbWJvYm94T3B0aW9uVHlwZSA9IHtcbiAgUHJpbWl0aXZlOiAncHJpbWl0aXZlJyxcbiAgT2JqZWN0OiAnb2JqZWN0Jyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBDT01CT0JPWF9UT0tFTiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxDb21ib2JveENvbXBvbmVudD4oJ0VUX0NPTUJPQk9YX1RPS0VOJyk7XG5cbmludGVyZmFjZSBLZXlIYW5kbGVyUmVzdWx0IHtcbiAgc2V0RmlsdGVyPzogc3RyaW5nO1xuICBvdmVybGF5T3BlcmF0aW9uPzogJ29wZW4nIHwgJ2Nsb3NlJztcbiAgb3B0aW9uQWN0aW9uPzpcbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2FkZCc7XG4gICAgICAgIG9wdGlvbjogdW5rbm93bjtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3JlbW92ZSc7XG4gICAgICAgIG9wdGlvbjogdW5rbm93bjtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3RvZ2dsZSc7XG4gICAgICAgIG9wdGlvbjogdW5rbm93bjtcbiAgICAgIH1cbiAgICB8ICdjbGVhcidcbiAgICB8ICd0b2dnbGVBbGwnO1xuICBmb2N1c0FjdGlvbj86ICdmaXJzdCcgfCAnbGFzdCcgfCAnbmV4dCcgfCAncHJldmlvdXMnIHwgeyB0eXBlOiAnb2Zmc2V0Jzsgb2Zmc2V0OiBudW1iZXIgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZXQtY29tYm9ib3gnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tYm9ib3guY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21ib2JveC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnZXQtY29tYm9ib3gnLFxuICB9LFxuICBpbXBvcnRzOiBbTmdJZiwgTmF0aXZlSW5wdXRSZWZEaXJlY3RpdmUsIEFzeW5jUGlwZSwgQ2hldnJvbkljb25Db21wb25lbnQsIExldERpcmVjdGl2ZSwgTmdGb3JdLFxuICBob3N0RGlyZWN0aXZlczogW3sgZGlyZWN0aXZlOiBJbnB1dERpcmVjdGl2ZSB9LCBBbmltYXRlZE92ZXJsYXlEaXJlY3RpdmVdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBDT01CT0JPWF9UT0tFTixcbiAgICAgIHVzZUV4aXN0aW5nOiBDb21ib2JveENvbXBvbmVudCxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb21ib2JveENvbXBvbmVudCBleHRlbmRzIERlY29yYXRlZElucHV0QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vI3JlZ2lvbiBJbmplY3RzXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfaW5wdXQgPSBpbmplY3QoSU5QVVRfVE9LRU4pO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hbmltYXRlZE92ZXJsYXkgPSBpbmplY3Q8QW5pbWF0ZWRPdmVybGF5RGlyZWN0aXZlPENvbWJvYm94Qm9keUNvbXBvbmVudD4+KEFuaW1hdGVkT3ZlcmxheURpcmVjdGl2ZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlbGVjdEZpZWxkID0gaW5qZWN0KFNFTEVDVF9GSUVMRF9UT0tFTik7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIElucHV0c1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIGdldCBvcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5nZXRGaWx0ZXJlZE9wdGlvbnMoKTtcbiAgfVxuICBzZXQgb3B0aW9ucyh2YWx1ZTogdW5rbm93bltdKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2V0T3B0aW9ucyh2YWx1ZSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgaW5pdGlhbFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uKHZhbHVlKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGdldCBmaWx0ZXJJbnRlcm5hbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVySW50ZXJuYWwkLnZhbHVlO1xuICB9XG4gIHNldCBmaWx0ZXJJbnRlcm5hbCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgY29uc3QgdmFsID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB0aGlzLl9maWx0ZXJJbnRlcm5hbCQubmV4dCh2YWwpO1xuXG4gICAgaWYgKCF2YWwpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNldEZpbHRlcignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNldEZpbHRlcih0aGlzLl9jdXJyZW50RmlsdGVyKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfZmlsdGVySW50ZXJuYWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcblxuICBASW5wdXQoKVxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbG9hZGluZyQudmFsdWU7XG4gIH1cbiAgc2V0IGxvYWRpbmcodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2xvYWRpbmckLm5leHQoY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKSk7XG4gIH1cbiAgcHJpdmF0ZSBfbG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcmVhZG9ubHkgbG9hZGluZyQgPSB0aGlzLl9sb2FkaW5nJC5hc09ic2VydmFibGUoKTtcblxuICBASW5wdXQoKVxuICBnZXQgZXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Vycm9yJC52YWx1ZTtcbiAgfVxuICBzZXQgZXJyb3IodmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9lcnJvciQubmV4dCh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfZXJyb3IkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx1bmtub3duPihudWxsKTtcblxuICBASW5wdXQoKVxuICBnZXQgcGxhY2Vob2xkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyJC52YWx1ZTtcbiAgfVxuICBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLl9wbGFjZWhvbGRlciQubmV4dCh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfcGxhY2Vob2xkZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBASW5wdXQoKVxuICBzZXQgbXVsdGlwbGUodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNldEFsbG93TXVsdGlwbGUoY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgYmluZExhYmVsKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2V0TGFiZWxCaW5kaW5nKHZhbHVlKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBiaW5kVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZXRWYWx1ZUJpbmRpbmcodmFsdWUpO1xuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IGFsbG93Q3VzdG9tVmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hbGxvd0N1c3RvbVZhbHVlcyQudmFsdWU7XG4gIH1cbiAgc2V0IGFsbG93Q3VzdG9tVmFsdWVzKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9hbGxvd0N1c3RvbVZhbHVlcyQubmV4dChjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpKTtcbiAgfVxuICBwcml2YXRlIF9hbGxvd0N1c3RvbVZhbHVlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gT3V0cHV0c1xuXG4gIEBPdXRwdXQoKVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIE1lbWJlcnNcblxuICBwcml2YXRlIGdldCBfY3VycmVudEZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudEZpbHRlciQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfY3VycmVudEZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gIHByaXZhdGUgZ2V0IF9pc09wZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc01vdW50ZWQ7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfaXNPcGVuJCA9IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc01vdW50ZWQkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsKCk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRPcHRpb25zJCA9IHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGlvbiQ7XG4gIHJlYWRvbmx5IG11bHRpcGxlJCA9IHRoaXMuX3NlbGVjdGlvbk1vZGVsLmFsbG93TXVsdGlwbGUkO1xuICByZWFkb25seSBvcHRpb25zJCA9IHRoaXMuX3NlbGVjdGlvbk1vZGVsLmZpbHRlcmVkT3B0aW9ucyQ7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIENvbXB1dGVzXG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIExpZmVjeWNsZVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9iaW5kaW5ncy5wdXNoKHtcbiAgICAgIGF0dHJpYnV0ZTogJ2NsYXNzLmV0LWNvbWJvYm94LS1sb2FkaW5nJyxcbiAgICAgIG9ic2VydmFibGU6IHRoaXMuX2xvYWRpbmckLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fYmluZGluZ3MucHVzaCh7XG4gICAgICBhdHRyaWJ1dGU6ICdjbGFzcy5ldC1jb21ib2JveC0tZXJyb3InLFxuICAgICAgb2JzZXJ2YWJsZTogdGhpcy5fZXJyb3IkLnBpcGUobWFwKCh2KSA9PiAhIXYpKSxcbiAgICB9KTtcblxuICAgIHRoaXMuX2JpbmRpbmdzLnB1c2goe1xuICAgICAgYXR0cmlidXRlOiAnY2xhc3MuZXQtY29tYm9ib3gtLW9wZW4nLFxuICAgICAgb2JzZXJ2YWJsZTogdGhpcy5faXNPcGVuJCxcbiAgICB9KTtcblxuICAgIHRoaXMuX3NlbGVjdEZpZWxkLl9iaW5kaW5ncy5wdXNoKHtcbiAgICAgIGF0dHJpYnV0ZTogJ2NsYXNzLmV0LXNlbGVjdC1maWVsZC0tb3BlbicsXG4gICAgICBvYnNlcnZhYmxlOiB0aGlzLl9pc09wZW4kLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5faW5pdERpc3BhdGNoRmlsdGVyQ2hhbmdlcygpO1xuICAgIHRoaXMuX2luaXRSZXBvc2l0aW9uT25WYWx1ZUNoYW5nZXMoKTtcblxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgdGhpcy5fZGVidWdWYWxpZGF0ZUNvbWJvYm94Q29uZmlnKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwudmFsdWUkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgdGFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuX2lucHV0Ll91cGRhdGVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgdGhpcy5fc2V0RmlsdGVyRnJvbUlucHV0VmFsdWUoKTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gUHVibGljIE1ldGhvZHNcblxuICBnZXRPcHRpb25MYWJlbChvcHRpb246IHVua25vd24pIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWwuZ2V0TGFiZWwkKG9wdGlvbik7XG4gIH1cblxuICBnZXRPcHRpb25WYWx1ZShvcHRpb246IHVua25vd24pIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWwuZ2V0VmFsdWUkKG9wdGlvbik7XG4gIH1cblxuICByZW1vdmVTZWxlY3RlZE9wdGlvbihvcHRpb246IHVua25vd24pIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5yZW1vdmVTZWxlY3RlZE9wdGlvbihvcHRpb24pO1xuXG4gICAgdGhpcy5pbnB1dC5fbWFya0FzVG91Y2hlZCgpO1xuICB9XG5cbiAgb3BlbigpIHtcbiAgICAvLyBpZiAoIXRoaXMuX3NlbGVjdEJvZHlDb25maWcpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl9pc09wZW4gfHwgdGhpcy5pbnB1dC5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgLy8gdGhpcy5fc2V0U2VsZWN0ZWRPcHRpb25BY3RpdmUoKTtcblxuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5fYW5pbWF0ZWRPdmVybGF5Lm1vdW50KHtcbiAgICAgIGNvbXBvbmVudDogQ29tYm9ib3hCb2R5Q29tcG9uZW50LFxuICAgICAgbWlycm9yV2lkdGg6IHRydWUsXG4gICAgICAvLyBkYXRhOiB7IF9ib2R5VGVtcGxhdGU6IHRoaXMuX3NlbGVjdEJvZHlDb25maWcudGVtcGxhdGUgfSxcbiAgICB9KTtcblxuICAgIGlmICghaW5zdGFuY2UpIHJldHVybjtcblxuICAgIC8vIHRoaXMuX3NlbGVjdEJvZHlJZCQubmV4dChpbnN0YW5jZS5zZWxlY3RCb2R5LmlkKTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIGlmICghdGhpcy5faXNPcGVuKSByZXR1cm47XG5cbiAgICB0aGlzLl9hbmltYXRlZE92ZXJsYXkudW5tb3VudCgpO1xuXG4gICAgLy8gdGhpcy5fc2VsZWN0Qm9keUlkJC5uZXh0KG51bGwpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZUZyb21PcHRpb24ob3B0aW9uOiB1bmtub3duKSB7XG4gICAgdGhpcy5pbnB1dC5fbWFya0FzVG91Y2hlZCgpO1xuXG4gICAgaWYgKHRoaXMuX3NlbGVjdGlvbk1vZGVsLmFsbG93TXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnRvZ2dsZVNlbGVjdGVkT3B0aW9uKG9wdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGVkT3B0aW9uKG9wdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zZWxlY3Rpb25Nb2RlbC5hbGxvd011bHRpcGxlKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB0aGlzLl9zZXRGaWx0ZXJGcm9tSW5wdXRWYWx1ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uOiB1bmtub3duKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQkKG9wdGlvbik7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gUHJvdGVjdGVkIE1ldGhvZHNcblxuICBwcm90ZWN0ZWQgcHJvY2Vzc0tleWRvd25FdmVudChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgIGNvbnN0IGlzT3BlbiA9IHRoaXMuX2lzT3BlbjtcbiAgICBjb25zdCBpc011bHRpcGxlID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwuYWxsb3dNdWx0aXBsZTtcbiAgICBjb25zdCBjYW5BZGRDdXN0b21WYWx1ZSA9IHRoaXMuYWxsb3dDdXN0b21WYWx1ZXM7XG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIGNvbnN0IGhhc0ZpbHRlclZhbHVlID0gISF2YWx1ZTtcblxuICAgIGNvbnN0IHJlc3VsdDogS2V5SGFuZGxlclJlc3VsdCA9IHt9O1xuXG4gICAgLy8gVGhlIHVzZXIgdHlwZWQgYSBjdXN0b20gdmFsdWUgYW5kIHByZXNzZWQgZW50ZXIuIEFkZCBpdCB0byB0aGUgc2VsZWN0ZWQgb3B0aW9ucy5cbiAgICBpZiAoa2V5Q29kZSA9PT0gRU5URVIpIHtcbiAgICAgIGlmIChjYW5BZGRDdXN0b21WYWx1ZSAmJiBoYXNGaWx0ZXJWYWx1ZSkge1xuICAgICAgICByZXN1bHQub3B0aW9uQWN0aW9uID0geyB0eXBlOiAnYWRkJywgb3B0aW9uOiB2YWx1ZSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzTXVsdGlwbGUpIHtcbiAgICAgICAgICAvLyBUT0RPOiBUb2dnbGUgdGhlIGZvY3VzZWQgb3B0aW9uXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVE9ETzogU2VsZWN0IHRoZSBmb2N1c2VkIG9wdGlvblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc011bHRpcGxlKSB7XG4gICAgICAgIHJlc3VsdC5zZXRGaWx0ZXIgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5vdmVybGF5T3BlcmF0aW9uID0gJ2Nsb3NlJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2ludGVycHJldEtleUhhbmRsZXJSZXN1bHQocmVzdWx0KTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gU1BBQ0UpIHtcbiAgICAgIGlmIChpc011bHRpcGxlKSB7XG4gICAgICAgIHJlc3VsdC5zZXRGaWx0ZXIgPSAnJztcbiAgICAgICAgLy8gVE9ETzogVG9nZ2xlIHRoZSBmb2N1c2VkIG9wdGlvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0Lm92ZXJsYXlPcGVyYXRpb24gPSAnY2xvc2UnO1xuICAgICAgICAvLyBUT0RPOiBTZWxlY3QgdGhlIGZvY3VzZWQgb3B0aW9uXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9pbnRlcnByZXRLZXlIYW5kbGVyUmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgaWYgKGtleUNvZGUgPT09IEVTQ0FQRSkge1xuICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICByZXN1bHQub3ZlcmxheU9wZXJhdGlvbiA9ICdjbG9zZSc7XG4gICAgICB9IGVsc2UgaWYgKCFpc011bHRpcGxlKSB7XG4gICAgICAgIHJlc3VsdC5zZXRGaWx0ZXIgPSAnJztcbiAgICAgICAgcmVzdWx0Lm9wdGlvbkFjdGlvbiA9ICdjbGVhcic7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9pbnRlcnByZXRLZXlIYW5kbGVyUmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgaWYgKGtleUNvZGUgPT09IFRBQikge1xuICAgICAgcmVzdWx0Lm92ZXJsYXlPcGVyYXRpb24gPSAnY2xvc2UnO1xuICAgICAgcmV0dXJuIHRoaXMuX2ludGVycHJldEtleUhhbmRsZXJSZXN1bHQocmVzdWx0KTtcbiAgICB9XG5cbiAgICBpZiAoIWlzT3Blbikge1xuICAgICAgcmVzdWx0Lm92ZXJsYXlPcGVyYXRpb24gPSAnb3Blbic7XG4gICAgfVxuXG4gICAgaWYgKGtleUNvZGUgPT09IERPV05fQVJST1cpIHtcbiAgICAgIHJlc3VsdC5mb2N1c0FjdGlvbiA9ICduZXh0JztcbiAgICB9XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gVVBfQVJST1cpIHtcbiAgICAgIHJlc3VsdC5mb2N1c0FjdGlvbiA9ICdwcmV2aW91cyc7XG4gICAgfVxuXG4gICAgaWYgKGtleUNvZGUgPT09IFBBR0VfVVApIHtcbiAgICAgIHJlc3VsdC5mb2N1c0FjdGlvbiA9IHsgdHlwZTogJ29mZnNldCcsIG9mZnNldDogLTEwIH07XG4gICAgfVxuXG4gICAgaWYgKGtleUNvZGUgPT09IFBBR0VfRE9XTikge1xuICAgICAgcmVzdWx0LmZvY3VzQWN0aW9uID0geyB0eXBlOiAnb2Zmc2V0Jywgb2Zmc2V0OiAxMCB9O1xuICAgIH1cblxuICAgIGlmIChrZXlDb2RlID09PSBIT01FKSB7XG4gICAgICByZXN1bHQuZm9jdXNBY3Rpb24gPSAnZmlyc3QnO1xuICAgIH1cblxuICAgIGlmIChrZXlDb2RlID09PSBFTkQpIHtcbiAgICAgIHJlc3VsdC5mb2N1c0FjdGlvbiA9ICdsYXN0JztcbiAgICB9XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gQSAmJiBldmVudC5jdHJsS2V5ICYmIGlzTXVsdGlwbGUpIHtcbiAgICAgIHJlc3VsdC5vcHRpb25BY3Rpb24gPSAndG9nZ2xlQWxsJztcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2ludGVycHJldEtleUhhbmRsZXJSZXN1bHQocmVzdWx0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzSW5wdXRFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG5cbiAgICB0aGlzLl91cGRhdGVGaWx0ZXIodmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUJsdXJFdmVudCgpIHtcbiAgICB0aGlzLmlucHV0Ll9tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5pbnB1dC5fc2V0U2hvdWxkRGlzcGxheUVycm9yKHRydWUpO1xuXG4gICAgaWYgKHRoaXMuX3NlbGVjdGlvbk1vZGVsLmFsbG93TXVsdGlwbGUpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl9jdXJyZW50RmlsdGVyID09PSAnJykge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXJTZWxlY3RlZE9wdGlvbnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRGaWx0ZXJGcm9tSW5wdXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFByaXZhdGUgTWV0aG9kc1xuXG4gIHByaXZhdGUgX2luaXREaXNwYXRjaEZpbHRlckNoYW5nZXMoKSB7XG4gICAgdGhpcy5fY3VycmVudEZpbHRlciRcbiAgICAgIC5waXBlKFxuICAgICAgICBza2lwV2hpbGUoKCkgPT4gdGhpcy5maWx0ZXJJbnRlcm5hbCksXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICB0YXAoKHYpID0+IHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQodikpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFJlcG9zaXRpb25PblZhbHVlQ2hhbmdlcygpIHtcbiAgICB0aGlzLmlucHV0LnZhbHVlQ2hhbmdlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5fcmVwb3NpdGlvbigpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUZpbHRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaW5wdXQubmF0aXZlSW5wdXRSZWYgJiYgdGhpcy5pbnB1dC5uYXRpdmVJbnB1dFJlZi5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLmlucHV0Lm5hdGl2ZUlucHV0UmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jdXJyZW50RmlsdGVyID09PSB2YWx1ZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fY3VycmVudEZpbHRlciQubmV4dCh2YWx1ZSk7XG5cbiAgICBpZiAodGhpcy5maWx0ZXJJbnRlcm5hbCkge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2V0RmlsdGVyKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRGaWx0ZXJGcm9tSW5wdXRWYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5fc2VsZWN0aW9uTW9kZWwuYWxsb3dNdWx0aXBsZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmlucHV0LnZhbHVlO1xuXG4gICAgaWYgKCF2YWx1ZSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdGhpcy5fdXBkYXRlRmlsdGVyKCcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5nZXRPcHRpb25CeVZhbHVlKHZhbHVlKTtcblxuICAgIGlmICghb3B0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuX3NlbGVjdGlvbk1vZGVsLmdldExhYmVsKG9wdGlvbik7XG5cbiAgICBpZiAodHlwZW9mIGxhYmVsICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgdGhpcy5fdXBkYXRlRmlsdGVyKGxhYmVsKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ludGVycHJldEtleUhhbmRsZXJSZXN1bHQocmVzdWx0OiBLZXlIYW5kbGVyUmVzdWx0KSB7XG4gICAgaWYgKHJlc3VsdC5vdmVybGF5T3BlcmF0aW9uID09PSAnY2xvc2UnKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfSBlbHNlIGlmIChyZXN1bHQub3ZlcmxheU9wZXJhdGlvbiA9PT0gJ29wZW4nKSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LnNldEZpbHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl91cGRhdGVGaWx0ZXIocmVzdWx0LnNldEZpbHRlcik7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5vcHRpb25BY3Rpb24pIHtcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0Lm9wdGlvbkFjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHJlc3VsdC5vcHRpb25BY3Rpb24gPT09ICdjbGVhcicpIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhclNlbGVjdGVkT3B0aW9ucygpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5vcHRpb25BY3Rpb24gPT09ICd0b2dnbGVBbGwnKSB7XG4gICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwudG9nZ2xlQWxsU2VsZWN0ZWRPcHRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSwgb3B0aW9uIH0gPSByZXN1bHQub3B0aW9uQWN0aW9uO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnYWRkJykge1xuICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGVkT3B0aW9uKG9wdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSA9PT0gJ3JlbW92ZScpIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5yZW1vdmVTZWxlY3RlZE9wdGlvbihvcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICd0b2dnbGUnKSB7XG4gICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwudG9nZ2xlU2VsZWN0ZWRPcHRpb24ob3B0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXN1bHQuZm9jdXNBY3Rpb24pIHtcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0LmZvY3VzQWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAocmVzdWx0LmZvY3VzQWN0aW9uID09PSAnZmlyc3QnKSB7XG4gICAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0LmZvY3VzQWN0aW9uID09PSAnbGFzdCcpIHtcbiAgICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQuZm9jdXNBY3Rpb24gPT09ICduZXh0Jykge1xuICAgICAgICAgIC8vIFRPRE86IEltcGxlbWVudFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdC5mb2N1c0FjdGlvbiA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgICAgIC8vIFRPRE86IEltcGxlbWVudFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IHR5cGUgfSA9IHJlc3VsdC5mb2N1c0FjdGlvbjtcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ29mZnNldCcpIHtcbiAgICAgICAgICBjb25zdCB7IG9mZnNldCB9ID0gcmVzdWx0LmZvY3VzQWN0aW9uO1xuXG4gICAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gRGV2IG1vZGVcblxuICBwcml2YXRlIF9kZWJ1Z1ZhbGlkYXRlQ29tYm9ib3hDb25maWcoaXNSZXRyeSA9IGZhbHNlKSB7XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5fc2VsZWN0aW9uTW9kZWwubGFiZWxCaW5kaW5nJCwgdGhpcy5fc2VsZWN0aW9uTW9kZWwudmFsdWVCaW5kaW5nJCwgdGhpcy5fYWxsb3dDdXN0b21WYWx1ZXMkXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBza2lwKGlzUmV0cnkgPyAxIDogMCksIC8vIFNraXAgaWYgcmV0cnlpbmcgdG8gYXZvaWQgaW5maW5pdGUgbG9vcFxuICAgICAgICBkZWJvdW5jZVRpbWUoMCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIG1hcCgoW2JpbmRMYWJlbCwgYmluZFZhbHVlLCBhbGxvd0N1c3RvbVZhbHVlc10pID0+IHtcbiAgICAgICAgICBjb25zdCBzaG91bGRCZU9iamVjdHMgPSBiaW5kTGFiZWwgJiYgYmluZFZhbHVlICYmICFhbGxvd0N1c3RvbVZhbHVlcztcblxuICAgICAgICAgIGlmIChzaG91bGRCZU9iamVjdHMpIHtcbiAgICAgICAgICAgIHJldHVybiBDb21ib2JveE9wdGlvblR5cGUuT2JqZWN0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBDb21ib2JveE9wdGlvblR5cGUuUHJpbWl0aXZlO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKChleHBlY3RlZE9wdGlvblR5cGUpID0+IHtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwub3B0aW9ucztcblxuICAgICAgICAgIGlmIChpc0VtcHR5QXJyYXkob3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRPcHRpb25UeXBlID09PSBDb21ib2JveE9wdGlvblR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIWlzT2JqZWN0QXJyYXkob3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgdGhyb3cgY29tYm9ib3hFcnJvcigxLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkT3B0aW9uVHlwZSA9PT0gQ29tYm9ib3hPcHRpb25UeXBlLlByaW1pdGl2ZSkge1xuICAgICAgICAgICAgaWYgKCFpc1ByaW1pdGl2ZUFycmF5KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgIHRocm93IGNvbWJvYm94RXJyb3IoMiwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZSkgPT4ge1xuICAgICAgICAgIHRoaXMuX2RlYnVnVmFsaWRhdGVDb21ib2JveENvbmZpZyh0cnVlKTtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlKTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cbn1cbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL2NsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgLS0+XG48IS0tIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC90ZW1wbGF0ZS91c2UtdHJhY2stYnktZnVuY3Rpb24gLS0+XG48bmctY29udGVudCBzZWxlY3Q9XCJbZXRJbnB1dFByZWZpeF1cIiAvPlxuXG48ZGl2IGNsYXNzPVwiZXQtY29tYm9ib3gtd3JhcHBlclwiPlxuICA8dWwgKm5nSWY9XCJtdWx0aXBsZSQgfCBhc3luY1wiIGNsYXNzPVwiZXQtY29tYm9ib3gtc2VsZWN0ZWQtb3B0aW9uc1wiPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWxlY3RlZE9wdGlvbnMkIHwgYXN5bmNcIiBjbGFzcz1cImV0LWNvbWJvYm94LXNlbGVjdGVkLW9wdGlvblwiPlxuICAgICAge3sgZ2V0T3B0aW9uTGFiZWwoaXRlbSkgfCBhc3luYyB9fVxuICAgICAgPHNwYW4gKGNsaWNrKT1cInJlbW92ZVNlbGVjdGVkT3B0aW9uKGl0ZW0pXCIgY2xhc3M9XCJldC1jb21ib2JveC1zZWxlY3RlZC1vcHRpb24tcmVtb3ZlXCIgdGFiaW5kZXg9XCItMVwiPiB4IDwvc3Bhbj5cbiAgICA8L2xpPlxuICA8L3VsPlxuXG4gIDxpbnB1dFxuICAgIChrZXlkb3duKT1cInByb2Nlc3NLZXlkb3duRXZlbnQoJGV2ZW50KVwiXG4gICAgKGNsaWNrKT1cIm9wZW4oKVwiXG4gICAgKGJsdXIpPVwiaGFuZGxlQmx1ckV2ZW50KClcIlxuICAgIChpbnB1dCk9XCJwcm9jZXNzSW5wdXRFdmVudCgkZXZlbnQpXCJcbiAgICB0eXBlPVwidGV4dFwiXG4gICAgZXROYXRpdmVJbnB1dFJlZlxuICAvPlxuXG4gIDxldC1jaGV2cm9uLWljb24gY2xhc3M9XCJldC1jb21ib2JveC1jaGV2cm9uXCIgLz5cbjwvZGl2PlxuXG48bmctY29udGVudCBzZWxlY3Q9XCJbZXRJbnB1dFN1ZmZpeF1cIiAvPlxuXG48bmctdGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IC8+XG48L25nLXRlbXBsYXRlPlxuIl19