@alauda/ui 7.2.1-beta → 7.2.1-beta.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 (32) hide show
  1. package/esm2022/autocomplete/autocomplete.component.mjs +3 -3
  2. package/esm2022/drawer/component/drawer.component.mjs +3 -12
  3. package/esm2022/paginator/paginator.component.mjs +3 -3
  4. package/esm2022/paginator/paginator.module.mjs +3 -2
  5. package/esm2022/scrolling/virtual-for-of.directive.mjs +14 -2
  6. package/esm2022/select/base-select.mjs +265 -152
  7. package/esm2022/select/helper-directives.mjs +9 -54
  8. package/esm2022/select/index.mjs +3 -2
  9. package/esm2022/select/multi-select/multi-select.component.mjs +38 -58
  10. package/esm2022/select/option-group/option-group.component.mjs +16 -11
  11. package/esm2022/select/option-item/option-item.component.mjs +63 -0
  12. package/esm2022/select/option.component.mjs +48 -0
  13. package/esm2022/select/select.component.mjs +21 -13
  14. package/esm2022/select/select.module.mjs +16 -33
  15. package/esm2022/select/select.types.mjs +1 -1
  16. package/esm2022/select/validators.mjs +4 -9
  17. package/esm2022/tree-select/tree-select.component.mjs +3 -3
  18. package/fesm2022/alauda-ui.mjs +2251 -2225
  19. package/fesm2022/alauda-ui.mjs.map +1 -1
  20. package/package.json +1 -1
  21. package/select/base-select.d.ts +57 -36
  22. package/select/helper-directives.d.ts +3 -16
  23. package/select/index.d.ts +2 -1
  24. package/select/multi-select/multi-select.component.d.ts +16 -20
  25. package/select/option-group/option-group.component.d.ts +4 -5
  26. package/select/option-item/option-item.component.d.ts +23 -0
  27. package/select/option.component.d.ts +16 -0
  28. package/select/select.component.d.ts +3 -3
  29. package/select/select.module.d.ts +12 -17
  30. package/select/select.types.d.ts +8 -2
  31. package/esm2022/select/option/option.component.mjs +0 -120
  32. package/select/option/option.component.d.ts +0 -46
@@ -1,11 +1,21 @@
1
- import { ContentChild, ContentChildren, Directive, EventEmitter, Input, Output, ViewChild, ViewChildren, forwardRef, } from '@angular/core';
2
- import { BehaviorSubject, combineLatest, debounceTime, distinctUntilChanged, map, of, startWith, Subject, switchMap, takeUntil, } from 'rxjs';
1
+ import { ContentChild, ContentChildren, DestroyRef, Directive, ElementRef, EventEmitter, Input, Output, TemplateRef, ViewChild, ViewChildren, inject, } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { BehaviorSubject, combineLatest, map, switchMap, merge, startWith, } from 'rxjs';
3
4
  import { CommonFormControl } from '../form';
5
+ import { VirtualScrollViewportComponent } from '../scrolling/virtual-scroll-viewport.component';
4
6
  import { ComponentSize } from '../types';
5
7
  import { coerceAttrBoolean, coerceString, isTemplateRef, publishRef, scrollIntoView, } from '../utils';
6
- import { OptionContentDirective } from './helper-directives';
7
- import { OptionComponent } from './option/option.component';
8
+ import { OptionItemCustomDirective } from './helper-directives';
9
+ import { OptionItemComponent } from './option-item/option-item.component';
10
+ import { OptionComponent } from './option.component';
8
11
  import * as i0 from "@angular/core";
