@ecodev/natural 60.0.1 → 60.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/esm2022/lib/classes/abstract-list.mjs +4 -1
  2. package/esm2022/lib/modules/common/directives/background-density.directive.mjs +65 -0
  3. package/esm2022/lib/modules/common/directives/linkable-tab.directive.mjs +3 -1
  4. package/esm2022/lib/modules/common/directives/src-density.directive.mjs +25 -15
  5. package/esm2022/lib/modules/common/public-api.mjs +2 -1
  6. package/esm2022/lib/modules/detail-header/detail-header.component.mjs +3 -3
  7. package/esm2022/lib/modules/file/component/file.component.mjs +16 -16
  8. package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.mjs +3 -3
  9. package/esm2022/lib/modules/relations/relations.component.mjs +4 -1
  10. package/esm2022/lib/modules/search/facet-selector/facet-selector.component.mjs +3 -3
  11. package/esm2022/lib/modules/search/group/group.component.mjs +3 -3
  12. package/esm2022/lib/modules/search/input/input.component.mjs +4 -1
  13. package/esm2022/lib/modules/search/search/search.component.mjs +3 -3
  14. package/esm2022/lib/modules/select/select/select.component.mjs +7 -7
  15. package/esm2022/lib/modules/select/select-enum/select-enum.component.mjs +3 -3
  16. package/esm2022/lib/modules/select/select-hierarchic/select-hierarchic.component.mjs +14 -5
  17. package/fesm2022/ecodev-natural.mjs +140 -48
  18. package/fesm2022/ecodev-natural.mjs.map +1 -1
  19. package/lib/classes/abstract-list.d.ts +3 -0
  20. package/lib/modules/common/directives/background-density.directive.d.ts +39 -0
  21. package/lib/modules/common/directives/linkable-tab.directive.d.ts +2 -0
  22. package/lib/modules/common/directives/src-density.directive.d.ts +2 -1
  23. package/lib/modules/common/public-api.d.ts +1 -0
  24. package/lib/modules/detail-header/detail-header.component.d.ts +2 -2
  25. package/lib/modules/file/component/file.component.d.ts +3 -5
  26. package/lib/modules/relations/relations.component.d.ts +3 -0
  27. package/lib/modules/select/select/select.component.d.ts +4 -4
  28. package/lib/modules/select/select-hierarchic/select-hierarchic.component.d.ts +13 -4
  29. package/package.json +1 -1
@@ -6,19 +6,18 @@ import { NaturalIconDirective } from '../../icon/icon.directive';
6
6
  import { MatIconModule } from '@angular/material/icon';
7
7
  import { MatRippleModule } from '@angular/material/core';
8
8
  import { NaturalFileDropDirective } from '../file-drop.directive';
9
+ import { NaturalBackgroundDensityDirective } from '../../common/directives/background-density.directive';
9
10
  import * as i0 from "@angular/core";
10
11
  import * as i1 from "../file.service";
11
12
  import * as i2 from "../../alert/alert.service";
12
- import * as i3 from "@angular/platform-browser";
13
- import * as i4 from "@angular/material/core";
14
- import * as i5 from "@angular/common";
15
- import * as i6 from "@angular/material/icon";
13
+ import * as i3 from "@angular/material/core";
14
+ import * as i4 from "@angular/common";
15
+ import * as i5 from "@angular/material/icon";
16
16
  // @dynamic
17
17
  export class NaturalFileComponent {
18
- constructor(naturalFileService, alertService, sanitizer, document) {
18
+ constructor(naturalFileService, alertService, document) {
19
19
  this.naturalFileService = naturalFileService;
20
20
  this.alertService = alertService;
21
- this.sanitizer = sanitizer;
22
21
  this.document = document;
23
22
  this.height = 250;
24
23
  this.action = null;
@@ -41,7 +40,7 @@ export class NaturalFileComponent {
41
40
  * human navigates away from the page before the upload is finished. Instead, you should use `[uploader]`.
42
41
  */
43
42
  this.modelChange = new EventEmitter();
44
- this.imagePreview = null;
43
+ this.imagePreview = '';
45
44
  this.filePreview = null;
46
45
  }
47
46
  ngOnChanges(changes) {
@@ -74,7 +73,7 @@ export class NaturalFileComponent {
74
73
  return this.naturalFileService.getDownloadLink(this.model);
75
74
  }
76
75
  updateImage() {
77
- this.imagePreview = null;
76
+ this.imagePreview = '';
78
77
  this.filePreview = null;
79
78
  if (!this.model) {
80
79
  return;
@@ -84,7 +83,7 @@ export class NaturalFileComponent {
84
83
  this.getBase64(this.model.file).subscribe(result => {
85
84
  if (this.model?.file?.type) {
86
85
  const content = 'url(data:' + this.model?.file?.type + ';base64,' + result + ')';
87
- this.imagePreview = this.sanitizer.bypassSecurityTrustStyle(content);
86
+ this.imagePreview = content;
88
87
  }
89
88
  });
90
89
  }
@@ -101,14 +100,14 @@ export class NaturalFileComponent {
101
100
  const height = this.height ? '/' + this.height : '';
102
101
  // create image url without port to stay compatible with dev mode
103
102
  const image = loc.protocol + '//' + loc.hostname + '/api/image/' + this.model.id + height;
104
- this.imagePreview = this.sanitizer.bypassSecurityTrustStyle('url(' + image + ')');
103
+ this.imagePreview = image;
105
104
  }
106
105
  else if (this.model?.mime && ['File', 'AccountingDocument'].includes(this.model.__typename || '')) {
107
106
  this.filePreview = this.model.mime.split('/')[1];
108
107
  }
109
108
  else if (this.model.src) {
110
109
  // external url
111
- this.imagePreview = this.sanitizer.bypassSecurityTrustStyle('url(' + this.model.src + ')');
110
+ this.imagePreview = this.model.src;
112
111
  }
113
112
  }
114
113
  getBase64(file) {
@@ -124,8 +123,8 @@ export class NaturalFileComponent {
124
123
  reader.readAsBinaryString(file);
125
124
  return subject.asObservable();
126
125
  }
127
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NaturalFileComponent, deps: [{ token: i1.NaturalFileService }, { token: i2.NaturalAlertService }, { token: i3.DomSanitizer }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
128
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: NaturalFileComponent, isStandalone: true, selector: "natural-file", inputs: { height: "height", action: "action", backgroundSize: "backgroundSize", accept: "accept", uploader: "uploader", model: "model", formCtrl: "formCtrl" }, outputs: { modelChange: "modelChange" }, host: { properties: { "style.height.px": "this.height" } }, usesOnChanges: true, ngImport: i0, template: "<a\n (fileChange)=\"upload($event)\"\n naturalFileDrop\n [selectable]=\"true\"\n [accept]=\"accept\"\n [attr.href]=\"getDownloadLink()\"\n [class.has-action]=\"!!action\"\n [class.suggest-upload]=\"!model && action === 'upload'\"\n [fileSelectionDisabled]=\"action !== 'upload'\"\n [matRippleDisabled]=\"!action\"\n [style.backgroundImage]=\"imagePreview\"\n [style.backgroundSize]=\"backgroundSize\"\n matRipple\n target=\"_blank\"\n>\n @if (filePreview) {\n <div class=\"file-preview\">\n <mat-icon [size]=\"height * 0.33\" naturalIcon=\"attachment\" />\n {{ filePreview | uppercase }}\n </div>\n }\n\n <div class=\"action-overlay\">\n @if (action === 'upload') {\n <mat-icon [size]=\"height * 0.66\" naturalIcon=\"cloud_upload\" />\n }\n @if (action === 'download') {\n <mat-icon [size]=\"height * 0.66\" naturalIcon=\"get_app\" />\n }\n {{ action | capitalize }}\n </div>\n</a>\n", styles: [":host{display:flex;position:relative;flex-direction:row;overflow:hidden}:host>a{position:relative;flex:1;background-position:center;background-repeat:no-repeat}:host>a.has-action{cursor:pointer}:host>a.has-action.suggest-upload .action-overlay{opacity:.66}:host>a.has-action:hover .action-overlay,:host>a.has-action.natural-file-over .action-overlay{opacity:1}:host .action-overlay,:host .file-preview{display:flex;position:absolute;inset:0;flex-direction:column;justify-content:center;align-items:center;font-size:36px;line-height:1.3em;text-align:center}:host .action-overlay{opacity:0}:host .action-overlay>div{display:flex;position:absolute;inset:0;justify-content:center;align-items:center;opacity:0}\n"], dependencies: [{ kind: "directive", type: NaturalFileDropDirective, selector: ":not([naturalFileSelect])[naturalFileDrop]", outputs: ["fileOver"] }, { kind: "ngmodule", type: MatRippleModule }, { kind: "directive", type: i4.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i5.UpperCasePipe, name: "uppercase" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NaturalIconDirective, selector: "mat-icon[naturalIcon]", inputs: ["naturalIcon", "size"] }, { kind: "pipe", type: NaturalCapitalizePipe, name: "capitalize" }] }); }
126
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NaturalFileComponent, deps: [{ token: i1.NaturalFileService }, { token: i2.NaturalAlertService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
127
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: NaturalFileComponent, isStandalone: true, selector: "natural-file", inputs: { height: "height", action: "action", backgroundSize: "backgroundSize", accept: "accept", uploader: "uploader", model: "model", formCtrl: "formCtrl" }, outputs: { modelChange: "modelChange" }, host: { properties: { "style.height.px": "this.height" } }, usesOnChanges: true, ngImport: i0, template: "<a\n (fileChange)=\"upload($event)\"\n naturalFileDrop\n [selectable]=\"true\"\n [accept]=\"accept\"\n [attr.href]=\"getDownloadLink()\"\n [class.has-action]=\"!!action\"\n [class.suggest-upload]=\"!model && action === 'upload'\"\n [fileSelectionDisabled]=\"action !== 'upload'\"\n [matRippleDisabled]=\"!action\"\n [naturalBackgroundDensity]=\"imagePreview\"\n [style.backgroundSize]=\"backgroundSize\"\n matRipple\n target=\"_blank\"\n>\n @if (filePreview) {\n <div class=\"file-preview\">\n <mat-icon [size]=\"height * 0.33\" naturalIcon=\"attachment\" />\n {{ filePreview | uppercase }}\n </div>\n }\n\n <div class=\"action-overlay\">\n @if (action === 'upload') {\n <mat-icon [size]=\"height * 0.66\" naturalIcon=\"cloud_upload\" />\n }\n @if (action === 'download') {\n <mat-icon [size]=\"height * 0.66\" naturalIcon=\"get_app\" />\n }\n {{ action | capitalize }}\n </div>\n</a>\n", styles: [":host{display:flex;position:relative;flex-direction:row;overflow:hidden}:host>a{position:relative;flex:1;background-position:center;background-repeat:no-repeat}:host>a.has-action{cursor:pointer}:host>a.has-action.suggest-upload .action-overlay{opacity:.66}:host>a.has-action:hover .action-overlay,:host>a.has-action.natural-file-over .action-overlay{opacity:1}:host .action-overlay,:host .file-preview{display:flex;position:absolute;inset:0;flex-direction:column;justify-content:center;align-items:center;font-size:36px;line-height:1.3em;text-align:center}:host .action-overlay{opacity:0}:host .action-overlay>div{display:flex;position:absolute;inset:0;justify-content:center;align-items:center;opacity:0}\n"], dependencies: [{ kind: "directive", type: NaturalFileDropDirective, selector: ":not([naturalFileSelect])[naturalFileDrop]", outputs: ["fileOver"] }, { kind: "ngmodule", type: MatRippleModule }, { kind: "directive", type: i3.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i4.UpperCasePipe, name: "uppercase" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NaturalIconDirective, selector: "mat-icon[naturalIcon]", inputs: ["naturalIcon", "size"] }, { kind: "pipe", type: NaturalCapitalizePipe, name: "capitalize" }, { kind: "directive", type: NaturalBackgroundDensityDirective, selector: "[naturalBackgroundDensity]", inputs: ["naturalBackgroundDensity"] }] }); }
129
128
  }
130
129
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NaturalFileComponent, decorators: [{
131
130
  type: Component,
@@ -136,8 +135,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
136
135
  MatIconModule,
137
136
  NaturalIconDirective,
138
137
  NaturalCapitalizePipe,
139
- ], template: "<a\n (fileChange)=\"upload($event)\"\n naturalFileDrop\n [selectable]=\"true\"\n [accept]=\"accept\"\n [attr.href]=\"getDownloadLink()\"\n [class.has-action]=\"!!action\"\n [class.suggest-upload]=\"!model && action === 'upload'\"\n [fileSelectionDisabled]=\"action !== 'upload'\"\n [matRippleDisabled]=\"!action\"\n [style.backgroundImage]=\"imagePreview\"\n [style.backgroundSize]=\"backgroundSize\"\n matRipple\n target=\"_blank\"\n>\n @if (filePreview) {\n <div class=\"file-preview\">\n <mat-icon [size]=\"height * 0.33\" naturalIcon=\"attachment\" />\n {{ filePreview | uppercase }}\n </div>\n }\n\n <div class=\"action-overlay\">\n @if (action === 'upload') {\n <mat-icon [size]=\"height * 0.66\" naturalIcon=\"cloud_upload\" />\n }\n @if (action === 'download') {\n <mat-icon [size]=\"height * 0.66\" naturalIcon=\"get_app\" />\n }\n {{ action | capitalize }}\n </div>\n</a>\n", styles: [":host{display:flex;position:relative;flex-direction:row;overflow:hidden}:host>a{position:relative;flex:1;background-position:center;background-repeat:no-repeat}:host>a.has-action{cursor:pointer}:host>a.has-action.suggest-upload .action-overlay{opacity:.66}:host>a.has-action:hover .action-overlay,:host>a.has-action.natural-file-over .action-overlay{opacity:1}:host .action-overlay,:host .file-preview{display:flex;position:absolute;inset:0;flex-direction:column;justify-content:center;align-items:center;font-size:36px;line-height:1.3em;text-align:center}:host .action-overlay{opacity:0}:host .action-overlay>div{display:flex;position:absolute;inset:0;justify-content:center;align-items:center;opacity:0}\n"] }]
140
- }], ctorParameters: () => [{ type: i1.NaturalFileService }, { type: i2.NaturalAlertService }, { type: i3.DomSanitizer }, { type: Document, decorators: [{
138
+ NaturalBackgroundDensityDirective,
139
+ ], template: "<a\n (fileChange)=\"upload($event)\"\n naturalFileDrop\n [selectable]=\"true\"\n [accept]=\"accept\"\n [attr.href]=\"getDownloadLink()\"\n [class.has-action]=\"!!action\"\n [class.suggest-upload]=\"!model && action === 'upload'\"\n [fileSelectionDisabled]=\"action !== 'upload'\"\n [matRippleDisabled]=\"!action\"\n [naturalBackgroundDensity]=\"imagePreview\"\n [style.backgroundSize]=\"backgroundSize\"\n matRipple\n target=\"_blank\"\n>\n @if (filePreview) {\n <div class=\"file-preview\">\n <mat-icon [size]=\"height * 0.33\" naturalIcon=\"attachment\" />\n {{ filePreview | uppercase }}\n </div>\n }\n\n <div class=\"action-overlay\">\n @if (action === 'upload') {\n <mat-icon [size]=\"height * 0.66\" naturalIcon=\"cloud_upload\" />\n }\n @if (action === 'download') {\n <mat-icon [size]=\"height * 0.66\" naturalIcon=\"get_app\" />\n }\n {{ action | capitalize }}\n </div>\n</a>\n", styles: [":host{display:flex;position:relative;flex-direction:row;overflow:hidden}:host>a{position:relative;flex:1;background-position:center;background-repeat:no-repeat}:host>a.has-action{cursor:pointer}:host>a.has-action.suggest-upload .action-overlay{opacity:.66}:host>a.has-action:hover .action-overlay,:host>a.has-action.natural-file-over .action-overlay{opacity:1}:host .action-overlay,:host .file-preview{display:flex;position:absolute;inset:0;flex-direction:column;justify-content:center;align-items:center;font-size:36px;line-height:1.3em;text-align:center}:host .action-overlay{opacity:0}:host .action-overlay>div{display:flex;position:absolute;inset:0;justify-content:center;align-items:center;opacity:0}\n"] }]
140
+ }], ctorParameters: () => [{ type: i1.NaturalFileService }, { type: i2.NaturalAlertService }, { type: Document, decorators: [{
141
141
  type: Inject,
142
142
  args: [DOCUMENT]
143
143
  }] }], propDecorators: { height: [{
@@ -160,4 +160,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
160
160
  }], modelChange: [{
161
161
  type: Output
162
162
  }] } });
