ngx-material-entity 16.0.9 → 16.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 (33) hide show
  1. package/README.md +4 -3
  2. package/components/create-page/create-page.component.d.ts +1 -1
  3. package/components/create-page/page-create-data.builder.d.ts +1 -1
  4. package/components/input/input.component.d.ts +3 -5
  5. package/components/table/create-dialog/{create-entity-dialog-data.builder.d.ts → create-entity-data.builder.d.ts} +1 -1
  6. package/components/table/create-dialog/create-entity-dialog.component.d.ts +2 -2
  7. package/directives/tooltip.directive.d.ts +2 -1
  8. package/esm2022/components/create-page/create-page.component.mjs +1 -1
  9. package/esm2022/components/create-page/page-create-data.builder.mjs +1 -1
  10. package/esm2022/components/edit-page/edit-page.component.mjs +3 -3
  11. package/esm2022/components/input/array/array-date-input/array-date-input.component.mjs +2 -2
  12. package/esm2022/components/input/array/array-date-range-input/array-date-range-input.component.mjs +2 -2
  13. package/esm2022/components/input/array/array-date-time-input/array-date-time-input.component.mjs +2 -2
  14. package/esm2022/components/input/date/date-time-input/date-time-input.component.mjs +2 -2
  15. package/esm2022/components/input/file/file-image-input/file-image-input.component.mjs +4 -5
  16. package/esm2022/components/input/file/file-input/file-input.component.mjs +5 -6
  17. package/esm2022/components/input/input.component.mjs +24 -34
  18. package/esm2022/components/input/relations/references-many-input/references-many-input.component.mjs +2 -2
  19. package/esm2022/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +2 -2
  20. package/esm2022/components/table/create-dialog/create-entity-data.builder.mjs +32 -0
  21. package/esm2022/components/table/create-dialog/create-entity-data.mjs +2 -0
  22. package/esm2022/components/table/create-dialog/create-entity-dialog.component.mjs +4 -4
  23. package/esm2022/components/table/table.component.mjs +4 -4
  24. package/esm2022/directives/tooltip.directive.mjs +10 -6
  25. package/esm2022/public-api.mjs +3 -3
  26. package/esm2022/services/entity.service.mjs +1 -1
  27. package/fesm2022/ngx-material-entity.mjs +56 -63
  28. package/fesm2022/ngx-material-entity.mjs.map +1 -1
  29. package/package.json +1 -1
  30. package/public-api.d.ts +2 -2
  31. package/esm2022/components/table/create-dialog/create-entity-dialog-data.builder.mjs +0 -32
  32. package/esm2022/components/table/create-dialog/create-entity-dialog-data.mjs +0 -2
  33. /package/components/table/create-dialog/{create-entity-dialog-data.d.ts → create-entity-data.d.ts} +0 -0
@@ -110,7 +110,7 @@ export class FileInputComponent {
110
110
  this.fileDataChangeEvent.emit(this.propertyValue);
111
111
  }