12
+ const itemSizeMap = {
13
+ [ComponentSize.Large]: 40,
14
+ [ComponentSize.Medium]: 32,
15
+ [ComponentSize.Small]: 28,
16
+ [ComponentSize.Mini]: 26,
17
+ [ComponentSize.Empty]: 32,
18
+ };
9
19
  export class BaseSelect extends CommonFormControl {
10
20
  get size() {
11
21
  return this._size;
@@ -17,26 +27,44 @@ export class BaseSelect extends CommonFormControl {
17
27
  this._size = val;
18
28
  this.size$$.next(val);
19
29
  }
30
+ get options() {
31
+ return this._options;
32
+ }
33
+ set options(val) {
34
+ this._options = val;
35
+ this.options$$.next(val);
36
+ }
20
37
  filterable = true;
21
38
  clearable;
39
+ allowCreate;
40
+ loading = false;
41
+ placeholder = '';
42
+ defaultFirstOption = true;
43
+ useVirtual;
44
+ itemSize;
45
+ maxItemLength = 10;
46
+ createFn = this._createFn;
22
47
  filterFn = this._filterFn.bind(this);
23
48
  trackFn = this._trackFn;
24
49
  labelFn;
25
- allowCreate;
26
- get allOptions() {
27
- return [
28
- ...(this.customOptions ? this.customOptions.toArray() : []),
29
- ...(this.contentOptions ? this.contentOptions.toArray() : []),
30
- ];
31
- }
50
+ filterChange = new EventEmitter();
51
+ show = new EventEmitter();
52
+ hide = new EventEmitter();
53
+ selectRef;
54
+ tooltipRef;
55
+ optionListRef;
56
+ virtualScrollViewport;
57
+ inputItemTemplate;
58
+ contentOptionItems;
59
+ contentTplOptions;
32
60
  get opened() {
33
61
  return this.tooltipRef.isCreated;
34
62
  }
35
63
  get inputReadonly() {
36
64
  return !(this.filterable && this.opened);
37
65
  }
38
- get filterString() {
39
- return this._filterString;
66
+ get _itemSize() {
67
+ return this.itemSize || itemSizeMap[this.size];
40
68
  }
41
69
  set filterString(val) {
42
70
  if (val !== this._filterString) {
@@ -45,89 +73,141 @@ export class BaseSelect extends CommonFormControl {
45
73
  this.filterChange.emit(val);
46
74
  }
47
75
  }
48
- loading = false;
49
- placeholder = '';
50
- defaultFirstOption = true;
51
- lazy = true;
52
- filterChange = new EventEmitter();
53
- show = new EventEmitter();
54
- hide = new EventEmitter();
55
- selectRef;
56
- tooltipRef;
57
- optionListRef;
58
- inputtingOption;
59
- optionContent;
60
- customOptions;
61
- contentOptions;
76
+ get filterString() {
77
+ return this._filterString;
78
+ }
62
79
  isTemplateRef = isTemplateRef;
63
80
  isMulti = false;
64
- allOptions$;
65
- focusedOption;
81
+ scrolledIndex = 0;
66
82
  _size = ComponentSize.Medium;
83
+ _options;
67
84
  _filterString = '';
68
- destroy$$ = new Subject();
85
+ selectableOptions = [];
86
+ options$$ = new BehaviorSubject(null);
87
+ contentOptions$;
88
+ customOptions$;
89
+ inputtingOption$;
90
+ allOptions$ = new BehaviorSubject([]);
91
+ filterOptions$ = new BehaviorSubject([]);
92
+ containerWidth;
69
93
  size$$ = new BehaviorSubject(this.size);
70
94
  filterString$$ = new BehaviorSubject(this.filterString);
71
95
  size$ = this.size$$.asObservable();
96
+ options$ = this.options$$.asObservable();
72
97
  filterString$ = this.filterString$$.asObservable();
73
- optionVisibles$;
74
- hasVisibleOption$;
75
- hasMatchedOption$;
76
- customCreatedOptions$;
77
- containerWidth;
98
+ focused$ = new BehaviorSubject(null);
99
+ destroyRef = inject(DestroyRef);
78
100
  ngAfterContentInit() {
79
- this.customCreatedOptions$ = combineLatest([
101
+ this.contentOptions$ = this.options$.pipe(switchMap(options => {
102
+ if (options?.length) {
103
+ return this.options$;
104
+ }
105
+ return combineLatest([
106
+ this.values$,
107
+ merge(...this.contentTplOptions.map(contentTpl => contentTpl.changes$), this.contentTplOptions.changes).pipe(startWith(this.contentTplOptions)),
108
+ ]).pipe(map(([values]) => this.tplOptions2Data(values)));
109
+ }), publishRef());
110
+ this.inputtingOption$ = this.filterString$.pipe(map(filterString => {
111
+ if (filterString && this.allowCreate) {
112
+ return this.createFn(filterString);
113
+ }
114
+ }), publishRef());
115
+ this.customOptions$ = combineLatest([
80
116
  this.values$,
81
- this.contentOptions.changes.pipe(startWith(this.contentOptions), switchMap((options) => options.length > 0
82
- ? combineLatest(options.map(option => option.value$))
83
- : of([]))),
84
- ]).pipe(map(([values, optionValues]) => values.reduce((acc, value) => {
85
- const included = optionValues
86
- .map(value => this.trackFn(value))
87
- .includes(this.trackFn(value));
88
- if (!included) {
89
- const label = this.labelFn?.(value) || coerceString(this.trackFn(value));
90
- if (label) {
91
- acc.push({
92
- label,
93
- value,
94
- });
95
- }
117
+ this.contentOptions$,
118
+ ]).pipe(map(([values, options]) => {
119
+ if (!this.allowCreate) {
120
+ return [];
96
121
  }
97
- return acc;
98
- }, [])), publishRef());
99
- }
100
- ngAfterViewInit() {
101
- this.allOptions$ = combineLatest([
102
- this.customOptions.changes.pipe(startWith(this.customOptions)),
103
- this.contentOptions.changes.pipe(startWith(this.contentOptions)),
104
- ]).pipe(map(([customOptions, contentOptions]) => [...customOptions.toArray(), ...contentOptions.toArray()]), publishRef());
105
- this.allOptions$.pipe(takeUntil(this.destroy$$)).subscribe(() => {
106
- if (this.opened) {
107
- requestAnimationFrame(() => {
108
- this.autoFocusFirstOption();
122
+ const optionKeys = new Set(options.map(option => this.trackFn(option.value)));
123
+ return values.reduce((acc, value) => {
124
+ if (!optionKeys.has(this.trackFn(value))) {
125
+ const label = this.labelFn?.(value) || coerceString(this.trackFn(value));
126
+ if (label) {
127
+ acc.push({
128
+ label,
129
+ value,
130
+ selected: true,
131
+ });
132
+ }
133
+ }
134
+ return acc;
135
+ }, []);
136
+ }), publishRef());
137
+ this.transformOptions();
138
+ this.filterOptions$
139
+ .pipe(takeUntilDestroyed(this.destroyRef))
140
+ .subscribe(options => {
141
+ this.selectableOptions = options.filter(option => !option.disabled);
142
+ });
143
+ }
144
+ tplOptions2Data(values) {
145
+ const contents = [];
146
+ let lastGroupTitle;
147
+ this.contentTplOptions.toArray().forEach(com => {
148
+ const { value, label, disabled, groupTitle, labelContext, contentTemplate, } = com;
149
+ if (lastGroupTitle !== groupTitle) {
150
+ lastGroupTitle = groupTitle;
151
+ contents.push({
152
+ groupTitle,
109
153
  });
110
154
  }
155
+ contents.push({
156
+ value,
157
+ label,
158
+ disabled,
159
+ labelContext,
160
+ selected: this.getSelected(value, values),
161
+ contentTemplate,
162
+ });
111
163
  });
112
- this.hasMatchedOption$ = combineLatest([
113
- this.allOptions$.pipe(map(customOptions => customOptions.filter(option => option !== this.inputtingOption)), switchMap(options => options.length > 0
114
- ? combineLatest(options.map(option => option.value$))
115
- : of([]))),
116
- this.filterString$,
117
- ]).pipe(map(([values, filterString]) => values.some(value => this.trackFn(value) === filterString)), publishRef());
118
- this.optionVisibles$ = this.contentOptions.changes.pipe(startWith(this.contentOptions), switchMap((options) => options.length > 0
119
- ? combineLatest(options.map(option => option.visible$))
120
- : of([])), publishRef());
121
- this.hasVisibleOption$ = this.optionVisibles$.pipe(map(visible => visible.some(Boolean)), distinctUntilChanged(), publishRef());
122
- this.optionVisibles$.pipe(debounceTime(50)).subscribe(() => {
123
- this.tooltipRef?.updatePosition();
124
- });
164
+ return contents;
125
165
  }
126
- ngOnDestroy() {
127
- this.optionContent?.detach();
128
- this.destroy$$.next();
129
- this.destroy$$.complete();
166
+ transformOptions() {
167
+ combineLatest([
168
+ this.inputtingOption$,
169
+ this.customOptions$,
170
+ this.contentOptions$,
171
+ ])
172
+ .pipe(map(([inputtingOption, customOptions, contentOptions]) => {
173
+ const arr = [...customOptions, ...contentOptions];
174
+ if (inputtingOption) {
175
+ arr.unshift(inputtingOption);
176
+ }
177
+ return arr;
178
+ }))
179
+ .subscribe(arr => {
180
+ this.allOptions$.next(arr);
181
+ });
182
+ combineLatest([this.allOptions$, this.filterString$])
183
+ .pipe(takeUntilDestroyed(this.destroyRef), map(([options, filterString]) => {
184
+ const result = [];
185
+ let lastTitleOption;
186
+ let lastResultLength = 0;
187
+ let lastTitleResultLength = 0;
188
+ options.forEach((option, idx) => {
189
+ if (lastTitleOption &&
190
+ (idx === options.length - 1 ||
191
+ (option.groupTitle && lastTitleOption !== option)) &&
192
+ lastResultLength !== lastTitleResultLength) {
193
+ result.splice(lastTitleResultLength, 0, lastTitleOption);
194
+ }
195
+ if (option.groupTitle) {
196
+ lastTitleResultLength = result.length;
197
+ lastTitleOption = option;
198
+ }
199
+ else if (this.filterFn(filterString, option)) {
200
+ result.push(option);
201
+ }
202
+ lastResultLength = result.length;
203
+ });
204
+ return result;
205
+ }))
206
+ .subscribe(result => {
207
+ this.filterOptions$.next(result);
208
+ });
130
209
  }
210
+ trackByValue = (_, item) => this.trackFn(item.value);
131
211
  openOption() {
132
212
  this.tooltipRef.show();
133
213
  }
@@ -135,30 +215,16 @@ export class BaseSelect extends CommonFormControl {
135
215
  this.tooltipRef.hide();
136
216
  }
137
217
  onShowOptions() {
138
- const exec = () => {
139
- this.containerWidth = this.selectRef.nativeElement.offsetWidth + 'px';
140
- requestAnimationFrame(() => {
141
- this.autoFocusFirstOption();
142
- });
143
- this.show.emit();
144
- };
145
- if (this.optionContent) {
146
- requestAnimationFrame(() => {
147
- this.optionContent.attach();
148
- exec();
149
- });
150
- }
151
- else {
152
- exec();
153
- }
218
+ this.containerWidth = this.selectRef.nativeElement.offsetWidth + 'px';
219
+ requestAnimationFrame(() => {
220
+ this.autoFocusFirstOption();
221
+ });
222
+ this.show.emit();
154
223
  }
155
224
  onHideOptions() {
156
225
  if (this.onTouched) {
157
226
  this.onTouched();
158
227
  }
159
- if (!this.lazy) {
160
- this.optionContent?.detach();
161
- }
162
228
  this.resetFocusedOption();
163
229
  this.filterString = '';
164
230
  this.hide.emit();
@@ -170,30 +236,30 @@ export class BaseSelect extends CommonFormControl {
170
236
  });
171
237
  this.cdr.markForCheck();
172
238
  }
239
+ stopEvent(event) {
240
+ event.stopPropagation();
241
+ event.preventDefault();
242
+ }
173
243
  onKeyDown(event) {
174
244
  switch (event.key) {
175
245
  case 'ArrowDown': {
176
246
  this.focusOptionDir('down');
177
- event.stopPropagation();
178
- event.preventDefault();
247
+ this.stopEvent(event);
179
248
  break;
180
249
  }
181
250
  case 'ArrowUp': {
182
251
  this.focusOptionDir('up');
183
- event.stopPropagation();
184
- event.preventDefault();
252
+ this.stopEvent(event);
185
253
  break;
186
254
  }
187
255
  case 'Enter': {
188
256
  this.selectFocusedOption();
189
- event.stopPropagation();
190
- event.preventDefault();
257
+ this.stopEvent(event);
191
258
  break;
192
259
  }
193
260
  case 'Escape': {
194
261
  this.escSelect();
195
- event.stopPropagation();
196
- event.preventDefault();
262
+ this.stopEvent(event);
197
263
  break;
198
264
  }
199
265
  }
@@ -202,19 +268,25 @@ export class BaseSelect extends CommonFormControl {
202
268
  this.resetFocusedOption(option);
203
269
  this.selectOption(option);
204
270
  }
271
+ updateAllOptions(option) {
272
+ const allOptions = this.allOptions$.getValue();
273
+ allOptions.find(_option => _option.value === option.value).selected =
274
+ !option.selected;
275
+ this.allOptions$.next(allOptions);
276
+ }
205
277
  autoFocusFirstOption() {
206
- if (this.defaultFirstOption && this.allowCreate && this.filterString) {
207
- const matchedOption = this.contentOptions.find(option => this.trackFn(option.value) === this.filterString);
208
- this.resetFocusedOption(matchedOption || this.customOptions.first);
278
+ if (!this.selectableOptions.length) {
209
279
  return;
210
280
  }
211
- const selectedOption = this.allOptions.find(option => option.selected && option.visible);
281
+ const first = this.selectableOptions.find(option => option.selected) ||
282
+ (this.selectableOptions[0].groupTitle
283
+ ? this.selectableOptions[1]
284
+ : this.selectableOptions[0]);
212
285
  if (this.defaultFirstOption) {
213
- this.resetFocusedOption(selectedOption ||
214
- this.allOptions.find(option => option.visible && !option.disabled));
286
+ this.resetFocusedOption(first);
215
287
  }
216
- else if (selectedOption) {
217
- this.scrollToOption(selectedOption);
288
+ else {
289
+ this.scrollToOption(first);
218
290
  }
219
291
  }
220
292
  focusOptionDir(dir) {
@@ -222,37 +294,50 @@ export class BaseSelect extends CommonFormControl {
222
294
  this.openOption();
223
295
  return;
224
296
  }
225
- const visibleOptions = this.allOptions.filter(option => option.visible && !option.disabled);
226
- if (visibleOptions.length === 0) {
297
+ if (!this.selectableOptions?.length) {
227
298
  return;
228
299
  }
229
300
  const step = dir === 'down' ? 1 : -1;
230
- let i = visibleOptions.indexOf(this.focusedOption);
301
+ let i = this.selectableOptions.findIndex(option => this.isFocus(option.value));
231
302
  i = i + step;
232
- if (i >= visibleOptions.length) {
303
+ if (this.selectableOptions[i]?.groupTitle) {
304
+ i = i + step;
305
+ }
306
+ if (i >= this.selectableOptions.length) {
233
307
  i = 0;
234
308
  }
235
309
  else if (i < 0) {
236
- i = visibleOptions.length - 1;
310
+ i = this.selectableOptions.length - 1;
237
311
  }
238
- this.resetFocusedOption(visibleOptions[i]);
312
+ this.resetFocusedOption(this.selectableOptions[i]);
239
313
  }
314
+ isFocus = (value, focusOption) => {
315
+ const _focusOption = focusOption || this.focused$.getValue();
316
+ return (_focusOption && this.trackFn(_focusOption.value) === this.trackFn(value));
317
+ };
240
318
  resetFocusedOption(focusedOption) {
241
- if (this.focusedOption === focusedOption) {
242
- return;
243
- }
244
- if (this.focusedOption) {
245
- this.focusedOption.blur();
246
- }
247
- this.focusedOption = focusedOption;
248
- if (this.focusedOption) {
249
- this.focusedOption.focus();
250
- this.scrollToOption(this.focusedOption);
319
+ this.blur();
320
+ if (focusedOption?.value) {
321
+ this.focused$.next(focusedOption);
322
+ this.scrollToOption(focusedOption);
251
323
  }
252
324
  }
325
+ onScrolledIndexChange(index) {
326
+ this.scrolledIndex = index;
327
+ }
253
328
  scrollToOption(option) {
254
- if (this.optionListRef) {
255
- scrollIntoView(this.optionListRef.nativeElement, option.elRef.nativeElement);
329
+ const index = this.filterOptions$
330
+ .getValue()
331
+ .findIndex(item => this.trackFn(item.value) === this.trackFn(option.value));
332
+ if (!this.virtualScrollViewport) {
333
+ if (this.contentOptionItems.get(index)) {
334
+ scrollIntoView(this.optionListRef.nativeElement, this.contentOptionItems.get(index).nativeElement);
335
+ }
336
+ return;
337
+ }
338
+ if (index < this.scrolledIndex ||
339
+ index >= this.scrolledIndex + this.maxItemLength) {
340
+ this.virtualScrollViewport.scrollToIndex(index || 0);
256
341
  }
257
342
  }
258
343
  selectFocusedOption() {
@@ -260,16 +345,36 @@ export class BaseSelect extends CommonFormControl {
260
345
  this.openOption();
261
346
  return;
262
347
  }
263
- if (this.focusedOption && !this.focusedOption.disabled) {
264
- this.selectOption(this.focusedOption);
348
+ let focusedOption = this.focused$.getValue();
349
+ if (focusedOption) {
350
+ focusedOption = this.selectableOptions.find(option => this.trackFn(option.value) === this.trackFn(focusedOption.value));
351
+ focusedOption && this.selectOption(focusedOption);
265
352
  }
266
353
  }
354
+ getSelected(value, values) {
355
+ return values.some(item => this.trackFn(item) === this.trackFn(value));
356
+ }
357
+ focus(option) {
358
+ this.focused$.next(option);
359
+ }
360
+ blur() {
361
+ this.focused$.next(null);
362
+ }
363
+ getLabelByValue(value) {
364
+ return this.labelFn?.(value) || coerceString(this.trackFn(value));
365
+ }
267
366
  escSelect() {
268
367
  this.closeOption();
269
368
  }
270
369
  _trackFn(value) {
271
370
  return value;
272
371
  }
372
+ _createFn(input) {
373
+ const value = input;
374
+ return {
375
+ value,
376
+ };
377
+ }
273
378
  _filterFn(filterString, { label, value }) {
274
379
  return ((typeof label === 'string' && label) ||
275
380
  this.labelFn?.(value) ||
@@ -278,7 +383,7 @@ export class BaseSelect extends CommonFormControl {
278
383
  .includes(filterString?.toLowerCase() ?? '');
279
384
  }
280
385
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.3", ngImport: i0, type: BaseSelect, deps: null, target: i0.ɵɵFactoryTarget.Directive });
281
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "16.2.3", type: BaseSelect, isStandalone: true, inputs: { size: "size", filterable: ["filterable", "filterable", coerceAttrBoolean], clearable: ["clearable", "clearable", coerceAttrBoolean], filterFn: "filterFn", trackFn: "trackFn", labelFn: "labelFn", allowCreate: ["allowCreate", "allowCreate", coerceAttrBoolean], loading: "loading", placeholder: "placeholder", defaultFirstOption: "defaultFirstOption", lazy: "lazy" }, outputs: { filterChange: "filterChange", show: "show", hide: "hide" }, queries: [{ propertyName: "optionContent", first: true, predicate: OptionContentDirective, descendants: true }, { propertyName: "contentOptions", predicate: i0.forwardRef(function () { return OptionComponent; }), descendants: true }], viewQueries: [{ propertyName: "selectRef", first: true, predicate: ["selectRef"], descendants: true, static: true }, { propertyName: "tooltipRef", first: true, predicate: ["tooltipRef"], descendants: true, static: true }, { propertyName: "optionListRef", first: true, predicate: ["optionListRef"], descendants: true }, { propertyName: "inputtingOption", first: true, predicate: ["inputtingOption"], descendants: true }, { propertyName: "customOptions", predicate: i0.forwardRef(function () { return OptionComponent; }), descendants: true }], usesInheritance: true, ngImport: i0 });
386
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "16.2.3", type: BaseSelect, isStandalone: true, inputs: { size: "size", options: "options", filterable: ["filterable", "filterable", coerceAttrBoolean], clearable: ["clearable", "clearable", coerceAttrBoolean], allowCreate: ["allowCreate", "allowCreate", coerceAttrBoolean], loading: "loading", placeholder: "placeholder", defaultFirstOption: "defaultFirstOption", useVirtual: "useVirtual", itemSize: "itemSize", maxItemLength: "maxItemLength", createFn: "createFn", filterFn: "filterFn", trackFn: "trackFn", labelFn: "labelFn" }, outputs: { filterChange: "filterChange", show: "show", hide: "hide" }, queries: [{ propertyName: "inputItemTemplate", first: true, predicate: OptionItemCustomDirective, descendants: true, read: TemplateRef }, { propertyName: "contentTplOptions", predicate: OptionComponent, descendants: true }], viewQueries: [{ propertyName: "selectRef", first: true, predicate: ["selectRef"], descendants: true, static: true }, { propertyName: "tooltipRef", first: true, predicate: ["tooltipRef"], descendants: true, static: true }, { propertyName: "optionListRef", first: true, predicate: ["optionListRef"], descendants: true }, { propertyName: "virtualScrollViewport", first: true, predicate: VirtualScrollViewportComponent, descendants: true }, { propertyName: "contentOptionItems", predicate: OptionItemComponent, descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0 });
282
387
  }
283
388
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.3", ngImport: i0, type: BaseSelect, decorators: [{
284
389
  type: Directive,
@@ -287,18 +392,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.3", ngImpor
287
392
  }]
288
393
  }], propDecorators: { size: [{
289
394
  type: Input
395
+ }], options: [{
396
+ type: Input
290
397
  }], filterable: [{
291
398
  type: Input,
292
399
  args: [{ transform: coerceAttrBoolean }]
293
400
  }], clearable: [{
294
401
  type: Input,
295
402
  args: [{ transform: coerceAttrBoolean }]
296
- }], filterFn: [{
297
- type: Input
298
- }], trackFn: [{
299
- type: Input
300
- }], labelFn: [{
301
- type: Input
302
403
  }], allowCreate: [{
303
404
  type: Input,
304
405
  args: [{ transform: coerceAttrBoolean }]
@@ -308,7 +409,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.3", ngImpor
308
409
  type: Input
309
410
  }], defaultFirstOption: [{
310
411
  type: Input
311
- }], lazy: [{
412
+ }], useVirtual: [{
413
+ type: Input
414
+ }], itemSize: [{
415
+ type: Input
416
+ }], maxItemLength: [{
417
+ type: Input
418
+ }], createFn: [{
419
+ type: Input
420
+ }], filterFn: [{
421
+ type: Input
422
+ }], trackFn: [{
423
+ type: Input
424
+ }], labelFn: [{
312
425
  type: Input
313
426
  }], filterChange: [{
314
427
  type: Output
@@ -325,17 +438,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.3", ngImpor
325
438
  }], optionListRef: [{
326
439
  type: ViewChild,
327
440
  args: ['optionListRef', { static: false }]
328
- }], inputtingOption: [{
441
+ }], virtualScrollViewport: [{
329
442
  type: ViewChild,
330
- args: ['inputtingOption', { static: false }]
331
- }], optionContent: [{
443
+ args: [VirtualScrollViewportComponent]
444
+ }], inputItemTemplate: [{
332
445
  type: ContentChild,
333
- args: [OptionContentDirective]
334
- }], customOptions: [{
446
+ args: [OptionItemCustomDirective, { read: TemplateRef }]
447
+ }], contentOptionItems: [{
335
448
  type: ViewChildren,
336
- args: [forwardRef(() => OptionComponent)]
337
- }], contentOptions: [{
449
+ args: [OptionItemComponent, { read: ElementRef }]
450
+ }], contentTplOptions: [{
338
451
  type: ContentChildren,
339
- args: [forwardRef(() => OptionComponent), { descendants: true }]
452
+ args: [OptionComponent, { descendants: true }]
340
453
  }] } });
341
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1zZWxlY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VsZWN0L2Jhc2Utc2VsZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxZQUFZLEVBQ1osZUFBZSxFQUNmLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLEdBQUcsRUFFSCxFQUFFLEVBQ0YsU0FBUyxFQUNULE9BQU8sRUFDUCxTQUFTLEVBQ1QsU0FBUyxHQUNWLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRTVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osYUFBYSxFQUNiLFVBQVUsRUFDVixjQUFjLEdBQ2YsTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQU01RCxNQUFNLE9BQWdCLFVBQ3BCLFNBQVEsaUJBQW9CO0lBRzVCLElBQ0ksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxJQUFJLENBQUMsR0FBRztRQUNWLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxHQUFHLEVBQUU7WUFDOUIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUdELFVBQVUsR0FBRyxJQUFJLENBQUM7SUFHbEIsU0FBUyxDQUFVO0lBR25CLFFBQVEsR0FBc0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFHeEQsT0FBTyxHQUFlLElBQUksQ0FBQyxRQUFRLENBQUM7SUFHcEMsT0FBTyxDQUF3QjtJQUcvQixXQUFXLENBQVU7SUFFckIsSUFBSSxVQUFVO1FBQ1osT0FBTztZQUNMLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0QsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUM5RCxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksWUFBWSxDQUFDLEdBQUc7UUFDbEIsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQztZQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM3QjtJQUNILENBQUM7SUFHRCxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBR2hCLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFHakIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBRzFCLElBQUksR0FBRyxJQUFJLENBQUM7SUFHWixZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUcxQyxJQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUdoQyxJQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUd0QixTQUFTLENBQTBCO0lBR25DLFVBQVUsQ0FBbUI7SUFHN0IsYUFBYSxDQUE2QjtJQUcxQyxlQUFlLENBQXFCO0lBR3BDLGFBQWEsQ0FBMEI7SUFHakQsYUFBYSxDQUFnQztJQUc3QyxjQUFjLENBQWdDO0lBRTlDLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDOUIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQU9oQixXQUFXLENBQXdDO0lBRXpDLGFBQWEsQ0FBcUI7SUFFcEMsS0FBSyxHQUFrQixhQUFhLENBQUMsTUFBTSxDQUFDO0lBQzVDLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFFakIsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDaEMsTUFBTSxHQUFHLElBQUksZUFBZSxDQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEQsY0FBYyxHQUFHLElBQUksZUFBZSxDQUNuRCxJQUFJLENBQUMsWUFBWSxDQUNsQixDQUFDO0lBRUYsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkQsZUFBZSxDQUF3QjtJQUN2QyxpQkFBaUIsQ0FBc0I7SUFDdkMsaUJBQWlCLENBQXNCO0lBQ3ZDLHFCQUFxQixDQUEyQztJQUNoRSxjQUFjLENBQVM7SUFFdkIsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLE9BQU87WUFFVixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQ3JCLENBQUMsSUFBSSxDQUNKLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQzlCLFNBQVMsQ0FBQyxDQUFDLE9BQXNDLEVBQUUsRUFBRSxDQUNuRCxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ2hCLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFTLENBQUMsQ0FDbEIsQ0FDRjtTQUNGLENBQUMsQ0FBQyxJQUFJLENBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUM3QixNQUFNLENBQUMsTUFBTSxDQUErQixDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN6RCxNQUFNLFFBQVEsR0FBRyxZQUFZO2lCQUMxQixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNqQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2IsTUFBTSxLQUFLLEdBQ1QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzdELElBQUksS0FBSyxFQUFFO29CQUNULEdBQUcsQ0FBQyxJQUFJLENBQUM7d0JBQ1AsS0FBSzt3QkFDTCxLQUFLO3FCQUNOLENBQUMsQ0FBQztpQkFDSjthQUNGO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQ1AsRUFDRCxVQUFVLEVBQUUsQ0FDYixDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQztZQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNqRSxDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FDRCxDQUFDLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FHOUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUNoRSxFQUNELFVBQVUsRUFBRSxDQUNiLENBQUM7UUFHRixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUM5RCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2YscUJBQXFCLENBQUMsR0FBRyxFQUFFO29CQUN6QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGFBQWEsQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDbkIsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQ2xCLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUNoRSxFQUNELFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUNsQixPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ2hCLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFTLENBQUMsQ0FDbEIsQ0FDRjtZQUNELElBQUksQ0FBQyxhQUFhO1NBQ25CLENBQUMsQ0FBQyxJQUFJLENBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxZQUFZLENBQUMsQ0FDM0QsRUFDRCxVQUFVLEVBQUUsQ0FDYixDQUFDO1FBRUYsSUFBSSxDQUFDLGVBQWUsR0FDbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUNyQixDQUFDLElBQUksQ0FDSixTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUM5QixTQUFTLENBQUMsQ0FBQyxPQUFzQyxFQUFFLEVBQUUsQ0FDbkQsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2RCxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQWUsQ0FBQyxDQUN4QixFQUNELFVBQVUsRUFBRSxDQUNiLENBQUM7UUFFRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQ2hELEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFDckMsb0JBQW9CLEVBQUUsRUFDdEIsVUFBVSxFQUFFLENBQ2IsQ0FBQztRQUVGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDekQsSUFBSSxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsYUFBYTtRQUNYLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFFdEUscUJBQXFCLENBQUMsR0FBRyxFQUFFO2dCQUN6QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLHFCQUFxQixDQUFDLEdBQUcsRUFBRTtnQkFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxFQUFFLENBQUM7WUFDVCxDQUFDLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxJQUFJLEVBQUUsQ0FBQztTQUNSO0lBQ0gsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ2xCO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCxJQUFJLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQVk7UUFDbEIsSUFBSSxDQUFDLFlBQVksR0FBSSxLQUFLLENBQUMsTUFBMkIsQ0FBQyxLQUFLLENBQUM7UUFFN0QscUJBQXFCLENBQUMsR0FBRyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQW9CO1FBQzVCLFFBQVEsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNqQixLQUFLLFdBQVcsQ0FBQyxDQUFDO2dCQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTthQUNQO1lBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQztnQkFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTthQUNQO1lBQ0QsS0FBSyxPQUFPLENBQUMsQ0FBQztnQkFDWixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0IsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07YUFDUDtZQUNELEtBQUssUUFBUSxDQUFDLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNqQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTthQUNQO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQTBCO1FBQ3RDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFUyxvQkFBb0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3BFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUM1QyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQzNELENBQUM7WUFDRixJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkUsT0FBTztTQUNSO1FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ3pDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUM1QyxDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUNyQixjQUFjO2dCQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FDckUsQ0FBQztTQUNIO2FBQU0sSUFBSSxjQUFjLEVBQUU7WUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNyQztJQUNILENBQUM7SUFFUyxjQUFjLENBQUMsR0FBa0I7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLE9BQU87U0FDUjtRQUNELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUMzQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUM3QyxDQUFDO1FBQ0YsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMvQixPQUFPO1NBQ1I7UUFDRCxNQUFNLElBQUksR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25ELENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2IsSUFBSSxDQUFDLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRTtZQUM5QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ1A7YUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDaEIsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQy9CO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxhQUFrQztRQUM3RCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssYUFBYSxFQUFFO1lBQ3hDLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzNCO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFFbkMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDekM7SUFDSCxDQUFDO0lBRVMsY0FBYyxDQUFDLE1BQTBCO1FBQ2pELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixjQUFjLENBQ1osSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUMzQixDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRVMsbUJBQW1CO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixPQUFPO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUN0RCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUN2QztJQUNILENBQUM7SUFFUyxTQUFTO1FBQ2pCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU8sUUFBUSxDQUFJLEtBQVE7UUFDMUIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sU0FBUyxDQUNmLFlBQW9CLEVBQ3BCLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBeUI7UUFFdkMsT0FBTyxDQUNMLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQztZQUNwQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3JCLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ2xDO1lBQ0MsRUFBRSxXQUFXLEVBQUU7YUFDZCxRQUFRLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7dUdBeGFtQixVQUFVOzJGQUFWLFVBQVUsdUZBaUJWLGlCQUFpQix5Q0FHakIsaUJBQWlCLDZHQVlqQixpQkFBaUIsdVBBK0R2QixzQkFBc0IsdUdBTUYsZUFBZSwrZ0JBSGxCLGVBQWU7OzJGQWxHMUIsVUFBVTtrQkFIL0IsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtpQkFDakI7OEJBTUssSUFBSTtzQkFEUCxLQUFLO2dCQWNOLFVBQVU7c0JBRFQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRTtnQkFJdkMsU0FBUztzQkFEUixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFO2dCQUl2QyxRQUFRO3NCQURQLEtBQUs7Z0JBSU4sT0FBTztzQkFETixLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJTixXQUFXO3NCQURWLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUU7Z0JBK0J2QyxPQUFPO3NCQUROLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO2dCQUlOLGtCQUFrQjtzQkFEakIsS0FBSztnQkFJTixJQUFJO3NCQURILEtBQUs7Z0JBSU4sWUFBWTtzQkFEWCxNQUFNO2dCQUlQLElBQUk7c0JBREgsTUFBTTtnQkFJUCxJQUFJO3NCQURILE1BQU07Z0JBSUcsU0FBUztzQkFEbEIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk5QixVQUFVO3NCQURuQixTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSS9CLGFBQWE7c0JBRHRCLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJbkMsZUFBZTtzQkFEeEIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSXJDLGFBQWE7c0JBRHRCLFlBQVk7dUJBQUMsc0JBQXNCO2dCQUlwQyxhQUFhO3NCQURaLFlBQVk7dUJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFJL0MsY0FBYztzQkFEYixlQUFlO3VCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHN0YXJ0V2l0aCxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlVW50aWwsXG59IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBDb21tb25Gb3JtQ29udHJvbCB9IGZyb20gJy4uL2Zvcm0nO1xuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4uL3Rvb2x0aXAnO1xuaW1wb3J0IHsgQ29tcG9uZW50U2l6ZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7XG4gIGNvZXJjZUF0dHJCb29sZWFuLFxuICBjb2VyY2VTdHJpbmcsXG4gIGlzVGVtcGxhdGVSZWYsXG4gIHB1Ymxpc2hSZWYsXG4gIHNjcm9sbEludG9WaWV3LFxufSBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7IE9wdGlvbkNvbnRlbnREaXJlY3RpdmUgfSBmcm9tICcuL2hlbHBlci1kaXJlY3RpdmVzJztcbmltcG9ydCB7IE9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vb3B0aW9uL29wdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT3B0aW9uRmlsdGVyRm4sIFNlbGVjdEZpbHRlck9wdGlvbiwgVHJhY2tGbiB9IGZyb20gJy4vc2VsZWN0LnR5cGVzJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTZWxlY3Q8VCwgViA9IFQ+XG4gIGV4dGVuZHMgQ29tbW9uRm9ybUNvbnRyb2w8Vj5cbiAgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgQElucHV0KClcbiAgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gIH1cblxuICBzZXQgc2l6ZSh2YWwpIHtcbiAgICBpZiAoIXZhbCB8fCB0aGlzLl9zaXplID09PSB2YWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc2l6ZSA9IHZhbDtcbiAgICB0aGlzLnNpemUkJC5uZXh0KHZhbCk7XG4gIH1cblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUF0dHJCb29sZWFuIH0pXG4gIGZpbHRlcmFibGUgPSB0cnVlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogY29lcmNlQXR0ckJvb2xlYW4gfSlcbiAgY2xlYXJhYmxlOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpXG4gIGZpbHRlckZuOiBPcHRpb25GaWx0ZXJGbjxUPiA9IHRoaXMuX2ZpbHRlckZuLmJpbmQodGhpcyk7XG5cbiAgQElucHV0KClcbiAgdHJhY2tGbjogVHJhY2tGbjxUPiA9IHRoaXMuX3RyYWNrRm47XG5cbiAgQElucHV0KClcbiAgbGFiZWxGbj86ICh2YWx1ZTogVCkgPT4gc3RyaW5nO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogY29lcmNlQXR0ckJvb2xlYW4gfSlcbiAgYWxsb3dDcmVhdGU6IGJvb2xlYW47XG5cbiAgZ2V0IGFsbE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLih0aGlzLmN1c3RvbU9wdGlvbnMgPyB0aGlzLmN1c3RvbU9wdGlvbnMudG9BcnJheSgpIDogW10pLFxuICAgICAgLi4uKHRoaXMuY29udGVudE9wdGlvbnMgPyB0aGlzLmNvbnRlbnRPcHRpb25zLnRvQXJyYXkoKSA6IFtdKSxcbiAgICBdO1xuICB9XG5cbiAgZ2V0IG9wZW5lZCgpIHtcbiAgICByZXR1cm4gdGhpcy50b29sdGlwUmVmLmlzQ3JlYXRlZDtcbiAgfVxuXG4gIGdldCBpbnB1dFJlYWRvbmx5KCkge1xuICAgIHJldHVybiAhKHRoaXMuZmlsdGVyYWJsZSAmJiB0aGlzLm9wZW5lZCk7XG4gIH1cblxuICBnZXQgZmlsdGVyU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJTdHJpbmc7XG4gIH1cblxuICBzZXQgZmlsdGVyU3RyaW5nKHZhbCkge1xuICAgIGlmICh2YWwgIT09IHRoaXMuX2ZpbHRlclN0cmluZykge1xuICAgICAgdGhpcy5fZmlsdGVyU3RyaW5nID0gdmFsO1xuICAgICAgdGhpcy5maWx0ZXJTdHJpbmckJC5uZXh0KHZhbCk7XG4gICAgICB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KHZhbCk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KClcbiAgbG9hZGluZyA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHBsYWNlaG9sZGVyID0gJyc7XG5cbiAgQElucHV0KClcbiAgZGVmYXVsdEZpcnN0T3B0aW9uID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBsYXp5ID0gdHJ1ZTtcblxuICBAT3V0cHV0KClcbiAgZmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHNob3cgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGhpZGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnc2VsZWN0UmVmJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJvdGVjdGVkIHNlbGVjdFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgndG9vbHRpcFJlZicsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByb3RlY3RlZCB0b29sdGlwUmVmOiBUb29sdGlwRGlyZWN0aXZlO1xuXG4gIEBWaWV3Q2hpbGQoJ29wdGlvbkxpc3RSZWYnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgcHJvdGVjdGVkIG9wdGlvbkxpc3RSZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ2lucHV0dGluZ09wdGlvbicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwcm90ZWN0ZWQgaW5wdXR0aW5nT3B0aW9uOiBPcHRpb25Db21wb25lbnQ8VD47XG5cbiAgQENvbnRlbnRDaGlsZChPcHRpb25Db250ZW50RGlyZWN0aXZlKVxuICBwcm90ZWN0ZWQgb3B0aW9uQ29udGVudD86IE9wdGlvbkNvbnRlbnREaXJlY3RpdmU7XG5cbiAgQFZpZXdDaGlsZHJlbihmb3J3YXJkUmVmKCgpID0+IE9wdGlvbkNvbXBvbmVudCkpXG4gIGN1c3RvbU9wdGlvbnM6IFF1ZXJ5TGlzdDxPcHRpb25Db21wb25lbnQ8VD4+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBPcHRpb25Db21wb25lbnQpLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIGNvbnRlbnRPcHRpb25zOiBRdWVyeUxpc3Q8T3B0aW9uQ29tcG9uZW50PFQ+PjtcblxuICBpc1RlbXBsYXRlUmVmID0gaXNUZW1wbGF0ZVJlZjtcbiAgaXNNdWx0aSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBVdGlsaXR5IGZpZWxkIHRvIG1ha2Ugc3VyZSB0aGUgdXNlcnMgYWx3YXlzIHNlZSB0aGUgdmFsdWUgYXMgdHlwZSBhcnJheVxuICAgKi9cbiAgYWJzdHJhY3QgcmVhZG9ubHkgdmFsdWVzJDogT2JzZXJ2YWJsZTxUW10+O1xuXG4gIGFsbE9wdGlvbnMkOiBPYnNlcnZhYmxlPEFycmF5PE9wdGlvbkNvbXBvbmVudDxUPj4+O1xuXG4gIHByb3RlY3RlZCBmb2N1c2VkT3B0aW9uOiBPcHRpb25Db21wb25lbnQ8VD47XG5cbiAgcHJpdmF0ZSBfc2l6ZTogQ29tcG9uZW50U2l6ZSA9IENvbXBvbmVudFNpemUuTWVkaXVtO1xuICBwcml2YXRlIF9maWx0ZXJTdHJpbmcgPSAnJztcblxuICBwcm90ZWN0ZWQgZGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJvdGVjdGVkIHNpemUkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29tcG9uZW50U2l6ZT4odGhpcy5zaXplKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWx0ZXJTdHJpbmckJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihcbiAgICB0aGlzLmZpbHRlclN0cmluZyxcbiAgKTtcblxuICBzaXplJCA9IHRoaXMuc2l6ZSQkLmFzT2JzZXJ2YWJsZSgpO1xuICBmaWx0ZXJTdHJpbmckID0gdGhpcy5maWx0ZXJTdHJpbmckJC5hc09ic2VydmFibGUoKTtcbiAgb3B0aW9uVmlzaWJsZXMkOiBPYnNlcnZhYmxlPGJvb2xlYW5bXT47XG4gIGhhc1Zpc2libGVPcHRpb24kOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBoYXNNYXRjaGVkT3B0aW9uJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgY3VzdG9tQ3JlYXRlZE9wdGlvbnMkOiBPYnNlcnZhYmxlPEFycmF5PFNlbGVjdEZpbHRlck9wdGlvbjxUPj4+O1xuICBjb250YWluZXJXaWR0aDogc3RyaW5nO1xuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLmN1c3RvbUNyZWF0ZWRPcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy52YWx1ZXMkLFxuICAgICAgKFxuICAgICAgICB0aGlzLmNvbnRlbnRPcHRpb25zLmNoYW5nZXMgYXMgT2JzZXJ2YWJsZTxRdWVyeUxpc3Q8T3B0aW9uQ29tcG9uZW50PFQ+Pj5cbiAgICAgICkucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMuY29udGVudE9wdGlvbnMpLFxuICAgICAgICBzd2l0Y2hNYXAoKG9wdGlvbnM6IFF1ZXJ5TGlzdDxPcHRpb25Db21wb25lbnQ8VD4+KSA9PlxuICAgICAgICAgIG9wdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBjb21iaW5lTGF0ZXN0KG9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24udmFsdWUkKSlcbiAgICAgICAgICAgIDogb2YoW10gYXMgVFtdKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3ZhbHVlcywgb3B0aW9uVmFsdWVzXSkgPT5cbiAgICAgICAgdmFsdWVzLnJlZHVjZTxBcnJheTxTZWxlY3RGaWx0ZXJPcHRpb248VD4+PigoYWNjLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGluY2x1ZGVkID0gb3B0aW9uVmFsdWVzXG4gICAgICAgICAgICAubWFwKHZhbHVlID0+IHRoaXMudHJhY2tGbih2YWx1ZSkpXG4gICAgICAgICAgICAuaW5jbHVkZXModGhpcy50cmFja0ZuKHZhbHVlKSk7XG4gICAgICAgICAgaWYgKCFpbmNsdWRlZCkge1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPVxuICAgICAgICAgICAgICB0aGlzLmxhYmVsRm4/Lih2YWx1ZSkgfHwgY29lcmNlU3RyaW5nKHRoaXMudHJhY2tGbih2YWx1ZSkpO1xuICAgICAgICAgICAgaWYgKGxhYmVsKSB7XG4gICAgICAgICAgICAgIGFjYy5wdXNoKHtcbiAgICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdKSxcbiAgICAgICksXG4gICAgICBwdWJsaXNoUmVmKCksXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmFsbE9wdGlvbnMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmN1c3RvbU9wdGlvbnMuY2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmN1c3RvbU9wdGlvbnMpKSxcbiAgICAgIHRoaXMuY29udGVudE9wdGlvbnMuY2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmNvbnRlbnRPcHRpb25zKSksXG4gICAgXSkucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKFtjdXN0b21PcHRpb25zLCBjb250ZW50T3B0aW9uc106IFtcbiAgICAgICAgICBRdWVyeUxpc3Q8T3B0aW9uQ29tcG9uZW50PFQ+PixcbiAgICAgICAgICBRdWVyeUxpc3Q8T3B0aW9uQ29tcG9uZW50PFQ+PixcbiAgICAgICAgXSkgPT4gWy4uLmN1c3RvbU9wdGlvbnMudG9BcnJheSgpLCAuLi5jb250ZW50T3B0aW9ucy50b0FycmF5KCldLFxuICAgICAgKSxcbiAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICApO1xuXG4gICAgLy8gc3VwcG9ydCBkeW5hbWljIG9wdGlvbnMgbG9hZGluZyBvbiBmaWx0ZXJpbmdcbiAgICB0aGlzLmFsbE9wdGlvbnMkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wZW5lZCkge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYXV0b0ZvY3VzRmlyc3RPcHRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmhhc01hdGNoZWRPcHRpb24kID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmFsbE9wdGlvbnMkLnBpcGUoXG4gICAgICAgIG1hcChjdXN0b21PcHRpb25zID0+XG4gICAgICAgICAgY3VzdG9tT3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IG9wdGlvbiAhPT0gdGhpcy5pbnB1dHRpbmdPcHRpb24pLFxuICAgICAgICApLFxuICAgICAgICBzd2l0Y2hNYXAob3B0aW9ucyA9PlxuICAgICAgICAgIG9wdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBjb21iaW5lTGF0ZXN0KG9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24udmFsdWUkKSlcbiAgICAgICAgICAgIDogb2YoW10gYXMgVFtdKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgICB0aGlzLmZpbHRlclN0cmluZyQsXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3ZhbHVlcywgZmlsdGVyU3RyaW5nXSkgPT5cbiAgICAgICAgdmFsdWVzLnNvbWUodmFsdWUgPT4gdGhpcy50cmFja0ZuKHZhbHVlKSA9PT0gZmlsdGVyU3RyaW5nKSxcbiAgICAgICksXG4gICAgICBwdWJsaXNoUmVmKCksXG4gICAgKTtcblxuICAgIHRoaXMub3B0aW9uVmlzaWJsZXMkID0gKFxuICAgICAgdGhpcy5jb250ZW50T3B0aW9ucy5jaGFuZ2VzIGFzIE9ic2VydmFibGU8UXVlcnlMaXN0PE9wdGlvbkNvbXBvbmVudDxUPj4+XG4gICAgKS5waXBlKFxuICAgICAgc3RhcnRXaXRoKHRoaXMuY29udGVudE9wdGlvbnMpLFxuICAgICAgc3dpdGNoTWFwKChvcHRpb25zOiBRdWVyeUxpc3Q8T3B0aW9uQ29tcG9uZW50PFQ+PikgPT5cbiAgICAgICAgb3B0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBjb21iaW5lTGF0ZXN0KG9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24udmlzaWJsZSQpKVxuICAgICAgICAgIDogb2YoW10gYXMgYm9vbGVhbltdKSxcbiAgICAgICksXG4gICAgICBwdWJsaXNoUmVmKCksXG4gICAgKTtcblxuICAgIHRoaXMuaGFzVmlzaWJsZU9wdGlvbiQgPSB0aGlzLm9wdGlvblZpc2libGVzJC5waXBlKFxuICAgICAgbWFwKHZpc2libGUgPT4gdmlzaWJsZS5zb21lKEJvb2xlYW4pKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBwdWJsaXNoUmVmKCksXG4gICAgKTtcblxuICAgIHRoaXMub3B0aW9uVmlzaWJsZXMkLnBpcGUoZGVib3VuY2VUaW1lKDUwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudG9vbHRpcFJlZj8udXBkYXRlUG9zaXRpb24oKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMub3B0aW9uQ29udGVudD8uZGV0YWNoKCk7XG4gICAgdGhpcy5kZXN0cm95JCQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBvcGVuT3B0aW9uKCkge1xuICAgIHRoaXMudG9vbHRpcFJlZi5zaG93KCk7XG4gIH1cblxuICBjbG9zZU9wdGlvbigpIHtcbiAgICB0aGlzLnRvb2x0aXBSZWYuaGlkZSgpO1xuICB9XG5cbiAgb25TaG93T3B0aW9ucygpIHtcbiAgICBjb25zdCBleGVjID0gKCkgPT4ge1xuICAgICAgdGhpcy5jb250YWluZXJXaWR0aCA9IHRoaXMuc2VsZWN0UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKyAncHgnO1xuXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLmF1dG9Gb2N1c0ZpcnN0T3B0aW9uKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zaG93LmVtaXQoKTtcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMub3B0aW9uQ29udGVudCkge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5vcHRpb25Db250ZW50LmF0dGFjaCgpO1xuICAgICAgICBleGVjKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhlYygpO1xuICAgIH1cbiAgfVxuXG4gIG9uSGlkZU9wdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMub25Ub3VjaGVkKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubGF6eSkge1xuICAgICAgdGhpcy5vcHRpb25Db250ZW50Py5kZXRhY2goKTtcbiAgICB9XG4gICAgdGhpcy5yZXNldEZvY3VzZWRPcHRpb24oKTtcbiAgICB0aGlzLmZpbHRlclN0cmluZyA9ICcnO1xuICAgIHRoaXMuaGlkZS5lbWl0KCk7XG4gIH1cblxuICBvbklucHV0KGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMuZmlsdGVyU3RyaW5nID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcblxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLmF1dG9Gb2N1c0ZpcnN0T3B0aW9uKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiB7XG4gICAgICAgIHRoaXMuZm9jdXNPcHRpb25EaXIoJ2Rvd24nKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQXJyb3dVcCc6IHtcbiAgICAgICAgdGhpcy5mb2N1c09wdGlvbkRpcigndXAnKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW50ZXInOiB7XG4gICAgICAgIHRoaXMuc2VsZWN0Rm9jdXNlZE9wdGlvbigpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdFc2NhcGUnOiB7XG4gICAgICAgIHRoaXMuZXNjU2VsZWN0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbk9wdGlvbkNsaWNrKG9wdGlvbjogT3B0aW9uQ29tcG9uZW50PFQ+KSB7XG4gICAgdGhpcy5yZXNldEZvY3VzZWRPcHRpb24ob3B0aW9uKTtcbiAgICB0aGlzLnNlbGVjdE9wdGlvbihvcHRpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGF1dG9Gb2N1c0ZpcnN0T3B0aW9uKCkge1xuICAgIGlmICh0aGlzLmRlZmF1bHRGaXJzdE9wdGlvbiAmJiB0aGlzLmFsbG93Q3JlYXRlICYmIHRoaXMuZmlsdGVyU3RyaW5nKSB7XG4gICAgICBjb25zdCBtYXRjaGVkT3B0aW9uID0gdGhpcy5jb250ZW50T3B0aW9ucy5maW5kKFxuICAgICAgICBvcHRpb24gPT4gdGhpcy50cmFja0ZuKG9wdGlvbi52YWx1ZSkgPT09IHRoaXMuZmlsdGVyU3RyaW5nLFxuICAgICAgKTtcbiAgICAgIHRoaXMucmVzZXRGb2N1c2VkT3B0aW9uKG1hdGNoZWRPcHRpb24gfHwgdGhpcy5jdXN0b21PcHRpb25zLmZpcnN0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHRoaXMuYWxsT3B0aW9ucy5maW5kKFxuICAgICAgb3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCAmJiBvcHRpb24udmlzaWJsZSxcbiAgICApO1xuICAgIGlmICh0aGlzLmRlZmF1bHRGaXJzdE9wdGlvbikge1xuICAgICAgdGhpcy5yZXNldEZvY3VzZWRPcHRpb24oXG4gICAgICAgIHNlbGVjdGVkT3B0aW9uIHx8XG4gICAgICAgICAgdGhpcy5hbGxPcHRpb25zLmZpbmQob3B0aW9uID0+IG9wdGlvbi52aXNpYmxlICYmICFvcHRpb24uZGlzYWJsZWQpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkT3B0aW9uKSB7XG4gICAgICB0aGlzLnNjcm9sbFRvT3B0aW9uKHNlbGVjdGVkT3B0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9jdXNPcHRpb25EaXIoZGlyOiAnZG93bicgfCAndXAnKSB7XG4gICAgaWYgKCF0aGlzLm9wZW5lZCkge1xuICAgICAgdGhpcy5vcGVuT3B0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZpc2libGVPcHRpb25zID0gdGhpcy5hbGxPcHRpb25zLmZpbHRlcihcbiAgICAgIG9wdGlvbiA9PiBvcHRpb24udmlzaWJsZSAmJiAhb3B0aW9uLmRpc2FibGVkLFxuICAgICk7XG4gICAgaWYgKHZpc2libGVPcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdGVwID0gZGlyID09PSAnZG93bicgPyAxIDogLTE7XG4gICAgbGV0IGkgPSB2aXNpYmxlT3B0aW9ucy5pbmRleE9mKHRoaXMuZm9jdXNlZE9wdGlvbik7XG4gICAgaSA9IGkgKyBzdGVwO1xuICAgIGlmIChpID49IHZpc2libGVPcHRpb25zLmxlbmd0aCkge1xuICAgICAgaSA9IDA7XG4gICAgfSBlbHNlIGlmIChpIDwgMCkge1xuICAgICAgaSA9IHZpc2libGVPcHRpb25zLmxlbmd0aCAtIDE7XG4gICAgfVxuICAgIHRoaXMucmVzZXRGb2N1c2VkT3B0aW9uKHZpc2libGVPcHRpb25zW2ldKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEZvY3VzZWRPcHRpb24oZm9jdXNlZE9wdGlvbj86IE9wdGlvbkNvbXBvbmVudDxUPikge1xuICAgIGlmICh0aGlzLmZvY3VzZWRPcHRpb24gPT09IGZvY3VzZWRPcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb2N1c2VkT3B0aW9uKSB7XG4gICAgICB0aGlzLmZvY3VzZWRPcHRpb24uYmx1cigpO1xuICAgIH1cblxuICAgIHRoaXMuZm9jdXNlZE9wdGlvbiA9IGZvY3VzZWRPcHRpb247XG5cbiAgICBpZiAodGhpcy5mb2N1c2VkT3B0aW9uKSB7XG4gICAgICB0aGlzLmZvY3VzZWRPcHRpb24uZm9jdXMoKTtcbiAgICAgIHRoaXMuc2Nyb2xsVG9PcHRpb24odGhpcy5mb2N1c2VkT3B0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9PcHRpb24ob3B0aW9uOiBPcHRpb25Db21wb25lbnQ8VD4pIHtcbiAgICBpZiAodGhpcy5vcHRpb25MaXN0UmVmKSB7XG4gICAgICBzY3JvbGxJbnRvVmlldyhcbiAgICAgICAgdGhpcy5vcHRpb25MaXN0UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIG9wdGlvbi5lbFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VsZWN0Rm9jdXNlZE9wdGlvbigpIHtcbiAgICBpZiAoIXRoaXMub3BlbmVkKSB7XG4gICAgICB0aGlzLm9wZW5PcHRpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9jdXNlZE9wdGlvbiAmJiAhdGhpcy5mb2N1c2VkT3B0aW9uLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnNlbGVjdE9wdGlvbih0aGlzLmZvY3VzZWRPcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlc2NTZWxlY3QoKSB7XG4gICAgdGhpcy5jbG9zZU9wdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJhY2tGbjxUPih2YWx1ZTogVCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbHRlckZuKFxuICAgIGZpbHRlclN0cmluZzogc3RyaW5nLFxuICAgIHsgbGFiZWwsIHZhbHVlIH06IFNlbGVjdEZpbHRlck9wdGlvbjxUPixcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0eXBlb2YgbGFiZWwgPT09ICdzdHJpbmcnICYmIGxhYmVsKSB8fFxuICAgICAgdGhpcy5sYWJlbEZuPy4odmFsdWUpIHx8XG4gICAgICBjb2VyY2VTdHJpbmcodGhpcy50cmFja0ZuKHZhbHVlKSlcbiAgICApXG4gICAgICA/LnRvTG93ZXJDYXNlKClcbiAgICAgIC5pbmNsdWRlcyhmaWx0ZXJTdHJpbmc/LnRvTG93ZXJDYXNlKCkgPz8gJycpO1xuICB9XG5cbiAgYWJzdHJhY3Qgc2VsZWN0T3B0aW9uKG9wdGlvbjogT3B0aW9uQ29tcG9uZW50PFQ+KTogdm9pZDtcblxuICBhYnN0cmFjdCBjbGVhclZhbHVlKGV2ZW50OiBFdmVudCk6IHZvaWQ7XG59XG4iXX0=
454
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1zZWxlY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VsZWN0L2Jhc2Utc2VsZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUVOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixHQUFHLEVBRUgsU0FBUyxFQUNULEtBQUssRUFDTCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDNUMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFaEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixhQUFhLEVBQ2IsVUFBVSxFQUNWLGNBQWMsR0FDZixNQUFNLFVBQVUsQ0FBQztBQUVsQixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBU3JELE1BQU0sV0FBVyxHQUFHO0lBQ2xCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUU7SUFDekIsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRTtJQUMxQixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFO0lBQ3pCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7SUFDeEIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRTtDQUMxQixDQUFDO0FBS0YsTUFBTSxPQUFnQixVQUNwQixTQUFRLGlCQUFvQjtJQUc1QixJQUNJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLEdBQUc7UUFDVixJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssR0FBRyxFQUFFO1lBQzlCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUNJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEdBQWlDO1FBQzNDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFHRCxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBR2xCLFNBQVMsQ0FBVTtJQUduQixXQUFXLENBQVU7SUFHckIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUdoQixXQUFXLEdBQUcsRUFBRSxDQUFDO0lBR2pCLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUcxQixVQUFVLENBQVU7SUFJcEIsUUFBUSxDQUFTO0lBR2pCLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFHbkIsUUFBUSxHQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDO0lBR3ZDLFFBQVEsR0FBc0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFHeEQsT0FBTyxHQUFlLElBQUksQ0FBQyxRQUFRLENBQUM7SUFHcEMsT0FBTyxDQUF3QjtJQUcvQixZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUcxQyxJQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUdoQyxJQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUd0QixTQUFTLENBQTBCO0lBR25DLFVBQVUsQ0FBbUI7SUFHN0IsYUFBYSxDQUE2QjtJQUdwRCxxQkFBcUIsQ0FBa0M7SUFLdkQsaUJBQWlCLENBQW1CO0lBR3BDLGtCQUFrQixDQUFxQztJQUd2RCxpQkFBaUIsQ0FBZ0M7SUFFakQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxHQUFHO1FBQ2xCLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7WUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQzlCLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDTixhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLEtBQUssR0FBa0IsYUFBYSxDQUFDLE1BQU0sQ0FBQztJQUM1QyxRQUFRLENBQStCO0lBQ3ZDLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDM0IsaUJBQWlCLEdBQTRCLEVBQUUsQ0FBQztJQU90QyxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBRS9ELGVBQWUsQ0FBc0M7SUFFckQsY0FBYyxDQUFzQztJQUVwRCxnQkFBZ0IsQ0FBK0I7SUFFekQsV0FBVyxHQUFHLElBQUksZUFBZSxDQUEwQixFQUFFLENBQUMsQ0FBQztJQUUvRCxjQUFjLEdBQUcsSUFBSSxlQUFlLENBQTBCLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLGNBQWMsQ0FBUztJQUViLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hELGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FDbkQsSUFBSSxDQUFDLFlBQVksQ0FDbEIsQ0FBQztJQUVGLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25DLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25ELFFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBbUIsSUFBSSxDQUFDLENBQUM7SUFFdEMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVqRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDdkMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2xCLElBQUksT0FBTyxFQUFFLE1BQU0sRUFBRTtnQkFFbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3RCO1lBRUQsT0FBTyxhQUFhLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxPQUFPO2dCQUVaLEtBQUssQ0FDSCxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQ2hFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQy9CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQzthQUMxQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxFQUNGLFVBQVUsRUFBRSxDQUNiLENBQUM7UUFFRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQzdDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNqQixJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNwQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDcEM7UUFDSCxDQUFDLENBQUMsRUFDRixVQUFVLEVBQUUsQ0FDYixDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7WUFDbEMsSUFBSSxDQUFDLE9BQU87WUFDWixJQUFJLENBQUMsZUFBZTtTQUNyQixDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUU7WUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3JCLE9BQU8sRUFBRSxDQUFDO2FBQ1g7WUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ2xELENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQTBCLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMzRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQ3hDLE1BQU0sS0FBSyxHQUNULElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUM3RCxJQUFJLEtBQUssRUFBRTt3QkFDVCxHQUFHLENBQUMsSUFBSSxDQUFDOzRCQUNQLEtBQUs7NEJBQ0wsS0FBSzs0QkFDTCxRQUFRLEVBQUUsSUFBSTt5QkFDZixDQUFDLENBQUM7cUJBQ0o7aUJBQ0Y7Z0JBQ0QsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsRUFDRixVQUFVLEVBQUUsQ0FDYixDQUFDO1FBRUYsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLGNBQWM7YUFDaEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN6QyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFHTyxlQUFlLENBQUMsTUFBVztRQUNqQyxNQUFNLFFBQVEsR0FBNEIsRUFBRSxDQUFDO1FBQzdDLElBQUksY0FBMEIsQ0FBQztRQUUvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzdDLE1BQU0sRUFDSixLQUFLLEVBQ0wsS0FBSyxFQUNMLFFBQVEsRUFDUixVQUFVLEVBQ1YsWUFBWSxFQUNaLGVBQWUsR0FDaEIsR0FBRyxHQUFHLENBQUM7WUFDUixJQUFJLGNBQWMsS0FBSyxVQUFVLEVBQUU7Z0JBQ2pDLGNBQWMsR0FBRyxVQUFVLENBQUM7Z0JBQzVCLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ1osVUFBVTtpQkFDUyxDQUFDLENBQUM7YUFDeEI7WUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNaLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxRQUFRO2dCQUNSLFlBQVk7Z0JBQ1osUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztnQkFDekMsZUFBZTthQUNJLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsYUFBYSxDQUFDO1lBQ1osSUFBSSxDQUFDLGdCQUFnQjtZQUNyQixJQUFJLENBQUMsY0FBYztZQUNuQixJQUFJLENBQUMsZUFBZTtTQUNyQixDQUFDO2FBQ0MsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxjQUFjLENBQUMsRUFBRSxFQUFFO1lBQ3ZELE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxhQUFhLEVBQUUsR0FBRyxjQUFjLENBQUMsQ0FBQztZQUNsRCxJQUFJLGVBQWUsRUFBRTtnQkFDbkIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUM5QjtZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVMLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ2xELElBQUksQ0FDSCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQ25DLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUU7WUFDOUIsTUFBTSxNQUFNLEdBQTRCLEVBQUUsQ0FBQztZQUMzQyxJQUFJLGVBQWlDLENBQUM7WUFDdEMsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFDekIsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7WUFDOUIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFFOUIsSUFDRSxlQUFlO29CQUNmLENBQUMsR0FBRyxLQUFLLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDekIsQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLGVBQWUsS0FBSyxNQUFNLENBQUMsQ0FBQztvQkFDcEQsZ0JBQWdCLEtBQUsscUJBQXFCLEVBQzFDO29CQUNBLE1BQU0sQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO2lCQUMxRDtnQkFDRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7b0JBQ3JCLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQ3RDLGVBQWUsR0FBRyxNQUFNLENBQUM7aUJBQzFCO3FCQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLEVBQUU7b0JBQzlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3JCO2dCQUNELGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDbkMsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FDSDthQUNBLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNsQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxZQUFZLEdBQUcsQ0FBQyxDQUFTLEVBQUUsSUFBMkIsRUFBRSxFQUFFLENBQ3hELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTNCLFVBQVU7UUFDUixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUV0RSxxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7WUFDekIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNsQjtRQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFZO1FBQ2xCLElBQUksQ0FBQyxZQUFZLEdBQUksS0FBSyxDQUFDLE1BQTJCLENBQUMsS0FBSyxDQUFDO1FBRTdELHFCQUFxQixDQUFDLEdBQUcsRUFBRTtZQUN6QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFvQjtRQUM1QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBb0I7UUFDNUIsUUFBUSxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ2pCLEtBQUssV0FBVyxDQUFDLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU07YUFDUDtZQUNELEtBQUssU0FBUyxDQUFDLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEIsTUFBTTthQUNQO1lBQ0QsS0FBSyxPQUFPLENBQUMsQ0FBQztnQkFDWixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEIsTUFBTTthQUNQO1lBQ0QsS0FBSyxRQUFRLENBQUMsQ0FBQztnQkFDYixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU07YUFDUDtTQUNGO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUE4QjtRQUMxQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBd0I7UUFDdkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUTtZQUNqRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVTLG9CQUFvQjtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtZQUNsQyxPQUFPO1NBQ1I7UUFDRCxNQUFNLEtBQUssR0FDVCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUN0RCxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVO2dCQUNuQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNoQzthQUFNO1lBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM1QjtJQUNILENBQUM7SUFFUyxjQUFjLENBQUMsR0FBa0I7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxFQUFFO1lBQ25DLE9BQU87U0FDUjtRQUNELE1BQU0sSUFBSSxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FDM0IsQ0FBQztRQUNGLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRWIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFO1lBQ3pDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQ2Q7UUFDRCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFO1lBQ3RDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDUDthQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNoQixDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDdkM7UUFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUNSLEtBQWdDLEVBQ2hDLFdBQThCLEVBQzlCLEVBQUU7UUFDRixNQUFNLFlBQVksR0FBRyxXQUFXLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3RCxPQUFPLENBQ0wsWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQ3pFLENBQUM7SUFDSixDQUFDLENBQUM7SUFFUSxrQkFBa0IsQ0FBQyxhQUFnQztRQUMzRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixJQUFJLGFBQWEsRUFBRSxLQUFLLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFhO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7SUFFUyxjQUFjLENBQUMsTUFBd0I7UUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWM7YUFDOUIsUUFBUSxFQUFFO2FBQ1YsU0FBUyxDQUNSLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQ2hFLENBQUM7UUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQy9CLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDdEMsY0FBYyxDQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUNoQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FDakQsQ0FBQzthQUNIO1lBQ0QsT0FBTztTQUNSO1FBQ0QsSUFDRSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWE7WUFDMUIsS0FBSyxJQUFJLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFDaEQ7WUFDQSxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN0RDtJQUNILENBQUM7SUFFUyxtQkFBbUI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLE9BQU87U0FDUjtRQUNELElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0MsSUFBSSxhQUFhLEVBQUU7WUFFakIsYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQ3pDLE1BQU0sQ0FBQyxFQUFFLENBQ1AsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQ25FLENBQUM7WUFDRixhQUFhLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7SUFFRCxXQUFXLENBQ1QsS0FBZ0MsRUFDaEMsTUFBd0M7UUFFeEMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUF3QjtRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBUTtRQUN0QixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFUyxTQUFTO1FBQ2pCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU8sUUFBUSxDQUFJLEtBQVE7UUFDMUIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sU0FBUyxDQUFJLEtBQWE7UUFDaEMsTUFBTSxLQUFLLEdBQUcsS0FBVSxDQUFDO1FBQ3pCLE9BQU87WUFDTCxLQUFLO1NBQ04sQ0FBQztJQUNKLENBQUM7SUFFTyxTQUFTLENBQ2YsWUFBb0IsRUFDcEIsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUF5QjtRQUV2QyxPQUFPLENBQ0wsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDckIsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDbEM7WUFDQyxFQUFFLFdBQVcsRUFBRTthQUNkLFFBQVEsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQzt1R0FoaUJtQixVQUFVOzJGQUFWLFVBQVUsMkdBMkJWLGlCQUFpQix5Q0FHakIsaUJBQWlCLCtDQUdqQixpQkFBaUIsaVpBeUR2Qix5QkFBeUIsMkJBQVUsV0FBVyxvREFNM0MsZUFBZSx3WkFYckIsOEJBQThCLHdFQVEzQixtQkFBbUIsMkJBQVUsVUFBVTs7MkZBN0ZqQyxVQUFVO2tCQUgvQixTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs4QkFNSyxJQUFJO3NCQURQLEtBQUs7Z0JBY0YsT0FBTztzQkFEVixLQUFLO2dCQVdOLFVBQVU7c0JBRFQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRTtnQkFJdkMsU0FBUztzQkFEUixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFO2dCQUl2QyxXQUFXO3NCQURWLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUU7Z0JBSXZDLE9BQU87c0JBRE4sS0FBSztnQkFJTixXQUFXO3NCQURWLEtBQUs7Z0JBSU4sa0JBQWtCO3NCQURqQixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsS0FBSztnQkFLTixRQUFRO3NCQUZQLEtBQUs7Z0JBS04sYUFBYTtzQkFEWixLQUFLO2dCQUlOLFFBQVE7c0JBRFAsS0FBSztnQkFJTixRQUFRO3NCQURQLEtBQUs7Z0JBSU4sT0FBTztzQkFETixLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJTixZQUFZO3NCQURYLE1BQU07Z0JBSVAsSUFBSTtzQkFESCxNQUFNO2dCQUlQLElBQUk7c0JBREgsTUFBTTtnQkFJRyxTQUFTO3NCQURsQixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTlCLFVBQVU7c0JBRG5CLFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJL0IsYUFBYTtzQkFEdEIsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUk3QyxxQkFBcUI7c0JBRHBCLFNBQVM7dUJBQUMsOEJBQThCO2dCQU16QyxpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUk5RCxrQkFBa0I7c0JBRGpCLFlBQVk7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUl2RCxpQkFBaUI7c0JBRGhCLGVBQWU7dUJBQUMsZUFBZSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBEZXN0cm95UmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgc3dpdGNoTWFwLFxuICBtZXJnZSxcbiAgc3RhcnRXaXRoLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ29tbW9uRm9ybUNvbnRyb2wgfSBmcm9tICcuLi9mb3JtJztcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gJy4uL3Njcm9sbGluZy92aXJ0dWFsLXNjcm9sbC12aWV3cG9ydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4uL3Rvb2x0aXAnO1xuaW1wb3J0IHsgQ29tcG9uZW50U2l6ZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7XG4gIGNvZXJjZUF0dHJCb29sZWFuLFxuICBjb2VyY2VTdHJpbmcsXG4gIGlzVGVtcGxhdGVSZWYsXG4gIHB1Ymxpc2hSZWYsXG4gIHNjcm9sbEludG9WaWV3LFxufSBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7IE9wdGlvbkl0ZW1DdXN0b21EaXJlY3RpdmUgfSBmcm9tICcuL2hlbHBlci1kaXJlY3RpdmVzJztcbmltcG9ydCB7IE9wdGlvbkl0ZW1Db21wb25lbnQgfSBmcm9tICcuL29wdGlvbi1pdGVtL29wdGlvbi1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL29wdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgQ3JlYXRlRm4sXG4gIERpc3BsYXlPcHRpb24sXG4gIE9wdGlvbkZpbHRlckZuLFxuICBTZWxlY3RGaWx0ZXJPcHRpb24sXG4gIFRyYWNrRm4sXG59IGZyb20gJy4vc2VsZWN0LnR5cGVzJztcblxuY29uc3QgaXRlbVNpemVNYXAgPSB7XG4gIFtDb21wb25lbnRTaXplLkxhcmdlXTogNDAsXG4gIFtDb21wb25lbnRTaXplLk1lZGl1bV06IDMyLFxuICBbQ29tcG9uZW50U2l6ZS5TbWFsbF06IDI4LFxuICBbQ29tcG9uZW50U2l6ZS5NaW5pXTogMjYsXG4gIFtDb21wb25lbnRTaXplLkVtcHR5XTogMzIsXG59O1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVNlbGVjdDxULCBWID0gVD5cbiAgZXh0ZW5kcyBDb21tb25Gb3JtQ29udHJvbDxWPlxuICBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXRcbntcbiAgQElucHV0KClcbiAgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gIH1cblxuICBzZXQgc2l6ZSh2YWwpIHtcbiAgICBpZiAoIXZhbCB8fCB0aGlzLl9zaXplID09PSB2YWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc2l6ZSA9IHZhbDtcbiAgICB0aGlzLnNpemUkJC5uZXh0KHZhbCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgfVxuXG4gIHNldCBvcHRpb25zKHZhbDogQXJyYXk8U2VsZWN0RmlsdGVyT3B0aW9uPFQ+Pikge1xuICAgIHRoaXMuX29wdGlvbnMgPSB2YWw7XG4gICAgdGhpcy5vcHRpb25zJCQubmV4dCh2YWwpO1xuICB9XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBjb2VyY2VBdHRyQm9vbGVhbiB9KVxuICBmaWx0ZXJhYmxlID0gdHJ1ZTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUF0dHJCb29sZWFuIH0pXG4gIGNsZWFyYWJsZTogYm9vbGVhbjtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUF0dHJCb29sZWFuIH0pXG4gIGFsbG93Q3JlYXRlOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpXG4gIGxvYWRpbmcgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlciA9ICcnO1xuXG4gIEBJbnB1dCgpXG4gIGRlZmF1bHRGaXJzdE9wdGlvbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgdXNlVmlydHVhbDogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICAvLyBUT0RPIOi/mOS4jeaUr+aMgeWKqOaAgemrmOW6pueahG9wdGlvblxuICBpdGVtU2l6ZTogbnVtYmVyO1xuXG4gIEBJbnB1dCgpXG4gIG1heEl0ZW1MZW5ndGggPSAxMDtcblxuICBASW5wdXQoKVxuICBjcmVhdGVGbjogQ3JlYXRlRm48VD4gPSB0aGlzLl9jcmVhdGVGbjtcblxuICBASW5wdXQoKVxuICBmaWx0ZXJGbjogT3B0aW9uRmlsdGVyRm48VD4gPSB0aGlzLl9maWx0ZXJGbi5iaW5kKHRoaXMpO1xuXG4gIEBJbnB1dCgpXG4gIHRyYWNrRm46IFRyYWNrRm48VD4gPSB0aGlzLl90cmFja0ZuO1xuXG4gIEBJbnB1dCgpXG4gIGxhYmVsRm4/OiAodmFsdWU6IFQpID0+IHN0cmluZztcblxuICBAT3V0cHV0KClcbiAgZmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHNob3cgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGhpZGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnc2VsZWN0UmVmJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJvdGVjdGVkIHNlbGVjdFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgndG9vbHRpcFJlZicsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByb3RlY3RlZCB0b29sdGlwUmVmOiBUb29sdGlwRGlyZWN0aXZlO1xuXG4gIEBWaWV3Q2hpbGQoJ29wdGlvbkxpc3RSZWYnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgcHJvdGVjdGVkIG9wdGlvbkxpc3RSZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoVmlydHVhbFNjcm9sbFZpZXdwb3J0Q29tcG9uZW50KVxuICB2aXJ0dWFsU2Nyb2xsVmlld3BvcnQhOiBWaXJ0dWFsU2Nyb2xsVmlld3BvcnRDb21wb25lbnQ7XG5cbiAgLy8g5Y+v5Lul5Lyg5YWl6Ieq5a6a5LmJb3B0aW9uSXRlbe+8jOe6p+WIq+acgOmrmFxuICAvLyDkuLvopoHkvZznlKjmmK/lj6/ku6XlnKjkuJrliqHph4zlr7lvcHRpb27pmYTliqDkvovlpoIgdG9vbHRpcCDov5nmoLfnmoTog73liptcbiAgQENvbnRlbnRDaGlsZChPcHRpb25JdGVtQ3VzdG9tRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGlucHV0SXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBWaWV3Q2hpbGRyZW4oT3B0aW9uSXRlbUNvbXBvbmVudCwgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIGNvbnRlbnRPcHRpb25JdGVtczogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcblxuICBAQ29udGVudENoaWxkcmVuKE9wdGlvbkNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBjb250ZW50VHBsT3B0aW9uczogUXVlcnlMaXN0PE9wdGlvbkNvbXBvbmVudDxUPj47XG5cbiAgZ2V0IG9wZW5lZCgpIHtcbiAgICByZXR1cm4gdGhpcy50b29sdGlwUmVmLmlzQ3JlYXRlZDtcbiAgfVxuXG4gIGdldCBpbnB1dFJlYWRvbmx5KCkge1xuICAgIHJldHVybiAhKHRoaXMuZmlsdGVyYWJsZSAmJiB0aGlzLm9wZW5lZCk7XG4gIH1cblxuICBnZXQgX2l0ZW1TaXplKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1TaXplIHx8IGl0ZW1TaXplTWFwW3RoaXMuc2l6ZV07XG4gIH1cblxuICBzZXQgZmlsdGVyU3RyaW5nKHZhbCkge1xuICAgIGlmICh2YWwgIT09IHRoaXMuX2ZpbHRlclN0cmluZykge1xuICAgICAgdGhpcy5fZmlsdGVyU3RyaW5nID0gdmFsO1xuICAgICAgdGhpcy5maWx0ZXJTdHJpbmckJC5uZXh0KHZhbCk7XG4gICAgICB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KHZhbCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZpbHRlclN0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyU3RyaW5nO1xuICB9XG5cbiAgaXNUZW1wbGF0ZVJlZiA9IGlzVGVtcGxhdGVSZWY7XG4gIGlzTXVsdGkgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNjcm9sbGVkSW5kZXggPSAwO1xuXG4gIHByaXZhdGUgX3NpemU6IENvbXBvbmVudFNpemUgPSBDb21wb25lbnRTaXplLk1lZGl1bTtcbiAgcHJpdmF0ZSBfb3B0aW9uczogQXJyYXk8U2VsZWN0RmlsdGVyT3B0aW9uPFQ+PjtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RyaW5nID0gJyc7XG4gIHNlbGVjdGFibGVPcHRpb25zOiBBcnJheTxEaXNwbGF5T3B0aW9uPFQ+PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBVdGlsaXR5IGZpZWxkIHRvIG1ha2Ugc3VyZSB0aGUgdXNlcnMgYWx3YXlzIHNlZSB0aGUgdmFsdWUgYXMgdHlwZSBhcnJheVxuICAgKi9cbiAgYWJzdHJhY3QgcmVhZG9ubHkgdmFsdWVzJDogT2JzZXJ2YWJsZTxUW10+O1xuICAvLyDkvKDlhaXnmoRvcHRpb27mlbDmja5cbiAgcHJvdGVjdGVkIG9wdGlvbnMkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8RGlzcGxheU9wdGlvbjxUPj4+KG51bGwpO1xuICAvLyDmnIDnu4jnmoRvcHRpb27mlbDmja5cbiAgcHJvdGVjdGVkIGNvbnRlbnRPcHRpb25zJDogT2JzZXJ2YWJsZTxBcnJheTxEaXNwbGF5T3B0aW9uPFQ+Pj47XG4gIC8vIOW3suWIm+W7uueahG9wdGlvbuaVsOaNru+8iOS7heW9k+aUr+aMgei+k+WFpeaXtuaJjeacie+8iVxuICBwcm90ZWN0ZWQgY3VzdG9tT3B0aW9ucyQ6IE9ic2VydmFibGU8QXJyYXk8RGlzcGxheU9wdGlvbjxUPj4+O1xuICAvLyDmraPlnKjovpPlhaXvvIjlvoXliJvlu7rvvInnmoRvcHRpb27mlbDmja5cbiAgcHJvdGVjdGVkIGlucHV0dGluZ09wdGlvbiQ6IE9ic2VydmFibGU8RGlzcGxheU9wdGlvbjxUPj47XG4gIC8vIOWMheaLrOi+k+WFpeS4reOAgeW3suWIm+W7uuOAgeWumuS5ieeahOaJgOaciW9wdGlvbuaVsOaNrlxuICBhbGxPcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8RGlzcGxheU9wdGlvbjxUPj4+KFtdKTtcbiAgLy8g57uP6L+H6L+H5ruk5ZCO55qEb3B0aW9u5pWw5o2uXG4gIGZpbHRlck9wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBcnJheTxEaXNwbGF5T3B0aW9uPFQ+Pj4oW10pO1xuICBjb250YWluZXJXaWR0aDogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBzaXplJCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENvbXBvbmVudFNpemU+KHRoaXMuc2l6ZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsdGVyU3RyaW5nJCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oXG4gICAgdGhpcy5maWx0ZXJTdHJpbmcsXG4gICk7XG5cbiAgc2l6ZSQgPSB0aGlzLnNpemUkJC5hc09ic2VydmFibGUoKTtcbiAgb3B0aW9ucyQgPSB0aGlzLm9wdGlvbnMkJC5hc09ic2VydmFibGUoKTtcbiAgZmlsdGVyU3RyaW5nJCA9IHRoaXMuZmlsdGVyU3RyaW5nJCQuYXNPYnNlcnZhYmxlKCk7XG4gIGZvY3VzZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEaXNwbGF5T3B0aW9uPFQ+PihudWxsKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuY29udGVudE9wdGlvbnMkID0gdGhpcy5vcHRpb25zJC5waXBlKFxuICAgICAgc3dpdGNoTWFwKG9wdGlvbnMgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgICAgLy8g5aaC5p6c5pyJ5Lyg5YWl55qE6YWN572u5YiZ5L2/55So5Lyg5YWl55qE6YWN572uXG4gICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucyQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5rKh5pyJ5Lyg5YWl55qE6YWN572u5YiZ6L2s5o2iIGh0bWwg5YaZ5rOV5Li66YWN572u5pWw5o2uXG4gICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICB0aGlzLnZhbHVlcyQsXG4gICAgICAgICAgLy8g5Y2V5Liqb3B0aW9u5oiW6ICFb3B0aW9u5YiX6KGo5Y+Y6YO95Lya6Kem5Y+RXG4gICAgICAgICAgbWVyZ2UoXG4gICAgICAgICAgICAuLi50aGlzLmNvbnRlbnRUcGxPcHRpb25zLm1hcChjb250ZW50VHBsID0+IGNvbnRlbnRUcGwuY2hhbmdlcyQpLFxuICAgICAgICAgICAgdGhpcy5jb250ZW50VHBsT3B0aW9ucy5jaGFuZ2VzLFxuICAgICAgICAgICkucGlwZShzdGFydFdpdGgodGhpcy5jb250ZW50VHBsT3B0aW9ucykpLFxuICAgICAgICBdKS5waXBlKG1hcCgoW3ZhbHVlc10pID0+IHRoaXMudHBsT3B0aW9uczJEYXRhKHZhbHVlcykpKTtcbiAgICAgIH0pLFxuICAgICAgcHVibGlzaFJlZigpLFxuICAgICk7XG5cbiAgICB0aGlzLmlucHV0dGluZ09wdGlvbiQgPSB0aGlzLmZpbHRlclN0cmluZyQucGlwZShcbiAgICAgIG1hcChmaWx0ZXJTdHJpbmcgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyU3RyaW5nICYmIHRoaXMuYWxsb3dDcmVhdGUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVGbihmaWx0ZXJTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICApO1xuXG4gICAgdGhpcy5jdXN0b21PcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy52YWx1ZXMkLFxuICAgICAgdGhpcy5jb250ZW50T3B0aW9ucyQsXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW3ZhbHVlcywgb3B0aW9uc10pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmFsbG93Q3JlYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbktleXMgPSBuZXcgU2V0KFxuICAgICAgICAgIG9wdGlvbnMubWFwKG9wdGlvbiA9PiB0aGlzLnRyYWNrRm4ob3B0aW9uLnZhbHVlKSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB2YWx1ZXMucmVkdWNlPEFycmF5PERpc3BsYXlPcHRpb248VD4+PigoYWNjLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICghb3B0aW9uS2V5cy5oYXModGhpcy50cmFja0ZuKHZhbHVlKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID1cbiAgICAgICAgICAgICAgdGhpcy5sYWJlbEZuPy4odmFsdWUpIHx8IGNvZXJjZVN0cmluZyh0aGlzLnRyYWNrRm4odmFsdWUpKTtcbiAgICAgICAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICAgICAgICBhY2MucHVzaCh7XG4gICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCBbXSk7XG4gICAgICB9KSxcbiAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICApO1xuXG4gICAgdGhpcy50cmFuc2Zvcm1PcHRpb25zKCk7XG5cbiAgICB0aGlzLmZpbHRlck9wdGlvbnMkXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUob3B0aW9ucyA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMgPSBvcHRpb25zLmZpbHRlcihvcHRpb24gPT4gIW9wdGlvbi5kaXNhYmxlZCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIOWwhmF1aS1vcHRpb27ovazkuLrphY3nva7mlbDmja5cbiAgcHJpdmF0ZSB0cGxPcHRpb25zMkRhdGEodmFsdWVzOiBUW10pIHtcbiAgICBjb25zdCBjb250ZW50czogQXJyYXk8RGlzcGxheU9wdGlvbjxUPj4gPSBbXTtcbiAgICBsZXQgbGFzdEdyb3VwVGl0bGU6IEVsZW1lbnRSZWY7XG4gICAgLy8g55So5pyA5paw55qEb3B0aW9u5YWD57Sg5YiX6KGo5riF5rSX5Ye66YWN572u5pWw5o2uXG4gICAgdGhpcy5jb250ZW50VHBsT3B0aW9ucy50b0FycmF5KCkuZm9yRWFjaChjb20gPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICBncm91cFRpdGxlLFxuICAgICAgICBsYWJlbENvbnRleHQsXG4gICAgICAgIGNvbnRlbnRUZW1wbGF0ZSxcbiAgICAgIH0gPSBjb207XG4gICAgICBpZiAobGFzdEdyb3VwVGl0bGUgIT09IGdyb3VwVGl0bGUpIHtcbiAgICAgICAgbGFzdEdyb3VwVGl0bGUgPSBncm91cFRpdGxlO1xuICAgICAgICBjb250ZW50cy5wdXNoKHtcbiAgICAgICAgICBncm91cFRpdGxlLFxuICAgICAgICB9IGFzIERpc3BsYXlPcHRpb248VD4pO1xuICAgICAgfVxuICAgICAgY29udGVudHMucHVzaCh7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBsYWJlbCxcbiAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgIGxhYmVsQ29udGV4dCxcbiAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuZ2V0U2VsZWN0ZWQodmFsdWUsIHZhbHVlcyksXG4gICAgICAgIGNvbnRlbnRUZW1wbGF0ZSxcbiAgICAgIH0gYXMgRGlzcGxheU9wdGlvbjxUPik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbnRlbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1PcHRpb25zKCkge1xuICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5pbnB1dHRpbmdPcHRpb24kLFxuICAgICAgdGhpcy5jdXN0b21PcHRpb25zJCxcbiAgICAgIHRoaXMuY29udGVudE9wdGlvbnMkLCAvLyB0b2RvIGNvbnRlbnRPcHRpb25zJCDmtYHkvJrop6blj5EgY3VzdG9tT3B0aW9ucyTvvIzmiYDku6XlupTor6XlsIbov5nkuKTkuKrlkIjlubbkuLrkuIDmrKHop6blj5FcbiAgICBdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoW2lucHV0dGluZ09wdGlvbiwgY3VzdG9tT3B0aW9ucywgY29udGVudE9wdGlvbnNdKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXJyID0gWy4uLmN1c3RvbU9wdGlvbnMsIC4uLmNvbnRlbnRPcHRpb25zXTtcbiAgICAgICAgICBpZiAoaW5wdXR0aW5nT3B0aW9uKSB7XG4gICAgICAgICAgICBhcnIudW5zaGlmdChpbnB1dHRpbmdPcHRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYXJyO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoYXJyID0+IHtcbiAgICAgICAgdGhpcy5hbGxPcHRpb25zJC5uZXh0KGFycik7XG4gICAgICB9KTtcblxuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuYWxsT3B0aW9ucyQsIHRoaXMuZmlsdGVyU3RyaW5nJF0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZiksXG4gICAgICAgIG1hcCgoW29wdGlvbnMsIGZpbHRlclN0cmluZ10pID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQ6IEFycmF5PERpc3BsYXlPcHRpb248VD4+ID0gW107XG4gICAgICAgICAgbGV0IGxhc3RUaXRsZU9wdGlvbjogRGlzcGxheU9wdGlvbjxUPjtcbiAgICAgICAgICBsZXQgbGFzdFJlc3VsdExlbmd0aCA9IDA7XG4gICAgICAgICAgbGV0IGxhc3RUaXRsZVJlc3VsdExlbmd0aCA9IDA7XG4gICAgICAgICAgb3B0aW9ucy5mb3JFYWNoKChvcHRpb24sIGlkeCkgPT4ge1xuICAgICAgICAgICAgLy8g5pyJ5b6F56Gu6K6k55qE57uEb3B0aW9uXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGxhc3RUaXRsZU9wdGlvbiAmJiAvLyDpgY3ljobliLDmnIDlkI7kuIDkuKrkuoYg5oiW6ICFIOW8gOWni+mBjeWOhuaWsOeahOe7hOS6huWwsei/m+WFpeehruiupOmAu+i+kVxuICAgICAgICAgICAgICAoaWR4ID09PSBvcHRpb25zLmxlbmd0aCAtIDEgfHxcbiAgICAgICAgICAgICAgICAob3B0aW9uLmdyb3VwVGl0bGUgJiYgbGFzdFRpdGxlT3B0aW9uICE9PSBvcHRpb24pKSAmJiAvLyDlpoLmnpzorrDlvZXlvoXnoa7orqTnu4Tml7bnmoRyZXN1bHTplb/luqblkozlvZPliY1yZXN1bHTplb/luqbkuI3kuIDoh7TvvIzkuZ/lsLHmmK/lop7liqDkuobvvIzor7TmmI7nu4TlhoXmnInnrKblkIjmnaHku7bnmoRvcHRpb27vvIzlsLHmj5LlhaXov5vljrtcbiAgICAgICAgICAgICAgbGFzdFJlc3VsdExlbmd0aCAhPT0gbGFzdFRpdGxlUmVzdWx0TGVuZ3RoXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnNwbGljZShsYXN0VGl0bGVSZXN1bHRMZW5ndGgsIDAsIGxhc3RUaXRsZU9wdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwVGl0bGUpIHtcbiAgICAgICAgICAgICAgbGFzdFRpdGxlUmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgbGFzdFRpdGxlT3B0aW9uID0gb3B0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZpbHRlckZuKGZpbHRlclN0cmluZywgb3B0aW9uKSkge1xuICAgICAgICAgICAgICByZXN1bHQucHVzaChvcHRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdFJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgIHRoaXMuZmlsdGVyT3B0aW9ucyQubmV4dChyZXN1bHQpO1xuICAgICAgfSk7XG4gIH1cblxuICB0cmFja0J5VmFsdWUgPSAoXzogbnVtYmVyLCBpdGVtOiBTZWxlY3RGaWx0ZXJPcHRpb248VD4pID0+XG4gICAgdGhpcy50cmFja0ZuKGl0ZW0udmFsdWUpO1xuXG4gIG9wZW5PcHRpb24oKSB7XG4gICAgdGhpcy50b29sdGlwUmVmLnNob3coKTtcbiAgfVxuXG4gIGNsb3NlT3B0aW9uKCkge1xuICAgIHRoaXMudG9vbHRpcFJlZi5oaWRlKCk7XG4gIH1cblxuICBvblNob3dPcHRpb25zKCkge1xuICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSB0aGlzLnNlbGVjdFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICsgJ3B4JztcblxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLmF1dG9Gb2N1c0ZpcnN0T3B0aW9uKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNob3cuZW1pdCgpO1xuICB9XG5cbiAgb25IaWRlT3B0aW9ucygpIHtcbiAgICBpZiAodGhpcy5vblRvdWNoZWQpIHtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgfVxuICAgIHRoaXMucmVzZXRGb2N1c2VkT3B0aW9uKCk7XG4gICAgdGhpcy5maWx0ZXJTdHJpbmcgPSAnJztcbiAgICB0aGlzLmhpZGUuZW1pdCgpO1xuICB9XG5cbiAgb25JbnB1dChldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlclN0cmluZyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG5cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5hdXRvRm9jdXNGaXJzdE9wdGlvbigpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzdG9wRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6IHtcbiAgICAgICAgdGhpcy5mb2N1c09wdGlvbkRpcignZG93bicpO1xuICAgICAgICB0aGlzLnN0b3BFdmVudChldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQXJyb3dVcCc6IHtcbiAgICAgICAgdGhpcy5mb2N1c09wdGlvbkRpcigndXAnKTtcbiAgICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VudGVyJzoge1xuICAgICAgICB0aGlzLnNlbGVjdEZvY3VzZWRPcHRpb24oKTtcbiAgICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VzY2FwZSc6IHtcbiAgICAgICAgdGhpcy5lc2NTZWxlY3QoKTtcbiAgICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbk9wdGlvbkNsaWNrKG9wdGlvbjogT3B0aW9uSXRlbUNvbXBvbmVudDxUPikge1xuICAgIHRoaXMucmVzZXRGb2N1c2VkT3B0aW9uKG9wdGlvbik7XG4gICAgdGhpcy5zZWxlY3RPcHRpb24ob3B0aW9uKTtcbiAgfVxuXG4gIHVwZGF0ZUFsbE9wdGlvbnMob3B0aW9uOiBEaXNwbGF5T3B0aW9uPFQ+KSB7XG4gICAgY29uc3QgYWxsT3B0aW9ucyA9IHRoaXMuYWxsT3B0aW9ucyQuZ2V0VmFsdWUoKTtcbiAgICBhbGxPcHRpb25zLmZpbmQoX29wdGlvbiA9PiBfb3B0aW9uLnZhbHVlID09PSBvcHRpb24udmFsdWUpLnNlbGVjdGVkID1cbiAgICAgICFvcHRpb24uc2VsZWN0ZWQ7XG4gICAgdGhpcy5hbGxPcHRpb25zJC5uZXh0KGFsbE9wdGlvbnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGF1dG9Gb2N1c0ZpcnN0T3B0aW9uKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RhYmxlT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmlyc3QgPVxuICAgICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucy5maW5kKG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQpIHx8XG4gICAgICAodGhpcy5zZWxlY3RhYmxlT3B0aW9uc1swXS5ncm91cFRpdGxlXG4gICAgICAgID8gdGhpcy5zZWxlY3RhYmxlT3B0aW9uc1sxXVxuICAgICAgICA6IHRoaXMuc2VsZWN0YWJsZU9wdGlvbnNbMF0pO1xuICAgIGlmICh0aGlzLmRlZmF1bHRGaXJzdE9wdGlvbikge1xuICAgICAgdGhpcy5yZXNldEZvY3VzZWRPcHRpb24oZmlyc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbFRvT3B0aW9uKGZpcnN0KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZm9jdXNPcHRpb25EaXIoZGlyOiAnZG93bicgfCAndXAnKSB7XG4gICAgaWYgKCF0aGlzLm9wZW5lZCkge1xuICAgICAgdGhpcy5vcGVuT3B0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGFibGVPcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RlcCA9IGRpciA9PT0gJ2Rvd24nID8gMSA6IC0xO1xuICAgIGxldCBpID0gdGhpcy5zZWxlY3RhYmxlT3B0aW9ucy5maW5kSW5kZXgob3B0aW9uID0+XG4gICAgICB0aGlzLmlzRm9jdXMob3B0aW9uLnZhbHVlKSxcbiAgICApO1xuICAgIGkgPSBpICsgc3RlcDtcbiAgICAvLyDlpoLmnpzmmK9ncm91cFRpdGxl77yM5bCx5YaN6LWw5LiA5q2lXG4gICAgaWYgKHRoaXMuc2VsZWN0YWJsZU9wdGlvbnNbaV0/Lmdyb3VwVGl0bGUpIHtcbiAgICAgIGkgPSBpICsgc3RlcDtcbiAgICB9XG4gICAgaWYgKGkgPj0gdGhpcy5zZWxlY3RhYmxlT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGkgPSAwO1xuICAgIH0gZWxzZSBpZiAoaSA8IDApIHtcbiAgICAgIGkgPSB0aGlzLnNlbGVjdGFibGVPcHRpb25zLmxlbmd0aCAtIDE7XG4gICAgfVxuICAgIHRoaXMucmVzZXRGb2N1c2VkT3B0aW9uKHRoaXMuc2VsZWN0YWJsZU9wdGlvbnNbaV0pO1xuICB9XG5cbiAgaXNGb2N1cyA9IChcbiAgICB2YWx1ZTogRGlzcGxheU9wdGlvbjxUPlsndmFsdWUnXSxcbiAgICBmb2N1c09wdGlvbj86IERpc3BsYXlPcHRpb248VD4sXG4gICkgPT4ge1xuICAgIGNvbnN0IF9mb2N1c09wdGlvbiA9IGZvY3VzT3B0aW9uIHx8IHRoaXMuZm9jdXNlZCQuZ2V0VmFsdWUoKTtcbiAgICByZXR1cm4gKFxuICAgICAgX2ZvY3VzT3B0aW9uICYmIHRoaXMudHJhY2tGbihfZm9jdXNPcHRpb24udmFsdWUpID09PSB0aGlzLnRyYWNrRm4odmFsdWUpXG4gICAgKTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgcmVzZXRGb2N1c2VkT3B0aW9uKGZvY3VzZWRPcHRpb24/OiBEaXNwbGF5T3B0aW9uPFQ+KSB7XG4gICAgdGhpcy5ibHVyKCk7XG4gICAgaWYgKGZvY3VzZWRPcHRpb24/LnZhbHVlKSB7XG4gICAgICB0aGlzLmZvY3VzZWQkLm5leHQoZm9jdXNlZE9wdGlvbik7XG4gICAgICB0aGlzLnNjcm9sbFRvT3B0aW9uKGZvY3VzZWRPcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIG9uU2Nyb2xsZWRJbmRleENoYW5nZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zY3JvbGxlZEluZGV4ID0gaW5kZXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9PcHRpb24ob3B0aW9uOiBEaXNwbGF5T3B0aW9uPFQ+KSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbHRlck9wdGlvbnMkXG4gICAgICAuZ2V0VmFsdWUoKVxuICAgICAgLmZpbmRJbmRleChcbiAgICAgICAgaXRlbSA9PiB0aGlzLnRyYWNrRm4oaXRlbS52YWx1ZSkgPT09IHRoaXMudHJhY2tGbihvcHRpb24udmFsdWUpLFxuICAgICAgKTtcbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICBpZiAodGhpcy5jb250ZW50T3B0aW9uSXRlbXMuZ2V0KGluZGV4KSkge1xuICAgICAgICBzY3JvbGxJbnRvVmlldyhcbiAgICAgICAgICB0aGlzLm9wdGlvbkxpc3RSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICB0aGlzLmNvbnRlbnRPcHRpb25JdGVtcy5nZXQoaW5kZXgpLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGluZGV4IDwgdGhpcy5zY3JvbGxlZEluZGV4IHx8XG4gICAgICBpbmRleCA+PSB0aGlzLnNjcm9sbGVkSW5kZXggKyB0aGlzLm1heEl0ZW1MZW5ndGhcbiAgICApIHtcbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoaW5kZXggfHwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNlbGVjdEZvY3VzZWRPcHRpb24oKSB7XG4gICAgaWYgKCF0aGlzLm9wZW5lZCkge1xuICAgICAgdGhpcy5vcGVuT3B0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBmb2N1c2VkT3B0aW9uID0gdGhpcy5mb2N1c2VkJC5nZXRWYWx1ZSgpO1xuICAgIGlmIChmb2N1c2VkT3B0aW9uKSB7XG4gICAgICAvLyDmm7TmlrDogZrnhKbnmoRvcHRpb27vvIzkvovlpoLvvJpmb2N1c+afkOS4gOmhueWQjuS4gOebtOaMiWVudGVy6ZSuXG4gICAgICBmb2N1c2VkT3B0aW9uID0gdGhpcy5zZWxlY3RhYmxlT3B0aW9ucy5maW5kKFxuICAgICAgICBvcHRpb24gPT5cbiAgICAgICAgICB0aGlzLnRyYWNrRm4ob3B0aW9uLnZhbHVlKSA9PT0gdGhpcy50cmFja0ZuKGZvY3VzZWRPcHRpb24udmFsdWUpLFxuICAgICAgKTtcbiAgICAgIGZvY3VzZWRPcHRpb24gJiYgdGhpcy5zZWxlY3RPcHRpb24oZm9jdXNlZE9wdGlvbik7XG4gICAgfVxuICB9XG5cbiAgZ2V0U2VsZWN0ZWQoXG4gICAgdmFsdWU6IERpc3BsYXlPcHRpb248VD5bJ3ZhbHVlJ10sXG4gICAgdmFsdWVzOiBBcnJheTxEaXNwbGF5T3B0aW9uPFQ+Wyd2YWx1ZSddPixcbiAgKSB7XG4gICAgcmV0dXJuIHZhbHVlcy5zb21lKGl0ZW0gPT4gdGhpcy50cmFja0ZuKGl0ZW0pID09PSB0aGlzLnRyYWNrRm4odmFsdWUpKTtcbiAgfVxuXG4gIGZvY3VzKG9wdGlvbjogRGlzcGxheU9wdGlvbjxUPikge1xuICAgIHRoaXMuZm9jdXNlZCQubmV4dChvcHRpb24pO1xuICB9XG5cbiAgYmx1cigpIHtcbiAgICB0aGlzLmZvY3VzZWQkLm5leHQobnVsbCk7XG4gIH1cblxuICBnZXRMYWJlbEJ5VmFsdWUodmFsdWU6IFQpIHtcbiAgICByZXR1cm4gdGhpcy5sYWJlbEZuPy4odmFsdWUpIHx8IGNvZXJjZVN0cmluZyh0aGlzLnRyYWNrRm4odmFsdWUpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlc2NTZWxlY3QoKSB7XG4gICAgdGhpcy5jbG9zZU9wdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJhY2tGbjxUPih2YWx1ZTogVCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUZuPFQ+KGlucHV0OiBzdHJpbmcpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGlucHV0IGFzIFQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9maWx0ZXJGbihcbiAgICBmaWx0ZXJTdHJpbmc6IHN0cmluZyxcbiAgICB7IGxhYmVsLCB2YWx1ZSB9OiBTZWxlY3RGaWx0ZXJPcHRpb248VD4sXG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICAodHlwZW9mIGxhYmVsID09PSAnc3RyaW5nJyAmJiBsYWJlbCkgfHxcbiAgICAgIHRoaXMubGFiZWxGbj8uKHZhbHVlKSB8fFxuICAgICAgY29lcmNlU3RyaW5nKHRoaXMudHJhY2tGbih2YWx1ZSkpXG4gICAgKVxuICAgICAgPy50b0xvd2VyQ2FzZSgpXG4gICAgICAuaW5jbHVkZXMoZmlsdGVyU3RyaW5nPy50b0xvd2VyQ2FzZSgpID8/ICcnKTtcbiAgfVxuXG4gIGFic3RyYWN0IHNlbGVjdE9wdGlvbihvcHRpb246IERpc3BsYXlPcHRpb248VD4pOiB2b2lkO1xuICBhYnN0cmFjdCBjbGVhclZhbHVlKGV2ZW50OiBFdmVudCk6IHZvaWQ7XG59XG4iXX0=