163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvbW9kdWxlcy9maWxlL2NvbXBvbmVudC9maWxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL2ZpbGUvY29tcG9uZW50L2ZpbGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBYSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVsRCxPQUFPLEVBQUMsWUFBWSxFQUFFLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBR3ZELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7O0FBRWhFLFdBQVc7QUFlWCxNQUFNLE9BQU8sb0JBQW9CO0lBZ0Q3QixZQUNxQixrQkFBc0MsRUFDdEMsWUFBaUMsRUFDakMsU0FBdUIsRUFDTCxRQUFrQjtRQUhwQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUNqQyxjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ0wsYUFBUSxHQUFSLFFBQVEsQ0FB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QU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNsQyxDQUFDOzhHQW5KUSxvQkFBb0IsbUhBb0RqQixRQUFRO2tHQXBEWCxvQkFBb0Isa1dDdkNqQyxxZ0NBZ0NBLDZ2QkREUSx3QkFBd0IsNkdBQ3hCLGVBQWUsa1NBQ2YsWUFBWSwyRkFDWixhQUFhLG9MQUNiLG9CQUFvQiw4RkFDcEIscUJBQXFCOzsyRkFHaEIsb0JBQW9CO2tCQWRoQyxTQUFTOytCQUNJLGNBQWMsY0FHWixJQUFJLFdBQ1A7d0JBQ0wsd0JBQXdCO3dCQUN4QixlQUFlO3dCQUNmLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixvQkFBb0I7d0JBQ3BCLHFCQUFxQjtxQkFDeEI7OzBCQXNESSxNQUFNOzJCQUFDLFFBQVE7eUNBbkQ0QixNQUFNO3NCQUFyRCxXQUFXO3VCQUFDLGlCQUFpQjs7c0JBQUcsS0FBSztnQkFFdEIsTUFBTTtzQkFBckIsS0FBSztnQkFFVSxjQUFjO3NCQUE3QixLQUFLO2dCQVFVLE1BQU07c0JBQXJCLEtBQUs7Z0JBZ0JVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBRVUsS0FBSztzQkFBcEIsS0FBSztnQkFNVSxRQUFRO3NCQUF2QixLQUFLO2dCQU1vQixXQUFXO3NCQUFwQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0RvbVNhbml0aXplciwgU2FmZVN0eWxlfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIHRhcH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge05hdHVyYWxGaWxlU2VydmljZX0gZnJvbSAnLi4vZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7Q29tbW9uTW9kdWxlLCBET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7RmlsZU1vZGVsfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge05hdHVyYWxBbGVydFNlcnZpY2V9IGZyb20gJy4uLy4uL2FsZXJ0L2FsZXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHtOYXR1cmFsQ2FwaXRhbGl6ZVBpcGV9IGZyb20gJy4uLy4uL2NvbW1vbi9waXBlcy9jYXBpdGFsaXplLnBpcGUnO1xuaW1wb3J0IHtOYXR1cmFsSWNvbkRpcmVjdGl2ZX0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLmRpcmVjdGl2ZSc7XG5pbXBvcnQge01hdEljb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHtNYXRSaXBwbGVNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHtOYXR1cmFsRmlsZURyb3BEaXJlY3RpdmV9IGZyb20gJy4uL2ZpbGUtZHJvcC5kaXJlY3RpdmUnO1xuXG4vLyBAZHluYW1pY1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYXR1cmFsLWZpbGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWxlLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vZmlsZS5jb21wb25lbnQuc2NzcycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE5hdHVyYWxGaWxlRHJvcERpcmVjdGl2ZSxcbiAgICAgICAgTWF0UmlwcGxlTW9kdWxlLFxuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIE5hdHVyYWxJY29uRGlyZWN0aXZlLFxuICAgICAgICBOYXR1cmFsQ2FwaXRhbGl6ZVBpcGUsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTmF0dXJhbEZpbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5oZWlnaHQucHgnKSBASW5wdXQoKSBwdWJsaWMgaGVpZ2h0ID0gMjUwO1xuXG4gICAgQElucHV0KCkgcHVibGljIGFjdGlvbjogJ3VwbG9hZCcgfCAnZG93bmxvYWQnIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgYmFja2dyb3VuZFNpemUgPSAnY29udGFpbic7XG5cbiAgICAvKipcbiAgICAgKiBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB1bmlxdWUgZmlsZSB0eXBlIHNwZWNpZmllcnMuIExpa2UgdGhlIG5hdGl2ZSBlbGVtZW50LFxuICAgICAqIGl0IGNhbiBiZSBhIG1peCBvZiBtaW1lLXR5cGUgYW5kIGZpbGUgZXh0ZW5zaW9ucy5cbiAgICAgKlxuICAgICAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQvZmlsZSNhY2NlcHRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgYWNjZXB0ID0gJ2ltYWdlL2JtcCxpbWFnZS9naWYsaW1hZ2UvanBlZyxpbWFnZS9wanBlZyxpbWFnZS9wbmcsaW1hZ2Uvc3ZnK3htbCxpbWFnZS9zdmcsaW1hZ2Uvd2VicCc7XG5cbiAgICAvKipcbiAgICAgKiBJZiBnaXZlbiwgaXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIG5ldyBmaWxlIGlzIHNlbGVjdGVkLiBUaGUgY2FsbGJhY2sgc2hvdWxkIHR5cGljYWxseSB1cGxvYWQgdGhlIGZpbGVcbiAgICAgKiB0byB0aGUgc2VydmVyIGFuZCBsaW5rIHRoZSBuZXdseSB1cGxvYWRlZCBmaWxlIHRvIHRoZSBleGlzdGluZyByZWxhdGVkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIFRoZSBjYWxsYmFjayAqKm11c3QqKiBiZSBhYmxlIHRvIHJ1biBldmVuIGlmIHRoZSBjYWxsaW5nIGNvbXBvbmVudCBoYXMgYmVlbiBkZXN0cm95ZWQuIFRoYXQgbWVhbnMgaW4gbW9zdFxuICAgICAqIGNhc2VzIHlvdSAqKm11c3QqKiBgYmluZCgpYCB0aGUgY2FsbGJhY2sgZXhwbGljaXRseSwgbGlrZSBzbzpcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8bmF0dXJhbC1maWxlIFt1cGxvYWRlcl09XCJteUNhbGxiYWNrLmJpbmQodGhpcylcIj48L25hdHVyYWwtZmlsZT5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEFsc28sIHlvdSBwcm9iYWJseSAqKnNob3VsZCoqIHNldCBhIGBbZm9ybUN0cmxdYCBzbyB0aGF0IHRoZSBmb3JtIGlzIHVwZGF0ZWQgYXV0b21hdGljYWxseSwgaW5zdGVhZCBvZiBkb2luZ1xuICAgICAqIGl0IG1hbnVhbGx5IHdpdGhpbiB0aGUgY2FsbGJhY2suXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHVwbG9hZGVyPzogKGZpbGU6IEZpbGUpID0+IE9ic2VydmFibGU8RmlsZU1vZGVsPjtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBtb2RlbDogRmlsZU1vZGVsIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBJZiBwcm92aWRlZCwgaXRzIHZhbHVlIHdpbGwgZ2V0IHVwZGF0ZWQgd2hlbiB0aGUgbW9kZWwgY2hhbmdlcy5cbiAgICAgKiBCdXQgaXRzIHZhbHVlIGlzIG5ldmVyIHJlYWQsIHNvIGlmIHlvdSB3YW50IHRvIHNldCBhIHZhbHVlIHVzZSBgW21vZGVsXWAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgZm9ybUN0cmw6IEFic3RyYWN0Q29udHJvbCB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyAqKm11c3Qgbm90KiogYmUgdXNlZCB0byBtdXRhdGUgdGhlIHNlcnZlciwgYmVjYXVzZSBpdCBpcyB2ZXJ5IGxpa2VseSBpdCB3aWxsIG5ldmVyIGJlIGNhbGxlZCBpZiB0aGVcbiAgICAgKiBodW1hbiBuYXZpZ2F0ZXMgYXdheSBmcm9tIHRoZSBwYWdlIGJlZm9yZSB0aGUgdXBsb2FkIGlzIGZpbmlzaGVkLiBJbnN0ZWFkLCB5b3Ugc2hvdWxkIHVzZSBgW3VwbG9hZGVyXWAuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBtb2RlbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZU1vZGVsPigpO1xuXG4gICAgcHVibGljIGltYWdlUHJldmlldzogU2FmZVN0eWxlIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGZpbGVQcmV2aWV3OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBuYXR1cmFsRmlsZVNlcnZpY2U6IE5hdHVyYWxGaWxlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhbGVydFNlcnZpY2U6IE5hdHVyYWxBbGVydFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgICkge31cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzLm1vZGVsICYmIGNoYW5nZXMubW9kZWwucHJldmlvdXNWYWx1ZSAhPT0gY2hhbmdlcy5tb2RlbC5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW1hZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVJbWFnZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGxvYWQoZmlsZTogRmlsZSk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vZGVsID0ge2ZpbGU6IGZpbGV9O1xuICAgICAgICB0aGlzLnVwZGF0ZUltYWdlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZm9ybUN0cmwpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUN0cmwuc2V0VmFsdWUodGhpcy5tb2RlbCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvYnNlcnZhYmxlID1cbiAgICAgICAgICAgIHRoaXMudXBsb2FkZXI/LihmaWxlKS5waXBlKHRhcCgoKSA9PiB0aGlzLmFsZXJ0U2VydmljZS5pbmZvKCRsb2NhbGl6ZWBNaXMgw6Agam91cmApKSkgPz8gb2YodGhpcy5tb2RlbCk7XG5cbiAgICAgICAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwgPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtQ3RybCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUN0cmwuc2V0VmFsdWUodGhpcy5tb2RlbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh0aGlzLm1vZGVsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERvd25sb2FkTGluaygpOiBudWxsIHwgc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uICE9PSAnZG93bmxvYWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm5hdHVyYWxGaWxlU2VydmljZS5nZXREb3dubG9hZExpbmsodGhpcy5tb2RlbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVJbWFnZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbWFnZVByZXZpZXcgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbGVQcmV2aWV3ID0gbnVsbDtcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tb2RlbC5maWxlPy50eXBlLmluY2x1ZGVzKCdpbWFnZS8nKSkge1xuICAgICAgICAgICAgLy8gTW9kZWwgZnJvbSB1cGxvYWQgKGJlZm9yZSBzYXZpbmcpXG4gICAgICAgICAgICB0aGlzLmdldEJhc2U2NCh0aGlzLm1vZGVsLmZpbGUpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsPy5maWxlPy50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSAndXJsKGRhdGE6JyArIHRoaXMubW9kZWw/LmZpbGU/LnR5cGUgKyAnO2Jhc2U2NCwnICsgcmVzdWx0ICsgJyknO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmltYWdlUHJldmlldyA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShjb250ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGVsLmZpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZVByZXZpZXcgPSB0aGlzLm1vZGVsLmZpbGUudHlwZS5zcGxpdCgnLycpWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZWwuX190eXBlbmFtZSA9PT0gJ0ltYWdlJyAmJiB0aGlzLm1vZGVsLmlkKSB7XG4gICAgICAgICAgICAvLyBNb2RlbCBpbWFnZSB3aXRoIGlkLCB1c2Ugc3BlY2lmaWMgQVBJIHRvIHJlbmRlciBpbWFnZSBieSBzaXplXG4gICAgICAgICAgICBjb25zdCB3aW5kb3cgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICAgICAgaWYgKCF3aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBzaG93IGltYWdlIHByZXZpZXcgYmVjYXVzZSBgd2luZG93YCBpcyB1bmRlZmluZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jID0gd2luZG93LmxvY2F0aW9uO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5oZWlnaHQgPyAnLycgKyB0aGlzLmhlaWdodCA6ICcnO1xuXG4gICAgICAgICAgICAvLyBjcmVhdGUgaW1hZ2UgdXJsIHdpdGhvdXQgcG9ydCB0byBzdGF5IGNvbXBhdGlibGUgd2l0aCBkZXYgbW9kZVxuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBsb2MucHJvdG9jb2wgKyAnLy8nICsgbG9jLmhvc3RuYW1lICsgJy9hcGkvaW1hZ2UvJyArIHRoaXMubW9kZWwuaWQgKyBoZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLmltYWdlUHJldmlldyA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZSgndXJsKCcgKyBpbWFnZSArICcpJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlbD8ubWltZSAmJiBbJ0ZpbGUnLCAnQWNjb3VudGluZ0RvY3VtZW50J10uaW5jbHVkZXModGhpcy5tb2RlbC5fX3R5cGVuYW1lIHx8ICcnKSkge1xuICAgICAgICAgICAgdGhpcy5maWxlUHJldmlldyA9IHRoaXMubW9kZWwubWltZS5zcGxpdCgnLycpWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZWwuc3JjKSB7XG4gICAgICAgICAgICAvLyBleHRlcm5hbCB1cmxcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VQcmV2aWV3ID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKCd1cmwoJyArIHRoaXMubW9kZWwuc3JjICsgJyknKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QmFzZTY0KGZpbGU6IEZpbGUgfCBudWxsKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICByZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIChldjogYW55KSA9PiB7XG4gICAgICAgICAgICBzdWJqZWN0Lm5leHQoYnRvYShldi50YXJnZXQucmVzdWx0KSk7XG4gICAgICAgICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKGZpbGUpO1xuXG4gICAgICAgIHJldHVybiBzdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbn1cbiIsIjxhXG4gICAgKGZpbGVDaGFuZ2UpPVwidXBsb2FkKCRldmVudClcIlxuICAgIG5hdHVyYWxGaWxlRHJvcFxuICAgIFtzZWxlY3RhYmxlXT1cInRydWVcIlxuICAgIFthY2NlcHRdPVwiYWNjZXB0XCJcbiAgICBbYXR0ci5ocmVmXT1cImdldERvd25sb2FkTGluaygpXCJcbiAgICBbY2xhc3MuaGFzLWFjdGlvbl09XCIhIWFjdGlvblwiXG4gICAgW2NsYXNzLnN1Z2dlc3QtdXBsb2FkXT1cIiFtb2RlbCAmJiBhY3Rpb24gPT09ICd1cGxvYWQnXCJcbiAgICBbZmlsZVNlbGVjdGlvbkRpc2FibGVkXT1cImFjdGlvbiAhPT0gJ3VwbG9hZCdcIlxuICAgIFttYXRSaXBwbGVEaXNhYmxlZF09XCIhYWN0aW9uXCJcbiAgICBbc3R5bGUuYmFja2dyb3VuZEltYWdlXT1cImltYWdlUHJldmlld1wiXG4gICAgW3N0eWxlLmJhY2tncm91bmRTaXplXT1cImJhY2tncm91bmRTaXplXCJcbiAgICBtYXRSaXBwbGVcbiAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuPlxuICAgIEBpZiAoZmlsZVByZXZpZXcpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtcHJldmlld1wiPlxuICAgICAgICAgICAgPG1hdC1pY29uIFtzaXplXT1cImhlaWdodCAqIDAuMzNcIiBuYXR1cmFsSWNvbj1cImF0dGFjaG1lbnRcIiAvPlxuICAgICAgICAgICAge3sgZmlsZVByZXZpZXcgfCB1cHBlcmNhc2UgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbi1vdmVybGF5XCI+XG4gICAgICAgIEBpZiAoYWN0aW9uID09PSAndXBsb2FkJykge1xuICAgICAgICAgICAgPG1hdC1pY29uIFtzaXplXT1cImhlaWdodCAqIDAuNjZcIiBuYXR1cmFsSWNvbj1cImNsb3VkX3VwbG9hZFwiIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChhY3Rpb24gPT09ICdkb3dubG9hZCcpIHtcbiAgICAgICAgICAgIDxtYXQtaWNvbiBbc2l6ZV09XCJoZWlnaHQgKiAwLjY2XCIgbmF0dXJhbEljb249XCJnZXRfYXBwXCIgLz5cbiAgICAgICAgfVxuICAgICAgICB7eyBhY3Rpb24gfCBjYXBpdGFsaXplIH19XG4gICAgPC9kaXY+XG48L2E+XG4iXX0=
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvbW9kdWxlcy9maWxlL2NvbXBvbmVudC9maWxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL2ZpbGUvY29tcG9uZW50L2ZpbGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBYSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVsRCxPQUFPLEVBQUMsWUFBWSxFQUFFLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBR3ZELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGlDQUFpQyxFQUFDLE1BQU0sc0RBQXNELENBQUM7Ozs7Ozs7QUFFdkcsV0FBVztBQWdCWCxNQUFNLE9BQU8sb0JBQW9CO0lBZ0Q3QixZQUNxQixrQkFBc0MsRUFDdEMsWUFBaUMsRUFDZixRQUFrQjtRQUZwQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUNmLGFBQVEsR0FBUixR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b0JBQW9CLDhGQUNwQixxQkFBcUIsbURBQ3JCLGlDQUFpQzs7MkZBRzVCLG9CQUFvQjtrQkFmaEMsU0FBUzsrQkFDSSxjQUFjLGNBR1osSUFBSSxXQUNQO3dCQUNMLHdCQUF3Qjt3QkFDeEIsZUFBZTt3QkFDZixZQUFZO3dCQUNaLGFBQWE7d0JBQ2Isb0JBQW9CO3dCQUNwQixxQkFBcUI7d0JBQ3JCLGlDQUFpQztxQkFDcEM7OzBCQXFESSxNQUFNOzJCQUFDLFFBQVE7eUNBbEQ0QixNQUFNO3NCQUFyRCxXQUFXO3VCQUFDLGlCQUFpQjs7c0JBQUcsS0FBSztnQkFFdEIsTUFBTTtzQkFBckIsS0FBSztnQkFFVSxjQUFjO3NCQUE3QixLQUFLO2dCQVFVLE1BQU07c0JBQXJCLEtBQUs7Z0JBZ0JVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBRVUsS0FBSztzQkFBcEIsS0FBSztnQkFNVSxRQUFRO3NCQUF2QixLQUFLO2dCQU1vQixXQUFXO3NCQUFwQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge09ic2VydmFibGUsIG9mLCBTdWJqZWN0LCB0YXB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtOYXR1cmFsRmlsZVNlcnZpY2V9IGZyb20gJy4uL2ZpbGUuc2VydmljZSc7XG5pbXBvcnQge0NvbW1vbk1vZHVsZSwgRE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0ZpbGVNb2RlbH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtOYXR1cmFsQWxlcnRTZXJ2aWNlfSBmcm9tICcuLi8uLi9hbGVydC9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7TmF0dXJhbENhcGl0YWxpemVQaXBlfSBmcm9tICcuLi8uLi9jb21tb24vcGlwZXMvY2FwaXRhbGl6ZS5waXBlJztcbmltcG9ydCB7TmF0dXJhbEljb25EaXJlY3RpdmV9IGZyb20gJy4uLy4uL2ljb24vaWNvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHtNYXRJY29uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7TWF0UmlwcGxlTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7TmF0dXJhbEZpbGVEcm9wRGlyZWN0aXZlfSBmcm9tICcuLi9maWxlLWRyb3AuZGlyZWN0aXZlJztcbmltcG9ydCB7TmF0dXJhbEJhY2tncm91bmREZW5zaXR5RGlyZWN0aXZlfSBmcm9tICcuLi8uLi9jb21tb24vZGlyZWN0aXZlcy9iYWNrZ3JvdW5kLWRlbnNpdHkuZGlyZWN0aXZlJztcblxuLy8gQGR5bmFtaWNcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmF0dXJhbC1maWxlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2ZpbGUuY29tcG9uZW50LnNjc3MnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOYXR1cmFsRmlsZURyb3BEaXJlY3RpdmUsXG4gICAgICAgIE1hdFJpcHBsZU1vZHVsZSxcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBOYXR1cmFsSWNvbkRpcmVjdGl2ZSxcbiAgICAgICAgTmF0dXJhbENhcGl0YWxpemVQaXBlLFxuICAgICAgICBOYXR1cmFsQmFja2dyb3VuZERlbnNpdHlEaXJlY3RpdmUsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTmF0dXJhbEZpbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5oZWlnaHQucHgnKSBASW5wdXQoKSBwdWJsaWMgaGVpZ2h0ID0gMjUwO1xuXG4gICAgQElucHV0KCkgcHVibGljIGFjdGlvbjogJ3VwbG9hZCcgfCAnZG93bmxvYWQnIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgYmFja2dyb3VuZFNpemUgPSAnY29udGFpbic7XG5cbiAgICAvKipcbiAgICAgKiBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB1bmlxdWUgZmlsZSB0eXBlIHNwZWNpZmllcnMuIExpa2UgdGhlIG5hdGl2ZSBlbGVtZW50LFxuICAgICAqIGl0IGNhbiBiZSBhIG1peCBvZiBtaW1lLXR5cGUgYW5kIGZpbGUgZXh0ZW5zaW9ucy5cbiAgICAgKlxuICAgICAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQvZmlsZSNhY2NlcHRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgYWNjZXB0ID0gJ2ltYWdlL2JtcCxpbWFnZS9naWYsaW1hZ2UvanBlZyxpbWFnZS9wanBlZyxpbWFnZS9wbmcsaW1hZ2Uvc3ZnK3htbCxpbWFnZS9zdmcsaW1hZ2Uvd2VicCc7XG5cbiAgICAvKipcbiAgICAgKiBJZiBnaXZlbiwgaXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIG5ldyBmaWxlIGlzIHNlbGVjdGVkLiBUaGUgY2FsbGJhY2sgc2hvdWxkIHR5cGljYWxseSB1cGxvYWQgdGhlIGZpbGVcbiAgICAgKiB0byB0aGUgc2VydmVyIGFuZCBsaW5rIHRoZSBuZXdseSB1cGxvYWRlZCBmaWxlIHRvIHRoZSBleGlzdGluZyByZWxhdGVkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIFRoZSBjYWxsYmFjayAqKm11c3QqKiBiZSBhYmxlIHRvIHJ1biBldmVuIGlmIHRoZSBjYWxsaW5nIGNvbXBvbmVudCBoYXMgYmVlbiBkZXN0cm95ZWQuIFRoYXQgbWVhbnMgaW4gbW9zdFxuICAgICAqIGNhc2VzIHlvdSAqKm11c3QqKiBgYmluZCgpYCB0aGUgY2FsbGJhY2sgZXhwbGljaXRseSwgbGlrZSBzbzpcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8bmF0dXJhbC1maWxlIFt1cGxvYWRlcl09XCJteUNhbGxiYWNrLmJpbmQodGhpcylcIiAvPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQWxzbywgeW91IHByb2JhYmx5ICoqc2hvdWxkKiogc2V0IGEgYFtmb3JtQ3RybF1gIHNvIHRoYXQgdGhlIGZvcm0gaXMgdXBkYXRlZCBhdXRvbWF0aWNhbGx5LCBpbnN0ZWFkIG9mIGRvaW5nXG4gICAgICogaXQgbWFudWFsbHkgd2l0aGluIHRoZSBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgdXBsb2FkZXI/OiAoZmlsZTogRmlsZSkgPT4gT2JzZXJ2YWJsZTxGaWxlTW9kZWw+O1xuXG4gICAgQElucHV0KCkgcHVibGljIG1vZGVsOiBGaWxlTW9kZWwgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCBpdHMgdmFsdWUgd2lsbCBnZXQgdXBkYXRlZCB3aGVuIHRoZSBtb2RlbCBjaGFuZ2VzLlxuICAgICAqIEJ1dCBpdHMgdmFsdWUgaXMgbmV2ZXIgcmVhZCwgc28gaWYgeW91IHdhbnQgdG8gc2V0IGEgdmFsdWUgdXNlIGBbbW9kZWxdYCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBmb3JtQ3RybDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzICoqbXVzdCBub3QqKiBiZSB1c2VkIHRvIG11dGF0ZSB0aGUgc2VydmVyLCBiZWNhdXNlIGl0IGlzIHZlcnkgbGlrZWx5IGl0IHdpbGwgbmV2ZXIgYmUgY2FsbGVkIGlmIHRoZVxuICAgICAqIGh1bWFuIG5hdmlnYXRlcyBhd2F5IGZyb20gdGhlIHBhZ2UgYmVmb3JlIHRoZSB1cGxvYWQgaXMgZmluaXNoZWQuIEluc3RlYWQsIHlvdSBzaG91bGQgdXNlIGBbdXBsb2FkZXJdYC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IG1vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlTW9kZWw+KCk7XG5cbiAgICBwdWJsaWMgaW1hZ2VQcmV2aWV3ID0gJyc7XG4gICAgcHVibGljIGZpbGVQcmV2aWV3OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBuYXR1cmFsRmlsZVNlcnZpY2U6IE5hdHVyYWxGaWxlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhbGVydFNlcnZpY2U6IE5hdHVyYWxBbGVydFNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgICkge31cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzLm1vZGVsICYmIGNoYW5nZXMubW9kZWwucHJldmlvdXNWYWx1ZSAhPT0gY2hhbmdlcy5tb2RlbC5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW1hZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVJbWFnZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGxvYWQoZmlsZTogRmlsZSk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vZGVsID0ge2ZpbGU6IGZpbGV9O1xuICAgICAgICB0aGlzLnVwZGF0ZUltYWdlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZm9ybUN0cmwpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUN0cmwuc2V0VmFsdWUodGhpcy5tb2RlbCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvYnNlcnZhYmxlID1cbiAgICAgICAgICAgIHRoaXMudXBsb2FkZXI/LihmaWxlKS5waXBlKHRhcCgoKSA9PiB0aGlzLmFsZXJ0U2VydmljZS5pbmZvKCRsb2NhbGl6ZWBNaXMgw6Agam91cmApKSkgPz8gb2YodGhpcy5tb2RlbCk7XG5cbiAgICAgICAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwgPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtQ3RybCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUN0cmwuc2V0VmFsdWUodGhpcy5tb2RlbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh0aGlzLm1vZGVsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERvd25sb2FkTGluaygpOiBudWxsIHwgc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uICE9PSAnZG93bmxvYWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm5hdHVyYWxGaWxlU2VydmljZS5nZXREb3dubG9hZExpbmsodGhpcy5tb2RlbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVJbWFnZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbWFnZVByZXZpZXcgPSAnJztcbiAgICAgICAgdGhpcy5maWxlUHJldmlldyA9IG51bGw7XG4gICAgICAgIGlmICghdGhpcy5tb2RlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubW9kZWwuZmlsZT8udHlwZS5pbmNsdWRlcygnaW1hZ2UvJykpIHtcbiAgICAgICAgICAgIC8vIE1vZGVsIGZyb20gdXBsb2FkIChiZWZvcmUgc2F2aW5nKVxuICAgICAgICAgICAgdGhpcy5nZXRCYXNlNjQodGhpcy5tb2RlbC5maWxlKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2RlbD8uZmlsZT8udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gJ3VybChkYXRhOicgKyB0aGlzLm1vZGVsPy5maWxlPy50eXBlICsgJztiYXNlNjQsJyArIHJlc3VsdCArICcpJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWFnZVByZXZpZXcgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZWwuZmlsZSkge1xuICAgICAgICAgICAgdGhpcy5maWxlUHJldmlldyA9IHRoaXMubW9kZWwuZmlsZS50eXBlLnNwbGl0KCcvJylbMV07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlbC5fX3R5cGVuYW1lID09PSAnSW1hZ2UnICYmIHRoaXMubW9kZWwuaWQpIHtcbiAgICAgICAgICAgIC8vIE1vZGVsIGltYWdlIHdpdGggaWQsIHVzZSBzcGVjaWZpYyBBUEkgdG8gcmVuZGVyIGltYWdlIGJ5IHNpemVcbiAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgICAgICAgICBpZiAoIXdpbmRvdykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHNob3cgaW1hZ2UgcHJldmlldyBiZWNhdXNlIGB3aW5kb3dgIGlzIHVuZGVmaW5lZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2MgPSB3aW5kb3cubG9jYXRpb247XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodCA/ICcvJyArIHRoaXMuaGVpZ2h0IDogJyc7XG5cbiAgICAgICAgICAgIC8vIGNyZWF0ZSBpbWFnZSB1cmwgd2l0aG91dCBwb3J0IHRvIHN0YXkgY29tcGF0aWJsZSB3aXRoIGRldiBtb2RlXG4gICAgICAgICAgICBjb25zdCBpbWFnZSA9IGxvYy5wcm90b2NvbCArICcvLycgKyBsb2MuaG9zdG5hbWUgKyAnL2FwaS9pbWFnZS8nICsgdGhpcy5tb2RlbC5pZCArIGhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VQcmV2aWV3ID0gaW1hZ2U7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlbD8ubWltZSAmJiBbJ0ZpbGUnLCAnQWNjb3VudGluZ0RvY3VtZW50J10uaW5jbHVkZXModGhpcy5tb2RlbC5fX3R5cGVuYW1lIHx8ICcnKSkge1xuICAgICAgICAgICAgdGhpcy5maWxlUHJldmlldyA9IHRoaXMubW9kZWwubWltZS5zcGxpdCgnLycpWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZWwuc3JjKSB7XG4gICAgICAgICAgICAvLyBleHRlcm5hbCB1cmxcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VQcmV2aWV3ID0gdGhpcy5tb2RlbC5zcmM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJhc2U2NChmaWxlOiBGaWxlIHwgbnVsbCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKCcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgICAgc3ViamVjdC5uZXh0KGJ0b2EoZXYudGFyZ2V0LnJlc3VsdCkpO1xuICAgICAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhmaWxlKTtcblxuICAgICAgICByZXR1cm4gc3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB9XG59XG4iLCI8YVxuICAgIChmaWxlQ2hhbmdlKT1cInVwbG9hZCgkZXZlbnQpXCJcbiAgICBuYXR1cmFsRmlsZURyb3BcbiAgICBbc2VsZWN0YWJsZV09XCJ0cnVlXCJcbiAgICBbYWNjZXB0XT1cImFjY2VwdFwiXG4gICAgW2F0dHIuaHJlZl09XCJnZXREb3dubG9hZExpbmsoKVwiXG4gICAgW2NsYXNzLmhhcy1hY3Rpb25dPVwiISFhY3Rpb25cIlxuICAgIFtjbGFzcy5zdWdnZXN0LXVwbG9hZF09XCIhbW9kZWwgJiYgYWN0aW9uID09PSAndXBsb2FkJ1wiXG4gICAgW2ZpbGVTZWxlY3Rpb25EaXNhYmxlZF09XCJhY3Rpb24gIT09ICd1cGxvYWQnXCJcbiAgICBbbWF0UmlwcGxlRGlzYWJsZWRdPVwiIWFjdGlvblwiXG4gICAgW25hdHVyYWxCYWNrZ3JvdW5kRGVuc2l0eV09XCJpbWFnZVByZXZpZXdcIlxuICAgIFtzdHlsZS5iYWNrZ3JvdW5kU2l6ZV09XCJiYWNrZ3JvdW5kU2l6ZVwiXG4gICAgbWF0UmlwcGxlXG4gICAgdGFyZ2V0PVwiX2JsYW5rXCJcbj5cbiAgICBAaWYgKGZpbGVQcmV2aWV3KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLXByZXZpZXdcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBbc2l6ZV09XCJoZWlnaHQgKiAwLjMzXCIgbmF0dXJhbEljb249XCJhdHRhY2htZW50XCIgLz5cbiAgICAgICAgICAgIHt7IGZpbGVQcmV2aWV3IHwgdXBwZXJjYXNlIH19XG4gICAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tb3ZlcmxheVwiPlxuICAgICAgICBAaWYgKGFjdGlvbiA9PT0gJ3VwbG9hZCcpIHtcbiAgICAgICAgICAgIDxtYXQtaWNvbiBbc2l6ZV09XCJoZWlnaHQgKiAwLjY2XCIgbmF0dXJhbEljb249XCJjbG91ZF91cGxvYWRcIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoYWN0aW9uID09PSAnZG93bmxvYWQnKSB7XG4gICAgICAgICAgICA8bWF0LWljb24gW3NpemVdPVwiaGVpZ2h0ICogMC42NlwiIG5hdHVyYWxJY29uPVwiZ2V0X2FwcFwiIC8+XG4gICAgICAgIH1cbiAgICAgICAge3sgYWN0aW9uIHwgY2FwaXRhbGl6ZSB9fVxuICAgIDwvZGl2PlxuPC9hPlxuIl19
@@ -342,7 +342,7 @@ export class NaturalHierarchicSelectorComponent extends NaturalAbstractControlle
342
342
  return model.__typename + '-' + model.id;