112
112
  async setMultiFile(files) {
113
- const data = [];
113
+ this.propertyValue = this.propertyValue ?? [];
114
114
  for (const file of files) {
115
115
  const fileData = {
116
116
  file: file,
@@ -118,9 +118,8 @@ export class FileInputComponent {
118
118
  type: file.type,
119
119
  size: file.size
120
120
  };
121
- data.push(fileData);
121
+ this.propertyValue.push(fileData);
122
122
  }
123
- this.propertyValue = LodashUtilities.cloneDeep(data);
124
123
  this.filenames = this.propertyValue.map(f => f.name);
125
124
  }
126
125
  async setSingleFile(file) {
@@ -185,11 +184,11 @@ export class FileInputComponent {
185
184
  }
186
185
  }
187
186
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: FileInputComponent, deps: [{ token: i1.MatDialog }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
188
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.0", type: FileInputComponent, selector: "file-input", inputs: { propertyValue: "propertyValue", entity: "entity", key: "key", metadata: "metadata", getValidationErrorMessage: "getValidationErrorMessage", isReadOnly: "isReadOnly" }, outputs: { fileDataChangeEvent: "fileDataChangeEvent" }, ngImport: i0, template: "<!-- eslint-disable angular/no-call-expression -->\n<input #fileInput\n type=\"file\" hidden\n [multiple]=\"metadata.multiple\"\n [accept]=\"acceptString\"\n (change)=\"setFileFromInput($event)\"\n>\n\n<mat-form-field floatLabel=\"always\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-grid #chipGrid\n #model=\"ngModel\" name=\"file\" [required]=\"metadata.required(entity)\"\n [(ngModel)]=\"filenames\"\n >\n <mat-chip-row *ngFor=\"let name of filenames\" (removed)=\"removeFile(name)\">\n {{name}}\n <span class=\"mat-mdc-chip-remove mat-mdc-chip-trailing-icon ngx-mat-grey\" (click)=\"downloadFile(name)\">\n <i class=\"fas fa-download\"></i>\n </span>\n <button *ngIf=\"!isReadOnly\" type=\"button\" matChipRemove>\n <i [class]=\"metadata.deleteIcon\"></i>\n </button>\n </mat-chip-row>\n <input hidden [matChipInputFor]=\"chipGrid\" [readonly]=\"true\">\n </mat-chip-grid>\n <button *ngIf=\"downloadAllEnabled()\" type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix (click)=\"downloadAll()\">\n <i class=\"fas fa-file-zipper\"></i>\n </button>\n <button type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas fa-upload\"></i>\n </button>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>\n\n<div *ngIf=\"metadata.dragAndDrop && !isReadOnly\" class=\"drag-drop\" dragDrop (files)=\"setFile($event)\">\n <button type=\"button\" mat-icon-button [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas fa-file-arrow-up ngx-mat-grey\"></i>\n </button>\n</div>", styles: ["mat-form-field{width:100%}.ngx-mat-grey{opacity:1;color:#0000008a}.drag-drop{display:flex;align-items:center;justify-content:center;height:200px;border:2px dashed rgba(0,0,0,.54);border-radius:15px;margin-top:5px;margin-bottom:5px}.drag-drop i{font-size:30px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatChipGrid, selector: "mat-chip-grid", inputs: ["tabIndex", "disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i6.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i6.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i6.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "editable"], outputs: ["edited"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i8.DragDropDirective, selector: "[dragDrop]", outputs: ["files"] }] });
187
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.0", type: FileInputComponent, selector: "file-input", inputs: { propertyValue: "propertyValue", entity: "entity", key: "key", metadata: "metadata", getValidationErrorMessage: "getValidationErrorMessage", isReadOnly: "isReadOnly" }, outputs: { fileDataChangeEvent: "fileDataChangeEvent" }, ngImport: i0, template: "<!-- eslint-disable angular/no-call-expression -->\n<input #fileInput\n type=\"file\" hidden\n [multiple]=\"metadata.multiple\"\n [accept]=\"acceptString\"\n (change)=\"setFileFromInput($event)\"\n>\n\n<mat-form-field floatLabel=\"always\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-grid #chipGrid\n #model=\"ngModel\" name=\"file\" [required]=\"metadata.required(entity)\"\n [(ngModel)]=\"filenames\"\n >\n <mat-chip-row *ngFor=\"let name of filenames\" (removed)=\"removeFile(name)\">\n {{name}}\n <span class=\"mat-mdc-chip-remove mat-mdc-chip-trailing-icon ngx-mat-grey\" (click)=\"downloadFile(name)\">\n <i class=\"fas fa-download\"></i>\n </span>\n <button *ngIf=\"!isReadOnly\" type=\"button\" matChipRemove>\n <i [class]=\"metadata.deleteIcon\"></i>\n </button>\n </mat-chip-row>\n <input hidden [matChipInputFor]=\"chipGrid\" [readonly]=\"true\">\n </mat-chip-grid>\n <button *ngIf=\"downloadAllEnabled()\" type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix (click)=\"downloadAll()\">\n <i class=\"fas fa-file-zipper\"></i>\n </button>\n <button type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas\" [class.fa-plus-circle]=\"metadata.multiple\" [class.fa-upload]=\"!metadata.multiple\"></i>\n </button>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>\n\n<div *ngIf=\"metadata.dragAndDrop && !isReadOnly\" class=\"drag-drop\" dragDrop (files)=\"setFile($event)\">\n <button type=\"button\" mat-icon-button [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas fa-file-arrow-up ngx-mat-grey\"></i>\n </button>\n</div>", styles: ["mat-form-field{width:100%}.ngx-mat-grey{opacity:1;color:#0000008a}.drag-drop{display:flex;align-items:center;justify-content:center;height:200px;border:2px dashed rgba(0,0,0,.54);border-radius:15px;margin-top:5px;margin-bottom:5px}.drag-drop i{font-size:30px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatChipGrid, selector: "mat-chip-grid", inputs: ["tabIndex", "disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i6.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i6.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i6.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "editable"], outputs: ["edited"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i8.DragDropDirective, selector: "[dragDrop]", outputs: ["files"] }] });
189
188
  }
190
189
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: FileInputComponent, decorators: [{
191
190
  type: Component,
192
- args: [{ selector: 'file-input', template: "<!-- eslint-disable angular/no-call-expression -->\n<input #fileInput\n type=\"file\" hidden\n [multiple]=\"metadata.multiple\"\n [accept]=\"acceptString\"\n (change)=\"setFileFromInput($event)\"\n>\n\n<mat-form-field floatLabel=\"always\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-grid #chipGrid\n #model=\"ngModel\" name=\"file\" [required]=\"metadata.required(entity)\"\n [(ngModel)]=\"filenames\"\n >\n <mat-chip-row *ngFor=\"let name of filenames\" (removed)=\"removeFile(name)\">\n {{name}}\n <span class=\"mat-mdc-chip-remove mat-mdc-chip-trailing-icon ngx-mat-grey\" (click)=\"downloadFile(name)\">\n <i class=\"fas fa-download\"></i>\n </span>\n <button *ngIf=\"!isReadOnly\" type=\"button\" matChipRemove>\n <i [class]=\"metadata.deleteIcon\"></i>\n </button>\n </mat-chip-row>\n <input hidden [matChipInputFor]=\"chipGrid\" [readonly]=\"true\">\n </mat-chip-grid>\n <button *ngIf=\"downloadAllEnabled()\" type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix (click)=\"downloadAll()\">\n <i class=\"fas fa-file-zipper\"></i>\n </button>\n <button type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas fa-upload\"></i>\n </button>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>\n\n<div *ngIf=\"metadata.dragAndDrop && !isReadOnly\" class=\"drag-drop\" dragDrop (files)=\"setFile($event)\">\n <button type=\"button\" mat-icon-button [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas fa-file-arrow-up ngx-mat-grey\"></i>\n </button>\n</div>", styles: ["mat-form-field{width:100%}.ngx-mat-grey{opacity:1;color:#0000008a}.drag-drop{display:flex;align-items:center;justify-content:center;height:200px;border:2px dashed rgba(0,0,0,.54);border-radius:15px;margin-top:5px;margin-bottom:5px}.drag-drop i{font-size:30px}\n"] }]
191
+ args: [{ selector: 'file-input', template: "<!-- eslint-disable angular/no-call-expression -->\n<input #fileInput\n type=\"file\" hidden\n [multiple]=\"metadata.multiple\"\n [accept]=\"acceptString\"\n (change)=\"setFileFromInput($event)\"\n>\n\n<mat-form-field floatLabel=\"always\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-grid #chipGrid\n #model=\"ngModel\" name=\"file\" [required]=\"metadata.required(entity)\"\n [(ngModel)]=\"filenames\"\n >\n <mat-chip-row *ngFor=\"let name of filenames\" (removed)=\"removeFile(name)\">\n {{name}}\n <span class=\"mat-mdc-chip-remove mat-mdc-chip-trailing-icon ngx-mat-grey\" (click)=\"downloadFile(name)\">\n <i class=\"fas fa-download\"></i>\n </span>\n <button *ngIf=\"!isReadOnly\" type=\"button\" matChipRemove>\n <i [class]=\"metadata.deleteIcon\"></i>\n </button>\n </mat-chip-row>\n <input hidden [matChipInputFor]=\"chipGrid\" [readonly]=\"true\">\n </mat-chip-grid>\n <button *ngIf=\"downloadAllEnabled()\" type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix (click)=\"downloadAll()\">\n <i class=\"fas fa-file-zipper\"></i>\n </button>\n <button type=\"button\" class=\"ngx-mat-grey\" mat-icon-button matSuffix [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas\" [class.fa-plus-circle]=\"metadata.multiple\" [class.fa-upload]=\"!metadata.multiple\"></i>\n </button>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n</mat-form-field>\n\n<div *ngIf=\"metadata.dragAndDrop && !isReadOnly\" class=\"drag-drop\" dragDrop (files)=\"setFile($event)\">\n <button type=\"button\" mat-icon-button [disabled]=\"isReadOnly\" (click)=\"fileInput.click()\">\n <i class=\"fas fa-file-arrow-up ngx-mat-grey\"></i>\n </button>\n</div>", styles: ["mat-form-field{width:100%}.ngx-mat-grey{opacity:1;color:#0000008a}.drag-drop{display:flex;align-items:center;justify-content:center;height:200px;border:2px dashed rgba(0,0,0,.54);border-radius:15px;margin-top:5px;margin-bottom:5px}.drag-drop i{font-size:30px}\n"] }]
193
192
  }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.HttpClient }]; }, propDecorators: { propertyValue: [{
194
193
  type: Input
195
194
  }], entity: [{
@@ -205,4 +204,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImpor
205
204
  }], fileDataChangeEvent: [{
206
205
  type: Output
207
206
  }] } });
