@worktile/theia 14.2.1 → 14.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,8 @@
1
- import { DOWN_ARROW, LEFT_ARROW, RIGHT_ARROW, UP_ARROW } from '@angular/cdk/keycodes';
1
+ import { DOWN_ARROW, LEFT_ARROW, ENTER, RIGHT_ARROW, UP_ARROW } from '@angular/cdk/keycodes';
2
2
  import { Optional, SkipSelf } from '@angular/core';
3
3
  import { ContentChildren, Directive, EventEmitter, HostBinding, Inject, Input, Output } from '@angular/core';
4
4
  import { fromEvent } from 'rxjs';
5
+ import { debounceTime } from 'rxjs/operators';
5
6
  import { THE_LISTBOX_TOKEN, THE_LISTBOX_PARENT_OPTION_TOKEN, THE_LISTBOX_PARENT_GROUP_TOKEN } from './listbox.type';
6
7
  import * as i0 from "@angular/core";
7
8
  export class TheListboxOptionDirective {
@@ -32,10 +33,10 @@ export class TheListboxOptionDirective {
32
33
  setActive(active) {
33
34
  this._active = active;
34
35
  if (active) {
35
- this.elementRef.nativeElement.classList.add('active');
36
+ this.elementRef.nativeElement.classList.add('focus');
36
37
  }
37
38
  else {
38
- this.elementRef.nativeElement.classList.remove('active');
39
+ this.elementRef.nativeElement.classList.remove('focus');
39
40
  }
40
41
  }
41
42
  getActive() {
@@ -43,17 +44,17 @@ export class TheListboxOptionDirective {
43
44
  }
44
45
  }
45
46
  TheListboxOptionDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: TheListboxOptionDirective, deps: [{ token: THE_LISTBOX_PARENT_OPTION_TOKEN, optional: true, skipSelf: true }, { token: THE_LISTBOX_PARENT_GROUP_TOKEN }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
46
- TheListboxOptionDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.0", type: TheListboxOptionDirective, selector: "[theListboxOpton]", host: { properties: { "class": "this.className" } }, providers: [
47
+ TheListboxOptionDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.0", type: TheListboxOptionDirective, selector: "[theListboxOption]", inputs: { theOptionValue: "theOptionValue" }, host: { properties: { "class": "this.className" } }, providers: [
47
48
  {
48
49
  provide: THE_LISTBOX_PARENT_OPTION_TOKEN,
49
50
  useExisting: TheListboxOptionDirective
50
51
  }
51
- ], queries: [{ propertyName: "_options", predicate: TheListboxOptionDirective, descendants: true }], exportAs: ["theListboxOpton"], ngImport: i0 });
52
+ ], queries: [{ propertyName: "_options", predicate: TheListboxOptionDirective, descendants: true }], exportAs: ["theListboxOption"], ngImport: i0 });
52
53
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: TheListboxOptionDirective, decorators: [{
53
54
  type: Directive,
54
55
  args: [{
55
- selector: '[theListboxOpton]',
56
- exportAs: 'theListboxOpton',
56
+ selector: '[theListboxOption]',
57
+ exportAs: 'theListboxOption',
57
58
  providers: [
58
59
  {
59
60
  provide: THE_LISTBOX_PARENT_OPTION_TOKEN,
@@ -77,6 +78,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImpor
77
78
  }], _options: [{
78
79
  type: ContentChildren,
79
80
  args: [TheListboxOptionDirective, { descendants: true }]
81
+ }], theOptionValue: [{
82
+ type: Input
80
83
  }] } });
81
84
  export class TheListboxGroupDirective {
82
85
  constructor(parentOption, theListBox) {
@@ -111,6 +114,9 @@ export class TheListboxGroupDirective {
111
114
  return this.theListBox.groups;
112
115
  }
113
116
  }
117
+ hasChild() {
118
+ return this.options.length > 0;
119
+ }
114
120
  getFirst() {
115
121
  return this.options[0];
116
122
  }
@@ -162,7 +168,7 @@ export class TheListboxDirective {
162
168
  this.elementRef = elementRef;
163
169
  this.className = 'the-listbox-container';
164
170
  this.groups = [];
165
- this.theActiveOptionChange = new EventEmitter();
171
+ this.theListboxChange = new EventEmitter();
166
172
  }
167
173
  ngOnInit() { }
168
174
  ngAfterContentInit() {
@@ -170,9 +176,9 @@ export class TheListboxDirective {
170
176
  if (this.groups.length > 0) {
171
177
  this.setActiveItem(null, this.groups[0].getFirst(), 'init');
172
178
  }
173
- this._optionChangesSubscription = this._groups.changes.subscribe(() => {
179
+ this._optionChangesSubscription = this._options.changes.pipe(debounceTime(20)).subscribe(() => {
174
180
  this.filterGroups();
175
- this.setActiveItem(null, this.groups[0].getFirst(), 'init');
181
+ this.setActiveItem(this.activeOption, this.groups[0].getFirst(), 'init');
176
182
  });
177
183
  this.ngZone.runOutsideAngular(() => {
178
184
  this._keyboardSubscription = fromEvent(this.keyboardContainer || this.elementRef.nativeElement, 'keydown').subscribe(event => {
@@ -182,7 +188,8 @@ export class TheListboxDirective {
182
188
  }
183
189
  filterGroups() {
184
190
  this.groups = this._groups.filter(group => {
185
- if (!group.parentOption) {
191
+ group.filterOptions();
192
+ if (!group.parentOption && group.hasChild()) {
186
193
  return true;
187
194
  }
188
195
  else {
@@ -209,6 +216,10 @@ export class TheListboxDirective {
209
216
  this.setPreviousItemActive();
210
217
  event.preventDefault();
211
218
  break;
219
+ case ENTER:
220
+ this.theListboxChange.emit({ option: this.activeOption, type: 'select' });
221
+ event.preventDefault();
222
+ break;
212
223
  }
213
224
  }
214
225
  /**
@@ -301,7 +312,7 @@ export class TheListboxDirective {
301
312
  }
302
313
  option.setActive(true);
303
314
  this.activeOption = option;
304
- this.theActiveOptionChange.emit({ option, type });
315
+ this.theListboxChange.emit({ option, type });
305
316
  }
306
317
  ngOnDestroy() {
307
318
  this._optionChangesSubscription.unsubscribe();
@@ -309,12 +320,12 @@ export class TheListboxDirective {
309
320
  }
310
321
  }
311
322
  TheListboxDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: TheListboxDirective, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
312
- TheListboxDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.0", type: TheListboxDirective, selector: "[theListBox]", inputs: { keyboardContainer: "keyboardContainer" }, outputs: { theActiveOptionChange: "theActiveOptionChange" }, host: { properties: { "class": "this.className" } }, providers: [
323
+ TheListboxDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.0", type: TheListboxDirective, selector: "[theListBox]", inputs: { keyboardContainer: "keyboardContainer" }, outputs: { theListboxChange: "theListboxChange" }, host: { properties: { "class": "this.className" } }, providers: [
313
324
  {
314
325
  provide: THE_LISTBOX_TOKEN,
315
326
  useExisting: TheListboxDirective
316
327
  }
317
- ], queries: [{ propertyName: "_groups", predicate: TheListboxGroupDirective, descendants: true }], exportAs: ["theListBox"], ngImport: i0 });
328
+ ], queries: [{ propertyName: "_groups", predicate: TheListboxGroupDirective, descendants: true }, { propertyName: "_options", predicate: TheListboxOptionDirective, descendants: true }], exportAs: ["theListBox"], ngImport: i0 });
318
329
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: TheListboxDirective, decorators: [{
319
330
  type: Directive,
320
331
  args: [{
@@ -333,9 +344,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImpor
333
344
  }], _groups: [{
334
345
  type: ContentChildren,
335
346
  args: [TheListboxGroupDirective, { descendants: true }]
347
+ }], _options: [{
348
+ type: ContentChildren,
349
+ args: [TheListboxOptionDirective, { descendants: true }]
336
350
  }], keyboardContainer: [{
337
351
  type: Input
338
- }], theActiveOptionChange: [{
352
+ }], theListboxChange: [{
339
353
  type: Output
340
354
  }] } });
341
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy9jb21wb25lbnRzL2xpc3Rib3gvbGlzdGJveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEYsT0FBTyxFQUFVLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUVILGVBQWUsRUFDZixTQUFTLEVBRVQsWUFBWSxFQUNaLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWpDLE9BQU8sRUFFSCxpQkFBaUIsRUFDakIsK0JBQStCLEVBQy9CLDhCQUE4QixFQUNqQyxNQUFNLGdCQUFnQixDQUFDOztBQVl4QixNQUFNLE9BQU8seUJBQXlCO0lBZWxDLFlBQzRFLFlBQXVDLEVBQ2hFLFdBQXFDLEVBQzVFLFVBQW1DO1FBRjZCLGlCQUFZLEdBQVosWUFBWSxDQUEyQjtRQUNoRSxnQkFBVyxHQUFYLFdBQVcsQ0FBMEI7UUFDNUUsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFqQnZDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFRixjQUFTLEdBQUcsb0JBQW9CLENBQUM7SUFnQnBELENBQUM7SUFaSixJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBUUQsUUFBUSxLQUFVLENBQUM7SUFFbkIsa0JBQWtCLEtBQVUsQ0FBQztJQUU3QixTQUFTO1FBQ0wsTUFB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OzJGQVhoQyxtQkFBbUI7a0JBVi9CLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFFBQVEsRUFBRSxZQUFZO29CQUN0QixTQUFTLEVBQUU7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxxQkFBcUI7eUJBQ25DO3FCQUNKO2lCQUNKO3NIQUV5QixTQUFTO3NCQUE5QixXQUFXO3VCQUFDLE9BQU87Z0JBVXdELE9BQU87c0JBQWxGLGVBQWU7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQUV2RCxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUkscUJBQXFCO3NCQUE5QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9XTl9BUlJPVywgTEVGVF9BUlJPVywgUklHSFRfQVJST1csIFVQX0FSUk9XIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IE5nWm9uZSwgT3B0aW9uYWwsIFNraXBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzL2ludGVybmFsL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQge1xuICAgIFRoZUxpc3Rib3hDaGFuZ2VFdmVudFR5cGUsXG4gICAgVEhFX0xJU1RCT1hfVE9LRU4sXG4gICAgVEhFX0xJU1RCT1hfUEFSRU5UX09QVElPTl9UT0tFTixcbiAgICBUSEVfTElTVEJPWF9QQVJFTlRfR1JPVVBfVE9LRU5cbn0gZnJvbSAnLi9saXN0Ym94LnR5cGUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1t0aGVMaXN0Ym94T3B0b25dJyxcbiAgICBleHBvcnRBczogJ3RoZUxpc3Rib3hPcHRvbicsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFRIRV9MSVNUQk9YX1BBUkVOVF9PUFRJT05fVE9LRU4sXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZVxuICAgICAgICB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBUaGVMaXN0Ym94T3B0aW9uRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgICBwcml2YXRlIF9hY3RpdmUgPSBmYWxzZTtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MnKSBjbGFzc05hbWUgPSAndGhlLWxpc3Rib3gtb3B0aW9uJztcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSBwdWJsaWMgX29wdGlvbnM6IFF1ZXJ5TGlzdDxUaGVMaXN0Ym94T3B0aW9uRGlyZWN0aXZlPjtcblxuICAgIGdldCBoYXNDaGlsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnMuZmlyc3Q7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoVEhFX0xJU1RCT1hfUEFSRU5UX09QVElPTl9UT0tFTikgQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgcHVibGljIHBhcmVudE9wdGlvbjogVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZSxcbiAgICAgICAgQEluamVjdChUSEVfTElTVEJPWF9QQVJFTlRfR1JPVVBfVE9LRU4pIHB1YmxpYyBwYXJlbnRHcm91cDogVGhlTGlzdGJveEdyb3VwRGlyZWN0aXZlLFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gICAgKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge31cblxuICAgIGdldEdyb3VwcygpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzOiBUaGVMaXN0Ym94R3JvdXBEaXJlY3RpdmVbXSA9IFtdO1xuICAgICAgICB0aGlzLl9vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb24ucGFyZW50T3B0aW9uICYmIG9wdGlvbi5wYXJlbnRPcHRpb24gPT09IHRoaXMgJiYgIWdyb3Vwcy5pbmNsdWRlcyhvcHRpb24ucGFyZW50R3JvdXApKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzLnB1c2gob3B0aW9uLnBhcmVudEdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBncm91cHM7XG4gICAgfVxuXG4gICAgc2V0QWN0aXZlKGFjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBhY3RpdmU7XG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gICAgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1t0aGVMaXN0Ym94R3JvdXBdJyxcbiAgICBleHBvcnRBczogJ3RoZUxpc3Rib3hHcm91cCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFRIRV9MSVNUQk9YX1BBUkVOVF9HUk9VUF9UT0tFTixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBUaGVMaXN0Ym94R3JvdXBEaXJlY3RpdmVcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgVGhlTGlzdGJveEdyb3VwRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgY2xhc3NOYW1lID0gJ3RoZS1saXN0Ym94LWdyb3VwJztcblxuICAgIG9wdGlvbnM6IFRoZUxpc3Rib3hPcHRpb25EaXJlY3RpdmVbXSA9IFtdO1xuXG4gICAgQENvbnRlbnRDaGlsZHJlbihUaGVMaXN0Ym94T3B0aW9uRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIHB1YmxpYyBfb3B0aW9uczogUXVlcnlMaXN0PFRoZUxpc3Rib3hPcHRpb25EaXJlY3RpdmU+O1xuXG4gICAgLyoqXG4gICAgICog5aSn5LqOIDEg6KGo56S65rC05bmz5YiG57uE77yM5bCP5LqO562J5LqOIDEg6KGo56S65Z6C55u05YiG57uEXG4gICAgICovXG4gICAgQElucHV0KCkgaG9yaXpvbnRhbENvbHVtbiA9IDE7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChUSEVfTElTVEJPWF9QQVJFTlRfT1BUSU9OX1RPS0VOKSBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBwdWJsaWMgcGFyZW50T3B0aW9uOiBUaGVMaXN0Ym94T3B0aW9uRGlyZWN0aXZlLFxuICAgICAgICBASW5qZWN0KFRIRV9MSVNUQk9YX1RPS0VOKSBwdWJsaWMgdGhlTGlzdEJveDogVGhlTGlzdGJveERpcmVjdGl2ZVxuICAgICkge31cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge31cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgZmlsdGVyT3B0aW9ucygpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gdGhpcy5fb3B0aW9ucy5maWx0ZXIoX29wdGlvbiA9PiB7XG4gICAgICAgICAgICBpZiAoX29wdGlvbi5wYXJlbnRHcm91cCAmJiBfb3B0aW9uLnBhcmVudEdyb3VwID09PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0U2libGluZ0dyb3VwcygpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50T3B0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRPcHRpb24uZ2V0R3JvdXBzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aGVMaXN0Qm94Lmdyb3VwcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEZpcnN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zWzBdO1xuICAgIH1cblxuICAgIGdldExhc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdGhpcy5vcHRpb25zLmxlbmd0aCAtIDFdO1xuICAgIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbdGhlTGlzdEJveF0nLFxuICAgIGV4cG9ydEFzOiAndGhlTGlzdEJveCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFRIRV9MSVNUQk9YX1RPS0VOLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IFRoZUxpc3Rib3hEaXJlY3RpdmVcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgVGhlTGlzdGJveERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgY2xhc3NOYW1lID0gJ3RoZS1saXN0Ym94LWNvbnRhaW5lcic7XG5cbiAgICBwcml2YXRlIF9vcHRpb25DaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBwcml2YXRlIF9rZXlib2FyZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgcHVibGljIGFjdGl2ZU9wdGlvbjogVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZTtcblxuICAgIHB1YmxpYyBncm91cHM6IFRoZUxpc3Rib3hHcm91cERpcmVjdGl2ZVtdID0gW107XG5cbiAgICBAQ29udGVudENoaWxkcmVuKFRoZUxpc3Rib3hHcm91cERpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSBwcm90ZWN0ZWQgX2dyb3VwczogUXVlcnlMaXN0PFRoZUxpc3Rib3hHcm91cERpcmVjdGl2ZT47XG5cbiAgICBASW5wdXQoKSBrZXlib2FyZENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG5cbiAgICBAT3V0cHV0KCkgdGhlQWN0aXZlT3B0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUaGVMaXN0Ym94Q2hhbmdlRXZlbnQ+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lLCBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlckdyb3VwcygpO1xuICAgICAgICBpZiAodGhpcy5ncm91cHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVJdGVtKG51bGwsIHRoaXMuZ3JvdXBzWzBdLmdldEZpcnN0KCksICdpbml0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb3B0aW9uQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMuX2dyb3Vwcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckdyb3VwcygpO1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVJdGVtKG51bGwsIHRoaXMuZ3JvdXBzWzBdLmdldEZpcnN0KCksICdpbml0Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9rZXlib2FyZFN1YnNjcmlwdGlvbiA9IGZyb21FdmVudDxLZXlib2FyZEV2ZW50PihcbiAgICAgICAgICAgICAgICB0aGlzLmtleWJvYXJkQ29udGFpbmVyIHx8IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICdrZXlkb3duJ1xuICAgICAgICAgICAgKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlS2V5ZG93bihldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmlsdGVyR3JvdXBzKCkge1xuICAgICAgICB0aGlzLmdyb3VwcyA9IHRoaXMuX2dyb3Vwcy5maWx0ZXIoZ3JvdXAgPT4ge1xuICAgICAgICAgICAgaWYgKCFncm91cC5wYXJlbnRPcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHsga2V5Q29kZSB9ID0gZXZlbnQ7XG4gICAgICAgIHN3aXRjaCAoa2V5Q29kZSkge1xuICAgICAgICAgICAgY2FzZSBET1dOX0FSUk9XOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TmV4dExpbmVBY3RpdmUoKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBVUF9BUlJPVzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFByZXZpb3VzTGluZUFjdGl2ZSgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJJR0hUX0FSUk9XOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TmV4dEl0ZW1BY3RpdmUoKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBMRUZUX0FSUk9XOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UHJldmlvdXNJdGVtQWN0aXZlKCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOKGkFxuICAgICAqL1xuICAgIHNldFByZXZpb3VzSXRlbUFjdGl2ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlT3B0aW9uLnBhcmVudE9wdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVJdGVtKHRoaXMuYWN0aXZlT3B0aW9uLCB0aGlzLmFjdGl2ZU9wdGlvbi5wYXJlbnRPcHRpb24sICdwYXJlbnQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwT3B0aW9ucyA9IHRoaXMuYWN0aXZlT3B0aW9uLnBhcmVudEdyb3VwLm9wdGlvbnM7XG4gICAgICAgICAgICBsZXQgb3B0aW9uSW5kZXggPSBncm91cE9wdGlvbnMuaW5kZXhPZih0aGlzLmFjdGl2ZU9wdGlvbik7XG4gICAgICAgICAgICBsZXQgbmV3T3B0aW9uSW5kZXggPSBvcHRpb25JbmRleCAtIDE7XG4gICAgICAgICAgICBpZiAobmV3T3B0aW9uSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlSXRlbSh0aGlzLmFjdGl2ZU9wdGlvbiwgZ3JvdXBPcHRpb25zW25ld09wdGlvbkluZGV4XSwgJ3R1cm4nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbnRlclByZXZpb3VzR3JvdXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOKGkyDplK5cbiAgICAgKi9cbiAgICBzZXROZXh0TGluZUFjdGl2ZSgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBPcHRpb25zID0gdGhpcy5hY3RpdmVPcHRpb24ucGFyZW50R3JvdXAub3B0aW9ucztcbiAgICAgICAgbGV0IG9wdGlvbkluZGV4ID0gZ3JvdXBPcHRpb25zLmluZGV4T2YodGhpcy5hY3RpdmVPcHRpb24pO1xuICAgICAgICBsZXQgbmV3T3B0aW9uSW5kZXggPSBvcHRpb25JbmRleCArIHRoaXMuYWN0aXZlT3B0aW9uLnBhcmVudEdyb3VwLmhvcml6b250YWxDb2x1bW47XG4gICAgICAgIGlmIChuZXdPcHRpb25JbmRleCA8PSBncm91cE9wdGlvbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVJdGVtKHRoaXMuYWN0aXZlT3B0aW9uLCBncm91cE9wdGlvbnNbbmV3T3B0aW9uSW5kZXhdLCAndHVybicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbnRlck5leHRHcm91cCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog4oaSIOmUrlxuICAgICAqL1xuICAgIHNldE5leHRJdGVtQWN0aXZlKCkge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVPcHRpb24uaGFzQ2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlSXRlbSh0aGlzLmFjdGl2ZU9wdGlvbiwgdGhpcy5hY3RpdmVPcHRpb24uZmlyc3RDaGlsZCwgJ2NoaWxkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBncm91cE9wdGlvbnMgPSB0aGlzLmFjdGl2ZU9wdGlvbi5wYXJlbnRHcm91cC5vcHRpb25zO1xuICAgICAgICAgICAgbGV0IG9wdGlvbkluZGV4ID0gZ3JvdXBPcHRpb25zLmluZGV4T2YodGhpcy5hY3RpdmVPcHRpb24pO1xuICAgICAgICAgICAgbGV0IG5ld09wdGlvbkluZGV4ID0gb3B0aW9uSW5kZXggKyAxO1xuICAgICAgICAgICAgaWYgKG5ld09wdGlvbkluZGV4IDw9IGdyb3VwT3B0aW9ucy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVJdGVtKHRoaXMuYWN0aXZlT3B0aW9uLCBncm91cE9wdGlvbnNbbmV3T3B0aW9uSW5kZXhdLCAndHVybicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVudGVyTmV4dEdyb3VwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDihpEg6ZSuXG4gICAgICovXG4gICAgc2V0UHJldmlvdXNMaW5lQWN0aXZlKCkge1xuICAgICAgICBjb25zdCBncm91cE9wdGlvbnMgPSB0aGlzLmFjdGl2ZU9wdGlvbi5wYXJlbnRHcm91cC5vcHRpb25zO1xuICAgICAgICBsZXQgb3B0aW9uSW5kZXggPSBncm91cE9wdGlvbnMuaW5kZXhPZih0aGlzLmFjdGl2ZU9wdGlvbik7XG4gICAgICAgIGxldCBuZXdPcHRpb25JbmRleCA9IG9wdGlvbkluZGV4IC0gdGhpcy5hY3RpdmVPcHRpb24ucGFyZW50R3JvdXAuaG9yaXpvbnRhbENvbHVtbjtcbiAgICAgICAgaWYgKG5ld09wdGlvbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlSXRlbSh0aGlzLmFjdGl2ZU9wdGlvbiwgZ3JvdXBPcHRpb25zW25ld09wdGlvbkluZGV4XSwgJ3R1cm4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW50ZXJQcmV2aW91c0dyb3VwKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlbnRlck5leHRHcm91cCgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5hY3RpdmVPcHRpb24ucGFyZW50R3JvdXAuZ2V0U2libGluZ0dyb3VwcygpO1xuICAgICAgICBjb25zdCBncm91cEluZGV4ID0gZ3JvdXBzLmluZGV4T2YodGhpcy5hY3RpdmVPcHRpb24ucGFyZW50R3JvdXApO1xuICAgICAgICBsZXQgbmV3R3JvdXBJbmRleCA9IGdyb3VwSW5kZXggKyAxO1xuICAgICAgICBpZiAobmV3R3JvdXBJbmRleCA+IGdyb3Vwcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBuZXdHcm91cEluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEFjdGl2ZUl0ZW0odGhpcy5hY3RpdmVPcHRpb24sIGdyb3Vwc1tuZXdHcm91cEluZGV4XS5nZXRGaXJzdCgpLCAndHVybicpO1xuICAgIH1cblxuICAgIGVudGVyUHJldmlvdXNHcm91cCgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5hY3RpdmVPcHRpb24ucGFyZW50R3JvdXAuZ2V0U2libGluZ0dyb3VwcygpO1xuICAgICAgICBjb25zdCBncm91cEluZGV4ID0gZ3JvdXBzLmluZGV4T2YodGhpcy5hY3RpdmVPcHRpb24ucGFyZW50R3JvdXApO1xuICAgICAgICBsZXQgbmV3R3JvdXBJbmRleCA9IGdyb3VwSW5kZXggLSAxO1xuICAgICAgICBpZiAobmV3R3JvdXBJbmRleCA8IDApIHtcbiAgICAgICAgICAgIG5ld0dyb3VwSW5kZXggPSBncm91cHMubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEFjdGl2ZUl0ZW0odGhpcy5hY3RpdmVPcHRpb24sIGdyb3Vwc1tuZXdHcm91cEluZGV4XS5nZXRMYXN0KCksICd0dXJuJyk7XG4gICAgfVxuXG4gICAgc2V0QWN0aXZlSXRlbShwcmV2aW91czogVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZSB8IG51bGwsIG9wdGlvbjogVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZSwgdHlwZTogVGhlTGlzdGJveENoYW5nZUV2ZW50VHlwZSkge1xuICAgICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgICAgIHByZXZpb3VzLnNldEFjdGl2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9uLnNldEFjdGl2ZSh0cnVlKTtcbiAgICAgICAgdGhpcy5hY3RpdmVPcHRpb24gPSBvcHRpb247XG4gICAgICAgIHRoaXMudGhlQWN0aXZlT3B0aW9uQ2hhbmdlLmVtaXQoeyBvcHRpb24sIHR5cGUgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29wdGlvbkNoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fa2V5Ym9hcmRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhlTGlzdGJveENoYW5nZUV2ZW50IHtcbiAgICBvcHRpb246IFRoZUxpc3Rib3hPcHRpb25EaXJlY3RpdmU7XG4gICAgdHlwZTogVGhlTGlzdGJveENoYW5nZUV2ZW50VHlwZTtcbn1cbiJdfQ==
355
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy9jb21wb25lbnRzL2xpc3Rib3gvbGlzdGJveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdGLE9BQU8sRUFBVSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFFSCxlQUFlLEVBQ2YsU0FBUyxFQUVULFlBQVksRUFDWixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBRVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUVILGlCQUFpQixFQUNqQiwrQkFBK0IsRUFDL0IsOEJBQThCLEVBQ2pDLE1BQU0sZ0JBQWdCLENBQUM7O0FBWXhCLE1BQU0sT0FBTyx5QkFBeUI7SUFpQmxDLFlBQzRFLFlBQXVDLEVBQ2hFLFdBQXFDLEVBQzdFLFVBQW1DO1FBRjhCLGlCQUFZLEdBQVosWUFBWSxDQUEyQjtRQUNoRSxnQkFBVyxHQUFYLFdBQVcsQ0FBMEI7UUFDN0UsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFuQnRDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFRixjQUFTLEdBQUcsb0JBQW9CLENBQUM7SUFrQnBELENBQUM7SUFkSixJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBVUQsUUFBUSxLQUFVLENBQUM7SUFFbkIsa0JBQWtCLEtBQVUsQ0FBQztJQUU3QixTQUFTO1FBQ0wsTUFBTSxNQUFNLEdBQStCLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMzQixJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDN0YsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDbkM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBZTtRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLE1BQU0sRUFBRTtZQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDeEQ7YUFBTTtZQUNILElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0lBRUQsU0FBUztRQUNMLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDOztzSEFoRFEseUJBQXlCLGtCQWtCdEIsK0JBQStCLDZDQUMvQiw4QkFBOEI7MEdBbkJqQyx5QkFBeUIsZ0pBUHZCO1FBQ1A7WUFDSSxPQUFPLEVBQUUsK0JBQStCO1lBQ3hDLFdBQVcsRUFBRSx5QkFBeUI7U0FDekM7S0FDSixtREFPZ0IseUJBQXlCOzJGQUxqQyx5QkFBeUI7a0JBVnJDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsU0FBUyxFQUFFO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSwrQkFBK0I7NEJBQ3hDLFdBQVcsMkJBQTJCO3lCQUN6QztxQkFDSjtpQkFDSjswREFtQjZGLHlCQUF5QjswQkFBOUcsTUFBTTsyQkFBQywrQkFBK0I7OzBCQUFHLFFBQVE7OzBCQUFJLFFBQVE7OEJBQ0Ysd0JBQXdCOzBCQUFuRixNQUFNOzJCQUFDLDhCQUE4QjtxRUFoQnBCLFNBQVM7c0JBQTlCLFdBQVc7dUJBQUMsT0FBTztnQkFFc0QsUUFBUTtzQkFBakYsZUFBZTt1QkFBQyx5QkFBeUIsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBVXhELGNBQWM7c0JBQXRCLEtBQUs7O0FBOENWLE1BQU0sT0FBTyx3QkFBd0I7SUFZakMsWUFDNEUsWUFBdUMsRUFDN0UsVUFBK0I7UUFETyxpQkFBWSxHQUFaLFlBQVksQ0FBMkI7UUFDN0UsZUFBVSxHQUFWLFVBQVUsQ0FBcUI7UUFiL0MsY0FBUyxHQUFHLG1CQUFtQixDQUFDO1FBRXRELFlBQU8sR0FBZ0MsRUFBRSxDQUFDO1FBSTFDOztXQUVHO1FBQ00scUJBQWdCLEdBQUcsQ0FBQyxDQUFDO0lBSzNCLENBQUM7SUFFSixRQUFRLEtBQVUsQ0FBQztJQUVuQixrQkFBa0I7UUFDZCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELGFBQWE7UUFDVCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzFDLElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsV0FBVyxLQUFLLElBQUksRUFBRTtnQkFDckQsT0FBTyxJQUFJLENBQUM7YUFDZjtpQkFBTTtnQkFDSCxPQUFPLEtBQUssQ0FBQzthQUNoQjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGdCQUFnQjtRQUNaLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDeEM7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7U0FDakM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxRQUFRO1FBQ0osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxPQUFPO1FBQ0gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7O3FIQW5EUSx3QkFBd0Isa0JBYXJCLCtCQUErQiw2Q0FDL0IsaUJBQWlCO3lHQWRwQix3QkFBd0IsbUpBUHRCO1FBQ1A7WUFDSSxPQUFPLEVBQUUsOEJBQThCO1lBQ3ZDLFdBQVcsRUFBRSx3QkFBd0I7U0FDeEM7S0FDSixtREFPZ0IseUJBQXlCOzJGQUxqQyx3QkFBd0I7a0JBVnBDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsU0FBUyxFQUFFO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSw4QkFBOEI7NEJBQ3ZDLFdBQVcsMEJBQTBCO3lCQUN4QztxQkFDSjtpQkFDSjswREFjNkYseUJBQXlCOzBCQUE5RyxNQUFNOzJCQUFDLCtCQUErQjs7MEJBQUcsUUFBUTs7MEJBQUksUUFBUTs4QkFDaEIsbUJBQW1COzBCQUFoRSxNQUFNOzJCQUFDLGlCQUFpQjs0Q0FiUCxTQUFTO3NCQUE5QixXQUFXO3VCQUFDLE9BQU87Z0JBSXNELFFBQVE7c0JBQWpGLGVBQWU7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQUt4RCxnQkFBZ0I7c0JBQXhCLEtBQUs7O0FBc0RWLE1BQU0sT0FBTyxtQkFBbUI7SUFtQjVCLFlBQW9CLE1BQWMsRUFBVSxVQUFtQztRQUEzRCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVUsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFsQnpELGNBQVMsR0FBRyx1QkFBdUIsQ0FBQztRQVFuRCxXQUFNLEdBQStCLEVBQUUsQ0FBQztRQVFyQyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBeUIsQ0FBQztJQUVXLENBQUM7SUFFbkYsUUFBUSxLQUFVLENBQUM7SUFFbkIsa0JBQWtCO1FBQ2QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDL0Q7UUFDRCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDMUYsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzdFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FDbEMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUN2RCxTQUFTLENBQ1osQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxZQUFZO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN0QyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUN6QyxPQUFPLElBQUksQ0FBQzthQUNmO2lCQUFNO2dCQUNILE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQW9CO1FBQzlCLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFDMUIsUUFBUSxPQUFPLEVBQUU7WUFDYixLQUFLLFVBQVU7Z0JBQ1gsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3pCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTtZQUNWLEtBQUssUUFBUTtnQkFDVCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDN0IsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixNQUFNO1lBQ1YsS0FBSyxXQUFXO2dCQUNaLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUN6QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFDVixLQUFLLFVBQVU7Z0JBQ1gsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQzdCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTtZQUNWLEtBQUssS0FBSztnQkFDTixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQzFFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTtTQUNiO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gscUJBQXFCO1FBQ2pCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ25GO2FBQU07WUFDSCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7WUFDM0QsSUFBSSxXQUFXLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDMUQsSUFBSSxjQUFjLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUNyQyxJQUFJLGNBQWMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDL0U7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7YUFDN0I7U0FDSjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQjtRQUNiLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUMzRCxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxJQUFJLGNBQWMsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUM7UUFDbEYsSUFBSSxjQUFjLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUMvRTthQUFNO1lBQ0gsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3pCO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsaUJBQWlCO1FBQ2IsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtZQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDaEY7YUFBTTtZQUNILE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztZQUMzRCxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMxRCxJQUFJLGNBQWMsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3JDLElBQUksY0FBYyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQy9FO2lCQUFNO2dCQUNILElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN6QjtTQUNKO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gscUJBQXFCO1FBQ2pCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUMzRCxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxJQUFJLGNBQWMsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUM7UUFDbEYsSUFBSSxjQUFjLElBQUksQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDL0U7YUFBTTtZQUNILElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztJQUVELGNBQWM7UUFDVixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRSxJQUFJLGFBQWEsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25DLGFBQWEsR0FBRyxDQUFDLENBQUM7U0FDckI7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCxrQkFBa0I7UUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRSxJQUFJLGFBQWEsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksYUFBYSxHQUFHLENBQUMsRUFBRTtZQUNuQixhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxhQUFhLENBQUMsUUFBMEMsRUFBRSxNQUFpQyxFQUFFLElBQStCO1FBQ3hILElBQUksUUFBUSxFQUFFO1lBQ1YsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM3QjtRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM3QyxDQUFDOztnSEEvS1EsbUJBQW1CO29HQUFuQixtQkFBbUIsbU1BUGpCO1FBQ1A7WUFDSSxPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFdBQVcsRUFBRSxtQkFBbUI7U0FDbkM7S0FDSixrREFhZ0Isd0JBQXdCLDhEQUV4Qix5QkFBeUI7MkZBYmpDLG1CQUFtQjtrQkFWL0IsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsY0FBYztvQkFDeEIsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFNBQVMsRUFBRTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLHFCQUFxQjt5QkFDbkM7cUJBQ0o7aUJBQ0o7c0hBRXlCLFNBQVM7c0JBQTlCLFdBQVc7dUJBQUMsT0FBTztnQkFVd0QsT0FBTztzQkFBbEYsZUFBZTt1QkFBQyx3QkFBd0IsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBRWEsUUFBUTtzQkFBcEYsZUFBZTt1QkFBQyx5QkFBeUIsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBRXhELGlCQUFpQjtzQkFBekIsS0FBSztnQkFFSSxnQkFBZ0I7c0JBQXpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET1dOX0FSUk9XLCBMRUZUX0FSUk9XLCBFTlRFUiwgUklHSFRfQVJST1csIFVQX0FSUk9XIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IE5nWm9uZSwgT3B0aW9uYWwsIFNraXBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzL2ludGVybmFsL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICAgIFRoZUxpc3Rib3hDaGFuZ2VFdmVudFR5cGUsXG4gICAgVEhFX0xJU1RCT1hfVE9LRU4sXG4gICAgVEhFX0xJU1RCT1hfUEFSRU5UX09QVElPTl9UT0tFTixcbiAgICBUSEVfTElTVEJPWF9QQVJFTlRfR1JPVVBfVE9LRU5cbn0gZnJvbSAnLi9saXN0Ym94LnR5cGUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1t0aGVMaXN0Ym94T3B0aW9uXScsXG4gICAgZXhwb3J0QXM6ICd0aGVMaXN0Ym94T3B0aW9uJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVEhFX0xJU1RCT1hfUEFSRU5UX09QVElPTl9UT0tFTixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBUaGVMaXN0Ym94T3B0aW9uRGlyZWN0aXZlXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFRoZUxpc3Rib3hPcHRpb25EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQge1xuICAgIHByaXZhdGUgX2FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIGNsYXNzTmFtZSA9ICd0aGUtbGlzdGJveC1vcHRpb24nO1xuXG4gICAgQENvbnRlbnRDaGlsZHJlbihUaGVMaXN0Ym94T3B0aW9uRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIHB1YmxpYyBfb3B0aW9uczogUXVlcnlMaXN0PFRoZUxpc3Rib3hPcHRpb25EaXJlY3RpdmU+O1xuXG4gICAgZ2V0IGhhc0NoaWxkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIGdldCBmaXJzdENoaWxkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucy5maXJzdDtcbiAgICB9XG5cbiAgICBASW5wdXQoKSB0aGVPcHRpb25WYWx1ZTogdW5rbm93bjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFRIRV9MSVNUQk9YX1BBUkVOVF9PUFRJT05fVE9LRU4pIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHB1YmxpYyBwYXJlbnRPcHRpb246IFRoZUxpc3Rib3hPcHRpb25EaXJlY3RpdmUsXG4gICAgICAgIEBJbmplY3QoVEhFX0xJU1RCT1hfUEFSRU5UX0dST1VQX1RPS0VOKSBwdWJsaWMgcGFyZW50R3JvdXA6IFRoZUxpc3Rib3hHcm91cERpcmVjdGl2ZSxcbiAgICAgICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gICAgKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge31cblxuICAgIGdldEdyb3VwcygpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzOiBUaGVMaXN0Ym94R3JvdXBEaXJlY3RpdmVbXSA9IFtdO1xuICAgICAgICB0aGlzLl9vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb24ucGFyZW50T3B0aW9uICYmIG9wdGlvbi5wYXJlbnRPcHRpb24gPT09IHRoaXMgJiYgIWdyb3Vwcy5pbmNsdWRlcyhvcHRpb24ucGFyZW50R3JvdXApKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzLnB1c2gob3B0aW9uLnBhcmVudEdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBncm91cHM7XG4gICAgfVxuXG4gICAgc2V0QWN0aXZlKGFjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBhY3RpdmU7XG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdmb2N1cycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0QWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbdGhlTGlzdGJveEdyb3VwXScsXG4gICAgZXhwb3J0QXM6ICd0aGVMaXN0Ym94R3JvdXAnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBUSEVfTElTVEJPWF9QQVJFTlRfR1JPVVBfVE9LRU4sXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogVGhlTGlzdGJveEdyb3VwRGlyZWN0aXZlXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFRoZUxpc3Rib3hHcm91cERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIGNsYXNzTmFtZSA9ICd0aGUtbGlzdGJveC1ncm91cCc7XG5cbiAgICBvcHRpb25zOiBUaGVMaXN0Ym94T3B0aW9uRGlyZWN0aXZlW10gPSBbXTtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSBwdWJsaWMgX29wdGlvbnM6IFF1ZXJ5TGlzdDxUaGVMaXN0Ym94T3B0aW9uRGlyZWN0aXZlPjtcblxuICAgIC8qKlxuICAgICAqIOWkp+S6jiAxIOihqOekuuawtOW5s+WIhue7hO+8jOWwj+S6juetieS6jiAxIOihqOekuuWeguebtOWIhue7hFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGhvcml6b250YWxDb2x1bW4gPSAxO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoVEhFX0xJU1RCT1hfUEFSRU5UX09QVElPTl9UT0tFTikgQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgcHVibGljIHBhcmVudE9wdGlvbjogVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZSxcbiAgICAgICAgQEluamVjdChUSEVfTElTVEJPWF9UT0tFTikgcHVibGljIHRoZUxpc3RCb3g6IFRoZUxpc3Rib3hEaXJlY3RpdmVcbiAgICApIHt9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHt9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVyT3B0aW9ucygpO1xuICAgIH1cblxuICAgIGZpbHRlck9wdGlvbnMoKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHRoaXMuX29wdGlvbnMuZmlsdGVyKF9vcHRpb24gPT4ge1xuICAgICAgICAgICAgaWYgKF9vcHRpb24ucGFyZW50R3JvdXAgJiYgX29wdGlvbi5wYXJlbnRHcm91cCA9PT0gdGhpcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFNpYmxpbmdHcm91cHMoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE9wdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50T3B0aW9uLmdldEdyb3VwcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlTGlzdEJveC5ncm91cHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYXNDaGlsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIGdldEZpcnN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zWzBdO1xuICAgIH1cblxuICAgIGdldExhc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdGhpcy5vcHRpb25zLmxlbmd0aCAtIDFdO1xuICAgIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbdGhlTGlzdEJveF0nLFxuICAgIGV4cG9ydEFzOiAndGhlTGlzdEJveCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFRIRV9MSVNUQk9YX1RPS0VOLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IFRoZUxpc3Rib3hEaXJlY3RpdmVcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgVGhlTGlzdGJveERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgY2xhc3NOYW1lID0gJ3RoZS1saXN0Ym94LWNvbnRhaW5lcic7XG5cbiAgICBwcml2YXRlIF9vcHRpb25DaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBwcml2YXRlIF9rZXlib2FyZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgcHVibGljIGFjdGl2ZU9wdGlvbjogVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZTtcblxuICAgIHB1YmxpYyBncm91cHM6IFRoZUxpc3Rib3hHcm91cERpcmVjdGl2ZVtdID0gW107XG5cbiAgICBAQ29udGVudENoaWxkcmVuKFRoZUxpc3Rib3hHcm91cERpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSBwcm90ZWN0ZWQgX2dyb3VwczogUXVlcnlMaXN0PFRoZUxpc3Rib3hHcm91cERpcmVjdGl2ZT47XG5cbiAgICBAQ29udGVudENoaWxkcmVuKFRoZUxpc3Rib3hPcHRpb25EaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgcHJvdGVjdGVkIF9vcHRpb25zOiBRdWVyeUxpc3Q8VGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZT47XG5cbiAgICBASW5wdXQoKSBrZXlib2FyZENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG5cbiAgICBAT3V0cHV0KCkgdGhlTGlzdGJveENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGhlTGlzdGJveENoYW5nZUV2ZW50PigpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSwgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge31cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge31cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJHcm91cHMoKTtcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlSXRlbShudWxsLCB0aGlzLmdyb3Vwc1swXS5nZXRGaXJzdCgpLCAnaW5pdCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29wdGlvbkNoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLl9vcHRpb25zLmNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMjApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJHcm91cHMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlSXRlbSh0aGlzLmFjdGl2ZU9wdGlvbiwgdGhpcy5ncm91cHNbMF0uZ2V0Rmlyc3QoKSwgJ2luaXQnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2tleWJvYXJkU3Vic2NyaXB0aW9uID0gZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KFxuICAgICAgICAgICAgICAgIHRoaXMua2V5Ym9hcmRDb250YWluZXIgfHwgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgJ2tleWRvd24nXG4gICAgICAgICAgICApLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVLZXlkb3duKGV2ZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmaWx0ZXJHcm91cHMoKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLmZpbHRlcihncm91cCA9PiB7XG4gICAgICAgICAgICBncm91cC5maWx0ZXJPcHRpb25zKCk7XG4gICAgICAgICAgICBpZiAoIWdyb3VwLnBhcmVudE9wdGlvbiAmJiBncm91cC5oYXNDaGlsZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBjb25zdCB7IGtleUNvZGUgfSA9IGV2ZW50O1xuICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgRE9XTl9BUlJPVzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldE5leHRMaW5lQWN0aXZlKCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVVBfQVJST1c6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQcmV2aW91c0xpbmVBY3RpdmUoKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBSSUdIVF9BUlJPVzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldE5leHRJdGVtQWN0aXZlKCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTEVGVF9BUlJPVzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEVOVEVSOlxuICAgICAgICAgICAgICAgIHRoaXMudGhlTGlzdGJveENoYW5nZS5lbWl0KHsgb3B0aW9uOiB0aGlzLmFjdGl2ZU9wdGlvbiwgdHlwZTogJ3NlbGVjdCcgfSk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOKGkFxuICAgICAqL1xuICAgIHNldFByZXZpb3VzSXRlbUFjdGl2ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlT3B0aW9uLnBhcmVudE9wdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVJdGVtKHRoaXMuYWN0aXZlT3B0aW9uLCB0aGlzLmFjdGl2ZU9wdGlvbi5wYXJlbnRPcHRpb24sICdwYXJlbnQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwT3B0aW9ucyA9IHRoaXMuYWN0aXZlT3B0aW9uLnBhcmVudEdyb3VwLm9wdGlvbnM7XG4gICAgICAgICAgICBsZXQgb3B0aW9uSW5kZXggPSBncm91cE9wdGlvbnMuaW5kZXhPZih0aGlzLmFjdGl2ZU9wdGlvbik7XG4gICAgICAgICAgICBsZXQgbmV3T3B0aW9uSW5kZXggPSBvcHRpb25JbmRleCAtIDE7XG4gICAgICAgICAgICBpZiAobmV3T3B0aW9uSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlSXRlbSh0aGlzLmFjdGl2ZU9wdGlvbiwgZ3JvdXBPcHRpb25zW25ld09wdGlvbkluZGV4XSwgJ3R1cm4nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbnRlclByZXZpb3VzR3JvdXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOKGkyDplK5cbiAgICAgKi9cbiAgICBzZXROZXh0TGluZUFjdGl2ZSgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBPcHRpb25zID0gdGhpcy5hY3RpdmVPcHRpb24ucGFyZW50R3JvdXAub3B0aW9ucztcbiAgICAgICAgbGV0IG9wdGlvbkluZGV4ID0gZ3JvdXBPcHRpb25zLmluZGV4T2YodGhpcy5hY3RpdmVPcHRpb24pO1xuICAgICAgICBsZXQgbmV3T3B0aW9uSW5kZXggPSBvcHRpb25JbmRleCArIHRoaXMuYWN0aXZlT3B0aW9uLnBhcmVudEdyb3VwLmhvcml6b250YWxDb2x1bW47XG4gICAgICAgIGlmIChuZXdPcHRpb25JbmRleCA8PSBncm91cE9wdGlvbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVJdGVtKHRoaXMuYWN0aXZlT3B0aW9uLCBncm91cE9wdGlvbnNbbmV3T3B0aW9uSW5kZXhdLCAndHVybicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbnRlck5leHRHcm91cCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog4oaSIOmUrlxuICAgICAqL1xuICAgIHNldE5leHRJdGVtQWN0aXZlKCkge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVPcHRpb24uaGFzQ2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlSXRlbSh0aGlzLmFjdGl2ZU9wdGlvbiwgdGhpcy5hY3RpdmVPcHRpb24uZmlyc3RDaGlsZCwgJ2NoaWxkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBncm91cE9wdGlvbnMgPSB0aGlzLmFjdGl2ZU9wdGlvbi5wYXJlbnRHcm91cC5vcHRpb25zO1xuICAgICAgICAgICAgbGV0IG9wdGlvbkluZGV4ID0gZ3JvdXBPcHRpb25zLmluZGV4T2YodGhpcy5hY3RpdmVPcHRpb24pO1xuICAgICAgICAgICAgbGV0IG5ld09wdGlvbkluZGV4ID0gb3B0aW9uSW5kZXggKyAxO1xuICAgICAgICAgICAgaWYgKG5ld09wdGlvbkluZGV4IDw9IGdyb3VwT3B0aW9ucy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVJdGVtKHRoaXMuYWN0aXZlT3B0aW9uLCBncm91cE9wdGlvbnNbbmV3T3B0aW9uSW5kZXhdLCAndHVybicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVudGVyTmV4dEdyb3VwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDihpEg6ZSuXG4gICAgICovXG4gICAgc2V0UHJldmlvdXNMaW5lQWN0aXZlKCkge1xuICAgICAgICBjb25zdCBncm91cE9wdGlvbnMgPSB0aGlzLmFjdGl2ZU9wdGlvbi5wYXJlbnRHcm91cC5vcHRpb25zO1xuICAgICAgICBsZXQgb3B0aW9uSW5kZXggPSBncm91cE9wdGlvbnMuaW5kZXhPZih0aGlzLmFjdGl2ZU9wdGlvbik7XG4gICAgICAgIGxldCBuZXdPcHRpb25JbmRleCA9IG9wdGlvbkluZGV4IC0gdGhpcy5hY3RpdmVPcHRpb24ucGFyZW50R3JvdXAuaG9yaXpvbnRhbENvbHVtbjtcbiAgICAgICAgaWYgKG5ld09wdGlvbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlSXRlbSh0aGlzLmFjdGl2ZU9wdGlvbiwgZ3JvdXBPcHRpb25zW25ld09wdGlvbkluZGV4XSwgJ3R1cm4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW50ZXJQcmV2aW91c0dyb3VwKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlbnRlck5leHRHcm91cCgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5hY3RpdmVPcHRpb24ucGFyZW50R3JvdXAuZ2V0U2libGluZ0dyb3VwcygpO1xuICAgICAgICBjb25zdCBncm91cEluZGV4ID0gZ3JvdXBzLmluZGV4T2YodGhpcy5hY3RpdmVPcHRpb24ucGFyZW50R3JvdXApO1xuICAgICAgICBsZXQgbmV3R3JvdXBJbmRleCA9IGdyb3VwSW5kZXggKyAxO1xuICAgICAgICBpZiAobmV3R3JvdXBJbmRleCA+IGdyb3Vwcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBuZXdHcm91cEluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEFjdGl2ZUl0ZW0odGhpcy5hY3RpdmVPcHRpb24sIGdyb3Vwc1tuZXdHcm91cEluZGV4XS5nZXRGaXJzdCgpLCAndHVybicpO1xuICAgIH1cblxuICAgIGVudGVyUHJldmlvdXNHcm91cCgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5hY3RpdmVPcHRpb24ucGFyZW50R3JvdXAuZ2V0U2libGluZ0dyb3VwcygpO1xuICAgICAgICBjb25zdCBncm91cEluZGV4ID0gZ3JvdXBzLmluZGV4T2YodGhpcy5hY3RpdmVPcHRpb24ucGFyZW50R3JvdXApO1xuICAgICAgICBsZXQgbmV3R3JvdXBJbmRleCA9IGdyb3VwSW5kZXggLSAxO1xuICAgICAgICBpZiAobmV3R3JvdXBJbmRleCA8IDApIHtcbiAgICAgICAgICAgIG5ld0dyb3VwSW5kZXggPSBncm91cHMubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEFjdGl2ZUl0ZW0odGhpcy5hY3RpdmVPcHRpb24sIGdyb3Vwc1tuZXdHcm91cEluZGV4XS5nZXRMYXN0KCksICd0dXJuJyk7XG4gICAgfVxuXG4gICAgc2V0QWN0aXZlSXRlbShwcmV2aW91czogVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZSB8IG51bGwsIG9wdGlvbjogVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZSwgdHlwZTogVGhlTGlzdGJveENoYW5nZUV2ZW50VHlwZSkge1xuICAgICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgICAgIHByZXZpb3VzLnNldEFjdGl2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9uLnNldEFjdGl2ZSh0cnVlKTtcbiAgICAgICAgdGhpcy5hY3RpdmVPcHRpb24gPSBvcHRpb247XG4gICAgICAgIHRoaXMudGhlTGlzdGJveENoYW5nZS5lbWl0KHsgb3B0aW9uLCB0eXBlIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vcHRpb25DaGFuZ2VzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX2tleWJvYXJkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRoZUxpc3Rib3hDaGFuZ2VFdmVudCB7XG4gICAgb3B0aW9uOiBUaGVMaXN0Ym94T3B0aW9uRGlyZWN0aXZlO1xuICAgIHR5cGU6IFRoZUxpc3Rib3hDaGFuZ2VFdmVudFR5cGU7XG59XG4iXX0=
@@ -2,4 +2,4 @@ import { InjectionToken } from '@angular/core';
2
2
  export const THE_LISTBOX_PARENT_OPTION_TOKEN = new InjectionToken('THE_LISTBOX_PARENT_OPTION_TOKEN');
3
3
  export const THE_LISTBOX_PARENT_GROUP_TOKEN = new InjectionToken('THE_LISTBOX_PARENT_GROUP_TOKEN');
4
4
  export const THE_LISTBOX_TOKEN = new InjectionToken('THE_LISTBOX_TOKEN');
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdGJveC50eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvbGlzdGJveC9saXN0Ym94LnR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBRXJHLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLElBQUksY0FBYyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7QUFFbkcsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBUSEVfTElTVEJPWF9QQVJFTlRfT1BUSU9OX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuKCdUSEVfTElTVEJPWF9QQVJFTlRfT1BUSU9OX1RPS0VOJyk7XG5cbmV4cG9ydCBjb25zdCBUSEVfTElTVEJPWF9QQVJFTlRfR1JPVVBfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1RIRV9MSVNUQk9YX1BBUkVOVF9HUk9VUF9UT0tFTicpO1xuXG5leHBvcnQgY29uc3QgVEhFX0xJU1RCT1hfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1RIRV9MSVNUQk9YX1RPS0VOJyk7XG5cbmV4cG9ydCB0eXBlIFRoZUxpc3Rib3hDaGFuZ2VFdmVudFR5cGUgPSAndHVybicgfCAnY2hpbGQnIHwgJ3BhcmVudCcgfCAnaW5pdCc7XG4iXX0=
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdGJveC50eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvbGlzdGJveC9saXN0Ym94LnR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBRXJHLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLElBQUksY0FBYyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7QUFFbkcsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBUSEVfTElTVEJPWF9QQVJFTlRfT1BUSU9OX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuKCdUSEVfTElTVEJPWF9QQVJFTlRfT1BUSU9OX1RPS0VOJyk7XG5cbmV4cG9ydCBjb25zdCBUSEVfTElTVEJPWF9QQVJFTlRfR1JPVVBfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1RIRV9MSVNUQk9YX1BBUkVOVF9HUk9VUF9UT0tFTicpO1xuXG5leHBvcnQgY29uc3QgVEhFX0xJU1RCT1hfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1RIRV9MSVNUQk9YX1RPS0VOJyk7XG5cbmV4cG9ydCB0eXBlIFRoZUxpc3Rib3hDaGFuZ2VFdmVudFR5cGUgPSAndHVybicgfCAnY2hpbGQnIHwgJ3BhcmVudCcgfCAnaW5pdCcgfCAnc2VsZWN0JztcbiJdfQ==
@@ -1,5 +1,5 @@
1
- import { Component, Input, HostBinding } from '@angular/core';
2
- import { mixinUnsubscribe, MixinBase } from 'ngx-tethys/core';
1
+ import { Component, Input, HostBinding, ViewChildren } from '@angular/core';
2
+ import { mixinUnsubscribe, MixinBase, ScrollToService } from 'ngx-tethys/core';
3
3
  import { Editor, Node } from 'slate';
4
4
  import { AngularEditor } from 'slate-angular';
5
5
  import { buildPluginMenu, buildPluginMenuItemMap } from '../../core/utils/plugin-menu';
@@ -8,20 +8,26 @@ import { ThePluginMenu } from '../../interfaces/plugins/plugin-menu';
8
8
  import { getPluginOptions } from '../../core';
9
9
  import { PluginKeys } from '../../interfaces';
10
10
  import { QuickInsertEditor } from '../../plugins/public-api';
11
+ import { ThyDropdownDirective } from 'ngx-tethys/dropdown';
11
12
  import * as i0 from "@angular/core";
12
13
  import * as i1 from "@angular/common";
13
- import * as i2 from "ngx-tethys/icon";
14
- import * as i3 from "ngx-tethys/tooltip";
15
- import * as i4 from "ngx-tethys/action";
16
- import * as i5 from "ngx-tethys/divider";
17
- import * as i6 from "ngx-tethys/dropdown";
18
- import * as i7 from "ngx-tethys/empty";
19
- import * as i8 from "../table-select/table-select.component";
14
+ import * as i2 from "@angular/forms";
15
+ import * as i3 from "ngx-tethys/icon";
16
+ import * as i4 from "ngx-tethys/tooltip";
17
+ import * as i5 from "ngx-tethys/input";
18
+ import * as i6 from "ngx-tethys/action";
19
+ import * as i7 from "ngx-tethys/divider";
20
+ import * as i8 from "ngx-tethys/dropdown";
21
+ import * as i9 from "ngx-tethys/empty";
22
+ import * as i10 from "../table-select/table-select.component";
23
+ import * as i11 from "../listbox/listbox";
24
+ import * as i12 from "../action/prevent-default";
20
25
  export class ThePluginMenuComponent extends mixinUnsubscribe(MixinBase) {
21
- constructor(elementRef, cdr) {
26
+ constructor(elementRef, cdr, ngZone) {
22
27
  super();
23
28
  this.elementRef = elementRef;
24
29
  this.cdr = cdr;
30
+ this.ngZone = ngZone;
25
31
  this.ThePluginMenu = ThePluginMenu;
26
32
  this.groupMenu = [];
27
33
  this.iconMenu = [];
@@ -35,6 +41,7 @@ export class ThePluginMenuComponent extends mixinUnsubscribe(MixinBase) {
35
41
  width: '266px'
36
42
  };
37
43
  this.containerClassName = `the-plugin-menu-container`;
44
+ this.theDisplaySearch = false;
38
45
  this.removeKeywords = () => {
39
46
  const hotkey = getPluginOptions(this.editor, PluginKeys.quickInsert)?.hotkey;
40
47
  const node = Node.get(this.editor, this.editor.selection.anchor.path);
@@ -47,56 +54,94 @@ export class ThePluginMenuComponent extends mixinUnsubscribe(MixinBase) {
47
54
  this.editorElement = AngularEditor.toDOMNode(this.editor, this.editor);
48
55
  let currentMenu = this.editor.options.menu ? this.editor.options.menu : DefaultPluginMenu;
49
56
  const menuItemsMap = buildPluginMenuItemMap(this.editor);
50
- this.pluginMenu = buildPluginMenu(menuItemsMap, currentMenu);
57
+ this._pluginMenu = buildPluginMenu(menuItemsMap, currentMenu);
51
58
  this.buildMenus();
52
59
  }
53
60
  buildMenus() {
54
61
  if (this.keyWords) {
55
62
  this.iconMenu = [];
56
- this.groupMenu = this.pluginMenu.filter((item) => {
57
- return item?.keywords && item?.keywords.includes(this.keyWords);
63
+ this.groupMenu = [];
64
+ this._pluginMenu.forEach((item) => {
65
+ if (ThePluginMenu.isMenuItem(item)) {
66
+ if (item.keywords && item.keywords?.includes(this.keyWords)) {
67
+ this.groupMenu.push(item);
68
+ }
69
+ if (item.children && item.children.length > 0) {
70
+ item.children.forEach((child) => {
71
+ if (child.keywords && item.keywords?.includes(this.keyWords)) {
72
+ this.groupMenu.push(child);
73
+ }
74
+ });
75
+ }
76
+ }
58
77
  });
59
78
  if (this.groupMenu.length > 0) {
60
79
  this.groupMenu.unshift(this.searchGroup);
61
80
  }
62
81
  }
63
82
  else {
64
- this.iconMenu = this.pluginMenu.filter((item) => {
83
+ this.iconMenu = this._pluginMenu.filter((item) => {
65
84
  return item?.type === ThePluginMenuItemType.icon;
66
85
  });
67
- this.groupMenu = this.pluginMenu.filter((item) => {
86
+ this.groupMenu = this._pluginMenu.filter((item) => {
68
87
  return item?.type !== ThePluginMenuItemType.icon;
69
88
  });
70
89
  }
71
90
  this.cdr.detectChanges();
72
91
  }
73
- executeItem(event, menuItem) {
74
- event.preventDefault();
75
- event.stopPropagation();
92
+ handleItemSelection(menuItem) {
76
93
  this.removeKeywords();
77
- const toolbarItem = this.pluginMenu.find((item) => item.key === menuItem.key);
78
- if (toolbarItem.execute) {
79
- toolbarItem.execute(this.editor);
80
- }
94
+ menuItem.execute(this.editor);
81
95
  QuickInsertEditor.closeMenu(this.editor);
82
96
  }
83
97
  updateKeywords(keywords) {
84
98
  this.keyWords = keywords.toLowerCase().trim();
85
99
  this.buildMenus();
86
100
  }
101
+ theListboxChange(event) {
102
+ if (event.type === 'select') {
103
+ this.handleItemSelection(event.option.theOptionValue);
104
+ }
105
+ if (event.type === 'child') {
106
+ const dropdown = this.findDropdownTrigger(event.option.parentOption);
107
+ this.ngZone.run(() => {
108
+ dropdown.show();
109
+ });
110
+ }
111
+ if (event.type === 'parent') {
112
+ const dropdown = this.findDropdownTrigger(event.option);
113
+ dropdown.hide();
114
+ }
115
+ if (event.type === 'turn') {
116
+ ScrollToService.scrollToElement(event.option.elementRef.nativeElement, this.elementRef.nativeElement);
117
+ }
118
+ }
119
+ findDropdownTrigger(option) {
120
+ const dropdown = this.dropdownTriggers.find(value => {
121
+ return value['elementRef'].nativeElement === option.elementRef.nativeElement;
122
+ });
123
+ return dropdown;
124
+ }
87
125
  ngOnDestroy() {
88
126
  super.ngOnDestroy();
89
127
  }
90
128
  }
91
- ThePluginMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ThePluginMenuComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
92
- ThePluginMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: ThePluginMenuComponent, selector: "the-plugin-menu", inputs: { editor: "editor" }, host: { properties: { "class": "this.containerClassName" } }, usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"groupMenu.length > 0; else thyEmpty\" class=\"thy-dropdown-menu py-2\">\n <div class=\"icon-menu d-flex px-5 py-1\">\n <ng-container *ngFor=\"let item of iconMenu\">\n <a\n *ngIf=\"item.type === ThePluginMenuItemType.icon\"\n href=\"javascript:;\"\n class=\"mt-2\"\n thyAction\n [thyActionIcon]=\"item.icon\"\n [thyTooltip]=\"item.name\"\n (mousedown)=\"executeItem($event, item)\"\n ></a>\n </ng-container>\n </div>\n\n <thy-divider *ngIf=\"this.iconMenu?.length\" class=\"my-2\"></thy-divider>\n\n <ng-container *ngFor=\"let item of groupMenu\">\n <ng-container *ngIf=\"ThePluginMenu.isMenuItem(item) && !item.isExpanded\">\n <div thyDropdownMenuItem class=\"insert-menu-item mb-1 py-0\" (mousedown)=\"executeItem($event, item)\">\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n <span *ngIf=\"!item?.isExpanded\" class=\"menu-item-display-key font-size-sm text-placeholder\">\n {{ item.displayKey }}</span\n >\n {{ item.name }}\n </div>\n <div class=\"text-muted font-size-sm\">{{ item.description }}</div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"ThePluginMenu.isMenuItem(item) && item.isExpanded\" #hasExpanded>\n <div\n [thyDropdown]=\"expand\"\n thyTrigger=\"hover\"\n thyDropdownMenuItem\n [thyPopoverOptions]=\"expandPopoverOptions\"\n class=\"insert-menu-item mb-1 py-0\"\n (mousedown)=\"executeItem($event, item)\"\n >\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n <span *ngIf=\"!item?.isExpanded\" class=\"menu-item-display-key font-size-sm text-placeholder\">\n {{ item.displayKey }}</span\n >\n {{ item.name }}\n </div>\n <div class=\"text-muted font-size-sm\">{{ item.description }}</div>\n </div>\n <div *ngIf=\"item?.isExpanded\">\n <thy-icon class=\"text-muted\" thyIconName=\"angle-right\"></thy-icon>\n </div>\n </div>\n <thy-dropdown-menu class=\"expand-menu\" #expand>\n <div class=\"the-plugin-menu-container\">\n <div *ngFor=\"let child of item.children\" thyDropdownMenuItem class=\"insert-menu-item mb-1 py-0\">\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"child.menuIcon\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n <span class=\"menu-item-display-key font-size-sm text-placeholder\"> {{ child.displayKey }}</span>\n {{ child.name }}\n </div>\n <div class=\"text-muted font-size-sm\">{{ child.description }}</div>\n </div>\n </div>\n </div>\n <table-select\n *ngIf=\"item.key === 'table'\"\n class=\"plugin-menu-table the-table-selector-panel\"\n [editor]=\"editor\"\n [beforeInsert]=\"removeKeywords\"\n ></table-select>\n </thy-dropdown-menu>\n </ng-container>\n\n <ng-container *ngIf=\"!ThePluginMenu.isMenuItem(item)\" #menuGroup>\n <thy-dropdown-menu-group class=\"font-size-sm\" [thyTitle]=\"item.groupName\"></thy-dropdown-menu-group>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #thyEmpty>\n <div class=\"empty d-flex align-items-center justify-content-center\">\n <thy-empty [thyMessage]=\"thyMessage\"></thy-empty>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ThyIconComponent, selector: "thy-icon, [thy-icon]", inputs: ["thyIconType", "thyTwotoneColor", "thyIconName", "thyIconRotate", "thyIconSet", "thyIconLegging", "thyIconLinearGradient"] }, { kind: "directive", type: i3.ThyTooltipDirective, selector: "[thyTooltip],[thy-tooltip]", inputs: ["thyTooltip", "thyTooltipPlacement", "thyTooltipClass", "thyTooltipShowDelay", "thyTooltipHideDelay", "thyTooltipTrigger", "thyTooltipDisabled", "thyTooltipTemplateContext", "thyTooltipOffset", "thyTooltipPin"], exportAs: ["thyTooltip"] }, { kind: "component", type: i4.ThyActionComponent, selector: "thy-action, [thyAction]", inputs: ["thyType", "thyIcon", "thyActionIcon", "thyActive", "thyActionActive", "thyTheme", "thyHoverIcon", "thyDisabled"] }, { kind: "component", type: i5.ThyDividerComponent, selector: "thy-divider", inputs: ["thyVertical", "thyStyle", "thyColor", "thyText", "thyTextDirection", "thyDeeper"] }, { kind: "directive", type: i6.ThyDropdownDirective, selector: "[thyDropdown]", inputs: ["thyDropdownMenu", "thyDropdown", "thyTrigger", "thyActiveClass", "thyPopoverOptions"], outputs: ["thyActiveChange"] }, { kind: "component", type: i6.ThyDropdownMenuComponent, selector: "thy-dropdown-menu", inputs: ["thyWidth"] }, { kind: "component", type: i6.ThyDropdownMenuGroupComponent, selector: "thy-dropdown-menu-group", inputs: ["thyTitle"] }, { kind: "directive", type: i6.ThyDropdownMenuItemDirective, selector: "[thyDropdownMenuItem]", inputs: ["thyType", "thyDisabled"] }, { kind: "component", type: i7.ThyEmptyComponent, selector: "thy-empty", inputs: ["thyMessage", "thyTranslationKey", "thyTranslationValues", "thyEntityName", "thyEntityNameTranslateKey", "thyIconName", "thySize", "thyMarginTop", "thyTopAuto", "thyContainer", "thyImageUrl", "thyImageLoading", "thyImageFetchPriority", "thyDescription"] }, { kind: "component", type: i8.TheTableSelectComponent, selector: "table-select", inputs: ["optionsParam", "editor", "beforeInsert"] }] });
129
+ ThePluginMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ThePluginMenuComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
130
+ ThePluginMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: ThePluginMenuComponent, selector: "the-plugin-menu", inputs: { editor: "editor", theDisplaySearch: "theDisplaySearch", thePluginMenu: "thePluginMenu" }, host: { properties: { "class": "this.containerClassName" } }, viewQueries: [{ propertyName: "dropdownTriggers", predicate: ["dropdownTriggers"], descendants: true, read: ThyDropdownDirective }], usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"theDisplaySearch\" class=\"menu-search px-5 pt-5\">\n <thy-input-search [(ngModel)]=\"keyWords\" placeholder=\"\u641C\u7D22\" thyIconPosition=\"after\" (ngModelChange)=\"buildMenus()\"> </thy-input-search>\n</div>\n\n<div\n *ngIf=\"groupMenu.length > 0; else thyEmpty\"\n theListBox\n [keyboardContainer]=\"editorElement\"\n (theListboxChange)=\"theListboxChange($event)\"\n class=\"thy-dropdown-menu py-2\"\n>\n <div *ngIf=\"iconMenu?.length > 0\" theListboxGroup [horizontalColumn]=\"6\" class=\"icon-menu d-flex px-5 py-1\">\n <ng-container *ngFor=\"let item of iconMenu\">\n <a\n *ngIf=\"item.type === ThePluginMenuItemType.icon\"\n href=\"javascript:;\"\n class=\"mt-2\"\n thyAction\n theListboxOption\n [theOptionValue]=\"item\"\n [thyActionIcon]=\"item.icon\"\n [thyTooltip]=\"item.name\"\n thePreventDefault\n (click)=\"handleItemSelection(item)\"\n ></a>\n </ng-container>\n </div>\n\n <thy-divider *ngIf=\"this.iconMenu?.length\" class=\"my-2\"></thy-divider>\n <div theListboxGroup>\n <ng-container *ngFor=\"let item of groupMenu\">\n <ng-container *ngIf=\"ThePluginMenu.isMenuItem(item) && !item.isExpanded\">\n <div\n thyDropdownMenuItem\n theListboxOption\n [theOptionValue]=\"item\"\n class=\"insert-menu-item mb-1 py-0\"\n thePreventDefault\n (click)=\"handleItemSelection(item)\"\n >\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n <span *ngIf=\"!item?.isExpanded\" class=\"menu-item-display-key font-size-sm text-placeholder\">\n {{ item.displayKey }}</span\n >\n {{ item.name }}\n </div>\n <div class=\"text-muted font-size-sm\">{{ item.description }}</div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"ThePluginMenu.isMenuItem(item) && item.isExpanded\" #hasExpanded>\n <div\n #dropdownTriggers\n [thyDropdown]=\"expand\"\n thyTrigger=\"hover\"\n thyDropdownMenuItem\n theListboxOption\n [theOptionValue]=\"item\"\n [thyPopoverOptions]=\"expandPopoverOptions\"\n class=\"insert-menu-item mb-1 py-0\"\n thePreventDefault\n (click)=\"handleItemSelection(item)\"\n >\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n <span *ngIf=\"!item?.isExpanded\" class=\"menu-item-display-key font-size-sm text-placeholder\">\n {{ item.displayKey }}</span\n >\n {{ item.name }}\n </div>\n <div class=\"text-muted font-size-sm\">{{ item.description }}</div>\n </div>\n <div *ngIf=\"item?.isExpanded\">\n <thy-icon class=\"text-muted\" thyIconName=\"angle-right\"></thy-icon>\n </div>\n <thy-dropdown-menu class=\"expand-menu\" #expand>\n <div class=\"the-plugin-menu-container\" theListboxGroup>\n <div\n *ngFor=\"let child of item.children\"\n thyDropdownMenuItem\n theListboxOption\n class=\"insert-menu-item mb-1 py-0\"\n thePreventDefault\n (click)=\"handleItemSelection(child)\"\n [theOptionValue]=\"child\"\n >\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"child.menuIcon\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n <span class=\"menu-item-display-key font-size-sm text-placeholder\"> {{ child.displayKey }}</span>\n {{ child.name }}\n </div>\n <div class=\"text-muted font-size-sm\">{{ child.description }}</div>\n </div>\n </div>\n </div>\n <table-select\n *ngIf=\"item.key === 'table'\"\n class=\"plugin-menu-table the-table-selector-panel\"\n [editor]=\"editor\"\n [beforeInsert]=\"removeKeywords\"\n ></table-select>\n </thy-dropdown-menu>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!ThePluginMenu.isMenuItem(item)\" #menuGroup>\n <thy-dropdown-menu-group class=\"font-size-sm\" [thyTitle]=\"item.groupName\"></thy-dropdown-menu-group>\n </ng-container>\n </ng-container>\n </div>\n</div>\n\n<ng-template #thyEmpty>\n <div class=\"empty d-flex align-items-center justify-content-center\">\n <thy-empty [thyMessage]=\"thyMessage\"></thy-empty>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ThyIconComponent, selector: "thy-icon, [thy-icon]", inputs: ["thyIconType", "thyTwotoneColor", "thyIconName", "thyIconRotate", "thyIconSet", "thyIconLegging", "thyIconLinearGradient"] }, { kind: "directive", type: i4.ThyTooltipDirective, selector: "[thyTooltip],[thy-tooltip]", inputs: ["thyTooltip", "thyTooltipPlacement", "thyTooltipClass", "thyTooltipShowDelay", "thyTooltipHideDelay", "thyTooltipTrigger", "thyTooltipDisabled", "thyTooltipTemplateContext", "thyTooltipOffset", "thyTooltipPin"], exportAs: ["thyTooltip"] }, { kind: "component", type: i5.ThyInputSearchComponent, selector: "thy-input-search", inputs: ["name", "placeholder", "thyTheme", "thySearchFocus", "thyIconPosition", "thySize"], outputs: ["clear", "thyClear"] }, { kind: "component", type: i6.ThyActionComponent, selector: "thy-action, [thyAction]", inputs: ["thyType", "thyIcon", "thyActionIcon", "thyActive", "thyActionActive", "thyTheme", "thyHoverIcon", "thyDisabled"] }, { kind: "component", type: i7.ThyDividerComponent, selector: "thy-divider", inputs: ["thyVertical", "thyStyle", "thyColor", "thyText", "thyTextDirection", "thyDeeper"] }, { kind: "directive", type: i8.ThyDropdownDirective, selector: "[thyDropdown]", inputs: ["thyDropdownMenu", "thyDropdown", "thyTrigger", "thyActiveClass", "thyPopoverOptions"], outputs: ["thyActiveChange"] }, { kind: "component", type: i8.ThyDropdownMenuComponent, selector: "thy-dropdown-menu", inputs: ["thyWidth"] }, { kind: "component", type: i8.ThyDropdownMenuGroupComponent, selector: "thy-dropdown-menu-group", inputs: ["thyTitle"] }, { kind: "directive", type: i8.ThyDropdownMenuItemDirective, selector: "[thyDropdownMenuItem]", inputs: ["thyType", "thyDisabled"] }, { kind: "component", type: i9.ThyEmptyComponent, selector: "thy-empty", inputs: ["thyMessage", "thyTranslationKey", "thyTranslationValues", "thyEntityName", "thyEntityNameTranslateKey", "thyIconName", "thySize", "thyMarginTop", "thyTopAuto", "thyContainer", "thyImageUrl", "thyImageLoading", "thyImageFetchPriority", "thyDescription"] }, { kind: "component", type: i10.TheTableSelectComponent, selector: "table-select", inputs: ["optionsParam", "editor", "beforeInsert"] }, { kind: "directive", type: i11.TheListboxOptionDirective, selector: "[theListboxOption]", inputs: ["theOptionValue"], exportAs: ["theListboxOption"] }, { kind: "directive", type: i11.TheListboxGroupDirective, selector: "[theListboxGroup]", inputs: ["horizontalColumn"], exportAs: ["theListboxGroup"] }, { kind: "directive", type: i11.TheListboxDirective, selector: "[theListBox]", inputs: ["keyboardContainer"], outputs: ["theListboxChange"], exportAs: ["theListBox"] }, { kind: "directive", type: i12.ThePreventDefaultDirective, selector: "[thePreventDefault]", exportAs: ["thePreventDefault"] }] });
93
131
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ThePluginMenuComponent, decorators: [{
94
132
  type: Component,
95
- args: [{ selector: 'the-plugin-menu', template: "<div *ngIf=\"groupMenu.length > 0; else thyEmpty\" class=\"thy-dropdown-menu py-2\">\n <div class=\"icon-menu d-flex px-5 py-1\">\n <ng-container *ngFor=\"let item of iconMenu\">\n <a\n *ngIf=\"item.type === ThePluginMenuItemType.icon\"\n href=\"javascript:;\"\n class=\"mt-2\"\n thyAction\n [thyActionIcon]=\"item.icon\"\n [thyTooltip]=\"item.name\"\n (mousedown)=\"executeItem($event, item)\"\n ></a>\n </ng-container>\n </div>\n\n <thy-divider *ngIf=\"this.iconMenu?.length\" class=\"my-2\"></thy-divider>\n\n <ng-container *ngFor=\"let item of groupMenu\">\n <ng-container *ngIf=\"ThePluginMenu.isMenuItem(item) && !item.isExpanded\">\n <div thyDropdownMenuItem class=\"insert-menu-item mb-1 py-0\" (mousedown)=\"executeItem($event, item)\">\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n <span *ngIf=\"!item?.isExpanded\" class=\"menu-item-display-key font-size-sm text-placeholder\">\n {{ item.displayKey }}</span\n >\n {{ item.name }}\n </div>\n <div class=\"text-muted font-size-sm\">{{ item.description }}</div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"ThePluginMenu.isMenuItem(item) && item.isExpanded\" #hasExpanded>\n <div\n [thyDropdown]=\"expand\"\n thyTrigger=\"hover\"\n thyDropdownMenuItem\n [thyPopoverOptions]=\"expandPopoverOptions\"\n class=\"insert-menu-item mb-1 py-0\"\n (mousedown)=\"executeItem($event, item)\"\n >\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n <span *ngIf=\"!item?.isExpanded\" class=\"menu-item-display-key font-size-sm text-placeholder\">\n {{ item.displayKey }}</span\n >\n {{ item.name }}\n </div>\n <div class=\"text-muted font-size-sm\">{{ item.description }}</div>\n </div>\n <div *ngIf=\"item?.isExpanded\">\n <thy-icon class=\"text-muted\" thyIconName=\"angle-right\"></thy-icon>\n </div>\n </div>\n <thy-dropdown-menu class=\"expand-menu\" #expand>\n <div class=\"the-plugin-menu-container\">\n <div *ngFor=\"let child of item.children\" thyDropdownMenuItem class=\"insert-menu-item mb-1 py-0\">\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"child.menuIcon\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n <span class=\"menu-item-display-key font-size-sm text-placeholder\"> {{ child.displayKey }}</span>\n {{ child.name }}\n </div>\n <div class=\"text-muted font-size-sm\">{{ child.description }}</div>\n </div>\n </div>\n </div>\n <table-select\n *ngIf=\"item.key === 'table'\"\n class=\"plugin-menu-table the-table-selector-panel\"\n [editor]=\"editor\"\n [beforeInsert]=\"removeKeywords\"\n ></table-select>\n </thy-dropdown-menu>\n </ng-container>\n\n <ng-container *ngIf=\"!ThePluginMenu.isMenuItem(item)\" #menuGroup>\n <thy-dropdown-menu-group class=\"font-size-sm\" [thyTitle]=\"item.groupName\"></thy-dropdown-menu-group>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-template #thyEmpty>\n <div class=\"empty d-flex align-items-center justify-content-center\">\n <thy-empty [thyMessage]=\"thyMessage\"></thy-empty>\n </div>\n</ng-template>\n" }]
96
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { containerClassName: [{
133
+ args: [{ selector: 'the-plugin-menu', template: "<div *ngIf=\"theDisplaySearch\" class=\"menu-search px-5 pt-5\">\n <thy-input-search [(ngModel)]=\"keyWords\" placeholder=\"\u641C\u7D22\" thyIconPosition=\"after\" (ngModelChange)=\"buildMenus()\"> </thy-input-search>\n</div>\n\n<div\n *ngIf=\"groupMenu.length > 0; else thyEmpty\"\n theListBox\n [keyboardContainer]=\"editorElement\"\n (theListboxChange)=\"theListboxChange($event)\"\n class=\"thy-dropdown-menu py-2\"\n>\n <div *ngIf=\"iconMenu?.length > 0\" theListboxGroup [horizontalColumn]=\"6\" class=\"icon-menu d-flex px-5 py-1\">\n <ng-container *ngFor=\"let item of iconMenu\">\n <a\n *ngIf=\"item.type === ThePluginMenuItemType.icon\"\n href=\"javascript:;\"\n class=\"mt-2\"\n thyAction\n theListboxOption\n [theOptionValue]=\"item\"\n [thyActionIcon]=\"item.icon\"\n [thyTooltip]=\"item.name\"\n thePreventDefault\n (click)=\"handleItemSelection(item)\"\n ></a>\n </ng-container>\n </div>\n\n <thy-divider *ngIf=\"this.iconMenu?.length\" class=\"my-2\"></thy-divider>\n <div theListboxGroup>\n <ng-container *ngFor=\"let item of groupMenu\">\n <ng-container *ngIf=\"ThePluginMenu.isMenuItem(item) && !item.isExpanded\">\n <div\n thyDropdownMenuItem\n theListboxOption\n [theOptionValue]=\"item\"\n class=\"insert-menu-item mb-1 py-0\"\n thePreventDefault\n (click)=\"handleItemSelection(item)\"\n >\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n <span *ngIf=\"!item?.isExpanded\" class=\"menu-item-display-key font-size-sm text-placeholder\">\n {{ item.displayKey }}</span\n >\n {{ item.name }}\n </div>\n <div class=\"text-muted font-size-sm\">{{ item.description }}</div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"ThePluginMenu.isMenuItem(item) && item.isExpanded\" #hasExpanded>\n <div\n #dropdownTriggers\n [thyDropdown]=\"expand\"\n thyTrigger=\"hover\"\n thyDropdownMenuItem\n theListboxOption\n [theOptionValue]=\"item\"\n [thyPopoverOptions]=\"expandPopoverOptions\"\n class=\"insert-menu-item mb-1 py-0\"\n thePreventDefault\n (click)=\"handleItemSelection(item)\"\n >\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n <span *ngIf=\"!item?.isExpanded\" class=\"menu-item-display-key font-size-sm text-placeholder\">\n {{ item.displayKey }}</span\n >\n {{ item.name }}\n </div>\n <div class=\"text-muted font-size-sm\">{{ item.description }}</div>\n </div>\n <div *ngIf=\"item?.isExpanded\">\n <thy-icon class=\"text-muted\" thyIconName=\"angle-right\"></thy-icon>\n </div>\n <thy-dropdown-menu class=\"expand-menu\" #expand>\n <div class=\"the-plugin-menu-container\" theListboxGroup>\n <div\n *ngFor=\"let child of item.children\"\n thyDropdownMenuItem\n theListboxOption\n class=\"insert-menu-item mb-1 py-0\"\n thePreventDefault\n (click)=\"handleItemSelection(child)\"\n [theOptionValue]=\"child\"\n >\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"child.menuIcon\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n <span class=\"menu-item-display-key font-size-sm text-placeholder\"> {{ child.displayKey }}</span>\n {{ child.name }}\n </div>\n <div class=\"text-muted font-size-sm\">{{ child.description }}</div>\n </div>\n </div>\n </div>\n <table-select\n *ngIf=\"item.key === 'table'\"\n class=\"plugin-menu-table the-table-selector-panel\"\n [editor]=\"editor\"\n [beforeInsert]=\"removeKeywords\"\n ></table-select>\n </thy-dropdown-menu>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!ThePluginMenu.isMenuItem(item)\" #menuGroup>\n <thy-dropdown-menu-group class=\"font-size-sm\" [thyTitle]=\"item.groupName\"></thy-dropdown-menu-group>\n </ng-container>\n </ng-container>\n </div>\n</div>\n\n<ng-template #thyEmpty>\n <div class=\"empty d-flex align-items-center justify-content-center\">\n <thy-empty [thyMessage]=\"thyMessage\"></thy-empty>\n </div>\n</ng-template>\n" }]
134
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }]; }, propDecorators: { dropdownTriggers: [{
135
+ type: ViewChildren,
136
+ args: ['dropdownTriggers', { read: ThyDropdownDirective }]
137
+ }], containerClassName: [{
97
138
  type: HostBinding,
98
139
  args: ['class']
99
140
  }], editor: [{
100
141
  type: Input
142
+ }], theDisplaySearch: [{
143
+ type: Input
144
+ }], thePluginMenu: [{
145
+ type: Input
101
146
  }] } });
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvcGx1Z2luLW1lbnUvcGx1Z2luLW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvcGx1Z2luLW1lbnUvcGx1Z2luLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQTRDLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQVEsTUFBTSxPQUFPLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkYsT0FBTyxFQUFFLGFBQWEsRUFBa0UsTUFBTSxzQ0FBc0MsQ0FBQztBQUNySSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7O0FBTTdELE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7SUE4Qm5FLFlBQW1CLFVBQXNCLEVBQVMsR0FBc0I7UUFDcEUsS0FBSyxFQUFFLENBQUM7UUFETyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVMsUUFBRyxHQUFI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QUVELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFpQixFQUFFLFFBQTJCO1FBQ3RELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sV0FBVyxHQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBdUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEcsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFO1lBQ3JCLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsaUJBQWlCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBVUQsY0FBYyxDQUFDLFFBQWdCO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsV0FBVztRQUNQLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QixDQUFDOzttSEExRlEsc0JBQXNCO3VHQUF0QixzQkFBc0IsMEtDaEJuQyxpakpBOEZBOzJGRDlFYSxzQkFBc0I7a0JBSmxDLFNBQVM7K0JBQ0ksaUJBQWlCO2lJQTZCTCxrQkFBa0I7c0JBQXZDLFdBQVc7dUJBQUMsT0FBTztnQkFFWCxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uRGVzdHJveSwgRWxlbWVudFJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBtaXhpblVuc3Vic2NyaWJlLCBNaXhpbkJhc2UgfSBmcm9tICduZ3gtdGV0aHlzL2NvcmUnO1xuaW1wb3J0IHsgRWRpdG9yLCBOb2RlLCBUZXh0IH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvciB9IGZyb20gJ3NsYXRlLWFuZ3VsYXInO1xuaW1wb3J0IHsgYnVpbGRQbHVnaW5NZW51LCBidWlsZFBsdWdpbk1lbnVJdGVtTWFwIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9wbHVnaW4tbWVudSc7XG5pbXBvcnQgeyBEZWZhdWx0UGx1Z2luTWVudSwgVGhlUGx1Z2luTWVudUl0ZW1UeXBlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3BsdWdpbi1tZW51JztcbmltcG9ydCB7IFRoZVBsdWdpbk1lbnUsIFRoZVBsdWdpbk1lbnVHcm91cCwgVGhlUGx1Z2luTWVudUl0ZW0sIFRoZVBsdWdpbk1lbnVJdGVtQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wbHVnaW5zL3BsdWdpbi1tZW51JztcbmltcG9ydCB7IGdldFBsdWdpbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9jb3JlJztcbmltcG9ydCB7IFF1aWNrSW5zZXJ0UGx1Z2luT3B0aW9ucyB9IGZyb20gJy4uLy4uL3BsdWdpbnMvcXVpY2staW5zZXJ0L3F1aWNrLWluc2VydC5wbHVnaW4nO1xuaW1wb3J0IHsgUGx1Z2luS2V5cyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUXVpY2tJbnNlcnRFZGl0b3IgfSBmcm9tICcuLi8uLi9wbHVnaW5zL3B1YmxpYy1hcGknO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RoZS1wbHVnaW4tbWVudScsXG4gICAgdGVtcGxhdGVVcmw6ICdwbHVnaW4tbWVudS5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVGhlUGx1Z2luTWVudUNvbXBvbmVudCBleHRlbmRzIG1peGluVW5zdWJzY3JpYmUoTWl4aW5CYXNlKSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBlZGl0b3JFbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAgIFRoZVBsdWdpbk1lbnUgPSBUaGVQbHVnaW5NZW51O1xuXG4gICAgcGx1Z2luTWVudTogVGhlUGx1Z2luTWVudTtcblxuICAgIGdyb3VwTWVudTogVGhlUGx1Z2luTWVudSA9IFtdO1xuXG4gICAgaWNvbk1lbnU6IFRoZVBsdWdpbk1lbnUgPSBbXTtcblxuICAgIFRoZVBsdWdpbk1lbnVJdGVtVHlwZSA9IFRoZVBsdWdpbk1lbnVJdGVtVHlwZTtcblxuICAgIGtleVdvcmRzOiBzdHJpbmc7XG5cbiAgICB0aHlNZXNzYWdlID0gJ+aaguaXoOaVsOaNric7XG5cbiAgICBzZWFyY2hHcm91cDogVGhlUGx1Z2luTWVudUdyb3VwID0ge1xuICAgICAgICBncm91cE5hbWU6ICfmkJzntKLnu5PmnpwnXG4gICAgfTtcblxuICAgIGV4cGFuZFBvcG92ZXJPcHRpb25zID0ge1xuICAgICAgICBwbGFjZW1lbnQ6ICdyaWdodFRvcCcsXG4gICAgICAgIHdpZHRoOiAnMjY2cHgnXG4gICAgfTtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MnKSBjb250YWluZXJDbGFzc05hbWUgPSBgdGhlLXBsdWdpbi1tZW51LWNvbnRhaW5lcmA7XG5cbiAgICBASW5wdXQoKSBlZGl0b3I6IEVkaXRvcjtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmVkaXRvckVsZW1lbnQgPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgdGhpcy5lZGl0b3IpO1xuICAgICAgICBsZXQgY3VycmVudE1lbnUgPSAgdGhpcy5lZGl0b3Iub3B0aW9ucy5tZW51ID8gdGhpcy5lZGl0b3Iub3B0aW9ucy5tZW51IDogRGVmYXVsdFBsdWdpbk1lbnU7XG4gICAgICAgIGNvbnN0IG1lbnVJdGVtc01hcCA9IGJ1aWxkUGx1Z2luTWVudUl0ZW1NYXAodGhpcy5lZGl0b3IpO1xuICAgICAgICB0aGlzLnBsdWdpbk1lbnUgPSBidWlsZFBsdWdpbk1lbnUobWVudUl0ZW1zTWFwLCBjdXJyZW50TWVudSk7XG4gICAgICAgIHRoaXMuYnVpbGRNZW51cygpO1xuICAgIH1cblxuICAgIGJ1aWxkTWVudXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmtleVdvcmRzKSB7XG4gICAgICAgICAgICB0aGlzLmljb25NZW51ID0gW107XG4gICAgICAgICAgICB0aGlzLmdyb3VwTWVudSA9IHRoaXMucGx1Z2luTWVudS5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtPy5rZXl3b3JkcyAmJiBpdGVtPy5rZXl3b3Jkcy5pbmNsdWRlcyh0aGlzLmtleVdvcmRzKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cE1lbnUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBNZW51LnVuc2hpZnQodGhpcy5zZWFyY2hHcm91cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmljb25NZW51ID0gdGhpcy5wbHVnaW5NZW51LmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0/LnR5cGUgPT09IFRoZVBsdWdpbk1lbnVJdGVtVHlwZS5pY29uO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmdyb3VwTWVudSA9IHRoaXMucGx1Z2luTWVudS5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtPy50eXBlICE9PSBUaGVQbHVnaW5NZW51SXRlbVR5cGUuaWNvbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIGV4ZWN1dGVJdGVtKGV2ZW50OiBNb3VzZUV2ZW50LCBtZW51SXRlbTogVGhlUGx1Z2luTWVudUl0ZW0pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMucmVtb3ZlS2V5d29yZHMoKTtcbiAgICAgICAgY29uc3QgdG9vbGJhckl0ZW06IGFueSA9IHRoaXMucGx1Z2luTWVudS5maW5kKChpdGVtOiBUaGVQbHVnaW5NZW51SXRlbSkgPT4gaXRlbS5rZXkgPT09IG1lbnVJdGVtLmtleSk7XG4gICAgICAgIGlmICh0b29sYmFySXRlbS5leGVjdXRlKSB7XG4gICAgICAgICAgICB0b29sYmFySXRlbS5leGVjdXRlKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBRdWlja0luc2VydEVkaXRvci5jbG9zZU1lbnUodGhpcy5lZGl0b3IpO1xuICAgIH1cblxuICAgIHJlbW92ZUtleXdvcmRzID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBob3RrZXkgPSBnZXRQbHVnaW5PcHRpb25zPFF1aWNrSW5zZXJ0UGx1Z2luT3B0aW9ucz4odGhpcy5lZGl0b3IsIFBsdWdpbktleXMucXVpY2tJbnNlcnQpPy5ob3RrZXk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBOb2RlLmdldCh0aGlzLmVkaXRvciwgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uLmFuY2hvci5wYXRoKSBhcyBUZXh0O1xuICAgICAgICBpZiAobm9kZSAmJiBub2RlLnRleHQuaW5jbHVkZXMoaG90a2V5KSkge1xuICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUJhY2t3YXJkKHRoaXMuZWRpdG9yLCB7IHVuaXQ6ICdibG9jaycgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdXBkYXRlS2V5d29yZHMoa2V5d29yZHM6IHN0cmluZykge1xuICAgICAgICB0aGlzLmtleVdvcmRzID0ga2V5d29yZHMudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIHRoaXMuYnVpbGRNZW51cygpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJncm91cE1lbnUubGVuZ3RoID4gMDsgZWxzZSB0aHlFbXB0eVwiIGNsYXNzPVwidGh5LWRyb3Bkb3duLW1lbnUgcHktMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJpY29uLW1lbnUgZC1mbGV4IHB4LTUgcHktMVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGljb25NZW51XCI+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSBUaGVQbHVnaW5NZW51SXRlbVR5cGUuaWNvblwiXG4gICAgICAgICAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6O1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtdC0yXCJcbiAgICAgICAgICAgICAgICB0aHlBY3Rpb25cbiAgICAgICAgICAgICAgICBbdGh5QWN0aW9uSWNvbl09XCJpdGVtLmljb25cIlxuICAgICAgICAgICAgICAgIFt0aHlUb29sdGlwXT1cIml0ZW0ubmFtZVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJleGVjdXRlSXRlbSgkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgID48L2E+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPHRoeS1kaXZpZGVyICpuZ0lmPVwidGhpcy5pY29uTWVudT8ubGVuZ3RoXCIgY2xhc3M9XCJteS0yXCI+PC90aHktZGl2aWRlcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXBNZW51XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJUaGVQbHVnaW5NZW51LmlzTWVudUl0ZW0oaXRlbSkgJiYgIWl0ZW0uaXNFeHBhbmRlZFwiPlxuICAgICAgICAgICAgPGRpdiB0aHlEcm9wZG93bk1lbnVJdGVtIGNsYXNzPVwiaW5zZXJ0LW1lbnUtaXRlbSBtYi0xIHB5LTBcIiAobW91c2Vkb3duKT1cImV4ZWN1dGVJdGVtKCRldmVudCwgaXRlbSlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pY29uIG1yLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRoeS1pY29uIFt0aHlJY29uTmFtZV09XCJpdGVtLm1lbnVJY29uXCI+PC90aHktaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1jb250ZW50IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtaXRlbS10aXRsZSB3LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXRlbT8uaXNFeHBhbmRlZFwiIGNsYXNzPVwibWVudS1pdGVtLWRpc3BsYXkta2V5IGZvbnQtc2l6ZS1zbSB0ZXh0LXBsYWNlaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5kaXNwbGF5S2V5IH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIGZvbnQtc2l6ZS1zbVwiPnt7IGl0ZW0uZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlRoZVBsdWdpbk1lbnUuaXNNZW51SXRlbShpdGVtKSAmJiBpdGVtLmlzRXhwYW5kZWRcIiAjaGFzRXhwYW5kZWQ+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW3RoeURyb3Bkb3duXT1cImV4cGFuZFwiXG4gICAgICAgICAgICAgICAgdGh5VHJpZ2dlcj1cImhvdmVyXCJcbiAgICAgICAgICAgICAgICB0aHlEcm9wZG93bk1lbnVJdGVtXG4gICAgICAgICAgICAgICAgW3RoeVBvcG92ZXJPcHRpb25zXT1cImV4cGFuZFBvcG92ZXJPcHRpb25zXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImluc2VydC1tZW51LWl0ZW0gbWItMSBweS0wXCJcbiAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cImV4ZWN1dGVJdGVtKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWljb24gbXItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8dGh5LWljb24gW3RoeUljb25OYW1lXT1cIml0ZW0ubWVudUljb25cIj48L3RoeS1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWNvbnRlbnQgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtLXRpdGxlIHctMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpdGVtPy5pc0V4cGFuZGVkXCIgY2xhc3M9XCJtZW51LWl0ZW0tZGlzcGxheS1rZXkgZm9udC1zaXplLXNtIHRleHQtcGxhY2Vob2xkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmRpc3BsYXlLZXkgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgZm9udC1zaXplLXNtXCI+e3sgaXRlbS5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5pc0V4cGFuZGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0aHktaWNvbiBjbGFzcz1cInRleHQtbXV0ZWRcIiB0aHlJY29uTmFtZT1cImFuZ2xlLXJpZ2h0XCI+PC90aHktaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHRoeS1kcm9wZG93bi1tZW51IGNsYXNzPVwiZXhwYW5kLW1lbnVcIiAjZXhwYW5kPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtcGx1Z2luLW1lbnUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNoaWxkIG9mIGl0ZW0uY2hpbGRyZW5cIiB0aHlEcm9wZG93bk1lbnVJdGVtIGNsYXNzPVwiaW5zZXJ0LW1lbnUtaXRlbSBtYi0xIHB5LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWljb24gbXItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aHktaWNvbiBbdGh5SWNvbk5hbWVdPVwiY2hpbGQubWVudUljb25cIj48L3RoeS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1jb250ZW50IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtLXRpdGxlIHctMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVudS1pdGVtLWRpc3BsYXkta2V5IGZvbnQtc2l6ZS1zbSB0ZXh0LXBsYWNlaG9sZGVyXCI+IHt7IGNoaWxkLmRpc3BsYXlLZXkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNoaWxkLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBmb250LXNpemUtc21cIj57eyBjaGlsZC5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDx0YWJsZS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmtleSA9PT0gJ3RhYmxlJ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGx1Z2luLW1lbnUtdGFibGUgdGhlLXRhYmxlLXNlbGVjdG9yLXBhbmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW2VkaXRvcl09XCJlZGl0b3JcIlxuICAgICAgICAgICAgICAgICAgICBbYmVmb3JlSW5zZXJ0XT1cInJlbW92ZUtleXdvcmRzXCJcbiAgICAgICAgICAgICAgICA+PC90YWJsZS1zZWxlY3Q+XG4gICAgICAgICAgICA8L3RoeS1kcm9wZG93bi1tZW51PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIVRoZVBsdWdpbk1lbnUuaXNNZW51SXRlbShpdGVtKVwiICNtZW51R3JvdXA+XG4gICAgICAgICAgICA8dGh5LWRyb3Bkb3duLW1lbnUtZ3JvdXAgY2xhc3M9XCJmb250LXNpemUtc21cIiBbdGh5VGl0bGVdPVwiaXRlbS5ncm91cE5hbWVcIj48L3RoeS1kcm9wZG93bi1tZW51LWdyb3VwPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3RoeUVtcHR5PlxuICAgIDxkaXYgY2xhc3M9XCJlbXB0eSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgPHRoeS1lbXB0eSBbdGh5TWVzc2FnZV09XCJ0aHlNZXNzYWdlXCI+PC90aHktZW1wdHk+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvcGx1Z2luLW1lbnUvcGx1Z2luLW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvcGx1Z2luLW1lbnUvcGx1Z2luLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQTRDLFdBQVcsRUFBRSxZQUFZLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDdEksT0FBTyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBb0IsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakcsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQVEsTUFBTSxPQUFPLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkYsT0FBTyxFQUFFLGFBQWEsRUFBa0UsTUFBTSxzQ0FBc0MsQ0FBQztBQUNySSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQU0zRCxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO0lBb0NuRSxZQUFtQixVQUFzQixFQUFTLEdBQXNCLEVBQVUsTUFBYztRQUM1RixLQUFLLEVBQUUsQ0FBQztRQURPLGVBQVUsR0FBVixVQUFVLENBQVk7UUFBUyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7UUFqQ2hHLGtCQUFhLEdBQUcsYUFBYSxDQUFDO1FBSTlCLGNBQVMsR0FBa0IsRUFBRSxDQUFDO1FBRTlCLGFBQVEsR0FBa0IsRUFBRSxDQUFDO1FBRTdCLDBCQUFxQixHQUFHLHFCQUFxQixDQUFDO1FBSTlDLGVBQVUsR0FBRyxNQUFNLENBQUM7UUFFcEIsZ0JBQVcsR0FBdUI7WUFDOUIsU0FBUyxFQUFFLE1BQU07U0FDcEIsQ0FBQztRQUVGLHlCQUFvQixHQUFHO1lBQ25CLFNBQVMsRUFBRSxVQUFVO1lBQ3JCLEtBQUssRUFBRSxPQUFPO1NBQ2pCLENBQUM7UUFJb0IsdUJBQWtCLEdBQUcsMkJBQTJCLENBQUM7UUFJOUQscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBd0QzQyxtQkFBYyxHQUFHLEdBQUcsRUFBRTtZQUNsQixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBMkIsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDO1lBQ3ZHLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFTLENBQUM7WUFDOUUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3BDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQ3pEO1FBQ0wsQ0FBQyxDQUFDO0lBeERGLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZFLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztRQUMxRixNQUFNLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsVUFBVTtRQUNOLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBNEMsRUFBRSxFQUFFO2dCQUN0RSxJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ2hDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7d0JBQ3pELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUM3QjtvQkFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFOzRCQUM1QixJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dDQUMxRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs2QkFDOUI7d0JBQ0wsQ0FBQyxDQUFDLENBQUM7cUJBQ047aUJBQ0o7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDNUM7U0FDSjthQUFNO1lBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNsRCxPQUFPLElBQUksRUFBRSxJQUFJLEtBQUsscUJBQXFCLENBQUMsSUFBSSxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNuRCxPQUFPLElBQUksRUFBRSxJQUFJLEtBQUsscUJBQXFCLENBQUMsSUFBSSxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDO1NBQ047UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxRQUEyQjtRQUMzQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsaUJBQWlCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBVUQsY0FBYyxDQUFDLFFBQWdCO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBNEI7UUFDekMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUN6QixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFtQyxDQUFDLENBQUM7U0FDOUU7UUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFO1lBQ3hCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDakIsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUFDO1NBQ047UUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEQsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ25CO1FBQ0QsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUN2QixlQUFlLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3pHO0lBQ0wsQ0FBQztJQUVELG1CQUFtQixDQUFDLE1BQWlDO1FBQ2pELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDaEQsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsYUFBYSxLQUFLLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQ2pGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVELFdBQVc7UUFDUCxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEIsQ0FBQzs7bUhBaklRLHNCQUFzQjt1R0FBdEIsc0JBQXNCLDZTQTBCVyxvQkFBb0Isb0RDNUNsRSwyck1BOEhBOzJGRDVHYSxzQkFBc0I7a0JBSmxDLFNBQVM7K0JBQ0ksaUJBQWlCO3NKQTZCdUMsZ0JBQWdCO3NCQUFqRixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFO2dCQUUxQyxrQkFBa0I7c0JBQXZDLFdBQVc7dUJBQUMsT0FBTztnQkFFWCxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uRGVzdHJveSwgRWxlbWVudFJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEhvc3RCaW5kaW5nLCBWaWV3Q2hpbGRyZW4sIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbWl4aW5VbnN1YnNjcmliZSwgTWl4aW5CYXNlLCBUaHlTY3JvbGxTZXJ2aWNlLCBTY3JvbGxUb1NlcnZpY2UgfSBmcm9tICduZ3gtdGV0aHlzL2NvcmUnO1xuaW1wb3J0IHsgRWRpdG9yLCBOb2RlLCBUZXh0IH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvciB9IGZyb20gJ3NsYXRlLWFuZ3VsYXInO1xuaW1wb3J0IHsgYnVpbGRQbHVnaW5NZW51LCBidWlsZFBsdWdpbk1lbnVJdGVtTWFwIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9wbHVnaW4tbWVudSc7XG5pbXBvcnQgeyBEZWZhdWx0UGx1Z2luTWVudSwgVGhlUGx1Z2luTWVudUl0ZW1UeXBlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3BsdWdpbi1tZW51JztcbmltcG9ydCB7IFRoZVBsdWdpbk1lbnUsIFRoZVBsdWdpbk1lbnVHcm91cCwgVGhlUGx1Z2luTWVudUl0ZW0sIFRoZVBsdWdpbk1lbnVJdGVtQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wbHVnaW5zL3BsdWdpbi1tZW51JztcbmltcG9ydCB7IGdldFBsdWdpbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9jb3JlJztcbmltcG9ydCB7IFF1aWNrSW5zZXJ0UGx1Z2luT3B0aW9ucyB9IGZyb20gJy4uLy4uL3BsdWdpbnMvcXVpY2staW5zZXJ0L3F1aWNrLWluc2VydC5wbHVnaW4nO1xuaW1wb3J0IHsgUGx1Z2luS2V5cyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUXVpY2tJbnNlcnRFZGl0b3IgfSBmcm9tICcuLi8uLi9wbHVnaW5zL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgVGhlTGlzdGJveENoYW5nZUV2ZW50LCBUaGVMaXN0Ym94T3B0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vbGlzdGJveC9saXN0Ym94JztcbmltcG9ydCB7IFRoeURyb3Bkb3duRGlyZWN0aXZlIH0gZnJvbSAnbmd4LXRldGh5cy9kcm9wZG93bic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndGhlLXBsdWdpbi1tZW51JyxcbiAgICB0ZW1wbGF0ZVVybDogJ3BsdWdpbi1tZW51LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBUaGVQbHVnaW5NZW51Q29tcG9uZW50IGV4dGVuZHMgbWl4aW5VbnN1YnNjcmliZShNaXhpbkJhc2UpIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIGVkaXRvckVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgVGhlUGx1Z2luTWVudSA9IFRoZVBsdWdpbk1lbnU7XG5cbiAgICBfcGx1Z2luTWVudTogVGhlUGx1Z2luTWVudTtcblxuICAgIGdyb3VwTWVudTogVGhlUGx1Z2luTWVudSA9IFtdO1xuXG4gICAgaWNvbk1lbnU6IFRoZVBsdWdpbk1lbnUgPSBbXTtcblxuICAgIFRoZVBsdWdpbk1lbnVJdGVtVHlwZSA9IFRoZVBsdWdpbk1lbnVJdGVtVHlwZTtcblxuICAgIGtleVdvcmRzOiBzdHJpbmc7XG5cbiAgICB0aHlNZXNzYWdlID0gJ+aaguaXoOaVsOaNric7XG5cbiAgICBzZWFyY2hHcm91cDogVGhlUGx1Z2luTWVudUdyb3VwID0ge1xuICAgICAgICBncm91cE5hbWU6ICfmkJzntKLnu5PmnpwnXG4gICAgfTtcblxuICAgIGV4cGFuZFBvcG92ZXJPcHRpb25zID0ge1xuICAgICAgICBwbGFjZW1lbnQ6ICdyaWdodFRvcCcsXG4gICAgICAgIHdpZHRoOiAnMjY2cHgnXG4gICAgfTtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ2Ryb3Bkb3duVHJpZ2dlcnMnLCB7IHJlYWQ6IFRoeURyb3Bkb3duRGlyZWN0aXZlIH0pIGRyb3Bkb3duVHJpZ2dlcnM6IFRoeURyb3Bkb3duRGlyZWN0aXZlW107XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgY29udGFpbmVyQ2xhc3NOYW1lID0gYHRoZS1wbHVnaW4tbWVudS1jb250YWluZXJgO1xuXG4gICAgQElucHV0KCkgZWRpdG9yOiBFZGl0b3I7XG5cbiAgICBASW5wdXQoKSB0aGVEaXNwbGF5U2VhcmNoOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSB0aGVQbHVnaW5NZW51OiBUaGVQbHVnaW5NZW51SXRlbUNvbmZpZ1tdO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yRWxlbWVudCA9IEFuZ3VsYXJFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCB0aGlzLmVkaXRvcik7XG4gICAgICAgIGxldCBjdXJyZW50TWVudSA9IHRoaXMuZWRpdG9yLm9wdGlvbnMubWVudSA/IHRoaXMuZWRpdG9yLm9wdGlvbnMubWVudSA6IERlZmF1bHRQbHVnaW5NZW51O1xuICAgICAgICBjb25zdCBtZW51SXRlbXNNYXAgPSBidWlsZFBsdWdpbk1lbnVJdGVtTWFwKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgdGhpcy5fcGx1Z2luTWVudSA9IGJ1aWxkUGx1Z2luTWVudShtZW51SXRlbXNNYXAsIGN1cnJlbnRNZW51KTtcbiAgICAgICAgdGhpcy5idWlsZE1lbnVzKCk7XG4gICAgfVxuXG4gICAgYnVpbGRNZW51cygpIHtcbiAgICAgICAgaWYgKHRoaXMua2V5V29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMuaWNvbk1lbnUgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBNZW51ID0gW107XG4gICAgICAgICAgICB0aGlzLl9wbHVnaW5NZW51LmZvckVhY2goKGl0ZW06IFRoZVBsdWdpbk1lbnVHcm91cCB8IFRoZVBsdWdpbk1lbnVJdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKFRoZVBsdWdpbk1lbnUuaXNNZW51SXRlbShpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5rZXl3b3JkcyAmJiBpdGVtLmtleXdvcmRzPy5pbmNsdWRlcyh0aGlzLmtleVdvcmRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cE1lbnUucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQua2V5d29yZHMgJiYgaXRlbS5rZXl3b3Jkcz8uaW5jbHVkZXModGhpcy5rZXlXb3JkcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cE1lbnUucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBNZW51Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwTWVudS51bnNoaWZ0KHRoaXMuc2VhcmNoR3JvdXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pY29uTWVudSA9IHRoaXMuX3BsdWdpbk1lbnUuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbT8udHlwZSA9PT0gVGhlUGx1Z2luTWVudUl0ZW1UeXBlLmljb247XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBNZW51ID0gdGhpcy5fcGx1Z2luTWVudS5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtPy50eXBlICE9PSBUaGVQbHVnaW5NZW51SXRlbVR5cGUuaWNvbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIGhhbmRsZUl0ZW1TZWxlY3Rpb24obWVudUl0ZW06IFRoZVBsdWdpbk1lbnVJdGVtKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlS2V5d29yZHMoKTtcbiAgICAgICAgbWVudUl0ZW0uZXhlY3V0ZSh0aGlzLmVkaXRvcik7XG4gICAgICAgIFF1aWNrSW5zZXJ0RWRpdG9yLmNsb3NlTWVudSh0aGlzLmVkaXRvcik7XG4gICAgfVxuXG4gICAgcmVtb3ZlS2V5d29yZHMgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhvdGtleSA9IGdldFBsdWdpbk9wdGlvbnM8UXVpY2tJbnNlcnRQbHVnaW5PcHRpb25zPih0aGlzLmVkaXRvciwgUGx1Z2luS2V5cy5xdWlja0luc2VydCk/LmhvdGtleTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IE5vZGUuZ2V0KHRoaXMuZWRpdG9yLCB0aGlzLmVkaXRvci5zZWxlY3Rpb24uYW5jaG9yLnBhdGgpIGFzIFRleHQ7XG4gICAgICAgIGlmIChub2RlICYmIG5vZGUudGV4dC5pbmNsdWRlcyhob3RrZXkpKSB7XG4gICAgICAgICAgICBFZGl0b3IuZGVsZXRlQmFja3dhcmQodGhpcy5lZGl0b3IsIHsgdW5pdDogJ2Jsb2NrJyB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB1cGRhdGVLZXl3b3JkcyhrZXl3b3Jkczogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMua2V5V29yZHMgPSBrZXl3b3Jkcy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgdGhpcy5idWlsZE1lbnVzKCk7XG4gICAgfVxuXG4gICAgdGhlTGlzdGJveENoYW5nZShldmVudDogVGhlTGlzdGJveENoYW5nZUV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVJdGVtU2VsZWN0aW9uKGV2ZW50Lm9wdGlvbi50aGVPcHRpb25WYWx1ZSBhcyBUaGVQbHVnaW5NZW51SXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjaGlsZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duID0gdGhpcy5maW5kRHJvcGRvd25UcmlnZ2VyKGV2ZW50Lm9wdGlvbi5wYXJlbnRPcHRpb24pO1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5zaG93KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3BhcmVudCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duID0gdGhpcy5maW5kRHJvcGRvd25UcmlnZ2VyKGV2ZW50Lm9wdGlvbik7XG4gICAgICAgICAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0dXJuJykge1xuICAgICAgICAgICAgU2Nyb2xsVG9TZXJ2aWNlLnNjcm9sbFRvRWxlbWVudChldmVudC5vcHRpb24uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmaW5kRHJvcGRvd25UcmlnZ2VyKG9wdGlvbjogVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZSkge1xuICAgICAgICBjb25zdCBkcm9wZG93biA9IHRoaXMuZHJvcGRvd25UcmlnZ2Vycy5maW5kKHZhbHVlID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVsnZWxlbWVudFJlZiddLm5hdGl2ZUVsZW1lbnQgPT09IG9wdGlvbi5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZHJvcGRvd247XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxufVxuIiwiPGRpdiAqbmdJZj1cInRoZURpc3BsYXlTZWFyY2hcIiBjbGFzcz1cIm1lbnUtc2VhcmNoIHB4LTUgcHQtNVwiPlxuICAgIDx0aHktaW5wdXQtc2VhcmNoIFsobmdNb2RlbCldPVwia2V5V29yZHNcIiBwbGFjZWhvbGRlcj1cIuaQnOe0olwiIHRoeUljb25Qb3NpdGlvbj1cImFmdGVyXCIgKG5nTW9kZWxDaGFuZ2UpPVwiYnVpbGRNZW51cygpXCI+IDwvdGh5LWlucHV0LXNlYXJjaD5cbjwvZGl2PlxuXG48ZGl2XG4gICAgKm5nSWY9XCJncm91cE1lbnUubGVuZ3RoID4gMDsgZWxzZSB0aHlFbXB0eVwiXG4gICAgdGhlTGlzdEJveFxuICAgIFtrZXlib2FyZENvbnRhaW5lcl09XCJlZGl0b3JFbGVtZW50XCJcbiAgICAodGhlTGlzdGJveENoYW5nZSk9XCJ0aGVMaXN0Ym94Q2hhbmdlKCRldmVudClcIlxuICAgIGNsYXNzPVwidGh5LWRyb3Bkb3duLW1lbnUgcHktMlwiXG4+XG4gICAgPGRpdiAqbmdJZj1cImljb25NZW51Py5sZW5ndGggPiAwXCIgdGhlTGlzdGJveEdyb3VwIFtob3Jpem9udGFsQ29sdW1uXT1cIjZcIiBjbGFzcz1cImljb24tbWVudSBkLWZsZXggcHgtNSBweS0xXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaWNvbk1lbnVcIj5cbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT09IFRoZVBsdWdpbk1lbnVJdGVtVHlwZS5pY29uXCJcbiAgICAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDo7XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm10LTJcIlxuICAgICAgICAgICAgICAgIHRoeUFjdGlvblxuICAgICAgICAgICAgICAgIHRoZUxpc3Rib3hPcHRpb25cbiAgICAgICAgICAgICAgICBbdGhlT3B0aW9uVmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgW3RoeUFjdGlvbkljb25dPVwiaXRlbS5pY29uXCJcbiAgICAgICAgICAgICAgICBbdGh5VG9vbHRpcF09XCJpdGVtLm5hbWVcIlxuICAgICAgICAgICAgICAgIHRoZVByZXZlbnREZWZhdWx0XG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUl0ZW1TZWxlY3Rpb24oaXRlbSlcIlxuICAgICAgICAgICAgPjwvYT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8dGh5LWRpdmlkZXIgKm5nSWY9XCJ0aGlzLmljb25NZW51Py5sZW5ndGhcIiBjbGFzcz1cIm15LTJcIj48L3RoeS1kaXZpZGVyPlxuICAgIDxkaXYgdGhlTGlzdGJveEdyb3VwPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdyb3VwTWVudVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlRoZVBsdWdpbk1lbnUuaXNNZW51SXRlbShpdGVtKSAmJiAhaXRlbS5pc0V4cGFuZGVkXCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICB0aHlEcm9wZG93bk1lbnVJdGVtXG4gICAgICAgICAgICAgICAgICAgIHRoZUxpc3Rib3hPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgW3RoZU9wdGlvblZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImluc2VydC1tZW51LWl0ZW0gbWItMSBweS0wXCJcbiAgICAgICAgICAgICAgICAgICAgdGhlUHJldmVudERlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUl0ZW1TZWxlY3Rpb24oaXRlbSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtaWNvbiBtci0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGh5LWljb24gW3RoeUljb25OYW1lXT1cIml0ZW0ubWVudUljb25cIj48L3RoeS1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtY29udGVudCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtLXRpdGxlIHctMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXRlbT8uaXNFeHBhbmRlZFwiIGNsYXNzPVwibWVudS1pdGVtLWRpc3BsYXkta2V5IGZvbnQtc2l6ZS1zbSB0ZXh0LXBsYWNlaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZGlzcGxheUtleSB9fTwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgZm9udC1zaXplLXNtXCI+e3sgaXRlbS5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlRoZVBsdWdpbk1lbnUuaXNNZW51SXRlbShpdGVtKSAmJiBpdGVtLmlzRXhwYW5kZWRcIiAjaGFzRXhwYW5kZWQ+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAjZHJvcGRvd25UcmlnZ2Vyc1xuICAgICAgICAgICAgICAgICAgICBbdGh5RHJvcGRvd25dPVwiZXhwYW5kXCJcbiAgICAgICAgICAgICAgICAgICAgdGh5VHJpZ2dlcj1cImhvdmVyXCJcbiAgICAgICAgICAgICAgICAgICAgdGh5RHJvcGRvd25NZW51SXRlbVxuICAgICAgICAgICAgICAgICAgICB0aGVMaXN0Ym94T3B0aW9uXG4gICAgICAgICAgICAgICAgICAgIFt0aGVPcHRpb25WYWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgW3RoeVBvcG92ZXJPcHRpb25zXT1cImV4cGFuZFBvcG92ZXJPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnNlcnQtbWVudS1pdGVtIG1iLTEgcHktMFwiXG4gICAgICAgICAgICAgICAgICAgIHRoZVByZXZlbnREZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVJdGVtU2VsZWN0aW9uKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWljb24gbXItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoeS1pY29uIFt0aHlJY29uTmFtZV09XCJpdGVtLm1lbnVJY29uXCI+PC90aHktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWNvbnRlbnQgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtaXRlbS10aXRsZSB3LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWl0ZW0/LmlzRXhwYW5kZWRcIiBjbGFzcz1cIm1lbnUtaXRlbS1kaXNwbGF5LWtleSBmb250LXNpemUtc20gdGV4dC1wbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmRpc3BsYXlLZXkgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIGZvbnQtc2l6ZS1zbVwiPnt7IGl0ZW0uZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5pc0V4cGFuZGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGh5LWljb24gY2xhc3M9XCJ0ZXh0LW11dGVkXCIgdGh5SWNvbk5hbWU9XCJhbmdsZS1yaWdodFwiPjwvdGh5LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8dGh5LWRyb3Bkb3duLW1lbnUgY2xhc3M9XCJleHBhbmQtbWVudVwiICNleHBhbmQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhlLXBsdWdpbi1tZW51LWNvbnRhaW5lclwiIHRoZUxpc3Rib3hHcm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjaGlsZCBvZiBpdGVtLmNoaWxkcmVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh5RHJvcGRvd25NZW51SXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVMaXN0Ym94T3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5zZXJ0LW1lbnUtaXRlbSBtYi0xIHB5LTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVQcmV2ZW50RGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlSXRlbVNlbGVjdGlvbihjaGlsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhlT3B0aW9uVmFsdWVdPVwiY2hpbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtaWNvbiBtci0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGh5LWljb24gW3RoeUljb25OYW1lXT1cImNoaWxkLm1lbnVJY29uXCI+PC90aHktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWNvbnRlbnQgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtaXRlbS10aXRsZSB3LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVudS1pdGVtLWRpc3BsYXkta2V5IGZvbnQtc2l6ZS1zbSB0ZXh0LXBsYWNlaG9sZGVyXCI+IHt7IGNoaWxkLmRpc3BsYXlLZXkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2hpbGQubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBmb250LXNpemUtc21cIj57eyBjaGlsZC5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5rZXkgPT09ICd0YWJsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGx1Z2luLW1lbnUtdGFibGUgdGhlLXRhYmxlLXNlbGVjdG9yLXBhbmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZWRpdG9yXT1cImVkaXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JlZm9yZUluc2VydF09XCJyZW1vdmVLZXl3b3Jkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC90YWJsZS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvdGh5LWRyb3Bkb3duLW1lbnU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhVGhlUGx1Z2luTWVudS5pc01lbnVJdGVtKGl0ZW0pXCIgI21lbnVHcm91cD5cbiAgICAgICAgICAgICAgICA8dGh5LWRyb3Bkb3duLW1lbnUtZ3JvdXAgY2xhc3M9XCJmb250LXNpemUtc21cIiBbdGh5VGl0bGVdPVwiaXRlbS5ncm91cE5hbWVcIj48L3RoeS1kcm9wZG93bi1tZW51LWdyb3VwPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjdGh5RW1wdHk+XG4gICAgPGRpdiBjbGFzcz1cImVtcHR5IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxuICAgICAgICA8dGh5LWVtcHR5IFt0aHlNZXNzYWdlXT1cInRoeU1lc3NhZ2VcIj48L3RoeS1lbXB0eT5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=