343
343
  }
344
344
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NaturalHierarchicSelectorComponent, deps: [{ token: i1.NaturalHierarchicSelectorService }], target: i0.ɵɵFactoryTarget.Component }); }
345
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: NaturalHierarchicSelectorComponent, isStandalone: true, selector: "natural-hierarchic-selector", inputs: { displayWith: "displayWith", config: "config", multiple: "multiple", selected: "selected", allowUnselect: "allowUnselect", filters: "filters", searchFacets: "searchFacets", searchSelections: "searchSelections" }, outputs: { searchSelectionChange: "searchSelectionChange", selectionChange: "selectionChange" }, providers: [NaturalHierarchicSelectorService], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div [style.margin-bottom.px]=\"20\">\n <natural-search (selectionChange)=\"search($event)\" [facets]=\"searchFacets\" [selections]=\"searchSelections\" />\n</div>\n\n<div class=\"body\">\n @if (loading) {\n <mat-progress-spinner [diameter]=\"36\" mode=\"indeterminate\" style=\"margin: 10px\" />\n }\n\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" [ngClass]=\"{leaf: !node.expandable}\" matTreeNodePadding>\n @if (node.expandable) {\n <button\n (click)=\"loadChildren(node)\"\n [attr.aria-label]=\"'toggle ' + node.name\"\n mat-icon-button\n matTreeNodeToggle\n >\n @if (node.loading) {\n <mat-progress-spinner [diameter]=\"24\" [strokeWidth]=\"5\" mode=\"indeterminate\" />\n }\n @if (!node.loading) {\n <mat-icon [naturalIcon]=\"treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'\" />\n }\n </button>\n }\n\n <mat-checkbox\n (change)=\"toggleFlatNode(node)\"\n [checked]=\"flatNodesSelection.isSelected(node)\"\n [disabled]=\"!isNodeTogglable(node)\"\n style=\"margin-right: 10px\"\n >\n @if (node.node.config.icon) {\n <mat-icon [naturalIcon]=\"node.node.config.icon\" style=\"margin-right: 10px\" />\n }\n <span>{{ node.name }}</span>\n </mat-checkbox>\n </mat-tree-node>\n </mat-tree>\n\n <mat-chip-listbox aria-orientation=\"vertical\" class=\"mat-mdc-chip-set-stacked\">\n @for (node of selectedNodes; track node) {\n <mat-chip-option (removed)=\"unselectModelNode(node)\" [removable]=\"true\" [selectable]=\"false\">\n @if (node.config.icon) {\n <mat-icon [naturalIcon]=\"node.config.icon\" />\n }\n <div class=\"mat-body chip-label\">{{ node.model.name || node.model.fullName }}</div>\n <button matChipRemove>\n <mat-icon naturalIcon=\"cancel\" />\n </button>\n </mat-chip-option>\n }\n </mat-chip-listbox>\n</div>\n\n@if (!loading && !dataSource.data.length) {\n <div i18n>Aucun r\u00E9sultat</div>\n}\n", styles: [":host{display:block}:host ul,:host li{-webkit-margin-before:0;-webkit-margin-after:0;list-style-type:none}:host mat-icon{width:18px;height:18px;font-size:18px}:host .mat-tree-node.leaf{margin-left:48px}:host .body{display:flex;flex-direction:row;justify-content:space-between}:host .body mat-tree{flex:66}:host .body mat-chip-listbox{flex:33}:host mat-tree{flex-shrink:0}:host mat-chip-listbox{margin-left:10px}\n"], dependencies: [{ kind: "component", type: NaturalSearchComponent, selector: "natural-search", inputs: ["placeholder", "facets", "multipleGroups", "dropdownTitle", "selections"], outputs: ["selectionChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i4.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i4.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i4.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i4.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i4.MatTreeNode, selector: "mat-tree-node", inputs: ["disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NaturalIconDirective, selector: "mat-icon[naturalIcon]", inputs: ["naturalIcon", "size"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i8.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i8.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "directive", type: i8.MatChipRemove, selector: "[matChipRemove]" }] }); }
345
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: NaturalHierarchicSelectorComponent, isStandalone: true, selector: "natural-hierarchic-selector", inputs: { displayWith: "displayWith", config: "config", multiple: "multiple", selected: "selected", allowUnselect: "allowUnselect", filters: "filters", searchFacets: "searchFacets", searchSelections: "searchSelections" }, outputs: { searchSelectionChange: "searchSelectionChange", selectionChange: "selectionChange" }, providers: [NaturalHierarchicSelectorService], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div [style.margin-bottom.px]=\"20\">\n <natural-search (selectionChange)=\"search($event)\" [facets]=\"searchFacets\" [selections]=\"searchSelections\" />\n</div>\n\n<div class=\"body\">\n @if (loading) {\n <mat-progress-spinner [diameter]=\"36\" mode=\"indeterminate\" style=\"margin: 10px\" />\n }\n\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" [ngClass]=\"{leaf: !node.expandable}\" matTreeNodePadding>\n @if (node.expandable) {\n <button\n (click)=\"loadChildren(node)\"\n [attr.aria-label]=\"'toggle ' + node.name\"\n mat-icon-button\n matTreeNodeToggle\n >\n @if (node.loading) {\n <mat-progress-spinner [diameter]=\"24\" [strokeWidth]=\"5\" mode=\"indeterminate\" />\n }\n @if (!node.loading) {\n <mat-icon [naturalIcon]=\"treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'\" />\n }\n </button>\n }\n\n <mat-checkbox\n (change)=\"toggleFlatNode(node)\"\n [checked]=\"flatNodesSelection.isSelected(node)\"\n [disabled]=\"!isNodeTogglable(node)\"\n style=\"margin-right: 10px\"\n >\n @if (node.node.config.icon) {\n <mat-icon [naturalIcon]=\"node.node.config.icon\" style=\"margin-right: 10px\" />\n }\n <span>{{ node.name }}</span>\n </mat-checkbox>\n </mat-tree-node>\n </mat-tree>\n\n <mat-chip-listbox aria-orientation=\"vertical\" class=\"mat-mdc-chip-set-stacked\">\n @for (node of selectedNodes; track node.model.id) {\n <mat-chip-option (removed)=\"unselectModelNode(node)\" [removable]=\"true\" [selectable]=\"false\">\n @if (node.config.icon) {\n <mat-icon [naturalIcon]=\"node.config.icon\" />\n }\n <div class=\"mat-body chip-label\">{{ node.model.name || node.model.fullName }}</div>\n <button matChipRemove>\n <mat-icon naturalIcon=\"cancel\" />\n </button>\n </mat-chip-option>\n }\n </mat-chip-listbox>\n</div>\n\n@if (!loading && !dataSource.data.length) {\n <div i18n>Aucun r\u00E9sultat</div>\n}\n", styles: [":host{display:block}:host ul,:host li{-webkit-margin-before:0;-webkit-margin-after:0;list-style-type:none}:host mat-icon{width:18px;height:18px;font-size:18px}:host .mat-tree-node.leaf{margin-left:48px}:host .body{display:flex;flex-direction:row;justify-content:space-between}:host .body mat-tree{flex:66}:host .body mat-chip-listbox{flex:33}:host mat-tree{flex-shrink:0}:host mat-chip-listbox{margin-left:10px}\n"], dependencies: [{ kind: "component", type: NaturalSearchComponent, selector: "natural-search", inputs: ["placeholder", "facets", "multipleGroups", "dropdownTitle", "selections"], outputs: ["selectionChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatTreeModule }, { kind: "directive", type: i4.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i4.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i4.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i4.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i4.MatTreeNode, selector: "mat-tree-node", inputs: ["disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NaturalIconDirective, selector: "mat-icon[naturalIcon]", inputs: ["naturalIcon", "size"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i8.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i8.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "directive", type: i8.MatChipRemove, selector: "[matChipRemove]" }] }); }
346
346
  }
347
347
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NaturalHierarchicSelectorComponent, decorators: [{
348
348
  type: Component,
@@ -356,7 +356,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
356
356
  NaturalIconDirective,
357
357
  MatCheckboxModule,
358
358
  MatChipsModule,
359
- ], template: "<div [style.margin-bottom.px]=\"20\">\n <natural-search (selectionChange)=\"search($event)\" [facets]=\"searchFacets\" [selections]=\"searchSelections\" />\n</div>\n\n<div class=\"body\">\n @if (loading) {\n <mat-progress-spinner [diameter]=\"36\" mode=\"indeterminate\" style=\"margin: 10px\" />\n }\n\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" [ngClass]=\"{leaf: !node.expandable}\" matTreeNodePadding>\n @if (node.expandable) {\n <button\n (click)=\"loadChildren(node)\"\n [attr.aria-label]=\"'toggle ' + node.name\"\n mat-icon-button\n matTreeNodeToggle\n >\n @if (node.loading) {\n <mat-progress-spinner [diameter]=\"24\" [strokeWidth]=\"5\" mode=\"indeterminate\" />\n }\n @if (!node.loading) {\n <mat-icon [naturalIcon]=\"treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'\" />\n }\n </button>\n }\n\n <mat-checkbox\n (change)=\"toggleFlatNode(node)\"\n [checked]=\"flatNodesSelection.isSelected(node)\"\n [disabled]=\"!isNodeTogglable(node)\"\n style=\"margin-right: 10px\"\n >\n @if (node.node.config.icon) {\n <mat-icon [naturalIcon]=\"node.node.config.icon\" style=\"margin-right: 10px\" />\n }\n <span>{{ node.name }}</span>\n </mat-checkbox>\n </mat-tree-node>\n </mat-tree>\n\n <mat-chip-listbox aria-orientation=\"vertical\" class=\"mat-mdc-chip-set-stacked\">\n @for (node of selectedNodes; track node) {\n <mat-chip-option (removed)=\"unselectModelNode(node)\" [removable]=\"true\" [selectable]=\"false\">\n @if (node.config.icon) {\n <mat-icon [naturalIcon]=\"node.config.icon\" />\n }\n <div class=\"mat-body chip-label\">{{ node.model.name || node.model.fullName }}</div>\n <button matChipRemove>\n <mat-icon naturalIcon=\"cancel\" />\n </button>\n </mat-chip-option>\n }\n </mat-chip-listbox>\n</div>\n\n@if (!loading && !dataSource.data.length) {\n <div i18n>Aucun r\u00E9sultat</div>\n}\n", styles: [":host{display:block}:host ul,:host li{-webkit-margin-before:0;-webkit-margin-after:0;list-style-type:none}:host mat-icon{width:18px;height:18px;font-size:18px}:host .mat-tree-node.leaf{margin-left:48px}:host .body{display:flex;flex-direction:row;justify-content:space-between}:host .body mat-tree{flex:66}:host .body mat-chip-listbox{flex:33}:host mat-tree{flex-shrink:0}:host mat-chip-listbox{margin-left:10px}\n"] }]
359
+ ], template: "<div [style.margin-bottom.px]=\"20\">\n <natural-search (selectionChange)=\"search($event)\" [facets]=\"searchFacets\" [selections]=\"searchSelections\" />\n</div>\n\n<div class=\"body\">\n @if (loading) {\n <mat-progress-spinner [diameter]=\"36\" mode=\"indeterminate\" style=\"margin: 10px\" />\n }\n\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" [ngClass]=\"{leaf: !node.expandable}\" matTreeNodePadding>\n @if (node.expandable) {\n <button\n (click)=\"loadChildren(node)\"\n [attr.aria-label]=\"'toggle ' + node.name\"\n mat-icon-button\n matTreeNodeToggle\n >\n @if (node.loading) {\n <mat-progress-spinner [diameter]=\"24\" [strokeWidth]=\"5\" mode=\"indeterminate\" />\n }\n @if (!node.loading) {\n <mat-icon [naturalIcon]=\"treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'\" />\n }\n </button>\n }\n\n <mat-checkbox\n (change)=\"toggleFlatNode(node)\"\n [checked]=\"flatNodesSelection.isSelected(node)\"\n [disabled]=\"!isNodeTogglable(node)\"\n style=\"margin-right: 10px\"\n >\n @if (node.node.config.icon) {\n <mat-icon [naturalIcon]=\"node.node.config.icon\" style=\"margin-right: 10px\" />\n }\n <span>{{ node.name }}</span>\n </mat-checkbox>\n </mat-tree-node>\n </mat-tree>\n\n <mat-chip-listbox aria-orientation=\"vertical\" class=\"mat-mdc-chip-set-stacked\">\n @for (node of selectedNodes; track node.model.id) {\n <mat-chip-option (removed)=\"unselectModelNode(node)\" [removable]=\"true\" [selectable]=\"false\">\n @if (node.config.icon) {\n <mat-icon [naturalIcon]=\"node.config.icon\" />\n }\n <div class=\"mat-body chip-label\">{{ node.model.name || node.model.fullName }}</div>\n <button matChipRemove>\n <mat-icon naturalIcon=\"cancel\" />\n </button>\n </mat-chip-option>\n }\n </mat-chip-listbox>\n</div>\n\n@if (!loading && !dataSource.data.length) {\n <div i18n>Aucun r\u00E9sultat</div>\n}\n", styles: [":host{display:block}:host ul,:host li{-webkit-margin-before:0;-webkit-margin-after:0;list-style-type:none}:host mat-icon{width:18px;height:18px;font-size:18px}:host .mat-tree-node.leaf{margin-left:48px}:host .body{display:flex;flex-direction:row;justify-content:space-between}:host .body mat-tree{flex:66}:host .body mat-chip-listbox{flex:33}:host mat-tree{flex-shrink:0}:host mat-chip-listbox{margin-left:10px}\n"] }]
360
360
  }], ctorParameters: () => [{ type: i1.NaturalHierarchicSelectorService }], propDecorators: { displayWith: [{
361
361
  type: Input
362
362
  }], config: [{
@@ -379,4 +379,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
379
379
  }], selectionChange: [{
380
380
  type: Output
381
381
  }] } });