208
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2ZpbGUvZmlsZS1pbnB1dC9maWxlLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NvbXBvbmVudHMvaW5wdXQvZmlsZS9maWxlLWlucHV0L2ZpbGUtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0NBQXdDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUlyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7Ozs7Ozs7OztBQUV0RywrREFBK0Q7QUFPL0QsTUFBTSxPQUFPLGtCQUFrQjtJQWtDRTtJQUFvQztJQWhDakUsSUFBSSxTQUFTO1FBQ1QsT0FBTyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQXlCLENBQUM7SUFDdEgsQ0FBQztJQUNE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QkFEWixLQUFLO2dCQUlOLE1BQU07c0JBREwsS0FBSztnQkFJTixHQUFHO3NCQURGLEtBQUs7Z0JBSU4sUUFBUTtzQkFEUCxLQUFLO2dCQUlOLHlCQUF5QjtzQkFEeEIsS0FBSztnQkFJTixVQUFVO3NCQURULEtBQUs7Z0JBSU4sbUJBQW1CO3NCQURsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1qc2RvYyAqL1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nTW9kZWwgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgQmFzZUVudGl0eVR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi9jbGFzc2VzL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsLCBGaWxlRGF0YVdpdGhGaWxlLCBJbWFnZUZpbGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvZmlsZS9maWxlLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IEZpbGVEYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy9maWxlL2ZpbGUtZGVjb3JhdG9yLmRhdGEnO1xuaW1wb3J0IHsgTG9kYXNoVXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vZW5jYXBzdWxhdGlvbi9sb2Rhc2gudXRpbGl0aWVzJztcbmltcG9ydCB7IFJlZmxlY3RVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi8uLi8uLi9lbmNhcHN1bGF0aW9uL3JlZmxlY3QudXRpbGl0aWVzJztcbmltcG9ydCB7IEVudGl0eVV0aWxpdGllcyB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzJztcbmltcG9ydCB7IEZpbGVVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlsaXRpZXMvZmlsZS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBhbmd1bGFyL3ByZWZlci1zdGFuZGFsb25lLWNvbXBvbmVudFxuQENvbXBvbmVudCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGFuZ3VsYXIvY29tcG9uZW50LXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdmaWxlLWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZmlsZS1pbnB1dC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVJbnB1dENvbXBvbmVudDxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIGdldCBmaWxlbmFtZXMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YShFbnRpdHlVdGlsaXRpZXMuRklMRU5BTUVTX0tFWSwgdGhpcy5lbnRpdHksIHRoaXMua2V5KSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc2V0IGZpbGVuYW1lcyh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgUmVmbGVjdFV0aWxpdGllcy5kZWZpbmVNZXRhZGF0YShFbnRpdHlVdGlsaXRpZXMuRklMRU5BTUVTX0tFWSwgdmFsdWUsIHRoaXMuZW50aXR5LCB0aGlzLmtleSk7XG4gICAgfVxuXG4gICAgRmlsZVV0aWxpdGllczogdHlwZW9mIEZpbGVVdGlsaXRpZXMgPSBGaWxlVXRpbGl0aWVzO1xuXG4gICAgQElucHV0KClcbiAgICBwcm9wZXJ0eVZhbHVlITogRmlsZURhdGEgfCBGaWxlRGF0YVtdIHwgdW5kZWZpbmVkO1xuXG4gICAgQElucHV0KClcbiAgICBlbnRpdHkhOiBFbnRpdHlUeXBlO1xuXG4gICAgQElucHV0KClcbiAgICBrZXkhOiBrZXlvZiBFbnRpdHlUeXBlO1xuXG4gICAgQElucHV0KClcbiAgICBtZXRhZGF0YSE6IERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfCBJbWFnZUZpbGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcblxuICAgIEBJbnB1dCgpXG4gICAgZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZSE6IChtb2RlbDogTmdNb2RlbCkgPT4gc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBpc1JlYWRPbmx5ITogYm9vbGVhbjtcblxuICAgIEBPdXRwdXQoKVxuICAgIGZpbGVEYXRhQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxGaWxlRGF0YSB8IEZpbGVEYXRhW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlRGF0YSB8IEZpbGVEYXRhW10+KCk7XG5cbiAgICBhY2NlcHRTdHJpbmchOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRpYWxvZzogTWF0RGlhbG9nLCBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQpIHsgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRNdWx0aUZpbGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdFNpbmdsZUZpbGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbGVEYXRhQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnByb3BlcnR5VmFsdWUpO1xuICAgICAgICB0aGlzLmFjY2VwdFN0cmluZyA9IEZpbGVVdGlsaXRpZXMuZ2V0QWNjZXB0U3RyaW5nKHRoaXMubWV0YWRhdGEuYWxsb3dlZE1pbWVUeXBlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0TXVsdGlGaWxlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wcm9wZXJ0eVZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVuYW1lcyA9ICh0aGlzLnByb3BlcnR5VmFsdWUgYXMgRmlsZURhdGFbXSkubWFwKGYgPT4gZi5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFNpbmdsZUZpbGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnByb3BlcnR5VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZW5hbWVzID0gWyh0aGlzLnByb3BlcnR5VmFsdWUgYXMgRmlsZURhdGEpLm5hbWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0RmlsZUZyb21JbnB1dChldmVudDogRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZmlsZXM6IEZpbGVMaXN0IHwgW10gPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzID8/IFtdO1xuICAgICAgICBhd2FpdCB0aGlzLnNldEZpbGUoQXJyYXkuZnJvbShmaWxlcykpO1xuICAgIH1cblxuICAgIGFzeW5jIHNldEZpbGUoZmlsZXM6IEZpbGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyB2YWxpZGF0aW9uIGRvbmUgaW5saW5lXG4gICAgICAgIGlmIChmaWxlcy5maW5kKGYgPT4gIUZpbGVVdGlsaXRpZXMuaXNNaW1lVHlwZVZhbGlkKGYudHlwZSwgdGhpcy5tZXRhZGF0YS5hbGxvd2VkTWltZVR5cGVzKSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMubWV0YWRhdGEubWltZVR5cGVFcnJvckRpYWxvZyxcbiAgICAgICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVJbnB1dHMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZXMuZmluZChmID0+IEZpbGVVdGlsaXRpZXMudHJhbnNmb3JtVG9NZWdhQnl0ZXMoZi5zaXplLCAnQicpID4gdGhpcy5tZXRhZGF0YS5tYXhTaXplKSkge1xuICAgICAgICAgICAgdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5tZXRhZGF0YS5tYXhTaXplRXJyb3JEaWFsb2csXG4gICAgICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRGaWxlSW5wdXRzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbGVTaXplVG90YWw6IG51bWJlciA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgZmlsZVNpemVUb3RhbCArPSBmaWxlLnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEZpbGVVdGlsaXRpZXMudHJhbnNmb3JtVG9NZWdhQnl0ZXMoZmlsZVNpemVUb3RhbCwgJ0InKSA+IHRoaXMubWV0YWRhdGEubWF4U2l6ZVRvdGFsKSB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLm1ldGFkYXRhLm1heFNpemVUb3RhbEVycm9yRGlhbG9nLFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RmlsZUlucHV0cygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldE11bHRpRmlsZShBcnJheS5mcm9tKGZpbGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldFNpbmdsZUZpbGUoZmlsZXNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsZURhdGFDaGFuZ2VFdmVudC5lbWl0KHRoaXMucHJvcGVydHlWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldEZpbGVJbnB1dHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsZW5hbWVzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZmlsZURhdGFDaGFuZ2VFdmVudC5lbWl0KHRoaXMucHJvcGVydHlWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRNdWx0aUZpbGUoZmlsZXM6IEZpbGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkYXRhOiBGaWxlRGF0YVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgY29uc3QgZmlsZURhdGE6IEZpbGVEYXRhID0ge1xuICAgICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICAgICAgICBzaXplOiBmaWxlLnNpemVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkYXRhLnB1c2goZmlsZURhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZSA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAoZGF0YSk7XG4gICAgICAgIHRoaXMuZmlsZW5hbWVzID0gdGhpcy5wcm9wZXJ0eVZhbHVlLm1hcChmID0+IGYubmFtZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRTaW5nbGVGaWxlKGZpbGU6IEZpbGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eVZhbHVlID0ge1xuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmZpbGVuYW1lcyA9IFt0aGlzLnByb3BlcnR5VmFsdWUubmFtZV07XG4gICAgfVxuXG4gICAgcmVtb3ZlRmlsZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZWFkT25seSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVuYW1lcz8uc3BsaWNlKHRoaXMuZmlsZW5hbWVzLmluZGV4T2YobmFtZSksIDEpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbGVuYW1lcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlbmFtZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWxlRGF0YVRvUmVtb3ZlOiBGaWxlRGF0YSA9ICh0aGlzLnByb3BlcnR5VmFsdWUgYXMgRmlsZURhdGFbXSkuZmluZChmID0+IGYubmFtZSA9PT0gbmFtZSkgYXMgRmlsZURhdGE7XG4gICAgICAgICAgICAodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pLnNwbGljZSgodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pLmluZGV4T2YoZmlsZURhdGFUb1JlbW92ZSksIDEpO1xuICAgICAgICAgICAgaWYgKCEodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZW5hbWVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsZURhdGFDaGFuZ2VFdmVudC5lbWl0KHRoaXMucHJvcGVydHlWYWx1ZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZG93bmxvYWRGaWxlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5tZXRhZGF0YS5tdWx0aXBsZSAmJiAodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZm91bmRGaWxlRGF0YTogRmlsZURhdGEgPSAodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pLmZpbmQoZiA9PiBmLm5hbWUgPT09IG5hbWUpIGFzIEZpbGVEYXRhO1xuICAgICAgICAgICAgLy8gdGhlIGluZGV4IG5lZWQgdG8gYmUgc2F2ZWQgaW4gYSBjb25zdGFudCBiZWNhdXNlIHdlIGVkaXQgZm91bmRGaWxlRGF0YVxuICAgICAgICAgICAgLy8gPT4gLmluZGV4T2YoKSByZXR1cm5zIHVuZGVmaW5lZC5cbiAgICAgICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSAodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pLmluZGV4T2YoZm91bmRGaWxlRGF0YSk7XG4gICAgICAgICAgICAodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pW2luZGV4XSA9IGF3YWl0IEZpbGVVdGlsaXRpZXMuZ2V0RmlsZURhdGEoZm91bmRGaWxlRGF0YSwgdGhpcy5odHRwKTtcbiAgICAgICAgICAgIEZpbGVVdGlsaXRpZXMuZG93bmxvYWRTaW5nbGVGaWxlKCh0aGlzLnByb3BlcnR5VmFsdWUgYXMgRmlsZURhdGFbXSlbaW5kZXhdIGFzIEZpbGVEYXRhV2l0aEZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcGVydHlWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eVZhbHVlID0gYXdhaXQgRmlsZVV0aWxpdGllcy5nZXRGaWxlRGF0YSh0aGlzLnByb3BlcnR5VmFsdWUgYXMgRmlsZURhdGEsIHRoaXMuaHR0cCk7XG4gICAgICAgICAgICBGaWxlVXRpbGl0aWVzLmRvd25sb2FkU2luZ2xlRmlsZSh0aGlzLnByb3BlcnR5VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZG93bmxvYWRBbGxFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGEubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucHJvcGVydHlWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBhc3luYyBkb3dubG9hZEFsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCh0aGlzLnByb3BlcnR5VmFsdWUgYXMgRmlsZURhdGFbXSkubGVuZ3RoKSB7XG5cbiAgICAgICAgICAgIHZvaWQgRmlsZVV0aWxpdGllcy5kb3dubG9hZE11bHRpcGxlRmlsZXModGhpcy5tZXRhZGF0YS5kaXNwbGF5TmFtZSwgTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLnByb3BlcnR5VmFsdWUgYXMgRmlsZURhdGFbXSksIHRoaXMuaHR0cCk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiPCEtLSBlc2xpbnQtZGlzYWJsZSBhbmd1bGFyL25vLWNhbGwtZXhwcmVzc2lvbiAtLT5cbjxpbnB1dCAjZmlsZUlucHV0XG4gICAgdHlwZT1cImZpbGVcIiBoaWRkZW5cbiAgICBbbXVsdGlwbGVdPVwibWV0YWRhdGEubXVsdGlwbGVcIlxuICAgIFthY2NlcHRdPVwiYWNjZXB0U3RyaW5nXCJcbiAgICAoY2hhbmdlKT1cInNldEZpbGVGcm9tSW5wdXQoJGV2ZW50KVwiXG4+XG5cbjxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwiYWx3YXlzXCI+XG4gICAgPG1hdC1sYWJlbD57e21ldGFkYXRhLmRpc3BsYXlOYW1lfX08L21hdC1sYWJlbD5cbiAgICA8bWF0LWNoaXAtZ3JpZCAjY2hpcEdyaWRcbiAgICAgICAgI21vZGVsPVwibmdNb2RlbFwiIG5hbWU9XCJmaWxlXCIgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkKGVudGl0eSlcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImZpbGVuYW1lc1wiXG4gICAgPlxuICAgICAgICA8bWF0LWNoaXAtcm93ICpuZ0Zvcj1cImxldCBuYW1lIG9mIGZpbGVuYW1lc1wiIChyZW1vdmVkKT1cInJlbW92ZUZpbGUobmFtZSlcIj5cbiAgICAgICAgICAgIHt7bmFtZX19XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1tZGMtY2hpcC1yZW1vdmUgbWF0LW1kYy1jaGlwLXRyYWlsaW5nLWljb24gbmd4LW1hdC1ncmV5XCIgKGNsaWNrKT1cImRvd25sb2FkRmlsZShuYW1lKVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWRvd25sb2FkXCI+PC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFpc1JlYWRPbmx5XCIgdHlwZT1cImJ1dHRvblwiIG1hdENoaXBSZW1vdmU+XG4gICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIm1ldGFkYXRhLmRlbGV0ZUljb25cIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9tYXQtY2hpcC1yb3c+XG4gICAgICAgIDxpbnB1dCBoaWRkZW4gW21hdENoaXBJbnB1dEZvcl09XCJjaGlwR3JpZFwiIFtyZWFkb25seV09XCJ0cnVlXCI+XG4gICAgPC9tYXQtY2hpcC1ncmlkPlxuICAgIDxidXR0b24gKm5nSWY9XCJkb3dubG9hZEFsbEVuYWJsZWQoKVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5neC1tYXQtZ3JleVwiIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggKGNsaWNrKT1cImRvd25sb2FkQWxsKClcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZmlsZS16aXBwZXJcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtbWF0LWdyZXlcIiBtYXQtaWNvbi1idXR0b24gbWF0U3VmZml4IFtkaXNhYmxlZF09XCJpc1JlYWRPbmx5XCIgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXVwbG9hZFwiPjwvaT5cbiAgICA8L2J1dHRvbj5cbiAgICA8bWF0LWVycm9yPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShtb2RlbCl9fTwvbWF0LWVycm9yPlxuPC9tYXQtZm9ybS1maWVsZD5cblxuPGRpdiAqbmdJZj1cIm1ldGFkYXRhLmRyYWdBbmREcm9wICYmICFpc1JlYWRPbmx5XCIgY2xhc3M9XCJkcmFnLWRyb3BcIiBkcmFnRHJvcCAoZmlsZXMpPVwic2V0RmlsZSgkZXZlbnQpXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIFtkaXNhYmxlZF09XCJpc1JlYWRPbmx5XCIgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWZpbGUtYXJyb3ctdXAgbmd4LW1hdC1ncmV5XCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuPC9kaXY+Il19
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2ZpbGUvZmlsZS1pbnB1dC9maWxlLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NvbXBvbmVudHMvaW5wdXQvZmlsZS9maWxlLWlucHV0L2ZpbGUtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0NBQXdDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUlyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7Ozs7Ozs7OztBQUV0RywrREFBK0Q7QUFPL0QsTUFBTSxPQUFPLGtCQUFrQjtJQWtDRTtJQUFvQztJQWhDakUsSUFBSSxTQUFTO1FBQ1QsT0FBTyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQXlCLENBQUM7SUFDdEgsQ0FBQztJQUNE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REwsS0FBSztnQkFJTixHQUFHO3NCQURGLEtBQUs7Z0JBSU4sUUFBUTtzQkFEUCxLQUFLO2dCQUlOLHlCQUF5QjtzQkFEeEIsS0FBSztnQkFJTixVQUFVO3NCQURULEtBQUs7Z0JBSU4sbUJBQW1CO3NCQURsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUganNkb2MvcmVxdWlyZS1qc2RvYyAqL1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nTW9kZWwgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgQmFzZUVudGl0eVR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi9jbGFzc2VzL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsLCBGaWxlRGF0YVdpdGhGaWxlLCBJbWFnZUZpbGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvZmlsZS9maWxlLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IEZpbGVEYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy9maWxlL2ZpbGUtZGVjb3JhdG9yLmRhdGEnO1xuaW1wb3J0IHsgTG9kYXNoVXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vZW5jYXBzdWxhdGlvbi9sb2Rhc2gudXRpbGl0aWVzJztcbmltcG9ydCB7IFJlZmxlY3RVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi8uLi8uLi9lbmNhcHN1bGF0aW9uL3JlZmxlY3QudXRpbGl0aWVzJztcbmltcG9ydCB7IEVudGl0eVV0aWxpdGllcyB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzJztcbmltcG9ydCB7IEZpbGVVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlsaXRpZXMvZmlsZS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBhbmd1bGFyL3ByZWZlci1zdGFuZGFsb25lLWNvbXBvbmVudFxuQENvbXBvbmVudCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGFuZ3VsYXIvY29tcG9uZW50LXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdmaWxlLWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZmlsZS1pbnB1dC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVJbnB1dENvbXBvbmVudDxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIGdldCBmaWxlbmFtZXMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YShFbnRpdHlVdGlsaXRpZXMuRklMRU5BTUVTX0tFWSwgdGhpcy5lbnRpdHksIHRoaXMua2V5KSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc2V0IGZpbGVuYW1lcyh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgUmVmbGVjdFV0aWxpdGllcy5kZWZpbmVNZXRhZGF0YShFbnRpdHlVdGlsaXRpZXMuRklMRU5BTUVTX0tFWSwgdmFsdWUsIHRoaXMuZW50aXR5LCB0aGlzLmtleSk7XG4gICAgfVxuXG4gICAgRmlsZVV0aWxpdGllczogdHlwZW9mIEZpbGVVdGlsaXRpZXMgPSBGaWxlVXRpbGl0aWVzO1xuXG4gICAgQElucHV0KClcbiAgICBwcm9wZXJ0eVZhbHVlITogRmlsZURhdGEgfCBGaWxlRGF0YVtdIHwgdW5kZWZpbmVkO1xuXG4gICAgQElucHV0KClcbiAgICBlbnRpdHkhOiBFbnRpdHlUeXBlO1xuXG4gICAgQElucHV0KClcbiAgICBrZXkhOiBrZXlvZiBFbnRpdHlUeXBlO1xuXG4gICAgQElucHV0KClcbiAgICBtZXRhZGF0YSE6IERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfCBJbWFnZUZpbGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbDtcblxuICAgIEBJbnB1dCgpXG4gICAgZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZSE6IChtb2RlbDogTmdNb2RlbCkgPT4gc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBpc1JlYWRPbmx5ITogYm9vbGVhbjtcblxuICAgIEBPdXRwdXQoKVxuICAgIGZpbGVEYXRhQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxGaWxlRGF0YSB8IEZpbGVEYXRhW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlRGF0YSB8IEZpbGVEYXRhW10+KCk7XG5cbiAgICBhY2NlcHRTdHJpbmchOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRpYWxvZzogTWF0RGlhbG9nLCBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQpIHsgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRNdWx0aUZpbGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdFNpbmdsZUZpbGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbGVEYXRhQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnByb3BlcnR5VmFsdWUpO1xuICAgICAgICB0aGlzLmFjY2VwdFN0cmluZyA9IEZpbGVVdGlsaXRpZXMuZ2V0QWNjZXB0U3RyaW5nKHRoaXMubWV0YWRhdGEuYWxsb3dlZE1pbWVUeXBlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0TXVsdGlGaWxlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wcm9wZXJ0eVZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVuYW1lcyA9ICh0aGlzLnByb3BlcnR5VmFsdWUgYXMgRmlsZURhdGFbXSkubWFwKGYgPT4gZi5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFNpbmdsZUZpbGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnByb3BlcnR5VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZW5hbWVzID0gWyh0aGlzLnByb3BlcnR5VmFsdWUgYXMgRmlsZURhdGEpLm5hbWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0RmlsZUZyb21JbnB1dChldmVudDogRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZmlsZXM6IEZpbGVMaXN0IHwgW10gPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzID8/IFtdO1xuICAgICAgICBhd2FpdCB0aGlzLnNldEZpbGUoQXJyYXkuZnJvbShmaWxlcykpO1xuICAgIH1cblxuICAgIGFzeW5jIHNldEZpbGUoZmlsZXM6IEZpbGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyB2YWxpZGF0aW9uIGRvbmUgaW5saW5lXG4gICAgICAgIGlmIChmaWxlcy5maW5kKGYgPT4gIUZpbGVVdGlsaXRpZXMuaXNNaW1lVHlwZVZhbGlkKGYudHlwZSwgdGhpcy5tZXRhZGF0YS5hbGxvd2VkTWltZVR5cGVzKSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMubWV0YWRhdGEubWltZVR5cGVFcnJvckRpYWxvZyxcbiAgICAgICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVJbnB1dHMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZXMuZmluZChmID0+IEZpbGVVdGlsaXRpZXMudHJhbnNmb3JtVG9NZWdhQnl0ZXMoZi5zaXplLCAnQicpID4gdGhpcy5tZXRhZGF0YS5tYXhTaXplKSkge1xuICAgICAgICAgICAgdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5tZXRhZGF0YS5tYXhTaXplRXJyb3JEaWFsb2csXG4gICAgICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRGaWxlSW5wdXRzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbGVTaXplVG90YWw6IG51bWJlciA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgZmlsZVNpemVUb3RhbCArPSBmaWxlLnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEZpbGVVdGlsaXRpZXMudHJhbnNmb3JtVG9NZWdhQnl0ZXMoZmlsZVNpemVUb3RhbCwgJ0InKSA+IHRoaXMubWV0YWRhdGEubWF4U2l6ZVRvdGFsKSB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLm1ldGFkYXRhLm1heFNpemVUb3RhbEVycm9yRGlhbG9nLFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RmlsZUlucHV0cygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldE11bHRpRmlsZShBcnJheS5mcm9tKGZpbGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldFNpbmdsZUZpbGUoZmlsZXNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsZURhdGFDaGFuZ2VFdmVudC5lbWl0KHRoaXMucHJvcGVydHlWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldEZpbGVJbnB1dHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsZW5hbWVzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZmlsZURhdGFDaGFuZ2VFdmVudC5lbWl0KHRoaXMucHJvcGVydHlWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRNdWx0aUZpbGUoZmlsZXM6IEZpbGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWUgPSB0aGlzLnByb3BlcnR5VmFsdWUgPz8gW107XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgY29uc3QgZmlsZURhdGE6IEZpbGVEYXRhID0ge1xuICAgICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICAgICAgICBzaXplOiBmaWxlLnNpemVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pLnB1c2goZmlsZURhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsZW5hbWVzID0gKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5tYXAoZiA9PiBmLm5hbWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgc2V0U2luZ2xlRmlsZShmaWxlOiBGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgICBzaXplOiBmaWxlLnNpemVcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5maWxlbmFtZXMgPSBbdGhpcy5wcm9wZXJ0eVZhbHVlLm5hbWVdO1xuICAgIH1cblxuICAgIHJlbW92ZUZpbGUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVhZE9ubHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tZXRhZGF0YS5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5maWxlbmFtZXM/LnNwbGljZSh0aGlzLmZpbGVuYW1lcy5pbmRleE9mKG5hbWUpLCAxKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5maWxlbmFtZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZW5hbWVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmlsZURhdGFUb1JlbW92ZTogRmlsZURhdGEgPSAodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pLmZpbmQoZiA9PiBmLm5hbWUgPT09IG5hbWUpIGFzIEZpbGVEYXRhO1xuICAgICAgICAgICAgKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5zcGxpY2UoKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5pbmRleE9mKGZpbGVEYXRhVG9SZW1vdmUpLCAxKTtcbiAgICAgICAgICAgIGlmICghKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVuYW1lcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbGVEYXRhQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnByb3BlcnR5VmFsdWUpO1xuICAgIH1cblxuICAgIGFzeW5jIGRvd25sb2FkRmlsZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMubWV0YWRhdGEubXVsdGlwbGUgJiYgKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kRmlsZURhdGE6IEZpbGVEYXRhID0gKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5maW5kKGYgPT4gZi5uYW1lID09PSBuYW1lKSBhcyBGaWxlRGF0YTtcbiAgICAgICAgICAgIC8vIHRoZSBpbmRleCBuZWVkIHRvIGJlIHNhdmVkIGluIGEgY29uc3RhbnQgYmVjYXVzZSB3ZSBlZGl0IGZvdW5kRmlsZURhdGFcbiAgICAgICAgICAgIC8vID0+IC5pbmRleE9mKCkgcmV0dXJucyB1bmRlZmluZWQuXG4gICAgICAgICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5pbmRleE9mKGZvdW5kRmlsZURhdGEpO1xuICAgICAgICAgICAgKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKVtpbmRleF0gPSBhd2FpdCBGaWxlVXRpbGl0aWVzLmdldEZpbGVEYXRhKGZvdW5kRmlsZURhdGEsIHRoaXMuaHR0cCk7XG4gICAgICAgICAgICBGaWxlVXRpbGl0aWVzLmRvd25sb2FkU2luZ2xlRmlsZSgodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pW2luZGV4XSBhcyBGaWxlRGF0YVdpdGhGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BlcnR5VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZSA9IGF3YWl0IEZpbGVVdGlsaXRpZXMuZ2V0RmlsZURhdGEodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhLCB0aGlzLmh0dHApO1xuICAgICAgICAgICAgRmlsZVV0aWxpdGllcy5kb3dubG9hZFNpbmdsZUZpbGUodGhpcy5wcm9wZXJ0eVZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRvd25sb2FkQWxsRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhLm11bHRpcGxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnByb3BlcnR5VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRoaXMucHJvcGVydHlWYWx1ZSBhcyBGaWxlRGF0YVtdKS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYXN5bmMgZG93bmxvYWRBbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICgodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pLmxlbmd0aCkge1xuXG4gICAgICAgICAgICB2b2lkIEZpbGVVdGlsaXRpZXMuZG93bmxvYWRNdWx0aXBsZUZpbGVzKHRoaXMubWV0YWRhdGEuZGlzcGxheU5hbWUsIExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5wcm9wZXJ0eVZhbHVlIGFzIEZpbGVEYXRhW10pLCB0aGlzLmh0dHApO1xuICAgICAgICB9XG4gICAgfVxufSIsIjwhLS0gZXNsaW50LWRpc2FibGUgYW5ndWxhci9uby1jYWxsLWV4cHJlc3Npb24gLS0+XG48aW5wdXQgI2ZpbGVJbnB1dFxuICAgIHR5cGU9XCJmaWxlXCIgaGlkZGVuXG4gICAgW211bHRpcGxlXT1cIm1ldGFkYXRhLm11bHRpcGxlXCJcbiAgICBbYWNjZXB0XT1cImFjY2VwdFN0cmluZ1wiXG4gICAgKGNoYW5nZSk9XCJzZXRGaWxlRnJvbUlucHV0KCRldmVudClcIlxuPlxuXG48bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cImFsd2F5c1wiPlxuICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgPG1hdC1jaGlwLWdyaWQgI2NoaXBHcmlkXG4gICAgICAgICNtb2RlbD1cIm5nTW9kZWxcIiBuYW1lPVwiZmlsZVwiIFtyZXF1aXJlZF09XCJtZXRhZGF0YS5yZXF1aXJlZChlbnRpdHkpXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJmaWxlbmFtZXNcIlxuICAgID5cbiAgICAgICAgPG1hdC1jaGlwLXJvdyAqbmdGb3I9XCJsZXQgbmFtZSBvZiBmaWxlbmFtZXNcIiAocmVtb3ZlZCk9XCJyZW1vdmVGaWxlKG5hbWUpXCI+XG4gICAgICAgICAgICB7e25hbWV9fVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtbWRjLWNoaXAtcmVtb3ZlIG1hdC1tZGMtY2hpcC10cmFpbGluZy1pY29uIG5neC1tYXQtZ3JleVwiIChjbGljayk9XCJkb3dubG9hZEZpbGUobmFtZSlcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1kb3dubG9hZFwiPjwvaT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhaXNSZWFkT25seVwiIHR5cGU9XCJidXR0b25cIiBtYXRDaGlwUmVtb3ZlPlxuICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJtZXRhZGF0YS5kZWxldGVJY29uXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbWF0LWNoaXAtcm93PlxuICAgICAgICA8aW5wdXQgaGlkZGVuIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcEdyaWRcIiBbcmVhZG9ubHldPVwidHJ1ZVwiPlxuICAgIDwvbWF0LWNoaXAtZ3JpZD5cbiAgICA8YnV0dG9uICpuZ0lmPVwiZG93bmxvYWRBbGxFbmFibGVkKClcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuZ3gtbWF0LWdyZXlcIiBtYXQtaWNvbi1idXR0b24gbWF0U3VmZml4IChjbGljayk9XCJkb3dubG9hZEFsbCgpXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWZpbGUtemlwcGVyXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmd4LW1hdC1ncmV5XCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCBbZGlzYWJsZWRdPVwiaXNSZWFkT25seVwiIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhc1wiIFtjbGFzcy5mYS1wbHVzLWNpcmNsZV09XCJtZXRhZGF0YS5tdWx0aXBsZVwiIFtjbGFzcy5mYS11cGxvYWRdPVwiIW1ldGFkYXRhLm11bHRpcGxlXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxtYXQtZXJyb3I+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG48L21hdC1mb3JtLWZpZWxkPlxuXG48ZGl2ICpuZ0lmPVwibWV0YWRhdGEuZHJhZ0FuZERyb3AgJiYgIWlzUmVhZE9ubHlcIiBjbGFzcz1cImRyYWctZHJvcFwiIGRyYWdEcm9wIChmaWxlcyk9XCJzZXRGaWxlKCRldmVudClcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gW2Rpc2FibGVkXT1cImlzUmVhZE9ubHlcIiAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZmlsZS1hcnJvdy11cCBuZ3gtbWF0LWdyZXlcIj48L2k+XG4gICAgPC9idXR0b24+XG48L2Rpdj4iXX0=