382
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2hpYy1zZWxlY3Rvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvbW9kdWxlcy9oaWVyYXJjaGljLXNlbGVjdG9yL2hpZXJhcmNoaWMtc2VsZWN0b3IvaGllcmFyY2hpYy1zZWxlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvbW9kdWxlcy9oaWVyYXJjaGljLXNlbGVjdG9yL2hpZXJhcmNoaWMtc2VsZWN0b3IvaGllcmFyY2hpYy1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUMscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFOUYsT0FBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUcvRSxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUc5RSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUl4RCxPQUFPLEVBQUMsZ0NBQWdDLEVBQTBCLE1BQU0sK0JBQStCLENBQUM7QUFDeEcsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDdkUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFN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QUs7Z0JBS1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUtvQixxQkFBcUI7c0JBQTlDLE1BQU07Z0JBV21CLGVBQWU7c0JBQXhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NlbGVjdGlvbk1vZGVsfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtGbGF0VHJlZUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Nkay90cmVlJztcbmltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TWF0VHJlZUZsYXREYXRhU291cmNlLCBNYXRUcmVlRmxhdHRlbmVyLCBNYXRUcmVlTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90cmVlJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbmFsaXplLCB0YWtlVW50aWx9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TmF0dXJhbEFic3RyYWN0Q29udHJvbGxlcn0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9hYnN0cmFjdC1jb250cm9sbGVyJztcbmltcG9ydCB7UXVlcnlWYXJpYWJsZXN9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvcXVlcnktdmFyaWFibGUtbWFuYWdlcic7XG5pbXBvcnQge0xpdGVyYWx9IGZyb20gJy4uLy4uLy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7dG9HcmFwaFFMRG9jdHJpbmVGaWx0ZXJ9IGZyb20gJy4uLy4uL3NlYXJjaC9jbGFzc2VzL2dyYXBocWwtZG9jdHJpbmUnO1xuaW1wb3J0IHtOYXR1cmFsU2VhcmNoRmFjZXRzfSBmcm9tICcuLi8uLi9zZWFyY2gvdHlwZXMvZmFjZXQnO1xuaW1wb3J0IHtOYXR1cmFsU2VhcmNoU2VsZWN0aW9uc30gZnJvbSAnLi4vLi4vc2VhcmNoL3R5cGVzL3ZhbHVlcyc7XG5pbXBvcnQge0hpZXJhcmNoaWNGbGF0Tm9kZX0gZnJvbSAnLi4vY2xhc3Nlcy9mbGF0LW5vZGUnO1xuaW1wb3J0IHtOYXR1cmFsSGllcmFyY2hpY0NvbmZpZ3VyYXRpb259IGZyb20gJy4uL2NsYXNzZXMvaGllcmFyY2hpYy1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7SGllcmFyY2hpY0ZpbHRlcnNDb25maWd1cmF0aW9ufSBmcm9tICcuLi9jbGFzc2VzL2hpZXJhcmNoaWMtZmlsdGVycy1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7SGllcmFyY2hpY01vZGVsTm9kZX0gZnJvbSAnLi4vY2xhc3Nlcy9tb2RlbC1ub2RlJztcbmltcG9ydCB7TmF0dXJhbEhpZXJhcmNoaWNTZWxlY3RvclNlcnZpY2UsIE9yZ2FuaXplZE1vZGVsU2VsZWN0aW9ufSBmcm9tICcuL2hpZXJhcmNoaWMtc2VsZWN0b3Iuc2VydmljZSc7XG5pbXBvcnQge3JlcGxhY2VPYmplY3RLZWVwaW5nUmVmZXJlbmNlfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL3V0aWxpdHknO1xuaW1wb3J0IHtNYXRDaGlwc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xuaW1wb3J0IHtNYXRDaGVja2JveE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHtOYXR1cmFsSWNvbkRpcmVjdGl2ZX0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLmRpcmVjdGl2ZSc7XG5pbXBvcnQge01hdEljb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHtNYXRCdXR0b25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQge01hdFByb2dyZXNzU3Bpbm5lck1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7TmF0dXJhbFNlYXJjaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vc2VhcmNoL3NlYXJjaC9zZWFyY2guY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYXR1cmFsLWhpZXJhcmNoaWMtc2VsZWN0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9oaWVyYXJjaGljLXNlbGVjdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vaGllcmFyY2hpYy1zZWxlY3Rvci5jb21wb25lbnQuc2NzcycsXG4gICAgcHJvdmlkZXJzOiBbTmF0dXJhbEhpZXJhcmNoaWNTZWxlY3RvclNlcnZpY2VdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOYXR1cmFsU2VhcmNoQ29tcG9uZW50LFxuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICAgICAgTWF0VHJlZU1vZHVsZSxcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBOYXR1cmFsSWNvbkRpcmVjdGl2ZSxcbiAgICAgICAgTWF0Q2hlY2tib3hNb2R1bGUsXG4gICAgICAgIE1hdENoaXBzTW9kdWxlLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIE5hdHVyYWxIaWVyYXJjaGljU2VsZWN0b3JDb21wb25lbnQgZXh0ZW5kcyBOYXR1cmFsQWJzdHJhY3RDb250cm9sbGVyIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSBtb2RlbCBhbmQgcmV0dXJucyBhIHN0cmluZyBmb3IgZGlzcGxheSB2YWx1ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNwbGF5V2l0aD86IChpdGVtOiBhbnkpID0+IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbmZpZyBmb3IgaXRlbXMgYW5kIHJlbGF0aW9ucyBhcnJhbmdlbWVudFxuICAgICAqL1xuICAgIEBJbnB1dCh7cmVxdWlyZWQ6IHRydWV9KSBwdWJsaWMgY29uZmlnITogTmF0dXJhbEhpZXJhcmNoaWNDb25maWd1cmF0aW9uW107XG5cbiAgICAvKipcbiAgICAgKiBJZiBtdWx0aXBsZSBvciBzaW5nbGUgaXRlbSBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgbXVsdGlwbGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNlbGVjdGVkIGl0ZW1zXG4gICAgICogT3JnYW5pemVkIGJ5IGtleSwgY29udGFpbmluZyBlYWNoIGFuIGFycmF5IG9mIHNlbGVjdGVkIGl0ZW1zIG9mIHNhbWUgdHlwZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RlZDogT3JnYW5pemVkTW9kZWxTZWxlY3Rpb24gPSB7fTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgc2VsZWN0YWJsZSBlbGVtZW50cyBjYW4gYmUgdW5zZWxlY3RlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhbGxvd1Vuc2VsZWN0ID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdGhhdCBhcHBseSB0byBlYWNoIHF1ZXJ5XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGZpbHRlcnM/OiBIaWVyYXJjaGljRmlsdGVyc0NvbmZpZ3VyYXRpb24gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU2VhcmNoIGZhY2V0c1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hGYWNldHM6IE5hdHVyYWxTZWFyY2hGYWNldHMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIFNlbGVjdGlvbnMgdG8gYXBwbHkgb24gbmF0dXJhbC1zZWFyY2ggb24gY29tcG9uZW50IGluaXRpYWxpc2F0aW9uXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHNlYXJjaFNlbGVjdGlvbnM6IE5hdHVyYWxTZWFyY2hTZWxlY3Rpb25zID0gW107XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyB3aGVuIG5hdHVyYWwtc2VhcmNoIHNlbGVjdGlvbnMgY2hhbmdlXG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBzZWFyY2hTZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE5hdHVyYWxTZWFyY2hTZWxlY3Rpb25zPigpO1xuXG4gICAgLyoqXG4gICAgICogSW5uZXIgcmVwcmVzZW50YXRpb24gb2Ygc2VsZWN0ZWQgQElucHV0KCkgdG8gYWxsb3cgZmxhdCBsaXN0aW5nIGFzIG1hdC1jaGlwLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZE5vZGVzOiBIaWVyYXJjaGljTW9kZWxOb2RlW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHNlbGVjdGlvbiBjaGFuZ2VcbiAgICAgKiBSZXR1cm5zIGEgTGl0ZXJhbCB3aGVyZSBzZWxlY3RlZCBtb2RlbHMgYXJlIG9yZ2FuaXplZCBieSBrZXlcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8T3JnYW5pemVkTW9kZWxTZWxlY3Rpb24+KCk7XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9sbGVyIGZvciBub2RlcyBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZmxhdE5vZGVzU2VsZWN0aW9uITogU2VsZWN0aW9uTW9kZWw8SGllcmFyY2hpY0ZsYXROb2RlPjtcblxuICAgIHB1YmxpYyB0cmVlQ29udHJvbCE6IEZsYXRUcmVlQ29udHJvbDxIaWVyYXJjaGljRmxhdE5vZGU+O1xuICAgIHB1YmxpYyB0cmVlRmxhdHRlbmVyITogTWF0VHJlZUZsYXR0ZW5lcjxIaWVyYXJjaGljTW9kZWxOb2RlLCBIaWVyYXJjaGljRmxhdE5vZGU+O1xuICAgIHB1YmxpYyBkYXRhU291cmNlITogTWF0VHJlZUZsYXREYXRhU291cmNlPEhpZXJhcmNoaWNNb2RlbE5vZGUsIEhpZXJhcmNoaWNGbGF0Tm9kZT47XG5cbiAgICBwdWJsaWMgbG9hZGluZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2FjaGUgZm9yIHRyYW5zZm9ybWVkIG5vZGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmbGF0Tm9kZU1hcDogTWFwPHN0cmluZywgSGllcmFyY2hpY0ZsYXROb2RlPiA9IG5ldyBNYXA8c3RyaW5nLCBIaWVyYXJjaGljRmxhdE5vZGU+KCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBoaWVyYXJjaGljU2VsZWN0b3JTZXJ2aWNlOiBOYXR1cmFsSGllcmFyY2hpY1NlbGVjdG9yU2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuZ3VsYXIgT25DaGFuZ2UgaW1wbGVtZW50YXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlcy5zZWxlY3RlZCAmJiAhY2hhbmdlcy5zZWxlY3RlZC5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJbm5lclNlbGVjdGlvbih0aGlzLnNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzLmZpbHRlcnMgJiYgIWNoYW5nZXMuZmlsdGVycy5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkUm9vdHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuZ3VsYXIgT25Jbml0IGltcGxlbWVudGF0aW9uXG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICAvLyBJbml0IHRyZWUgY2hlY2tib3ggc2VsZWN0b3JzXG4gICAgICAgIHRoaXMuZmxhdE5vZGVzU2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odGhpcy5tdWx0aXBsZSk7XG5cbiAgICAgICAgLy8gVHJlZSBjb250cm9sbGVycyBhbmQgbWFuaXB1bGF0b3JzXG4gICAgICAgIHRoaXMudHJlZUZsYXR0ZW5lciA9IG5ldyBNYXRUcmVlRmxhdHRlbmVyKFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lcigpLFxuICAgICAgICAgICAgdGhpcy5nZXRMZXZlbCgpLFxuICAgICAgICAgICAgdGhpcy5pc0V4cGFuZGFibGUoKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2hpbGRyZW4oKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy50cmVlQ29udHJvbCA9IG5ldyBGbGF0VHJlZUNvbnRyb2w8SGllcmFyY2hpY0ZsYXROb2RlPih0aGlzLmdldExldmVsKCksIHRoaXMuaXNFeHBhbmRhYmxlKCkpO1xuXG4gICAgICAgIC8vIFRoZSBkYXRhU291cmNlIGNvbnRhaW5zIGEgbmVzdGVkIE1vZGVsTm9kZXMgbGlzdC4gRWFjaCBNb2RlbE5vZGUgaGFzIGEgY2hpbGQgYXR0cmlidXRlIHRoYXQgcmV0dXJucyBhbiBvYnNlcnZhYmxlLlxuICAgICAgICAvLyBUaGUgZGF0YVNvdXJjZSBjb250YWlucyBhIGZsYXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5lc3RlZCBNb2RlbE5vZGVzIHRoYXQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSB0cmVlRmxhdHRlbmVyIHJlbGF0ZWQgZnVuY3Rpb25zXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUcmVlRmxhdERhdGFTb3VyY2UodGhpcy50cmVlQ29udHJvbCwgdGhpcy50cmVlRmxhdHRlbmVyKTtcblxuICAgICAgICAvLyBVcGRhdGUgZGF0YVNvdXJjZSB3aGVuIHJlY2VpdmluZyBuZXcgbGlzdCAtPiB3ZSBhc3NpZ24gdGhlIHdob2xlIHRyZWVcbiAgICAgICAgLy8gVGhlIHRyZWVDb250cm9sIGFuZCB0cmVlRmxhdHRlbmVyIHdpbGwgZ2VuZXJhdGUgdGhlIGRpc3BsYXllZCB0cmVlXG4gICAgICAgIHRoaXMuaGllcmFyY2hpY1NlbGVjdG9yU2VydmljZS5kYXRhQ2hhbmdlXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiAodGhpcy5kYXRhU291cmNlLmRhdGEgPSBkYXRhKSk7XG5cbiAgICAgICAgLy8gUHJldmVudCBlbXB0eSBzY3JlZW4gb24gZmlyc3QgbG9hZCBhbmQgaW5pdCBOYXR1cmFsSGllcmFyY2hpY1NlbGVjdG9yU2VydmljZSB3aXRoIGlucHV0dGVkIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgbGV0IHZhcmlhYmxlcztcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoU2VsZWN0aW9ucy5zb21lKHMgPT4gcy5sZW5ndGgpKSB7XG4gICAgICAgICAgICB2YXJpYWJsZXMgPSB7ZmlsdGVyOiB0b0dyYXBoUUxEb2N0cmluZUZpbHRlcih0aGlzLnNlYXJjaEZhY2V0cywgdGhpcy5zZWFyY2hTZWxlY3Rpb25zKX07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkUm9vdHModmFyaWFibGVzKTtcblxuICAgICAgICAvLyBPcmdhbml6ZWRTZWxlY3Rpb24gaW50byBsaXN0IHVzYWJsZSBieSB0ZW1wbGF0ZVxuICAgICAgICB0aGlzLnVwZGF0ZUlubmVyU2VsZWN0aW9uKHRoaXMuc2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZSBzZWxlY3Rpb24gb2YgYSBGbGF0Tm9kZSwgY29uc2lkZXJpbmcgaWYgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGFjdGl2YXRlZCBvciBub3RcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlRmxhdE5vZGUoZmxhdE5vZGU6IEhpZXJhcmNoaWNGbGF0Tm9kZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgLy8gSXMgbXVsdGlwbGUgYWxsb3dlZCwganVzdCB0b2dnbGUgZWxlbWVudFxuICAgICAgICAgICAgaWYgKHRoaXMuZmxhdE5vZGVzU2VsZWN0aW9uLmlzU2VsZWN0ZWQoZmxhdE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bnNlbGVjdEZsYXROb2RlKGZsYXROb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RGbGF0Tm9kZShmbGF0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZsYXROb2Rlc1NlbGVjdGlvbi5pc1NlbGVjdGVkKGZsYXROb2RlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3RTaW5nbGVGbGF0Tm9kZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBub3QgbXVsdGlwbGUsIGFuZCB3ZSB3YW50IHRvIHNlbGVjdCBhbiBlbGVtZW50LCB1bnNlbGVjdCBldmVyeXRoaW5nIGJlZm9yZSB0byBrZWVwIGEgc2luZ2xlIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U2luZ2xlRmxhdE5vZGUoZmxhdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiB1bnNlbGVjdGluZyBhbiBlbGVtZW50IGZyb20gdGhlIG1hdC1jaGlwcywgaXQgY2FuIGJlIGRlZXAgaW4gdGhlIGhpZXJhcmNoeSwgYW5kIHRoZSB0cmVlIGVsZW1lbnQgbWF5IG5vdCBleGlzdC4uLlxuICAgICAqIC4uLiBidXQgd2Ugc3RpbGwgbmVlZCB0byByZW1vdmUgdGhlIGVsZW1lbnQgZnJvbSB0aGUgbWF0LWNoaXBzIGxpc3QuXG4gICAgICovXG4gICAgcHVibGljIHVuc2VsZWN0TW9kZWxOb2RlKG5vZGU6IEhpZXJhcmNoaWNNb2RlbE5vZGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmxhdE5vZGUgPSB0aGlzLmdldEZsYXROb2RlKG5vZGUpO1xuICAgICAgICBpZiAoZmxhdE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMudW5zZWxlY3RGbGF0Tm9kZShmbGF0Tm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgZnJvbSBjaGlwcyBsaXN0IG9ubHkgaWYgbm8gZmxhdE5vZGUsIGJlY2F1c2UgdW5zZWxlY3RGbGF0Tm9kZSgpIGFscmVhZHkgZGVhbHMgd2l0aCBpdC5cbiAgICAgICAgICAgIHRoaXMucmVtb3ZlTW9kZWxOb2RlKG5vZGUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24odGhpcy5zZWxlY3RlZE5vZGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpc05vZGVUb2dnbGFibGUoZmxhdE5vZGU6IEhpZXJhcmNoaWNGbGF0Tm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5pc05vZGVTZWxlY3RlZChmbGF0Tm9kZS5ub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZsYXROb2RlLmRlc2VsZWN0YWJsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmbGF0Tm9kZS5zZWxlY3RhYmxlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREaXNwbGF5Rm4oY29uZmlnOiBOYXR1cmFsSGllcmFyY2hpY0NvbmZpZ3VyYXRpb24pOiAoaXRlbTogYW55KSA9PiBzdHJpbmcge1xuICAgICAgICBpZiAoY29uZmlnLmRpc3BsYXlXaXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlnLmRpc3BsYXlXaXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheVdpdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlXaXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0ZW0gPT4gKGl0ZW0gPyBpdGVtLmZ1bGxOYW1lIHx8IGl0ZW0ubmFtZSA6ICcnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZENoaWxkcmVuKGZsYXROb2RlOiBIaWVyYXJjaGljRmxhdE5vZGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudHJlZUNvbnRyb2wuaXNFeHBhbmRlZChmbGF0Tm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2hpY1NlbGVjdG9yU2VydmljZS5sb2FkQ2hpbGRyZW4oZmxhdE5vZGUsIHRoaXMuZmlsdGVycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVkIHRvIGNvbGxhcHNlIGFsbCBjaGlsZHJlbiB3aGVuIGNsb3NpbmcgYSBwYXJlbnQsIGJ1dCBub3Qgc3VyZSBpdCdzIGdvb2QuXG4gICAgICovXG4gICAgLy8gcHVibGljIGxvYWRDaGlsZHJlbihmbGF0Tm9kZTogSGllcmFyY2hpY0ZsYXROb2RlKSB7XG4gICAgLy8gICAgIGlmICh0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQoZmxhdE5vZGUpKSB7XG4gICAgLy9cbiAgICAvLyAgICAgICAgIGNvbnN0IGNhY2hlZEZsYXROb2RlID0gdGhpcy5nZXRGbGF0Tm9kZShmbGF0Tm9kZS5ub2RlKTtcbiAgICAvLyAgICAgICAgIGlmIChjYWNoZWRGbGF0Tm9kZSkge1xuICAgIC8vICAgICAgICAgICAgIHRoaXMuaGllcmFyY2hpY1NlbGVjdG9yU2VydmljZS5sb2FkQ2hpbGRyZW4oY2FjaGVkRmxhdE5vZGUsIHRoaXMuZmlsdGVycyk7XG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICAvLyBDbG9zZSBjaGlsZHJlblxuICAgIC8vICAgICAgICAgICAgIGNhY2hlZEZsYXROb2RlLm5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHRoaXMuZ2V0RmxhdE5vZGUoY2hpbGQpO1xuICAgIC8vICAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmNvbGxhcHNlKGNoaWxkTm9kZSk7XG4gICAgLy8gICAgICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgICAgICB9KTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIHByaXZhdGUgZ2V0Q2hpbGRyZW4oKTogKG5vZGU6IEhpZXJhcmNoaWNNb2RlbE5vZGUpID0+IE9ic2VydmFibGU8SGllcmFyY2hpY01vZGVsTm9kZVtdPiB7XG4gICAgICAgIHJldHVybiAobm9kZTogSGllcmFyY2hpY01vZGVsTm9kZSk6IE9ic2VydmFibGU8SGllcmFyY2hpY01vZGVsTm9kZVtdPiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbkNoYW5nZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1zIGEgSGllcmFyY2hpY01vZGVsTm9kZSBpbnRvIGEgRmxhdE5vZGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHRyYW5zZm9ybWVyKCk6IChub2RlOiBIaWVyYXJjaGljTW9kZWxOb2RlLCBsZXZlbDogbnVtYmVyKSA9PiBIaWVyYXJjaGljRmxhdE5vZGUge1xuICAgICAgICByZXR1cm4gKG5vZGU6IEhpZXJhcmNoaWNNb2RlbE5vZGUsIGxldmVsOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE9yQ3JlYXRlRmxhdE5vZGUobm9kZSwgbGV2ZWwpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBkZWVwIG9mIHRoZSBub2RlIGluIHRoZSB0cmVlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRMZXZlbCgpOiAobm9kZTogSGllcmFyY2hpY0ZsYXROb2RlKSA9PiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKG5vZGU6IEhpZXJhcmNoaWNGbGF0Tm9kZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubGV2ZWw7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgYWx3YXlzIGV4cGFuZGFibGUgYmVjYXVzZSB3ZSBsb2FkIG9uIGRlbWFuZCwgd2UgZG9uJ3Qga25vdyBpZiB0aGVyZSBhcmUgY2hpbGRyZW4geWV0XG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0V4cGFuZGFibGUoKTogKG5vZGU6IEhpZXJhcmNoaWNGbGF0Tm9kZSkgPT4gYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAobm9kZTogSGllcmFyY2hpY0ZsYXROb2RlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5leHBhbmRhYmxlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3JDcmVhdGVGbGF0Tm9kZShub2RlOiBIaWVyYXJjaGljTW9kZWxOb2RlLCBsZXZlbDogbnVtYmVyKTogSGllcmFyY2hpY0ZsYXROb2RlIHtcbiAgICAgICAgLy8gUmV0dXJuIEZsYXROb2RlIGlmIGV4aXN0c1xuICAgICAgICBjb25zdCBmbGF0Tm9kZSA9IHRoaXMuZ2V0RmxhdE5vZGUobm9kZSk7XG4gICAgICAgIGlmIChmbGF0Tm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZsYXROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIG5ldyBGbGF0Tm9kZVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVGbGF0Tm9kZShub2RlLCBsZXZlbCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlYXJjaChzZWxlY3Rpb25zOiBOYXR1cmFsU2VhcmNoU2VsZWN0aW9ucyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaFNlbGVjdGlvbkNoYW5nZS5lbWl0KHNlbGVjdGlvbnMpO1xuICAgICAgICBpZiAoc2VsZWN0aW9ucy5zb21lKHMgPT4gcy5sZW5ndGgpKSB7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZXMgPSB7ZmlsdGVyOiB0b0dyYXBoUUxEb2N0cmluZUZpbHRlcih0aGlzLnNlYXJjaEZhY2V0cywgc2VsZWN0aW9ucyl9O1xuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaGljU2VsZWN0b3JTZXJ2aWNlLnNlYXJjaCh2YXJpYWJsZXMsIHRoaXMuZmlsdGVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRSb290cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkUm9vdHMoc2VhcmNoVmFyaWFibGVzPzogUXVlcnlWYXJpYWJsZXMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mbGF0Tm9kZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBIaWVyYXJjaGljRmxhdE5vZGU+KCk7XG4gICAgICAgIHRoaXMuaGllcmFyY2hpY1NlbGVjdG9yU2VydmljZVxuICAgICAgICAgICAgLmluaXQodGhpcy5jb25maWcsIHRoaXMuZmlsdGVycywgc2VhcmNoVmFyaWFibGVzIHx8IG51bGwpXG4gICAgICAgICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTeW5jIGlubmVyIHNlbGVjdGlvbiAodHJlZSBhbmQgbWF0LWNoaXBzKSBhY2NvcmRpbmcgdG8gc2VsZWN0ZWQgaW5wdXQgYXR0cmlidXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVJbm5lclNlbGVjdGlvbihzZWxlY3RlZDogT3JnYW5pemVkTW9kZWxTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgLy8gVHJhbnNmb3JtIGFuIE9yZ2FuaXplZE1vZGVsU2VsZWN0aW9uIGludG8gYSBNb2RlbE5vZGUgbGlzdCB0aGF0IGlzIHVzZWQgaW4gdGhlIHNlbGVjdGVkIHpvbmUgb2YgdGhlIGNvbXBvbmVudCAoc2VlIHRlbXBsYXRlKVxuICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZXMgPSB0aGlzLmhpZXJhcmNoaWNTZWxlY3RvclNlcnZpY2UuZnJvbU9yZ2FuaXplZFNlbGVjdGlvbihzZWxlY3RlZCk7XG5cbiAgICAgICAgdGhpcy5mbGF0Tm9kZXNTZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMuc2VsZWN0ZWROb2Rlcykge1xuICAgICAgICAgICAgY29uc3QgZmxhdE5vZGUgPSB0aGlzLmdldEZsYXROb2RlKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGZsYXROb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mbGF0Tm9kZXNTZWxlY3Rpb24uc2VsZWN0KGZsYXROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVuc2VsZWN0IGEgbm9kZSwga2VlcGluZyB0aGUgcmVzdCBvZiB0aGUgc2VsZWN0ZWQgdW50b3VjaGVkXG4gICAgICovXG4gICAgcHJpdmF0ZSB1bnNlbGVjdEZsYXROb2RlKGZsYXROb2RlOiBIaWVyYXJjaGljRmxhdE5vZGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mbGF0Tm9kZXNTZWxlY3Rpb24uZGVzZWxlY3QoZmxhdE5vZGUpO1xuICAgICAgICB0aGlzLnJlbW92ZU1vZGVsTm9kZShmbGF0Tm9kZS5ub2RlKTtcbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24odGhpcy5zZWxlY3RlZE5vZGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBub2RlIGZyb20gY2hpcCBsaXN0c1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVtb3ZlTW9kZWxOb2RlKG5vZGU6IEhpZXJhcmNoaWNNb2RlbE5vZGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRNYXBLZXkobm9kZS5tb2RlbCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkluZGV4ID0gdGhpcy5zZWxlY3RlZE5vZGVzLmZpbmRJbmRleChuID0+IHRoaXMuZ2V0TWFwS2V5KG4ubW9kZWwpID09PSBrZXkpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZXMuc3BsaWNlKHNlbGVjdGlvbkluZGV4LCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3QgYSBub2RlLCBrZWVwaW5nIHRoIHJlc3Qgb2YgdGhlIHNlbGVjdGVkIHVudG91Y2hlZFxuICAgICAqL1xuICAgIHByaXZhdGUgc2VsZWN0RmxhdE5vZGUoZmxhdE5vZGU6IEhpZXJhcmNoaWNGbGF0Tm9kZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmZsYXROb2Rlc1NlbGVjdGlvbi5zZWxlY3QoZmxhdE5vZGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZXMucHVzaChmbGF0Tm9kZS5ub2RlKTtcbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24odGhpcy5zZWxlY3RlZE5vZGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBhbGwgc2VsZWN0ZWQgYW5kIHNlbGVjdCB0aGUgZ2l2ZW4gbm9kZVxuICAgICAqL1xuICAgIHByaXZhdGUgc2VsZWN0U2luZ2xlRmxhdE5vZGUoZmxhdE5vZGU6IEhpZXJhcmNoaWNGbGF0Tm9kZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmZsYXROb2Rlc1NlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB0aGlzLmZsYXROb2Rlc1NlbGVjdGlvbi5zZWxlY3QoZmxhdE5vZGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZXMgPSBbZmxhdE5vZGUubm9kZV07XG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKHRoaXMuc2VsZWN0ZWROb2Rlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHNlbGVjdGVkIGFuZCBzZWxlY3QgdGhlIGdpdmVuIG5vZGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHVuc2VsZWN0U2luZ2xlRmxhdE5vZGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmxhdE5vZGVzU2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlcyA9IFtdO1xuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbih0aGlzLnNlbGVjdGVkTm9kZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSB0aGUgZ2l2ZW4gZWxlbWVudHMgaW50byB0aGUgb3JnYW5pemVkIHNlbGVjdGlvbiB0aGF0IGlzIGVtaXR0ZWQgdG8gb3V0cHV0XG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVTZWxlY3Rpb24oc2VsZWN0ZWQ6IEhpZXJhcmNoaWNNb2RlbE5vZGVbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcmdhbml6ZWRGbGF0Tm9kZXNTZWxlY3Rpb24gPSB0aGlzLmhpZXJhcmNoaWNTZWxlY3RvclNlcnZpY2UudG9Pcmdhbml6ZWRTZWxlY3Rpb24oc2VsZWN0ZWQpO1xuICAgICAgICByZXBsYWNlT2JqZWN0S2VlcGluZ1JlZmVyZW5jZSh0aGlzLnNlbGVjdGVkLCBvcmdhbml6ZWRGbGF0Tm9kZXNTZWxlY3Rpb24pO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KG9yZ2FuaXplZEZsYXROb2Rlc1NlbGVjdGlvbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc05vZGVTZWxlY3RlZChub2RlOiBIaWVyYXJjaGljTW9kZWxOb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0TWFwS2V5KG5vZGUubW9kZWwpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTm9kZXMuc29tZShuID0+IHRoaXMuZ2V0TWFwS2V5KG4ubW9kZWwpID09PSBrZXkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmxhdE5vZGUobm9kZTogSGllcmFyY2hpY01vZGVsTm9kZSk6IEhpZXJhcmNoaWNGbGF0Tm9kZSB8IG51bGwge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldE1hcEtleShub2RlLm1vZGVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxhdE5vZGVNYXAuZ2V0KGtleSkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUZsYXROb2RlKG5vZGU6IEhpZXJhcmNoaWNNb2RlbE5vZGUsIGxldmVsOiBudW1iZXIpOiBIaWVyYXJjaGljRmxhdE5vZGUge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldE1hcEtleShub2RlLm1vZGVsKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGlzcGxheUZuKG5vZGUuY29uZmlnKShub2RlLm1vZGVsKTtcbiAgICAgICAgY29uc3QgZXhwYW5kYWJsZSA9IGZhbHNlO1xuICAgICAgICBjb25zdCBpc0N1c3RvbVNlbGVjdGFibGUgPSBub2RlLmNvbmZpZy5pc1NlbGVjdGFibGVDYWxsYmFja1xuICAgICAgICAgICAgPyBub2RlLmNvbmZpZy5pc1NlbGVjdGFibGVDYWxsYmFjayhub2RlLm1vZGVsKVxuICAgICAgICAgICAgOiB0cnVlO1xuICAgICAgICBjb25zdCBpc1NlbGVjdGFibGUgPSAhIW5vZGUuY29uZmlnLnNlbGVjdGFibGVBdEtleSAmJiBpc0N1c3RvbVNlbGVjdGFibGU7XG5cbiAgICAgICAgY29uc3QgZmxhdE5vZGUgPSBuZXcgSGllcmFyY2hpY0ZsYXROb2RlKG5vZGUsIG5hbWUsIGxldmVsLCBleHBhbmRhYmxlLCBpc1NlbGVjdGFibGUpO1xuXG4gICAgICAgIHRoaXMuaGllcmFyY2hpY1NlbGVjdG9yU2VydmljZS5jb3VudEl0ZW1zKGZsYXROb2RlLCB0aGlzLmZpbHRlcnMpO1xuXG4gICAgICAgIC8vIE1hcmsgbm9kZSBhcyBzZWxlY3RlZCBpZiBuZWVkZWQgKGNoZWNrcyB0aGUgc2VsZWN0ZWQgcHJvY2Vzc2VkIGlucHV0KVxuICAgICAgICBpZiAodGhpcy5pc05vZGVTZWxlY3RlZChub2RlKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93VW5zZWxlY3QpIHtcbiAgICAgICAgICAgICAgICBmbGF0Tm9kZS5kZXNlbGVjdGFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmxhdE5vZGVzU2VsZWN0aW9uLnNlbGVjdChmbGF0Tm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSBGbGF0Tm9kZVxuICAgICAgICB0aGlzLmZsYXROb2RlTWFwLnNldChrZXksIGZsYXROb2RlKTtcblxuICAgICAgICByZXR1cm4gZmxhdE5vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBpZGVudGlmaWVyIGtleSBmb3IgbWFwIGNhY2hlXG4gICAgICogQXMgbWFueSBvYmplY3QgdHlwZXMgY2FuIGJlIHVzZWQsIHRoaXMgZnVuY3Rpb24gY29uc2lkZXJzIHR5cGVuYW1lIGFuZCBJRCB0byByZXR1cm4gc29tZXRoaW5nIGxpa2UgZG9jdW1lbnQtMTIzXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRNYXBLZXkobW9kZWw6IExpdGVyYWwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbW9kZWwuX190eXBlbmFtZSArICctJyArIG1vZGVsLmlkO1xuICAgIH1cbn1cbiIsIjxkaXYgW3N0eWxlLm1hcmdpbi1ib3R0b20ucHhdPVwiMjBcIj5cbiAgICA8bmF0dXJhbC1zZWFyY2ggKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWFyY2goJGV2ZW50KVwiIFtmYWNldHNdPVwic2VhcmNoRmFjZXRzXCIgW3NlbGVjdGlvbnNdPVwic2VhcmNoU2VsZWN0aW9uc1wiIC8+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImJvZHlcIj5cbiAgICBAaWYgKGxvYWRpbmcpIHtcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIFtkaWFtZXRlcl09XCIzNlwiIG1vZGU9XCJpbmRldGVybWluYXRlXCIgc3R5bGU9XCJtYXJnaW46IDEwcHhcIiAvPlxuICAgIH1cblxuICAgIDxtYXQtdHJlZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sXCI+XG4gICAgICAgIDxtYXQtdHJlZS1ub2RlICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlXCIgW25nQ2xhc3NdPVwie2xlYWY6ICFub2RlLmV4cGFuZGFibGV9XCIgbWF0VHJlZU5vZGVQYWRkaW5nPlxuICAgICAgICAgICAgQGlmIChub2RlLmV4cGFuZGFibGUpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJsb2FkQ2hpbGRyZW4obm9kZSlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIid0b2dnbGUgJyArIG5vZGUubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBtYXRUcmVlTm9kZVRvZ2dsZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChub2RlLmxvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBbZGlhbWV0ZXJdPVwiMjRcIiBbc3Ryb2tlV2lkdGhdPVwiNVwiIG1vZGU9XCJpbmRldGVybWluYXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFub2RlLmxvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbbmF0dXJhbEljb25dPVwidHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKSA/ICdleHBhbmRfbW9yZScgOiAnY2hldnJvbl9yaWdodCdcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUZsYXROb2RlKG5vZGUpXCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJmbGF0Tm9kZXNTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc05vZGVUb2dnbGFibGUobm9kZSlcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAaWYgKG5vZGUubm9kZS5jb25maWcuaWNvbikge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gW25hdHVyYWxJY29uXT1cIm5vZGUubm9kZS5jb25maWcuaWNvblwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4XCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgbm9kZS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvbWF0LXRyZWUtbm9kZT5cbiAgICA8L21hdC10cmVlPlxuXG4gICAgPG1hdC1jaGlwLWxpc3Rib3ggYXJpYS1vcmllbnRhdGlvbj1cInZlcnRpY2FsXCIgY2xhc3M9XCJtYXQtbWRjLWNoaXAtc2V0LXN0YWNrZWRcIj5cbiAgICAgICAgQGZvciAobm9kZSBvZiBzZWxlY3RlZE5vZGVzOyB0cmFjayBub2RlKSB7XG4gICAgICAgICAgICA8bWF0LWNoaXAtb3B0aW9uIChyZW1vdmVkKT1cInVuc2VsZWN0TW9kZWxOb2RlKG5vZGUpXCIgW3JlbW92YWJsZV09XCJ0cnVlXCIgW3NlbGVjdGFibGVdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICBAaWYgKG5vZGUuY29uZmlnLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIFtuYXR1cmFsSWNvbl09XCJub2RlLmNvbmZpZy5pY29uXCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1ib2R5IGNoaXAtbGFiZWxcIj57eyBub2RlLm1vZGVsLm5hbWUgfHwgbm9kZS5tb2RlbC5mdWxsTmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0Q2hpcFJlbW92ZT5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG5hdHVyYWxJY29uPVwiY2FuY2VsXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbWF0LWNoaXAtb3B0aW9uPlxuICAgICAgICB9XG4gICAgPC9tYXQtY2hpcC1saXN0Ym94PlxuPC9kaXY+XG5cbkBpZiAoIWxvYWRpbmcgJiYgIWRhdGFTb3VyY2UuZGF0YS5sZW5ndGgpIHtcbiAgICA8ZGl2IGkxOG4+QXVjdW4gcsOpc3VsdGF0PC9kaXY+XG59XG4iXX0=
382
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGllcmFyY2hpYy1zZWxlY3Rvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvbW9kdWxlcy9oaWVyYXJjaGljLXNlbGVjdG9yL2hpZXJhcmNoaWMtc2VsZWN0b3IvaGllcmFyY2hpYy1zZWxlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvbW9kdWxlcy9oaWVyYXJjaGljLXNlbGVjdG9yL2hpZXJhcmNoaWMtc2VsZWN0b3IvaGllcmFyY2hpYy1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUMscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFOUYsT0FBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUcvRSxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUc5RSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUl4RCxPQUFPLEVBQUMsZ0NBQWdDLEVBQTBCLE1BQU0sK0JBQStCLENBQUM7QUFDeEcsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDdkUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDNUUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHNDQUFzQyxDQUFDOzs7Ozs7Ozs7O0FBb0I1RSxNQUFNLE9BQU8sa0NBQW1DLFNBQVEseUJBQXlCO0lBMEU3RSxZQUFvQyx5QkFBMkQ7UUFDM0YsS0FBSyxFQUFFLENBQUM7UUFEd0IsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUFrQztRQS9EL0Y7O1dBRUc7UUFDYSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpDOzs7V0FHRztRQUNhLGFBQVEsR0FBNEIsRUFBRSxDQUFDO1FBRXZEOztXQUVHO1FBQ2Esa0JBQWEsR0FBRyxJQUFJLENBQUM7UUFPckM7O1dBRUc7UUFDYSxpQkFBWSxHQUF3QixFQUFFLENBQUM7UUFFdkQ7O1dBRUc7UUFDYSxxQkFBZ0IsR0FBNEIsRUFBRSxDQUFDO1FBRS9EOztXQUVHO1FBQ3VCLDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUEyQixDQUFDO1FBRTlGOztXQUVHO1FBQ0ksa0JBQWEsR0FBMEIsRUFBRSxDQUFDO1FBRWpEOzs7V0FHRztRQUN1QixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUEyQixDQUFDO1FBV2pGLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFdkI7O1dBRUc7UUFDSyxnQkFBVyxHQUFvQyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztJQUk3RixDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXLENBQUMsT0FBc0I7UUFDckMsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksUUFBUTtRQUNYLCtCQUErQjtRQUMvQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWpFLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksZ0JBQWdCLENBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFDbEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNmLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFDbkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUNyQixDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBcUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBRWpHLHFIQUFxSDtRQUNySCxrSUFBa0k7UUFDbEksSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRWxGLHdFQUF3RTtRQUN4RSxxRUFBcUU7UUFDckUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFVBQVU7YUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDbkMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXRELDJHQUEyRztRQUMzRyxJQUFJLFNBQVMsQ0FBQztRQUNkLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzVDLFNBQVMsR0FBRyxFQUFDLE1BQU0sRUFBRSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLENBQUM7UUFDNUYsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFMUIsa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ksY0FBYyxDQUFDLFFBQTRCO1FBQzlDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLDJDQUEyQztZQUMzQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDbEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLDJHQUEyRztnQkFDM0csSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGlCQUFpQixDQUFDLElBQXlCO1FBQzlDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxDQUFDO2FBQU0sQ0FBQztZQUNKLGdHQUFnRztZQUNoRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDTCxDQUFDO0lBRU0sZUFBZSxDQUFDLFFBQTRCO1FBQy9DLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDakMsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDL0IsQ0FBQztJQUNMLENBQUM7SUFFTyxZQUFZLENBQUMsTUFBc0M7UUFDdkQsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQzlCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDNUIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sWUFBWSxDQUFDLFFBQTRCO1FBQzVDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMseUJBQXlCLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEUsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILHNEQUFzRDtJQUN0RCxtREFBbUQ7SUFDbkQsRUFBRTtJQUNGLGtFQUFrRTtJQUNsRSxnQ0FBZ0M7SUFDaEMseUZBQXlGO0lBQ3pGLEVBQUU7SUFDRixnQ0FBZ0M7SUFDaEMsOERBQThEO0lBQzlELDZEQUE2RDtJQUM3RCxtQ0FBbUM7SUFDbkMsNERBQTREO0lBQzVELG9CQUFvQjtJQUNwQixrQkFBa0I7SUFDbEIsWUFBWTtJQUNaLFFBQVE7SUFDUixJQUFJO0lBRUksV0FBVztRQUNmLE9BQU8sQ0FBQyxJQUF5QixFQUFxQyxFQUFFO1lBQ3BFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMvQixDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSyxXQUFXO1FBQ2YsT0FBTyxDQUFDLElBQXlCLEVBQUUsS0FBYSxFQUFFLEVBQUU7WUFDaEQsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNLLFFBQVE7UUFDWixPQUFPLENBQUMsSUFBd0IsRUFBRSxFQUFFO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN0QixDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZO1FBQ2hCLE9BQU8sQ0FBQyxJQUF3QixFQUFFLEVBQUU7WUFDaEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzNCLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxJQUF5QixFQUFFLEtBQWE7UUFDaEUsNEJBQTRCO1FBQzVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNYLE9BQU8sUUFBUSxDQUFDO1FBQ3BCLENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU0sTUFBTSxDQUFDLFVBQW1DO1FBQzdDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDakMsTUFBTSxTQUFTLEdBQUcsRUFBQyxNQUFNLEVBQUUsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsRUFBQyxDQUFDO1lBQ25GLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRSxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQixDQUFDO0lBQ0wsQ0FBQztJQUVPLFNBQVMsQ0FBQyxlQUFnQztRQUM5QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO1FBQ3pELElBQUksQ0FBQyx5QkFBeUI7YUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxlQUFlLElBQUksSUFBSSxDQUFDO2FBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDNUMsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssb0JBQW9CLENBQUMsUUFBaUM7UUFDMUQsK0hBQStIO1FBQy9ILElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXJGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLFFBQTRCO1FBQ2pELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZSxDQUFDLElBQXlCO1FBQzdDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxRQUE0QjtRQUMvQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0IsQ0FBQyxRQUE0QjtRQUNyRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQjtRQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZSxDQUFDLFFBQStCO1FBQ25ELE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xHLDZCQUE2QixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTyxjQUFjLENBQUMsSUFBeUI7UUFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdkMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTyxXQUFXLENBQUMsSUFBeUI7UUFDekMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDN0MsQ0FBQztJQUVPLGNBQWMsQ0FBQyxJQUF5QixFQUFFLEtBQWE7UUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN6QixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CO1lBQ3ZELENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDOUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNYLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsSUFBSSxrQkFBa0IsQ0FBQztRQUV6RSxNQUFNLFFBQVEsR0FBRyxJQUFJLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUVyRixJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbEUsd0VBQXdFO1FBQ3hFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3RCLFFBQVEsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLENBQUM7WUFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxpQkFBaUI7UUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXBDLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxTQUFTLENBQUMsS0FBYztRQUM1QixPQUFPLEtBQUssQ0FBQyxVQUFVLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7SUFDN0MsQ0FBQzs4R0FyWVEsa0NBQWtDO2tHQUFsQyxrQ0FBa0MseVlBZGhDLENBQUMsZ0NBQWdDLENBQUMsc0VDL0JqRCw0OUVBMkRBLHVkRHpCUSxzQkFBc0IsNEtBQ3RCLFlBQVksNEhBQ1osd0JBQXdCLGtPQUN4QixhQUFhLG9vQkFDYixlQUFlLDJJQUNmLGFBQWEsb0xBQ2Isb0JBQW9CLGtHQUNwQixpQkFBaUIsNldBQ2pCLGNBQWM7OzJGQUdULGtDQUFrQztrQkFsQjlDLFNBQVM7K0JBQ0ksNkJBQTZCLGFBRzVCLENBQUMsZ0NBQWdDLENBQUMsY0FDakMsSUFBSSxXQUNQO3dCQUNMLHNCQUFzQjt3QkFDdEIsWUFBWTt3QkFDWix3QkFBd0I7d0JBQ3hCLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixhQUFhO3dCQUNiLG9CQUFvQjt3QkFDcEIsaUJBQWlCO3dCQUNqQixjQUFjO3FCQUNqQjtxR0FNZSxXQUFXO3NCQUExQixLQUFLO2dCQUswQixNQUFNO3NCQUFyQyxLQUFLO3VCQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQztnQkFLUCxRQUFRO3NCQUF2QixLQUFLO2dCQU1VLFFBQVE7c0JBQXZCLEtBQUs7Z0JBS1UsYUFBYTtzQkFBNUIsS0FBSztnQkFLVSxPQUFPO3NCQUF0QixLQUFLO2dCQUtVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBS1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUtvQixxQkFBcUI7c0JBQTlDLE1BQU07Z0JBV21CLGVBQWU7c0JBQXhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NlbGVjdGlvbk1vZGVsfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtGbGF0VHJlZUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Nkay90cmVlJztcbmltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TWF0VHJlZUZsYXREYXRhU291cmNlLCBNYXRUcmVlRmxhdHRlbmVyLCBNYXRUcmVlTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90cmVlJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbmFsaXplLCB0YWtlVW50aWx9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TmF0dXJhbEFic3RyYWN0Q29udHJvbGxlcn0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9hYnN0cmFjdC1jb250cm9sbGVyJztcbmltcG9ydCB7UXVlcnlWYXJpYWJsZXN9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvcXVlcnktdmFyaWFibGUtbWFuYWdlcic7XG5pbXBvcnQge0xpdGVyYWx9IGZyb20gJy4uLy4uLy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7dG9HcmFwaFFMRG9jdHJpbmVGaWx0ZXJ9IGZyb20gJy4uLy4uL3NlYXJjaC9jbGFzc2VzL2dyYXBocWwtZG9jdHJpbmUnO1xuaW1wb3J0IHtOYXR1cmFsU2VhcmNoRmFjZXRzfSBmcm9tICcuLi8uLi9zZWFyY2gvdHlwZXMvZmFjZXQnO1xuaW1wb3J0IHtOYXR1cmFsU2VhcmNoU2VsZWN0aW9uc30gZnJvbSAnLi4vLi4vc2VhcmNoL3R5cGVzL3ZhbHVlcyc7XG5pbXBvcnQge0hpZXJhcmNoaWNGbGF0Tm9kZX0gZnJvbSAnLi4vY2xhc3Nlcy9mbGF0LW5vZGUnO1xuaW1wb3J0IHtOYXR1cmFsSGllcmFyY2hpY0NvbmZpZ3VyYXRpb259IGZyb20gJy4uL2NsYXNzZXMvaGllcmFyY2hpYy1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7SGllcmFyY2hpY0ZpbHRlcnNDb25maWd1cmF0aW9ufSBmcm9tICcuLi9jbGFzc2VzL2hpZXJhcmNoaWMtZmlsdGVycy1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7SGllcmFyY2hpY01vZGVsTm9kZX0gZnJvbSAnLi4vY2xhc3Nlcy9tb2RlbC1ub2RlJztcbmltcG9ydCB7TmF0dXJhbEhpZXJhcmNoaWNTZWxlY3RvclNlcnZpY2UsIE9yZ2FuaXplZE1vZGVsU2VsZWN0aW9ufSBmcm9tICcuL2hpZXJhcmNoaWMtc2VsZWN0b3Iuc2VydmljZSc7XG5pbXBvcnQge3JlcGxhY2VPYmplY3RLZWVwaW5nUmVmZXJlbmNlfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL3V0aWxpdHknO1xuaW1wb3J0IHtNYXRDaGlwc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xuaW1wb3J0IHtNYXRDaGVja2JveE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHtOYXR1cmFsSWNvbkRpcmVjdGl2ZX0gZnJvbSAnLi4vLi4vaWNvbi9pY29uLmRpcmVjdGl2ZSc7XG5pbXBvcnQge01hdEljb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHtNYXRCdXR0b25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQge01hdFByb2dyZXNzU3Bpbm5lck1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7TmF0dXJhbFNlYXJjaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vc2VhcmNoL3NlYXJjaC9zZWFyY2guY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYXR1cmFsLWhpZXJhcmNoaWMtc2VsZWN0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9oaWVyYXJjaGljLXNlbGVjdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vaGllcmFyY2hpYy1zZWxlY3Rvci5jb21wb25lbnQuc2NzcycsXG4gICAgcHJvdmlkZXJzOiBbTmF0dXJhbEhpZXJhcmNoaWNTZWxlY3RvclNlcnZpY2VdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOYXR1cmFsU2VhcmNoQ29tcG9uZW50LFxuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICAgICAgTWF0VHJlZU1vZHVsZSxcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBOYXR1cmFsSWNvbkRpcmVjdGl2ZSxcbiAgICAgICAgTWF0Q2hlY2tib3hNb2R1bGUsXG4gICAgICAgIE1hdENoaXBzTW9kdWxlLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIE5hdHVyYWxIaWVyYXJjaGljU2VsZWN0b3JDb21wb25lbnQgZXh0ZW5kcyBOYXR1cmFsQWJzdHJhY3RDb250cm9sbGVyIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSBtb2RlbCBhbmQgcmV0dXJucyBhIHN0cmluZyBmb3IgZGlzcGxheSB2YWx1ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNwbGF5V2l0aD86IChpdGVtOiBhbnkpID0+IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbmZpZyBmb3IgaXRlbXMgYW5kIHJlbGF0aW9ucyBhcnJhbmdlbWVudFxuICAgICAqL1xuICAgIEBJbnB1dCh7cmVxdWlyZWQ6IHRydWV9KSBwdWJsaWMgY29uZmlnITogTmF0dXJhbEhpZXJhcmNoaWNDb25maWd1cmF0aW9uW107XG5cbiAgICAvKipcbiAgICAgKiBJZiBtdWx0aXBsZSBvciBzaW5nbGUgaXRlbSBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgbXVsdGlwbGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNlbGVjdGVkIGl0ZW1zXG4gICAgICogT3JnYW5pemVkIGJ5IGtleSwgY29udGFpbmluZyBlYWNoIGFuIGFycmF5IG9mIHNlbGVjdGVkIGl0ZW1zIG9mIHNhbWUgdHlwZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RlZDogT3JnYW5pemVkTW9kZWxTZWxlY3Rpb24gPSB7fTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgc2VsZWN0YWJsZSBlbGVtZW50cyBjYW4gYmUgdW5zZWxlY3RlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhbGxvd1Vuc2VsZWN0ID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdGhhdCBhcHBseSB0byBlYWNoIHF1ZXJ5XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGZpbHRlcnM/OiBIaWVyYXJjaGljRmlsdGVyc0NvbmZpZ3VyYXRpb24gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU2VhcmNoIGZhY2V0c1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hGYWNldHM6IE5hdHVyYWxTZWFyY2hGYWNldHMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIFNlbGVjdGlvbnMgdG8gYXBwbHkgb24gbmF0dXJhbC1zZWFyY2ggb24gY29tcG9uZW50IGluaXRpYWxpc2F0aW9uXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHNlYXJjaFNlbGVjdGlvbnM6IE5hdHVyYWxTZWFyY2hTZWxlY3Rpb25zID0gW107XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyB3aGVuIG5hdHVyYWwtc2VhcmNoIHNlbGVjdGlvbnMgY2hhbmdlXG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBzZWFyY2hTZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE5hdHVyYWxTZWFyY2hTZWxlY3Rpb25zPigpO1xuXG4gICAgLyoqXG4gICAgICogSW5uZXIgcmVwcmVzZW50YXRpb24gb2Ygc2VsZWN0ZWQgQElucHV0KCkgdG8gYWxsb3cgZmxhdCBsaXN0aW5nIGFzIG1hdC1jaGlwLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZE5vZGVzOiBIaWVyYXJjaGljTW9kZWxOb2RlW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHNlbGVjdGlvbiBjaGFuZ2VcbiAgICAgKiBSZXR1cm5zIGEgTGl0ZXJhbCB3aGVyZSBzZWxlY3RlZCBtb2RlbHMgYXJlIG9yZ2FuaXplZCBieSBrZXlcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8T3JnYW5pemVkTW9kZWxTZWxlY3Rpb24+KCk7XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9sbGVyIGZvciBub2RlcyBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZmxhdE5vZGVzU2VsZWN0aW9uITogU2VsZWN0aW9uTW9kZWw8SGllcmFyY2hpY0ZsYXROb2RlPjtcblxuICAgIHB1YmxpYyB0cmVlQ29udHJvbCE6IEZsYXRUcmVlQ29udHJvbDxIaWVyYXJjaGljRmxhdE5vZGU+O1xuICAgIHB1YmxpYyB0cmVlRmxhdHRlbmVyITogTWF0VHJlZUZsYXR0ZW5lcjxIaWVyYXJjaGljTW9kZWxOb2RlLCBIaWVyYXJjaGljRmxhdE5vZGU+O1xuICAgIHB1YmxpYyBkYXRhU291cmNlITogTWF0VHJlZUZsYXREYXRhU291cmNlPEhpZXJhcmNoaWNNb2RlbE5vZGUsIEhpZXJhcmNoaWNGbGF0Tm9kZT47XG5cbiAgICBwdWJsaWMgbG9hZGluZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2FjaGUgZm9yIHRyYW5zZm9ybWVkIG5vZGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmbGF0Tm9kZU1hcDogTWFwPHN0cmluZywgSGllcmFyY2hpY0ZsYXROb2RlPiA9IG5ldyBNYXA8c3RyaW5nLCBIaWVyYXJjaGljRmxhdE5vZGU+KCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBoaWVyYXJjaGljU2VsZWN0b3JTZXJ2aWNlOiBOYXR1cmFsSGllcmFyY2hpY1NlbGVjdG9yU2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuZ3VsYXIgT25DaGFuZ2UgaW1wbGVtZW50YXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlcy5zZWxlY3RlZCAmJiAhY2hhbmdlcy5zZWxlY3RlZC5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJbm5lclNlbGVjdGlvbih0aGlzLnNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzLmZpbHRlcnMgJiYgIWNoYW5nZXMuZmlsdGVycy5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkUm9vdHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuZ3VsYXIgT25Jbml0IGltcGxlbWVudGF0aW9uXG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICAvLyBJbml0IHRyZWUgY2hlY2tib3ggc2VsZWN0b3JzXG4gICAgICAgIHRoaXMuZmxhdE5vZGVzU2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odGhpcy5tdWx0aXBsZSk7XG5cbiAgICAgICAgLy8gVHJlZSBjb250cm9sbGVycyBhbmQgbWFuaXB1bGF0b3JzXG4gICAgICAgIHRoaXMudHJlZUZsYXR0ZW5lciA9IG5ldyBNYXRUcmVlRmxhdHRlbmVyKFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lcigpLFxuICAgICAgICAgICAgdGhpcy5nZXRMZXZlbCgpLFxuICAgICAgICAgICAgdGhpcy5pc0V4cGFuZGFibGUoKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2hpbGRyZW4oKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy50cmVlQ29udHJvbCA9IG5ldyBGbGF0VHJlZUNvbnRyb2w8SGllcmFyY2hpY0ZsYXROb2RlPih0aGlzLmdldExldmVsKCksIHRoaXMuaXNFeHBhbmRhYmxlKCkpO1xuXG4gICAgICAgIC8vIFRoZSBkYXRhU291cmNlIGNvbnRhaW5zIGEgbmVzdGVkIE1vZGVsTm9kZXMgbGlzdC4gRWFjaCBNb2RlbE5vZGUgaGFzIGEgY2hpbGQgYXR0cmlidXRlIHRoYXQgcmV0dXJucyBhbiBvYnNlcnZhYmxlLlxuICAgICAgICAvLyBUaGUgZGF0YVNvdXJjZSBjb250YWlucyBhIGZsYXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5lc3RlZCBNb2RlbE5vZGVzIHRoYXQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSB0cmVlRmxhdHRlbmVyIHJlbGF0ZWQgZnVuY3Rpb25zXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUcmVlRmxhdERhdGFTb3VyY2UodGhpcy50cmVlQ29udHJvbCwgdGhpcy50cmVlRmxhdHRlbmVyKTtcblxuICAgICAgICAvLyBVcGRhdGUgZGF0YVNvdXJjZSB3aGVuIHJlY2VpdmluZyBuZXcgbGlzdCAtPiB3ZSBhc3NpZ24gdGhlIHdob2xlIHRyZWVcbiAgICAgICAgLy8gVGhlIHRyZWVDb250cm9sIGFuZCB0cmVlRmxhdHRlbmVyIHdpbGwgZ2VuZXJhdGUgdGhlIGRpc3BsYXllZCB0cmVlXG4gICAgICAgIHRoaXMuaGllcmFyY2hpY1NlbGVjdG9yU2VydmljZS5kYXRhQ2hhbmdlXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiAodGhpcy5kYXRhU291cmNlLmRhdGEgPSBkYXRhKSk7XG5cbiAgICAgICAgLy8gUHJldmVudCBlbXB0eSBzY3JlZW4gb24gZmlyc3QgbG9hZCBhbmQgaW5pdCBOYXR1cmFsSGllcmFyY2hpY1NlbGVjdG9yU2VydmljZSB3aXRoIGlucHV0dGVkIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgbGV0IHZhcmlhYmxlcztcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoU2VsZWN0aW9ucy5zb21lKHMgPT4gcy5sZW5ndGgpKSB7XG4gICAgICAgICAgICB2YXJpYWJsZXMgPSB7ZmlsdGVyOiB0b0dyYXBoUUxEb2N0cmluZUZpbHRlcih0aGlzLnNlYXJjaEZhY2V0cywgdGhpcy5zZWFyY2hTZWxlY3Rpb25zKX07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkUm9vdHModmFyaWFibGVzKTtcblxuICAgICAgICAvLyBPcmdhbml6ZWRTZWxlY3Rpb24gaW50byBsaXN0IHVzYWJsZSBieSB0ZW1wbGF0ZVxuICAgICAgICB0aGlzLnVwZGF0ZUlubmVyU2VsZWN0aW9uKHRoaXMuc2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZSBzZWxlY3Rpb24gb2YgYSBGbGF0Tm9kZSwgY29uc2lkZXJpbmcgaWYgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGFjdGl2YXRlZCBvciBub3RcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlRmxhdE5vZGUoZmxhdE5vZGU6IEhpZXJhcmNoaWNGbGF0Tm9kZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgLy8gSXMgbXVsdGlwbGUgYWxsb3dlZCwganVzdCB0b2dnbGUgZWxlbWVudFxuICAgICAgICAgICAgaWYgKHRoaXMuZmxhdE5vZGVzU2VsZWN0aW9uLmlzU2VsZWN0ZWQoZmxhdE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bnNlbGVjdEZsYXROb2RlKGZsYXROb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RGbGF0Tm9kZShmbGF0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZsYXROb2Rlc1NlbGVjdGlvbi5pc1NlbGVjdGVkKGZsYXROb2RlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3RTaW5nbGVGbGF0Tm9kZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBub3QgbXVsdGlwbGUsIGFuZCB3ZSB3YW50IHRvIHNlbGVjdCBhbiBlbGVtZW50LCB1bnNlbGVjdCBldmVyeXRoaW5nIGJlZm9yZSB0byBrZWVwIGEgc2luZ2xlIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U2luZ2xlRmxhdE5vZGUoZmxhdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiB1bnNlbGVjdGluZyBhbiBlbGVtZW50IGZyb20gdGhlIG1hdC1jaGlwcywgaXQgY2FuIGJlIGRlZXAgaW4gdGhlIGhpZXJhcmNoeSwgYW5kIHRoZSB0cmVlIGVsZW1lbnQgbWF5IG5vdCBleGlzdC4uLlxuICAgICAqIC4uLiBidXQgd2Ugc3RpbGwgbmVlZCB0byByZW1vdmUgdGhlIGVsZW1lbnQgZnJvbSB0aGUgbWF0LWNoaXBzIGxpc3QuXG4gICAgICovXG4gICAgcHVibGljIHVuc2VsZWN0TW9kZWxOb2RlKG5vZGU6IEhpZXJhcmNoaWNNb2RlbE5vZGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmxhdE5vZGUgPSB0aGlzLmdldEZsYXROb2RlKG5vZGUpO1xuICAgICAgICBpZiAoZmxhdE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMudW5zZWxlY3RGbGF0Tm9kZShmbGF0Tm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgZnJvbSBjaGlwcyBsaXN0IG9ubHkgaWYgbm8gZmxhdE5vZGUsIGJlY2F1c2UgdW5zZWxlY3RGbGF0Tm9kZSgpIGFscmVhZHkgZGVhbHMgd2l0aCBpdC5cbiAgICAgICAgICAgIHRoaXMucmVtb3ZlTW9kZWxOb2RlKG5vZGUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24odGhpcy5zZWxlY3RlZE5vZGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpc05vZGVUb2dnbGFibGUoZmxhdE5vZGU6IEhpZXJhcmNoaWNGbGF0Tm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5pc05vZGVTZWxlY3RlZChmbGF0Tm9kZS5ub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZsYXROb2RlLmRlc2VsZWN0YWJsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmbGF0Tm9kZS5zZWxlY3RhYmxlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREaXNwbGF5Rm4oY29uZmlnOiBOYXR1cmFsSGllcmFyY2hpY0NvbmZpZ3VyYXRpb24pOiAoaXRlbTogYW55KSA9PiBzdHJpbmcge1xuICAgICAgICBpZiAoY29uZmlnLmRpc3BsYXlXaXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlnLmRpc3BsYXlXaXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheVdpdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlXaXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0ZW0gPT4gKGl0ZW0gPyBpdGVtLmZ1bGxOYW1lIHx8IGl0ZW0ubmFtZSA6ICcnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZENoaWxkcmVuKGZsYXROb2RlOiBIaWVyYXJjaGljRmxhdE5vZGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudHJlZUNvbnRyb2wuaXNFeHBhbmRlZChmbGF0Tm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2hpY1NlbGVjdG9yU2VydmljZS5sb2FkQ2hpbGRyZW4oZmxhdE5vZGUsIHRoaXMuZmlsdGVycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVkIHRvIGNvbGxhcHNlIGFsbCBjaGlsZHJlbiB3aGVuIGNsb3NpbmcgYSBwYXJlbnQsIGJ1dCBub3Qgc3VyZSBpdCdzIGdvb2QuXG4gICAgICovXG4gICAgLy8gcHVibGljIGxvYWRDaGlsZHJlbihmbGF0Tm9kZTogSGllcmFyY2hpY0ZsYXROb2RlKSB7XG4gICAgLy8gICAgIGlmICh0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQoZmxhdE5vZGUpKSB7XG4gICAgLy9cbiAgICAvLyAgICAgICAgIGNvbnN0IGNhY2hlZEZsYXROb2RlID0gdGhpcy5nZXRGbGF0Tm9kZShmbGF0Tm9kZS5ub2RlKTtcbiAgICAvLyAgICAgICAgIGlmIChjYWNoZWRGbGF0Tm9kZSkge1xuICAgIC8vICAgICAgICAgICAgIHRoaXMuaGllcmFyY2hpY1NlbGVjdG9yU2VydmljZS5sb2FkQ2hpbGRyZW4oY2FjaGVkRmxhdE5vZGUsIHRoaXMuZmlsdGVycyk7XG4gICAgLy9cbiAgICAvLyAgICAgICAgICAgICAvLyBDbG9zZSBjaGlsZHJlblxuICAgIC8vICAgICAgICAgICAgIGNhY2hlZEZsYXROb2RlLm5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHRoaXMuZ2V0RmxhdE5vZGUoY2hpbGQpO1xuICAgIC8vICAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVDb250cm9sLmNvbGxhcHNlKGNoaWxkTm9kZSk7XG4gICAgLy8gICAgICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgICAgICB9KTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIHByaXZhdGUgZ2V0Q2hpbGRyZW4oKTogKG5vZGU6IEhpZXJhcmNoaWNNb2RlbE5vZGUpID0+IE9ic2VydmFibGU8SGllcmFyY2hpY01vZGVsTm9kZVtdPiB7XG4gICAgICAgIHJldHVybiAobm9kZTogSGllcmFyY2hpY01vZGVsTm9kZSk6IE9ic2VydmFibGU8SGllcmFyY2hpY01vZGVsTm9kZVtdPiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbkNoYW5nZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1zIGEgSGllcmFyY2hpY01vZGVsTm9kZSBpbnRvIGEgRmxhdE5vZGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHRyYW5zZm9ybWVyKCk6IChub2RlOiBIaWVyYXJjaGljTW9kZWxOb2RlLCBsZXZlbDogbnVtYmVyKSA9PiBIaWVyYXJjaGljRmxhdE5vZGUge1xuICAgICAgICByZXR1cm4gKG5vZGU6IEhpZXJhcmNoaWNNb2RlbE5vZGUsIGxldmVsOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE9yQ3JlYXRlRmxhdE5vZGUobm9kZSwgbGV2ZWwpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBkZWVwIG9mIHRoZSBub2RlIGluIHRoZSB0cmVlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRMZXZlbCgpOiAobm9kZTogSGllcmFyY2hpY0ZsYXROb2RlKSA9PiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKG5vZGU6IEhpZXJhcmNoaWNGbGF0Tm9kZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubGV2ZWw7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXMgYWx3YXlzIGV4cGFuZGFibGUgYmVjYXVzZSB3ZSBsb2FkIG9uIGRlbWFuZCwgd2UgZG9uJ3Qga25vdyBpZiB0aGVyZSBhcmUgY2hpbGRyZW4geWV0XG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0V4cGFuZGFibGUoKTogKG5vZGU6IEhpZXJhcmNoaWNGbGF0Tm9kZSkgPT4gYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAobm9kZTogSGllcmFyY2hpY0ZsYXROb2RlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5leHBhbmRhYmxlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3JDcmVhdGVGbGF0Tm9kZShub2RlOiBIaWVyYXJjaGljTW9kZWxOb2RlLCBsZXZlbDogbnVtYmVyKTogSGllcmFyY2hpY0ZsYXROb2RlIHtcbiAgICAgICAgLy8gUmV0dXJuIEZsYXROb2RlIGlmIGV4aXN0c1xuICAgICAgICBjb25zdCBmbGF0Tm9kZSA9IHRoaXMuZ2V0RmxhdE5vZGUobm9kZSk7XG4gICAgICAgIGlmIChmbGF0Tm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZsYXROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIG5ldyBGbGF0Tm9kZVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVGbGF0Tm9kZShub2RlLCBsZXZlbCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlYXJjaChzZWxlY3Rpb25zOiBOYXR1cmFsU2VhcmNoU2VsZWN0aW9ucyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaFNlbGVjdGlvbkNoYW5nZS5lbWl0KHNlbGVjdGlvbnMpO1xuICAgICAgICBpZiAoc2VsZWN0aW9ucy5zb21lKHMgPT4gcy5sZW5ndGgpKSB7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZXMgPSB7ZmlsdGVyOiB0b0dyYXBoUUxEb2N0cmluZUZpbHRlcih0aGlzLnNlYXJjaEZhY2V0cywgc2VsZWN0aW9ucyl9O1xuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaGljU2VsZWN0b3JTZXJ2aWNlLnNlYXJjaCh2YXJpYWJsZXMsIHRoaXMuZmlsdGVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRSb290cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkUm9vdHMoc2VhcmNoVmFyaWFibGVzPzogUXVlcnlWYXJpYWJsZXMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mbGF0Tm9kZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBIaWVyYXJjaGljRmxhdE5vZGU+KCk7XG4gICAgICAgIHRoaXMuaGllcmFyY2hpY1NlbGVjdG9yU2VydmljZVxuICAgICAgICAgICAgLmluaXQodGhpcy5jb25maWcsIHRoaXMuZmlsdGVycywgc2VhcmNoVmFyaWFibGVzIHx8IG51bGwpXG4gICAgICAgICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTeW5jIGlubmVyIHNlbGVjdGlvbiAodHJlZSBhbmQgbWF0LWNoaXBzKSBhY2NvcmRpbmcgdG8gc2VsZWN0ZWQgaW5wdXQgYXR0cmlidXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVJbm5lclNlbGVjdGlvbihzZWxlY3RlZDogT3JnYW5pemVkTW9kZWxTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgLy8gVHJhbnNmb3JtIGFuIE9yZ2FuaXplZE1vZGVsU2VsZWN0aW9uIGludG8gYSBNb2RlbE5vZGUgbGlzdCB0aGF0IGlzIHVzZWQgaW4gdGhlIHNlbGVjdGVkIHpvbmUgb2YgdGhlIGNvbXBvbmVudCAoc2VlIHRlbXBsYXRlKVxuICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZXMgPSB0aGlzLmhpZXJhcmNoaWNTZWxlY3RvclNlcnZpY2UuZnJvbU9yZ2FuaXplZFNlbGVjdGlvbihzZWxlY3RlZCk7XG5cbiAgICAgICAgdGhpcy5mbGF0Tm9kZXNTZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMuc2VsZWN0ZWROb2Rlcykge1xuICAgICAgICAgICAgY29uc3QgZmxhdE5vZGUgPSB0aGlzLmdldEZsYXROb2RlKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGZsYXROb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mbGF0Tm9kZXNTZWxlY3Rpb24uc2VsZWN0KGZsYXROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVuc2VsZWN0IGEgbm9kZSwga2VlcGluZyB0aGUgcmVzdCBvZiB0aGUgc2VsZWN0ZWQgdW50b3VjaGVkXG4gICAgICovXG4gICAgcHJpdmF0ZSB1bnNlbGVjdEZsYXROb2RlKGZsYXROb2RlOiBIaWVyYXJjaGljRmxhdE5vZGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mbGF0Tm9kZXNTZWxlY3Rpb24uZGVzZWxlY3QoZmxhdE5vZGUpO1xuICAgICAgICB0aGlzLnJlbW92ZU1vZGVsTm9kZShmbGF0Tm9kZS5ub2RlKTtcbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24odGhpcy5zZWxlY3RlZE5vZGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBub2RlIGZyb20gY2hpcCBsaXN0c1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVtb3ZlTW9kZWxOb2RlKG5vZGU6IEhpZXJhcmNoaWNNb2RlbE5vZGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRNYXBLZXkobm9kZS5tb2RlbCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkluZGV4ID0gdGhpcy5zZWxlY3RlZE5vZGVzLmZpbmRJbmRleChuID0+IHRoaXMuZ2V0TWFwS2V5KG4ubW9kZWwpID09PSBrZXkpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZXMuc3BsaWNlKHNlbGVjdGlvbkluZGV4LCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3QgYSBub2RlLCBrZWVwaW5nIHRoIHJlc3Qgb2YgdGhlIHNlbGVjdGVkIHVudG91Y2hlZFxuICAgICAqL1xuICAgIHByaXZhdGUgc2VsZWN0RmxhdE5vZGUoZmxhdE5vZGU6IEhpZXJhcmNoaWNGbGF0Tm9kZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmZsYXROb2Rlc1NlbGVjdGlvbi5zZWxlY3QoZmxhdE5vZGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZXMucHVzaChmbGF0Tm9kZS5ub2RlKTtcbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb24odGhpcy5zZWxlY3RlZE5vZGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBhbGwgc2VsZWN0ZWQgYW5kIHNlbGVjdCB0aGUgZ2l2ZW4gbm9kZVxuICAgICAqL1xuICAgIHByaXZhdGUgc2VsZWN0U2luZ2xlRmxhdE5vZGUoZmxhdE5vZGU6IEhpZXJhcmNoaWNGbGF0Tm9kZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmZsYXROb2Rlc1NlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB0aGlzLmZsYXROb2Rlc1NlbGVjdGlvbi5zZWxlY3QoZmxhdE5vZGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZXMgPSBbZmxhdE5vZGUubm9kZV07XG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKHRoaXMuc2VsZWN0ZWROb2Rlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHNlbGVjdGVkIGFuZCBzZWxlY3QgdGhlIGdpdmVuIG5vZGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHVuc2VsZWN0U2luZ2xlRmxhdE5vZGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmxhdE5vZGVzU2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlcyA9IFtdO1xuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbih0aGlzLnNlbGVjdGVkTm9kZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSB0aGUgZ2l2ZW4gZWxlbWVudHMgaW50byB0aGUgb3JnYW5pemVkIHNlbGVjdGlvbiB0aGF0IGlzIGVtaXR0ZWQgdG8gb3V0cHV0XG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVTZWxlY3Rpb24oc2VsZWN0ZWQ6IEhpZXJhcmNoaWNNb2RlbE5vZGVbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcmdhbml6ZWRGbGF0Tm9kZXNTZWxlY3Rpb24gPSB0aGlzLmhpZXJhcmNoaWNTZWxlY3RvclNlcnZpY2UudG9Pcmdhbml6ZWRTZWxlY3Rpb24oc2VsZWN0ZWQpO1xuICAgICAgICByZXBsYWNlT2JqZWN0S2VlcGluZ1JlZmVyZW5jZSh0aGlzLnNlbGVjdGVkLCBvcmdhbml6ZWRGbGF0Tm9kZXNTZWxlY3Rpb24pO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KG9yZ2FuaXplZEZsYXROb2Rlc1NlbGVjdGlvbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc05vZGVTZWxlY3RlZChub2RlOiBIaWVyYXJjaGljTW9kZWxOb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0TWFwS2V5KG5vZGUubW9kZWwpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTm9kZXMuc29tZShuID0+IHRoaXMuZ2V0TWFwS2V5KG4ubW9kZWwpID09PSBrZXkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmxhdE5vZGUobm9kZTogSGllcmFyY2hpY01vZGVsTm9kZSk6IEhpZXJhcmNoaWNGbGF0Tm9kZSB8IG51bGwge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldE1hcEtleShub2RlLm1vZGVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxhdE5vZGVNYXAuZ2V0KGtleSkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUZsYXROb2RlKG5vZGU6IEhpZXJhcmNoaWNNb2RlbE5vZGUsIGxldmVsOiBudW1iZXIpOiBIaWVyYXJjaGljRmxhdE5vZGUge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldE1hcEtleShub2RlLm1vZGVsKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGlzcGxheUZuKG5vZGUuY29uZmlnKShub2RlLm1vZGVsKTtcbiAgICAgICAgY29uc3QgZXhwYW5kYWJsZSA9IGZhbHNlO1xuICAgICAgICBjb25zdCBpc0N1c3RvbVNlbGVjdGFibGUgPSBub2RlLmNvbmZpZy5pc1NlbGVjdGFibGVDYWxsYmFja1xuICAgICAgICAgICAgPyBub2RlLmNvbmZpZy5pc1NlbGVjdGFibGVDYWxsYmFjayhub2RlLm1vZGVsKVxuICAgICAgICAgICAgOiB0cnVlO1xuICAgICAgICBjb25zdCBpc1NlbGVjdGFibGUgPSAhIW5vZGUuY29uZmlnLnNlbGVjdGFibGVBdEtleSAmJiBpc0N1c3RvbVNlbGVjdGFibGU7XG5cbiAgICAgICAgY29uc3QgZmxhdE5vZGUgPSBuZXcgSGllcmFyY2hpY0ZsYXROb2RlKG5vZGUsIG5hbWUsIGxldmVsLCBleHBhbmRhYmxlLCBpc1NlbGVjdGFibGUpO1xuXG4gICAgICAgIHRoaXMuaGllcmFyY2hpY1NlbGVjdG9yU2VydmljZS5jb3VudEl0ZW1zKGZsYXROb2RlLCB0aGlzLmZpbHRlcnMpO1xuXG4gICAgICAgIC8vIE1hcmsgbm9kZSBhcyBzZWxlY3RlZCBpZiBuZWVkZWQgKGNoZWNrcyB0aGUgc2VsZWN0ZWQgcHJvY2Vzc2VkIGlucHV0KVxuICAgICAgICBpZiAodGhpcy5pc05vZGVTZWxlY3RlZChub2RlKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93VW5zZWxlY3QpIHtcbiAgICAgICAgICAgICAgICBmbGF0Tm9kZS5kZXNlbGVjdGFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmxhdE5vZGVzU2VsZWN0aW9uLnNlbGVjdChmbGF0Tm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSBGbGF0Tm9kZVxuICAgICAgICB0aGlzLmZsYXROb2RlTWFwLnNldChrZXksIGZsYXROb2RlKTtcblxuICAgICAgICByZXR1cm4gZmxhdE5vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBpZGVudGlmaWVyIGtleSBmb3IgbWFwIGNhY2hlXG4gICAgICogQXMgbWFueSBvYmplY3QgdHlwZXMgY2FuIGJlIHVzZWQsIHRoaXMgZnVuY3Rpb24gY29uc2lkZXJzIHR5cGVuYW1lIGFuZCBJRCB0byByZXR1cm4gc29tZXRoaW5nIGxpa2UgZG9jdW1lbnQtMTIzXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRNYXBLZXkobW9kZWw6IExpdGVyYWwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbW9kZWwuX190eXBlbmFtZSArICctJyArIG1vZGVsLmlkO1xuICAgIH1cbn1cbiIsIjxkaXYgW3N0eWxlLm1hcmdpbi1ib3R0b20ucHhdPVwiMjBcIj5cbiAgICA8bmF0dXJhbC1zZWFyY2ggKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWFyY2goJGV2ZW50KVwiIFtmYWNldHNdPVwic2VhcmNoRmFjZXRzXCIgW3NlbGVjdGlvbnNdPVwic2VhcmNoU2VsZWN0aW9uc1wiIC8+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImJvZHlcIj5cbiAgICBAaWYgKGxvYWRpbmcpIHtcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIFtkaWFtZXRlcl09XCIzNlwiIG1vZGU9XCJpbmRldGVybWluYXRlXCIgc3R5bGU9XCJtYXJnaW46IDEwcHhcIiAvPlxuICAgIH1cblxuICAgIDxtYXQtdHJlZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sXCI+XG4gICAgICAgIDxtYXQtdHJlZS1ub2RlICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlXCIgW25nQ2xhc3NdPVwie2xlYWY6ICFub2RlLmV4cGFuZGFibGV9XCIgbWF0VHJlZU5vZGVQYWRkaW5nPlxuICAgICAgICAgICAgQGlmIChub2RlLmV4cGFuZGFibGUpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJsb2FkQ2hpbGRyZW4obm9kZSlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIid0b2dnbGUgJyArIG5vZGUubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBtYXRUcmVlTm9kZVRvZ2dsZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChub2RlLmxvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBbZGlhbWV0ZXJdPVwiMjRcIiBbc3Ryb2tlV2lkdGhdPVwiNVwiIG1vZGU9XCJpbmRldGVybWluYXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFub2RlLmxvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbbmF0dXJhbEljb25dPVwidHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKSA/ICdleHBhbmRfbW9yZScgOiAnY2hldnJvbl9yaWdodCdcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUZsYXROb2RlKG5vZGUpXCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJmbGF0Tm9kZXNTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc05vZGVUb2dnbGFibGUobm9kZSlcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAaWYgKG5vZGUubm9kZS5jb25maWcuaWNvbikge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gW25hdHVyYWxJY29uXT1cIm5vZGUubm9kZS5jb25maWcuaWNvblwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4XCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgbm9kZS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvbWF0LXRyZWUtbm9kZT5cbiAgICA8L21hdC10cmVlPlxuXG4gICAgPG1hdC1jaGlwLWxpc3Rib3ggYXJpYS1vcmllbnRhdGlvbj1cInZlcnRpY2FsXCIgY2xhc3M9XCJtYXQtbWRjLWNoaXAtc2V0LXN0YWNrZWRcIj5cbiAgICAgICAgQGZvciAobm9kZSBvZiBzZWxlY3RlZE5vZGVzOyB0cmFjayBub2RlLm1vZGVsLmlkKSB7XG4gICAgICAgICAgICA8bWF0LWNoaXAtb3B0aW9uIChyZW1vdmVkKT1cInVuc2VsZWN0TW9kZWxOb2RlKG5vZGUpXCIgW3JlbW92YWJsZV09XCJ0cnVlXCIgW3NlbGVjdGFibGVdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICBAaWYgKG5vZGUuY29uZmlnLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIFtuYXR1cmFsSWNvbl09XCJub2RlLmNvbmZpZy5pY29uXCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1ib2R5IGNoaXAtbGFiZWxcIj57eyBub2RlLm1vZGVsLm5hbWUgfHwgbm9kZS5tb2RlbC5mdWxsTmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0Q2hpcFJlbW92ZT5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG5hdHVyYWxJY29uPVwiY2FuY2VsXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbWF0LWNoaXAtb3B0aW9uPlxuICAgICAgICB9XG4gICAgPC9tYXQtY2hpcC1saXN0Ym94PlxuPC9kaXY+XG5cbkBpZiAoIWxvYWRpbmcgJiYgIWRhdGFTb3VyY2UuZGF0YS5sZW5ndGgpIHtcbiAgICA8ZGl2IGkxOG4+QXVjdW4gcsOpc3VsdGF0PC9kaXY+XG59XG4iXX0=
@@ -24,11 +24,14 @@ import * as i8 from "@angular/material/paginator";
24
24
  import * as i9 from "@angular/material/progress-spinner";
25
25
  /**
26
26
  * Custom template usage :
27
+ *
28
+ * ```html
27
29
  * <natural-relations [main]="owner" [service]="svc" [filter]="{}" placeholder="Select an item">
28
30
  * <ng-template let-item="item">
29
31
  * <span>{{ item.xxx }}</span>
30
32
  * </ng-template>
31
33
  * </natural-relations>
34
+ * ```
32
35
  */
33
36
  export class NaturalRelationsComponent extends NaturalAbstractController {
34
37
  get service() {
@@ -219,4 +222,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
219
222
  }], filter: [{
220
223
  type: Input
221
224
  }] } });
222
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL3JlbGF0aW9ucy9yZWxhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmF0dXJhbC9zcmMvbGliL21vZHVsZXMvcmVsYXRpb25zL3JlbGF0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxrQkFBa0IsRUFBWSxNQUFNLDZCQUE2QixDQUFDO0FBQzFFLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQzVFLE9BQU8sRUFBQyxpQkFBaUIsRUFBZ0IsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRSxPQUFPLEVBQUMsNEJBQTRCLEVBQWtDLE1BQU0sc0NBQXNDLENBQUM7QUFNbkgsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFHekUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDNUUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixD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Y0FBYzt3QkFDZCxlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYixvQkFBb0I7d0JBQ3BCLGtCQUFrQjt3QkFDbEIsd0JBQXdCO3dCQUN4QixzQkFBc0I7cUJBQ3pCO29KQW1CMEMsTUFBTTtzQkFBaEQsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBQ0MsWUFBWTtzQkFBN0MsWUFBWTt1QkFBQyxXQUFXO2dCQVNkLE9BQU87c0JBRGpCLEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDO2dCQW1CUCxXQUFXO3NCQUExQixLQUFLO2dCQUtVLDBCQUEwQjtzQkFBekMsS0FBSztnQkFLVSxXQUFXO3NCQUExQixLQUFLO2dCQUtVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBSzBCLElBQUk7c0JBQW5DLEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDO2dCQUtHLGVBQWU7c0JBQXhDLE1BQU07Z0JBS1MseUJBQXlCO3NCQUF4QyxLQUFLO2dCQUtVLHdCQUF3QjtzQkFBdkMsS0FBSztnQkFLVSxTQUFTO3NCQUF4QixLQUFLO2dCQXdDSyxNQUFNO3NCQURoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNYXRQYWdpbmF0b3JNb2R1bGUsIFBhZ2VFdmVudH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7TmF0dXJhbEFic3RyYWN0Q29udHJvbGxlcn0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9hYnN0cmFjdC1jb250cm9sbGVyJztcbmltcG9ydCB7TmF0dXJhbERhdGFTb3VyY2UsIFBhZ2luYXRlZERhdGF9IGZyb20gJy4uLy4uL2NsYXNzZXMvZGF0YS1zb3VyY2UnO1xuaW1wb3J0IHtOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyLCBQYWdpbmF0aW9uSW5wdXQsIFF1ZXJ5VmFyaWFibGVzfSBmcm9tICcuLi8uLi9jbGFzc2VzL3F1ZXJ5LXZhcmlhYmxlLW1hbmFnZXInO1xuaW1wb3J0IHtIaWVyYXJjaGljRmlsdGVyc0NvbmZpZ3VyYXRpb259IGZyb20gJy4uLy4uL21vZHVsZXMvaGllcmFyY2hpYy1zZWxlY3Rvci9jbGFzc2VzL2hpZXJhcmNoaWMtZmlsdGVycy1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7TGlua2FibGVPYmplY3QsIE5hdHVyYWxMaW5rTXV0YXRpb25TZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9saW5rLW11dGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtOYXR1cmFsSGllcmFyY2hpY0NvbmZpZ3VyYXRpb259IGZyb20gJy4uL2hpZXJhcmNoaWMtc2VsZWN0b3IvY2xhc3Nlcy9oaWVyYXJjaGljLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtIaWVyYXJjaGljRGlhbG9nQ29uZmlnfSBmcm9tICcuLi9oaWVyYXJjaGljLXNlbGVjdG9yL2hpZXJhcmNoaWMtc2VsZWN0b3ItZGlhbG9nL2hpZXJhcmNoaWMtc2VsZWN0b3ItZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQge05hdHVyYWxIaWVyYXJjaGljU2VsZWN0b3JEaWFsb2dTZXJ2aWNlfSBmcm9tICcuLi9oaWVyYXJjaGljLXNlbGVjdG9yL2hpZXJhcmNoaWMtc2VsZWN0b3ItZGlhbG9nL2hpZXJhcmNoaWMtc2VsZWN0b3ItZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHtOYXR1cmFsU2VsZWN0Q29tcG9uZW50fSBmcm9tICcuLi9zZWxlY3Qvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHtOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Fic3RyYWN0LW1vZGVsLnNlcnZpY2UnO1xuaW1wb3J0IHtFeHRyYWN0VGFsbE9uZSwgRXh0cmFjdFZhbGx9IGZyb20gJy4uLy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7TWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7TmF0dXJhbEljb25EaXJlY3RpdmV9IGZyb20gJy4uL2ljb24vaWNvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHtNYXRJY29uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7TWF0VG9vbHRpcE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQge01hdEJ1dHRvbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7TWF0VGFibGVNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtmaW5hbGl6ZSwgZm9ya0pvaW4sIHRha2VVbnRpbCwgdGFwfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBDdXN0b20gdGVtcGxhdGUgdXNhZ2UgOlxuICogPG5hdHVyYWwtcmVsYXRpb25zIFttYWluXT1cIm93bmVyXCIgW3NlcnZpY2VdPVwic3ZjXCIgW2ZpbHRlcl09XCJ7fVwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGFuIGl0ZW1cIj5cbiAqICAgICA8bmctdGVtcGxhdGUgbGV0LWl0ZW09XCJpdGVtXCI+XG4gKiAgICAgICAgIDxzcGFuPnt7IGl0ZW0ueHh4IH19PC9zcGFuPlxuICogICAgIDwvbmctdGVtcGxhdGU+XG4gKiA8L25hdHVyYWwtcmVsYXRpb25zPlxuICovXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmF0dXJhbC1yZWxhdGlvbnMnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9yZWxhdGlvbnMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9yZWxhdGlvbnMuY29tcG9uZW50LnNjc3MnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIE1hdFRhYmxlTW9kdWxlLFxuICAgICAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIE5hdHVyYWxJY29uRGlyZWN0aXZlLFxuICAgICAgICBNYXRQYWdpbmF0b3JNb2R1bGUsXG4gICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICAgICAgTmF0dXJhbFNlbGVjdENvbXBvbmVudCxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBOYXR1cmFsUmVsYXRpb25zQ29tcG9uZW50PFxuICAgICAgICBUU2VydmljZSBleHRlbmRzIE5hdHVyYWxBYnN0cmFjdE1vZGVsU2VydmljZTxcbiAgICAgICAgICAgIHVua25vd24sXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBQYWdpbmF0ZWREYXRhPExpbmthYmxlT2JqZWN0PixcbiAgICAgICAgICAgIFF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICAgICAgdW5rbm93bixcbiAgICAgICAgICAgIGFueSxcbiAgICAgICAgICAgIHVua25vd24sXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICB1bmtub3duLFxuICAgICAgICAgICAgYW55XG4gICAgICAgID4sXG4gICAgPlxuICAgIGV4dGVuZHMgTmF0dXJhbEFic3RyYWN0Q29udHJvbGxlclxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXNcbntcbiAgICBAVmlld0NoaWxkKE5hdHVyYWxTZWxlY3RDb21wb25lbnQpIHByaXZhdGUgc2VsZWN0PzogTmF0dXJhbFNlbGVjdENvbXBvbmVudDxUU2VydmljZT47XG4gICAgQENvbnRlbnRDaGlsZChUZW1wbGF0ZVJlZikgcHVibGljIGl0ZW1UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gICAgcHJpdmF0ZSBfc2VydmljZSE6IFRTZXJ2aWNlO1xuXG4gICAgcHVibGljIGdldCBzZXJ2aWNlKCk6IFRTZXJ2aWNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcnZpY2U7XG4gICAgfVxuXG4gICAgQElucHV0KHtyZXF1aXJlZDogdHJ1ZX0pXG4gICAgcHVibGljIHNldCBzZXJ2aWNlKHNlcnZpY2U6IFRTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuX3NlcnZpY2UgPSBzZXJ2aWNlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBpdGVtcyQgPSB0aGlzLl9zZXJ2aWNlLndhdGNoQWxsKHRoaXMudmFyaWFibGVzTWFuYWdlcikucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLFxuICAgICAgICAgICAgdGFwKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAoKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpLFxuICAgICAgICAgICAgICAgIGVycm9yOiAoKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE5hdHVyYWxEYXRhU291cmNlKGl0ZW1zJCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYWNlaG9sZGVyIHVzZWQgaW4gdGhlIGJ1dHRvbiB0byBhZGQgYSBuZXcgcmVsYXRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXIgPSAnJztcblxuICAgIC8qKlxuICAgICAqIEZpbHRlciBmb3IgYXV0b2NvbXBsZXRlIHNlbGVjdG9yXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGF1dG9jb21wbGV0ZVNlbGVjdG9yRmlsdGVyPzogRXh0cmFjdFZhbGw8VFNlcnZpY2U+WydmaWx0ZXInXSB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBjdXN0b21pemUgdGhlIHJlbmRlcmluZyBvZiB0aGUgc2VsZWN0ZWQgaXRlbSBhcyB0ZXh0IGluIGlucHV0XG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGRpc3BsYXlXaXRoPzogKGl0ZW06IEV4dHJhY3RUYWxsT25lPFRTZXJ2aWNlPiB8IG51bGwpID0+IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHJlbGF0aW9ucyBjYW4gYmUgY2hhbmdlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1haW4gb2JqZWN0IHRvIHdoaWNoIGFsbCByZWxhdGlvbnMgYmVsb25nIHRvXG4gICAgICovXG4gICAgQElucHV0KHtyZXF1aXJlZDogdHJ1ZX0pIHB1YmxpYyBtYWluITogTGlua2FibGVPYmplY3QgJiB7cGVybWlzc2lvbnM/OiB7dXBkYXRlOiBib29sZWFufX07XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhZnRlciByZWxhdGlvbnMgd2VyZSBzdWNjZXNzZnVsbHkgYWRkZWQgb24gdGhlIHNlcnZlclxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqXG4gICAgICogRmlsdGVycyBmb3IgaGllcmFyY2hpYyBzZWxlY3RvclxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoaWVyYXJjaGljU2VsZWN0b3JGaWx0ZXJzPzogSGllcmFyY2hpY0ZpbHRlcnNDb25maWd1cmF0aW9uIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gaW4gY2FzZSB3ZSBwcmVmZXIgaGllcmFyY2hpYyBzZWxlY3Rpb24gb3ZlciBhdXRvY29tcGxldGUgc2VsZWN0aW9uXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGhpZXJhcmNoaWNTZWxlY3RvckNvbmZpZz86IE5hdHVyYWxIaWVyYXJjaGljQ29uZmlndXJhdGlvbltdO1xuXG4gICAgLyoqXG4gICAgICogTGluayBtdXRhdGlvbiBzZW1hbnRpY1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBvdGhlck5hbWU/OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogTGlzdGluZyBzZXJ2aWNlIGluc3RhbmNlXG4gICAgICovXG4gICAgcHVibGljIGRhdGFTb3VyY2UhOiBOYXR1cmFsRGF0YVNvdXJjZTxQYWdpbmF0ZWREYXRhPExpbmthYmxlT2JqZWN0Pj47XG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFRhYmxlIGNvbHVtbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzcGxheWVkQ29sdW1ucyA9IFsnbmFtZSddO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHBhZ2VTaXplT3B0aW9ucyA9IFs1LCAyNSwgNTAsIDEwMF07XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlZmF1bHRQYWdpbmF0aW9uID0ge1xuICAgICAgICBwYWdlSW5kZXg6IDAsXG4gICAgICAgIHBhZ2VTaXplOiAyNSxcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2YWJsZSB2YXJpYWJsZXMvb3B0aW9ucyBmb3IgbGlzdGluZyBzZXJ2aWNlIHVzYWdlIGFuZCBhcG9sbG8gd2F0Y2hRdWVyeVxuICAgICAqL1xuICAgIHByaXZhdGUgdmFyaWFibGVzTWFuYWdlciA9IG5ldyBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFF1ZXJ5VmFyaWFibGVzPigpO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHJlbW92aW5nID0gbmV3IFNldDxMaW5rYWJsZU9iamVjdD4oKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBsaW5rTXV0YXRpb25TZXJ2aWNlOiBOYXR1cmFsTGlua011dGF0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBoaWVyYXJjaGljU2VsZWN0b3JEaWFsb2c6IE5hdHVyYWxIaWVyYXJjaGljU2VsZWN0b3JEaWFsb2dTZXJ2aWNlLFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBmaWx0ZXIgdXNlZCB0byBmaWx0ZXIgcmVsYXRpb25zXG4gICAgICpcbiAgICAgKiBTbyBpZiB0aGUgcmVsYXRpb25zIGFyZSBmcm9tIG9uZSBhY3Rpb24gLT4gdG8gbWFueSBvYmplY3RpdmVzLCB0aGVuIHRoZSBmaWx0ZXIgbXVzdCBmaWx0ZXJcbiAgICAgKiB0aGUgb2JqZWN0aXZlcyB0aGF0IGhhdmUgaW5kZWVkIGEgcmVsYXRpb24gdG8gdGhlIHBhcnRpY3VsYXIgYWN0aW9uLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBmaWx0ZXIoZmlsdGVyOiBFeHRyYWN0VmFsbDxUU2VydmljZT5bJ2ZpbHRlciddKSB7XG4gICAgICAgIHRoaXMudmFyaWFibGVzTWFuYWdlci5zZXQoJ3JlbGF0aW9ucy1maWx0ZXInLCB7ZmlsdGVyOiBmaWx0ZXJ9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkICYmIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5pbmNsdWRlcygndW5saW5rJykpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5wb3AoKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmluY2x1ZGVzKCd1bmxpbmsnKSkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnB1c2goJ3VubGluaycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhZ2luYXRpb24oKTtcblxuICAgICAgICAvLyBGb3JjZSBkaXNhYmxlZCBpZiBjYW5ub3QgdXBkYXRlIG9iamVjdFxuICAgICAgICBpZiAodGhpcy5tYWluICYmIHRoaXMubWFpbi5wZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQgfHwgIXRoaXMubWFpbi5wZXJtaXNzaW9ucy51cGRhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbmxpbmsgYWN0aW9uXG4gICAgICogUmVmZXRjaCByZXN1bHQgdG8gZGlzcGxheSBpdCBpbiB0YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVSZWxhdGlvbihyZWxhdGlvbjogTGlua2FibGVPYmplY3QpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmluZy5hZGQocmVsYXRpb24pO1xuXG4gICAgICAgIHRoaXMubGlua011dGF0aW9uU2VydmljZVxuICAgICAgICAgICAgLnVubGluayh0aGlzLm1haW4sIHJlbGF0aW9uLCB0aGlzLm90aGVyTmFtZSlcbiAgICAgICAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+IHRoaXMucmVtb3ZpbmcuZGVsZXRlKHJlbGF0aW9uKSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuZGF0YVNvdXJjZT8ucmVtb3ZlKHJlbGF0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGluayBhY3Rpb25cbiAgICAgKiBSZWZldGNoIHJlc3VsdCB0byBkaXNwbGF5IGl0IGluIHRhYmxlXG4gICAgICogVE9ETyA6IGNvdWxkIG1heWJlIHVzZSBcInVwZGF0ZVwiIGF0dHJpYnV0ZSBvZiBhcG9sbG8ubXV0YXRlIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0YWJsZSBmYXN0ZXIgKGJ1dCBoYXJkIHRvIGRvIGl0IGhlcmUpXG4gICAgICovXG4gICAgcHVibGljIGFkZFJlbGF0aW9ucyhyZWxhdGlvbnM6IChMaW5rYWJsZU9iamVjdCB8IEV4dHJhY3RUYWxsT25lPFRTZXJ2aWNlPiB8IHN0cmluZyB8IG51bGwpW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZXMgPSByZWxhdGlvbnNcbiAgICAgICAgICAgIC5maWx0ZXIoKHJlbGF0aW9uKTogcmVsYXRpb24gaXMgTGlua2FibGVPYmplY3QgPT4gISFyZWxhdGlvbiAmJiB0eXBlb2YgcmVsYXRpb24gPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgLm1hcChyZWxhdGlvbiA9PiB0aGlzLmxpbmtNdXRhdGlvblNlcnZpY2UubGluayh0aGlzLm1haW4sIHJlbGF0aW9uLCB0aGlzLm90aGVyTmFtZSkpO1xuXG4gICAgICAgIGZvcmtKb2luKG9ic2VydmFibGVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCgpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Q/LmNsZWFyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYWdpbmF0aW9uKGV2ZW50PzogUGFnZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGxldCBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uSW5wdXQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXZlbnQgJiZcbiAgICAgICAgICAgIChldmVudC5wYWdlSW5kZXggIT09IHRoaXMuZGVmYXVsdFBhZ2luYXRpb24ucGFnZUluZGV4IHx8IGV2ZW50LnBhZ2VTaXplICE9PSB0aGlzLmRlZmF1bHRQYWdpbmF0aW9uLnBhZ2VTaXplKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHBhZ2luYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgcGFnZUluZGV4OiBldmVudC5wYWdlSW5kZXgsXG4gICAgICAgICAgICAgICAgcGFnZVNpemU6IGV2ZW50LnBhZ2VTaXplLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmFyaWFibGVzTWFuYWdlci5zZXQoJ3BhZ2luYXRpb24nLCB7cGFnaW5hdGlvbjogcGFnaW5hdGlvbiA/IHBhZ2luYXRpb24gOiB0aGlzLmRlZmF1bHRQYWdpbmF0aW9ufSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERpc3BsYXlGbigpOiAoaXRlbTogRXh0cmFjdFRhbGxPbmU8VFNlcnZpY2U+IHwgbnVsbCkgPT4gc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheVdpdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlXaXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChpdGVtOiBhbnkpID0+IChpdGVtID8gaXRlbS5mdWxsTmFtZSB8fCBpdGVtLm5hbWUgOiAnJyk7XG4gICAgfVxuXG4gICAgcHVibGljIG9wZW5OYXR1cmFsSGllcmFyY2hpY1NlbGVjdG9yKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3RBdEtleSA9IHRoaXMuZ2V0U2VsZWN0S2V5KCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3RBdEtleSB8fCAhdGhpcy5oaWVyYXJjaGljU2VsZWN0b3JDb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0ge307XG5cbiAgICAgICAgY29uc3QgaGllcmFyY2hpY0NvbmZpZzogSGllcmFyY2hpY0RpYWxvZ0NvbmZpZyA9IHtcbiAgICAgICAgICAgIGhpZXJhcmNoaWNDb25maWc6IHRoaXMuaGllcmFyY2hpY1NlbGVjdG9yQ29uZmlnLFxuICAgICAgICAgICAgaGllcmFyY2hpY1NlbGVjdGlvbjogc2VsZWN0ZWQsXG4gICAgICAgICAgICBoaWVyYXJjaGljRmlsdGVyczogdGhpcy5oaWVyYXJjaGljU2VsZWN0b3JGaWx0ZXJzLFxuICAgICAgICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5oaWVyYXJjaGljU2VsZWN0b3JEaWFsb2dcbiAgICAgICAgICAgIC5vcGVuKGhpZXJhcmNoaWNDb25maWcpXG4gICAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQ/LmhpZXJhcmNoaWNTZWxlY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSByZXN1bHQuaGllcmFyY2hpY1NlbGVjdGlvbltzZWxlY3RBdEtleV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFJlbGF0aW9ucyhzZWxlY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTZWxlY3RLZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKCF0aGlzLmhpZXJhcmNoaWNTZWxlY3RvckNvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGllcmFyY2hpY1NlbGVjdG9yQ29uZmlnLmZpbmQoYyA9PiAhIWMuc2VsZWN0YWJsZUF0S2V5KT8uc2VsZWN0YWJsZUF0S2V5O1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJib2R5XCI+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TmFtZUNlbGwgbGV0LWl0ZW09XCJpdGVtXCI+XG4gICAgICAgIHt7IGdldERpc3BsYXlGbigpKGl0ZW0pIH19XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDx0YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgY2xhc3M9XCJuYXR1cmFsLXJvdy1jbGlja1wiIG1hdC10YWJsZT5cbiAgICAgICAgPHRyICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCIgbWF0LWhlYWRlci1yb3cgc3R5bGU9XCJkaXNwbGF5OiBub25lXCI+PC90cj5cbiAgICAgICAgPHRyICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCIgbWF0LXJvdz48L3RyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibmFtZVwiPlxuICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGkxOG4gbWF0LWhlYWRlci1jZWxsPlRpdHJlPC90aD5cbiAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBpdGVtXCIgbWF0LWNlbGw+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7aXRlbTogaXRlbX1cIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtVGVtcGxhdGUgPyBpdGVtVGVtcGxhdGUgOiBkZWZhdWx0TmFtZUNlbGxcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVubGlua1wiPlxuICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIG1hdC1oZWFkZXItY2VsbD48L3RoPlxuICAgICAgICAgICAgPHRkICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBtYXQtY2VsbD5cbiAgICAgICAgICAgICAgICBAaWYgKCFkaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUmVsYXRpb24oZWxlbWVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJlbW92aW5nLmhhcyhlbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJEaXNzb2NpZXJcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbmF0dXJhbEljb249XCJsaW5rX29mZlwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdGFibGU+XG5cbiAgICBAaWYgKGRhdGFTb3VyY2UuZGF0YSAmJiAoZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCB8fCAwKSA+IChkYXRhU291cmNlLmRhdGEucGFnZVNpemUgfHwgMCkpIHtcbiAgICAgICAgPG1hdC1wYWdpbmF0b3JcbiAgICAgICAgICAgIChwYWdlKT1cInBhZ2luYXRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICBbbGVuZ3RoXT1cImRhdGFTb3VyY2UuZGF0YS5sZW5ndGggfHwgMFwiXG4gICAgICAgICAgICBbcGFnZUluZGV4XT1cImRhdGFTb3VyY2UuZGF0YS5wYWdlSW5kZXggfHwgMFwiXG4gICAgICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXG4gICAgICAgICAgICBbcGFnZVNpemVdPVwiZGF0YVNvdXJjZS5kYXRhLnBhZ2VTaXplIHx8IDBcIlxuICAgICAgICAvPlxuICAgIH1cblxuICAgIEBpZiAoIWxvYWRpbmcgJiYgZGF0YVNvdXJjZS5kYXRhPy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5hdC1tYXJnaW4tdmVydGljYWwgbWF0LWJvZHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGkxOG4+QXVjdW4gcsOpc3VsdGF0PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGxvYWRpbmcpIHtcbiAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIFtkaWFtZXRlcl09XCI0MFwiIGNsYXNzPVwibG9hZGluZ1wiIG1vZGU9XCJpbmRldGVybWluYXRlXCIgLz5cbiAgICB9XG48L2Rpdj5cblxuQGlmICghZGlzYWJsZWQpIHtcbiAgICBAaWYgKGhpZXJhcmNoaWNTZWxlY3RvckNvbmZpZykge1xuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib3Blbk5hdHVyYWxIaWVyYXJjaGljU2VsZWN0b3IoKVwiIGNvbG9yPVwicHJpbWFyeVwiIG1hdC1mbGF0LWJ1dHRvbj57eyBwbGFjZWhvbGRlciB9fTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgICAgPG5hdHVyYWwtc2VsZWN0XG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImFkZFJlbGF0aW9ucyhbJGV2ZW50XSlcIlxuICAgICAgICAgICAgW2Rpc3BsYXlXaXRoXT1cIiRhbnkoZ2V0RGlzcGxheUZuKCkpXCJcbiAgICAgICAgICAgIFtmaWx0ZXJdPVwiYXV0b2NvbXBsZXRlU2VsZWN0b3JGaWx0ZXJcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIFtzZXJ2aWNlXT1cInNlcnZpY2VcIlxuICAgICAgICAgICAgW3Nob3dJY29uXT1cImZhbHNlXCJcbiAgICAgICAgLz5cbiAgICB9XG59XG4iXX0=
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9tb2R1bGVzL3JlbGF0aW9ucy9yZWxhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmF0dXJhbC9zcmMvbGliL21vZHVsZXMvcmVsYXRpb25zL3JlbGF0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxrQkFBa0IsRUFBWSxNQUFNLDZCQUE2QixDQUFDO0FBQzFFLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQzVFLE9BQU8sRUFBQyxpQkFBaUIsRUFBZ0IsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRSxPQUFPLEVBQUMsNEJBQTRCLEVBQWtDLE1BQU0sc0NBQXNDLENBQUM7QUFNbkgsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFHekUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDNUUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixD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Q1osY0FBYzt3QkFDZCxlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYixvQkFBb0I7d0JBQ3BCLGtCQUFrQjt3QkFDbEIsd0JBQXdCO3dCQUN4QixzQkFBc0I7cUJBQ3pCO29KQW1CMEMsTUFBTTtzQkFBaEQsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBQ0MsWUFBWTtzQkFBN0MsWUFBWTt1QkFBQyxXQUFXO2dCQVNkLE9BQU87c0JBRGpCLEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDO2dCQW1CUCxXQUFXO3NCQUExQixLQUFLO2dCQUtVLDBCQUEwQjtzQkFBekMsS0FBSztnQkFLVSxXQUFXO3NCQUExQixLQUFLO2dCQUtVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBSzBCLElBQUk7c0JBQW5DLEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDO2dCQUtHLGVBQWU7c0JBQXhDLE1BQU07Z0JBS1MseUJBQXlCO3NCQUF4QyxLQUFLO2dCQUtVLHdCQUF3QjtzQkFBdkMsS0FBSztnQkFLVSxTQUFTO3NCQUF4QixLQUFLO2dCQXdDSyxNQUFNO3NCQURoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNYXRQYWdpbmF0b3JNb2R1bGUsIFBhZ2VFdmVudH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7TmF0dXJhbEFic3RyYWN0Q29udHJvbGxlcn0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9hYnN0cmFjdC1jb250cm9sbGVyJztcbmltcG9ydCB7TmF0dXJhbERhdGFTb3VyY2UsIFBhZ2luYXRlZERhdGF9IGZyb20gJy4uLy4uL2NsYXNzZXMvZGF0YS1zb3VyY2UnO1xuaW1wb3J0IHtOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyLCBQYWdpbmF0aW9uSW5wdXQsIFF1ZXJ5VmFyaWFibGVzfSBmcm9tICcuLi8uLi9jbGFzc2VzL3F1ZXJ5LXZhcmlhYmxlLW1hbmFnZXInO1xuaW1wb3J0IHtIaWVyYXJjaGljRmlsdGVyc0NvbmZpZ3VyYXRpb259IGZyb20gJy4uLy4uL21vZHVsZXMvaGllcmFyY2hpYy1zZWxlY3Rvci9jbGFzc2VzL2hpZXJhcmNoaWMtZmlsdGVycy1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7TGlua2FibGVPYmplY3QsIE5hdHVyYWxMaW5rTXV0YXRpb25TZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9saW5rLW11dGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtOYXR1cmFsSGllcmFyY2hpY0NvbmZpZ3VyYXRpb259IGZyb20gJy4uL2hpZXJhcmNoaWMtc2VsZWN0b3IvY2xhc3Nlcy9oaWVyYXJjaGljLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtIaWVyYXJjaGljRGlhbG9nQ29uZmlnfSBmcm9tICcuLi9oaWVyYXJjaGljLXNlbGVjdG9yL2hpZXJhcmNoaWMtc2VsZWN0b3ItZGlhbG9nL2hpZXJhcmNoaWMtc2VsZWN0b3ItZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQge05hdHVyYWxIaWVyYXJjaGljU2VsZWN0b3JEaWFsb2dTZXJ2aWNlfSBmcm9tICcuLi9oaWVyYXJjaGljLXNlbGVjdG9yL2hpZXJhcmNoaWMtc2VsZWN0b3ItZGlhbG9nL2hpZXJhcmNoaWMtc2VsZWN0b3ItZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHtOYXR1cmFsU2VsZWN0Q29tcG9uZW50fSBmcm9tICcuLi9zZWxlY3Qvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHtOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Fic3RyYWN0LW1vZGVsLnNlcnZpY2UnO1xuaW1wb3J0IHtFeHRyYWN0VGFsbE9uZSwgRXh0cmFjdFZhbGx9IGZyb20gJy4uLy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7TWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7TmF0dXJhbEljb25EaXJlY3RpdmV9IGZyb20gJy4uL2ljb24vaWNvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHtNYXRJY29uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7TWF0VG9vbHRpcE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQge01hdEJ1dHRvbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7TWF0VGFibGVNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtmaW5hbGl6ZSwgZm9ya0pvaW4sIHRha2VVbnRpbCwgdGFwfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBDdXN0b20gdGVtcGxhdGUgdXNhZ2UgOlxuICpcbiAqIGBgYGh0bWxcbiAqIDxuYXR1cmFsLXJlbGF0aW9ucyBbbWFpbl09XCJvd25lclwiIFtzZXJ2aWNlXT1cInN2Y1wiIFtmaWx0ZXJdPVwie31cIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBhbiBpdGVtXCI+XG4gKiAgICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtPVwiaXRlbVwiPlxuICogICAgICAgICA8c3Bhbj57eyBpdGVtLnh4eCB9fTwvc3Bhbj5cbiAqICAgICA8L25nLXRlbXBsYXRlPlxuICogPC9uYXR1cmFsLXJlbGF0aW9ucz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25hdHVyYWwtcmVsYXRpb25zJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmVsYXRpb25zLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vcmVsYXRpb25zLmNvbXBvbmVudC5zY3NzJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBNYXRUYWJsZU1vZHVsZSxcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgICAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBOYXR1cmFsSWNvbkRpcmVjdGl2ZSxcbiAgICAgICAgTWF0UGFnaW5hdG9yTW9kdWxlLFxuICAgICAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsXG4gICAgICAgIE5hdHVyYWxTZWxlY3RDb21wb25lbnQsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTmF0dXJhbFJlbGF0aW9uc0NvbXBvbmVudDxcbiAgICAgICAgVFNlcnZpY2UgZXh0ZW5kcyBOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2U8XG4gICAgICAgICAgICB1bmtub3duLFxuICAgICAgICAgICAgYW55LFxuICAgICAgICAgICAgUGFnaW5hdGVkRGF0YTxMaW5rYWJsZU9iamVjdD4sXG4gICAgICAgICAgICBRdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgICAgIHVua25vd24sXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICB1bmtub3duLFxuICAgICAgICAgICAgYW55LFxuICAgICAgICAgICAgdW5rbm93bixcbiAgICAgICAgICAgIGFueVxuICAgICAgICA+LFxuICAgID5cbiAgICBleHRlbmRzIE5hdHVyYWxBYnN0cmFjdENvbnRyb2xsZXJcbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzXG57XG4gICAgQFZpZXdDaGlsZChOYXR1cmFsU2VsZWN0Q29tcG9uZW50KSBwcml2YXRlIHNlbGVjdD86IE5hdHVyYWxTZWxlY3RDb21wb25lbnQ8VFNlcnZpY2U+O1xuICAgIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpIHB1YmxpYyBpdGVtVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAgIHByaXZhdGUgX3NlcnZpY2UhOiBUU2VydmljZTtcblxuICAgIHB1YmxpYyBnZXQgc2VydmljZSgpOiBUU2VydmljZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlO1xuICAgIH1cblxuICAgIEBJbnB1dCh7cmVxdWlyZWQ6IHRydWV9KVxuICAgIHB1YmxpYyBzZXQgc2VydmljZShzZXJ2aWNlOiBUU2VydmljZSkge1xuICAgICAgICB0aGlzLl9zZXJ2aWNlID0gc2VydmljZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgaXRlbXMkID0gdGhpcy5fc2VydmljZS53YXRjaEFsbCh0aGlzLnZhcmlhYmxlc01hbmFnZXIpLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSxcbiAgICAgICAgICAgIHRhcCh7XG4gICAgICAgICAgICAgICAgbmV4dDogKCkgPT4gKHRoaXMubG9hZGluZyA9IGZhbHNlKSxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTogKCkgPT4gKHRoaXMubG9hZGluZyA9IGZhbHNlKSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKCkgPT4gKHRoaXMubG9hZGluZyA9IGZhbHNlKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBOYXR1cmFsRGF0YVNvdXJjZShpdGVtcyQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGFjZWhvbGRlciB1c2VkIGluIHRoZSBidXR0b24gdG8gYWRkIGEgbmV3IHJlbGF0aW9uXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgZm9yIGF1dG9jb21wbGV0ZSBzZWxlY3RvclxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhdXRvY29tcGxldGVTZWxlY3RvckZpbHRlcj86IEV4dHJhY3RWYWxsPFRTZXJ2aWNlPlsnZmlsdGVyJ10gfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdG8gY3VzdG9taXplIHRoZSByZW5kZXJpbmcgb2YgdGhlIHNlbGVjdGVkIGl0ZW0gYXMgdGV4dCBpbiBpbnB1dFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXNwbGF5V2l0aD86IChpdGVtOiBFeHRyYWN0VGFsbE9uZTxUU2VydmljZT4gfCBudWxsKSA9PiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSByZWxhdGlvbnMgY2FuIGJlIGNoYW5nZWRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYWluIG9iamVjdCB0byB3aGljaCBhbGwgcmVsYXRpb25zIGJlbG9uZyB0b1xuICAgICAqL1xuICAgIEBJbnB1dCh7cmVxdWlyZWQ6IHRydWV9KSBwdWJsaWMgbWFpbiE6IExpbmthYmxlT2JqZWN0ICYge3Blcm1pc3Npb25zPzoge3VwZGF0ZTogYm9vbGVhbn19O1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYWZ0ZXIgcmVsYXRpb25zIHdlcmUgc3VjY2Vzc2Z1bGx5IGFkZGVkIG9uIHRoZSBzZXJ2ZXJcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgZm9yIGhpZXJhcmNoaWMgc2VsZWN0b3JcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgaGllcmFyY2hpY1NlbGVjdG9yRmlsdGVycz86IEhpZXJhcmNoaWNGaWx0ZXJzQ29uZmlndXJhdGlvbiB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIGluIGNhc2Ugd2UgcHJlZmVyIGhpZXJhcmNoaWMgc2VsZWN0aW9uIG92ZXIgYXV0b2NvbXBsZXRlIHNlbGVjdGlvblxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoaWVyYXJjaGljU2VsZWN0b3JDb25maWc/OiBOYXR1cmFsSGllcmFyY2hpY0NvbmZpZ3VyYXRpb25bXTtcblxuICAgIC8qKlxuICAgICAqIExpbmsgbXV0YXRpb24gc2VtYW50aWNcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgb3RoZXJOYW1lPzogc3RyaW5nIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIExpc3Rpbmcgc2VydmljZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHB1YmxpYyBkYXRhU291cmNlITogTmF0dXJhbERhdGFTb3VyY2U8UGFnaW5hdGVkRGF0YTxMaW5rYWJsZU9iamVjdD4+O1xuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBUYWJsZSBjb2x1bW5zXG4gICAgICovXG4gICAgcHVibGljIGRpc3BsYXllZENvbHVtbnMgPSBbJ25hbWUnXTtcblxuICAgIHB1YmxpYyByZWFkb25seSBwYWdlU2l6ZU9wdGlvbnMgPSBbNSwgMjUsIDUwLCAxMDBdO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0UGFnaW5hdGlvbiA9IHtcbiAgICAgICAgcGFnZUluZGV4OiAwLFxuICAgICAgICBwYWdlU2l6ZTogMjUsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE9ic2VydmFibGUgdmFyaWFibGVzL29wdGlvbnMgZm9yIGxpc3Rpbmcgc2VydmljZSB1c2FnZSBhbmQgYXBvbGxvIHdhdGNoUXVlcnlcbiAgICAgKi9cbiAgICBwcml2YXRlIHZhcmlhYmxlc01hbmFnZXIgPSBuZXcgTmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlcjxRdWVyeVZhcmlhYmxlcz4oKTtcblxuICAgIHB1YmxpYyByZWFkb25seSByZW1vdmluZyA9IG5ldyBTZXQ8TGlua2FibGVPYmplY3Q+KCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbGlua011dGF0aW9uU2VydmljZTogTmF0dXJhbExpbmtNdXRhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaGllcmFyY2hpY1NlbGVjdG9yRGlhbG9nOiBOYXR1cmFsSGllcmFyY2hpY1NlbGVjdG9yRGlhbG9nU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmlsdGVyIHVzZWQgdG8gZmlsdGVyIHJlbGF0aW9uc1xuICAgICAqXG4gICAgICogU28gaWYgdGhlIHJlbGF0aW9ucyBhcmUgZnJvbSBvbmUgYWN0aW9uIC0+IHRvIG1hbnkgb2JqZWN0aXZlcywgdGhlbiB0aGUgZmlsdGVyIG11c3QgZmlsdGVyXG4gICAgICogdGhlIG9iamVjdGl2ZXMgdGhhdCBoYXZlIGluZGVlZCBhIHJlbGF0aW9uIHRvIHRoZSBwYXJ0aWN1bGFyIGFjdGlvbi5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZmlsdGVyKGZpbHRlcjogRXh0cmFjdFZhbGw8VFNlcnZpY2U+WydmaWx0ZXInXSkge1xuICAgICAgICB0aGlzLnZhcmlhYmxlc01hbmFnZXIuc2V0KCdyZWxhdGlvbnMtZmlsdGVyJywge2ZpbHRlcjogZmlsdGVyfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCAmJiB0aGlzLmRpc3BsYXllZENvbHVtbnMuaW5jbHVkZXMoJ3VubGluaycpKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMucG9wKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMuZGlzcGxheWVkQ29sdW1ucy5pbmNsdWRlcygndW5saW5rJykpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5wdXNoKCd1bmxpbmsnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uKCk7XG5cbiAgICAgICAgLy8gRm9yY2UgZGlzYWJsZWQgaWYgY2Fubm90IHVwZGF0ZSBvYmplY3RcbiAgICAgICAgaWYgKHRoaXMubWFpbiAmJiB0aGlzLm1haW4ucGVybWlzc2lvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkIHx8ICF0aGlzLm1haW4ucGVybWlzc2lvbnMudXBkYXRlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5saW5rIGFjdGlvblxuICAgICAqIFJlZmV0Y2ggcmVzdWx0IHRvIGRpc3BsYXkgaXQgaW4gdGFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlUmVsYXRpb24ocmVsYXRpb246IExpbmthYmxlT2JqZWN0KTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVtb3ZpbmcuYWRkKHJlbGF0aW9uKTtcblxuICAgICAgICB0aGlzLmxpbmtNdXRhdGlvblNlcnZpY2VcbiAgICAgICAgICAgIC51bmxpbmsodGhpcy5tYWluLCByZWxhdGlvbiwgdGhpcy5vdGhlck5hbWUpXG4gICAgICAgICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiB0aGlzLnJlbW92aW5nLmRlbGV0ZShyZWxhdGlvbikpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmRhdGFTb3VyY2U/LnJlbW92ZShyZWxhdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpbmsgYWN0aW9uXG4gICAgICogUmVmZXRjaCByZXN1bHQgdG8gZGlzcGxheSBpdCBpbiB0YWJsZVxuICAgICAqIFRPRE8gOiBjb3VsZCBtYXliZSB1c2UgXCJ1cGRhdGVcIiBhdHRyaWJ1dGUgb2YgYXBvbGxvLm11dGF0ZSBmdW5jdGlvbiB0byB1cGRhdGUgdGFibGUgZmFzdGVyIChidXQgaGFyZCB0byBkbyBpdCBoZXJlKVxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRSZWxhdGlvbnMocmVsYXRpb25zOiAoTGlua2FibGVPYmplY3QgfCBFeHRyYWN0VGFsbE9uZTxUU2VydmljZT4gfCBzdHJpbmcgfCBudWxsKVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9ic2VydmFibGVzID0gcmVsYXRpb25zXG4gICAgICAgICAgICAuZmlsdGVyKChyZWxhdGlvbik6IHJlbGF0aW9uIGlzIExpbmthYmxlT2JqZWN0ID0+ICEhcmVsYXRpb24gJiYgdHlwZW9mIHJlbGF0aW9uID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgIC5tYXAocmVsYXRpb24gPT4gdGhpcy5saW5rTXV0YXRpb25TZXJ2aWNlLmxpbmsodGhpcy5tYWluLCByZWxhdGlvbiwgdGhpcy5vdGhlck5hbWUpKTtcblxuICAgICAgICBmb3JrSm9pbihvYnNlcnZhYmxlcykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Py5jbGVhcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFnaW5hdGlvbihldmVudD86IFBhZ2VFdmVudCk6IHZvaWQge1xuICAgICAgICBsZXQgcGFnaW5hdGlvbjogUGFnaW5hdGlvbklucHV0IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGV2ZW50ICYmXG4gICAgICAgICAgICAoZXZlbnQucGFnZUluZGV4ICE9PSB0aGlzLmRlZmF1bHRQYWdpbmF0aW9uLnBhZ2VJbmRleCB8fCBldmVudC5wYWdlU2l6ZSAhPT0gdGhpcy5kZWZhdWx0UGFnaW5hdGlvbi5wYWdlU2l6ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBwYWdpbmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHBhZ2VJbmRleDogZXZlbnQucGFnZUluZGV4LFxuICAgICAgICAgICAgICAgIHBhZ2VTaXplOiBldmVudC5wYWdlU2l6ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZhcmlhYmxlc01hbmFnZXIuc2V0KCdwYWdpbmF0aW9uJywge3BhZ2luYXRpb246IHBhZ2luYXRpb24gPyBwYWdpbmF0aW9uIDogdGhpcy5kZWZhdWx0UGFnaW5hdGlvbn0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREaXNwbGF5Rm4oKTogKGl0ZW06IEV4dHJhY3RUYWxsT25lPFRTZXJ2aWNlPiB8IG51bGwpID0+IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXlXaXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5V2l0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoaXRlbTogYW55KSA9PiAoaXRlbSA/IGl0ZW0uZnVsbE5hbWUgfHwgaXRlbS5uYW1lIDogJycpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuTmF0dXJhbEhpZXJhcmNoaWNTZWxlY3RvcigpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0QXRLZXkgPSB0aGlzLmdldFNlbGVjdEtleSgpO1xuXG4gICAgICAgIGlmICghc2VsZWN0QXRLZXkgfHwgIXRoaXMuaGllcmFyY2hpY1NlbGVjdG9yQ29uZmlnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHt9O1xuXG4gICAgICAgIGNvbnN0IGhpZXJhcmNoaWNDb25maWc6IEhpZXJhcmNoaWNEaWFsb2dDb25maWcgPSB7XG4gICAgICAgICAgICBoaWVyYXJjaGljQ29uZmlnOiB0aGlzLmhpZXJhcmNoaWNTZWxlY3RvckNvbmZpZyxcbiAgICAgICAgICAgIGhpZXJhcmNoaWNTZWxlY3Rpb246IHNlbGVjdGVkLFxuICAgICAgICAgICAgaGllcmFyY2hpY0ZpbHRlcnM6IHRoaXMuaGllcmFyY2hpY1NlbGVjdG9yRmlsdGVycyxcbiAgICAgICAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuaGllcmFyY2hpY1NlbGVjdG9yRGlhbG9nXG4gICAgICAgICAgICAub3BlbihoaWVyYXJjaGljQ29uZmlnKVxuICAgICAgICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5oaWVyYXJjaGljU2VsZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gcmVzdWx0LmhpZXJhcmNoaWNTZWxlY3Rpb25bc2VsZWN0QXRLZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRSZWxhdGlvbnMoc2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2VsZWN0S2V5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghdGhpcy5oaWVyYXJjaGljU2VsZWN0b3JDb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmhpZXJhcmNoaWNTZWxlY3RvckNvbmZpZy5maW5kKGMgPT4gISFjLnNlbGVjdGFibGVBdEtleSk/LnNlbGVjdGFibGVBdEtleTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYm9keVwiPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE5hbWVDZWxsIGxldC1pdGVtPVwiaXRlbVwiPlxuICAgICAgICB7eyBnZXREaXNwbGF5Rm4oKShpdGVtKSB9fVxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8dGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIGNsYXNzPVwibmF0dXJhbC1yb3ctY2xpY2tcIiBtYXQtdGFibGU+XG4gICAgICAgIDx0ciAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiIG1hdC1oZWFkZXItcm93IHN0eWxlPVwiZGlzcGxheTogbm9uZVwiPjwvdHI+XG4gICAgICAgIDx0ciAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1uc1wiIG1hdC1yb3c+PC90cj5cblxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm5hbWVcIj5cbiAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBpMThuIG1hdC1oZWFkZXItY2VsbD5UaXRyZTwvdGg+XG4gICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgaXRlbVwiIG1hdC1jZWxsPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2l0ZW06IGl0ZW19XCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbVRlbXBsYXRlID8gaXRlbVRlbXBsYXRlIDogZGVmYXVsdE5hbWVDZWxsXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ1bmxpbmtcIj5cbiAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtaGVhZGVyLWNlbGw+PC90aD5cbiAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgbWF0LWNlbGw+XG4gICAgICAgICAgICAgICAgQGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVJlbGF0aW9uKGVsZW1lbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZW1vdmluZy5oYXMoZWxlbWVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRGlzc29jaWVyXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG5hdHVyYWxJY29uPVwibGlua19vZmZcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L3RhYmxlPlxuXG4gICAgQGlmIChkYXRhU291cmNlLmRhdGEgJiYgKGRhdGFTb3VyY2UuZGF0YS5sZW5ndGggfHwgMCkgPiAoZGF0YVNvdXJjZS5kYXRhLnBhZ2VTaXplIHx8IDApKSB7XG4gICAgICAgIDxtYXQtcGFnaW5hdG9yXG4gICAgICAgICAgICAocGFnZSk9XCJwYWdpbmF0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgW2xlbmd0aF09XCJkYXRhU291cmNlLmRhdGEubGVuZ3RoIHx8IDBcIlxuICAgICAgICAgICAgW3BhZ2VJbmRleF09XCJkYXRhU291cmNlLmRhdGEucGFnZUluZGV4IHx8IDBcIlxuICAgICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxuICAgICAgICAgICAgW3BhZ2VTaXplXT1cImRhdGFTb3VyY2UuZGF0YS5wYWdlU2l6ZSB8fCAwXCJcbiAgICAgICAgLz5cbiAgICB9XG5cbiAgICBAaWYgKCFsb2FkaW5nICYmIGRhdGFTb3VyY2UuZGF0YT8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuYXQtbWFyZ2luLXZlcnRpY2FsIG1hdC1ib2R5XCI+XG4gICAgICAgICAgICA8c3BhbiBpMThuPkF1Y3VuIHLDqXN1bHRhdDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChsb2FkaW5nKSB7XG4gICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBbZGlhbWV0ZXJdPVwiNDBcIiBjbGFzcz1cImxvYWRpbmdcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIC8+XG4gICAgfVxuPC9kaXY+XG5cbkBpZiAoIWRpc2FibGVkKSB7XG4gICAgQGlmIChoaWVyYXJjaGljU2VsZWN0b3JDb25maWcpIHtcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9wZW5OYXR1cmFsSGllcmFyY2hpY1NlbGVjdG9yKClcIiBjb2xvcj1cInByaW1hcnlcIiBtYXQtZmxhdC1idXR0b24+e3sgcGxhY2Vob2xkZXIgfX08L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICAgIDxuYXR1cmFsLXNlbGVjdFxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJhZGRSZWxhdGlvbnMoWyRldmVudF0pXCJcbiAgICAgICAgICAgIFtkaXNwbGF5V2l0aF09XCIkYW55KGdldERpc3BsYXlGbigpKVwiXG4gICAgICAgICAgICBbZmlsdGVyXT1cImF1dG9jb21wbGV0ZVNlbGVjdG9yRmlsdGVyXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbc2VydmljZV09XCJzZXJ2aWNlXCJcbiAgICAgICAgICAgIFtzaG93SWNvbl09XCJmYWxzZVwiXG4gICAgICAgIC8+XG4gICAgfVxufVxuIl19