fabrikantencore 2.1.18 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/esm2020/src/app/modules/fabrikantencore/beheer/components/beheer-filters/beheer-filters.component.mjs +70 -46
  2. package/esm2020/src/app/modules/fabrikantencore/beheer/components/beheer-products/beheer-products-ebo/beheer-products-ebo.component.mjs +79 -44
  3. package/esm2020/src/app/modules/fabrikantencore/beheer/components/beheer-select-filteroption-dialog/beheer-select-filteroption-dialog.component.mjs +36 -37
  4. package/esm2020/src/app/modules/fabrikantencore/components/fab-actionmenu/fab-actionmenu.component.mjs +3 -3
  5. package/esm2020/src/app/modules/fabrikantencore/components/fab-filter/fab-filter.component.mjs +50 -3
  6. package/esm2020/src/app/modules/fabrikantencore/components/fab-header/fab-header.component.mjs +3 -3
  7. package/esm2020/src/app/modules/fabrikantencore/components/fab-input/fab-input.component.mjs +4 -3
  8. package/esm2020/src/app/modules/fabrikantencore/components/fab-multiselect/fab-multiselect.component.mjs +44 -0
  9. package/esm2020/src/app/modules/fabrikantencore/components/fab-product-tile/fab-product-tile.component.mjs +10 -5
  10. package/esm2020/src/app/modules/fabrikantencore/fabrikantencore.module.mjs +6 -3
  11. package/esm2020/src/app/modules/fabrikantencore/services/bestek.service.mjs +5 -1
  12. package/esm2020/src/app/modules/fabrikantencore/services/fabrikanten.service.mjs +124 -18
  13. package/esm2020/src/app/modules/fabrikantencore/services/importsets.service.mjs +25 -4
  14. package/esm2020/src/app/modules/fabrikantencore/services/svg.service.mjs +4 -1
  15. package/esm2020/src/app/modules/fabrikantencore/services/webgl.service.mjs +5 -1
  16. package/esm2020/src/app/modules/fabrikantencore/swagger/SwaggerClient.mjs +320 -9
  17. package/fesm2015/fabrikantencore.mjs +819 -220
  18. package/fesm2015/fabrikantencore.mjs.map +1 -1
  19. package/fesm2020/fabrikantencore.mjs +816 -220
  20. package/fesm2020/fabrikantencore.mjs.map +1 -1
  21. package/package.json +1 -1
  22. package/src/app/modules/fabrikantencore/beheer/components/beheer-filters/beheer-filters.component.d.ts +3 -1
  23. package/src/app/modules/fabrikantencore/beheer/components/beheer-products/beheer-products-ebo/beheer-products-ebo.component.d.ts +5 -2
  24. package/src/app/modules/fabrikantencore/beheer/components/beheer-select-filteroption-dialog/beheer-select-filteroption-dialog.component.d.ts +8 -7
  25. package/src/app/modules/fabrikantencore/components/fab-filter/fab-filter.component.d.ts +3 -0
  26. package/src/app/modules/fabrikantencore/components/fab-multiselect/fab-multiselect.component.d.ts +19 -0
  27. package/src/app/modules/fabrikantencore/fabrikantencore.module.d.ts +27 -26
  28. package/src/app/modules/fabrikantencore/services/bestek.service.d.ts +2 -0
  29. package/src/app/modules/fabrikantencore/services/fabrikanten.service.d.ts +5 -1
  30. package/src/app/modules/fabrikantencore/services/importsets.service.d.ts +9 -2
  31. package/src/app/modules/fabrikantencore/services/webgl.service.d.ts +2 -0
  32. package/src/app/modules/fabrikantencore/swagger/SwaggerClient.d.ts +127 -8
@@ -29,14 +29,6 @@ export class BeheerFiltersComponent {
29
29
  this.SaveInputs();
30
30
  }
31
31
  }
32
- //public GetFilters(): FilterViewModel[] {
33
- // if (this.FiltersViewModel.filterViewModels != undefined) {
34
- // return this.FiltersViewModel.filterViewModels.sort((a, b) => (a.position - b.position));
35
- // }
36
- // else {
37
- // return new Array<FilterViewModel>();
38
- // }
39
- //}
40
32
  GetFilterOptions() {
41
33
  if (this.InputViewModel?.filter?.filterOptionViewModels != undefined) {
42
34
  return this.InputViewModel.filter.filterOptionViewModels;
@@ -45,40 +37,6 @@ export class BeheerFiltersComponent {
45
37
  return new Array();
46
38
  }
47
39
  }
48
- //public MoveUp(filter: FilterViewModel) {
49
- // this.LoadingFilters = true;
50
- // var request = new MoveFilterRequest();
51
- // request.filterId = filter.id;
52
- // request.up = true;
53
- // this.FiltersApiClient.moveFilter(request).subscribe(() => {
54
- // this.LoadFilters();
55
- // }, (error: Response) => {
56
- // if (error.status == 400)
57
- // console.log(error.json());
58
- // else {
59
- // console.log('An unexpected error occured');
60
- // console.log(error);
61
- // }
62
- // this.LoadingFilters = false;
63
- // });
64
- //}
65
- //public MoveDown(filter: FilterViewModel) {
66
- // this.LoadingFilters = true;
67
- // var request = new MoveFilterRequest();
68
- // request.filterId = filter.id;
69
- // request.up = false;
70
- // this.FiltersApiClient.moveFilter(request).subscribe(() => {
71
- // this.LoadFilters();
72
- // }, (error: Response) => {
73
- // if (error.status == 400)
74
- // console.log(error.json());
75
- // else {
76
- // console.log('An unexpected error occured');
77
- // console.log(error);
78
- // }
79
- // this.LoadingFilters = false;
80
- // });
81
- //}
82
40
  MoveUpOption(option) {
83
41
  this.Loading = true;
84
42
  var request = new MoveFilterOptionRequest();
@@ -171,7 +129,8 @@ export class BeheerFiltersComponent {
171
129
  this.ChangeDetectorRef.detectChanges();
172
130
  this.ChangeDetectorRef.detectChanges();
173
131
  var request = new SetFilterOptionRequiredRequest();
174
- request.filterId = this.InputViewModel?.filter.id;
132
+ request.filterId = this.InputViewModel.filter.id;
133
+ request.rangeInputId = 0;
175
134
  request.filterOptionId = result.filteroption;
176
135
  this.FiltersApiClient.setFilterOptionRequired(request).subscribe(() => {
177
136
  this.LoadInputs();
@@ -190,6 +149,71 @@ export class BeheerFiltersComponent {
190
149
  });
191
150
  }
192
151
  RemoveRequireFilterOption(require) {
152
+ if (confirm("Weet je het zeker?")) {
153
+ this.ChangeDetectorRef.detectChanges();
154
+ var request = new SetFilterOptionRequiredRequest();
155
+ request.filterId = require.affectedFilterId;
156
+ request.rangeInputId = 0;
157
+ request.filterOptionId = require.requiredFilterOptionId;
158
+ this.FiltersApiClient.removeFilterOptionRequired(request).subscribe(() => {
159
+ this.LoadInputs();
160
+ }, (error) => {
161
+ if (error.status == 400)
162
+ console.log(error.json());
163
+ else {
164
+ console.log('An unexpected error occured');
165
+ console.log(error);
166
+ }
167
+ this.Loading = false;
168
+ });
169
+ }
170
+ }
171
+ RequireRangeInputFilterOption() {
172
+ var dialogRef = this.dialog.open(BeheerSelectFilteroptionDialogComponent);
173
+ dialogRef.afterClosed().subscribe((result) => {
174
+ if (result?.filteroption != null && this.InputViewModel?.range) {
175
+ if (result.filteroption > 0) {
176
+ if (confirm("Weet je het zeker?")) {
177
+ this.ChangeDetectorRef.detectChanges();
178
+ var request = new SetFilterOptionRequiredRequest();
179
+ request.filterId = 0;
180
+ request.rangeInputId = this.InputViewModel.range.id;
181
+ request.filterOptionId = result.filteroption;
182
+ this.FiltersApiClient.setFilterOptionRequired(request).subscribe(() => {
183
+ this.LoadInputs();
184
+ }, (error) => {
185
+ if (error.status == 400)
186
+ console.log(error.json());
187
+ else {
188
+ console.log('An unexpected error occured');
189
+ console.log(error);
190
+ }
191
+ this.Loading = false;
192
+ });
193
+ }
194
+ }
195
+ }
196
+ });
197
+ }
198
+ RemoveRequireRangeInputFilterOption(require) {
199
+ if (confirm("Weet je het zeker?")) {
200
+ this.ChangeDetectorRef.detectChanges();
201
+ var request = new SetFilterOptionRequiredRequest();
202
+ request.filterId = 0;
203
+ request.rangeInputId = require.affectedRangeInputId;
204
+ request.filterOptionId = require.requiredFilterOptionId;
205
+ this.FiltersApiClient.removeFilterOptionRequired(request).subscribe(() => {
206
+ this.LoadInputs();
207
+ }, (error) => {
208
+ if (error.status == 400)
209
+ console.log(error.json());
210
+ else {
211
+ console.log('An unexpected error occured');
212
+ console.log(error);
213
+ }
214
+ this.Loading = false;
215
+ });
216
+ }
193
217
  }
194
218
  RemoveFilterOption(option) {
195
219
  this.Loading = true;
@@ -249,9 +273,9 @@ export class BeheerFiltersComponent {
249
273
  }
250
274
  }
251
275
  BeheerFiltersComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: BeheerFiltersComponent, deps: [{ token: i1.FiltersApiClient }, { token: i2.MatDialog }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
252
- BeheerFiltersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.0", type: BeheerFiltersComponent, selector: "app-beheer-filters", ngImport: i0, template: "<app-beheer-nav></app-beheer-nav>\r\n\r\n<div *ngIf=\"Loading\">\r\n <app-fab-loader></app-fab-loader>\r\n</div>\r\n\r\n<div *ngIf=\"!Loading\" class=\"main-content\">\r\n <mat-card>\r\n <mat-card-content>\r\n <button mat-raised-button (click)=\"AddCategory()\">Categorie toevoegen</button>\r\n </mat-card-content>\r\n </mat-card>\r\n <br />\r\n <div class=\"displayflex\">\r\n <div>\r\n <mat-card>\r\n <mat-card-content>\r\n <div cdkDropList class=\"input-list\" (cdkDropListDropped)=\"drop($event)\">\r\n <div class=\"input-item\" *ngFor=\"let input of InputsViewModel.inputs\" cdkDrag>\r\n <ng-container *ngIf=\"input.filter\">\r\n {{ input.filter.name }}\r\n </ng-container>\r\n <ng-container *ngIf=\"input.range\">\r\n {{ input.range.name }}\r\n </ng-container>\r\n <button (click)=\"Open(input)\">Select</button>\r\n </div>\r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n <div class=\"flexauto\">\r\n <mat-card>\r\n <mat-card-content>\r\n <div *ngIf=\"InputViewModel != undefined\">\r\n <ng-container *ngIf=\"InputViewModel.filter\">\r\n <div class=\"filter-name\">\r\n <div class=\"flexauto\">\r\n Name: {{ InputViewModel.filter.name }}\r\n </div>\r\n <div>\r\n <button mat-raised-button (click)=\"Sort()\">Sort</button>\r\n </div>\r\n </div>\r\n <div >\r\n <div class=\"filter-name\">\r\n <div class=\"flexauto\">\r\n Requires\r\n </div>\r\n <button mat-raised-button (click)=\"RequireFilter()\">Filter</button>\r\n <button mat-raised-button (click)=\"RequireFilterOption()\">FilterOption</button>\r\n </div>\r\n\r\n <div *ngFor=\"let option of InputViewModel.filter.requiresFilterOptions\">\r\n {{ option.requiredFilterName }}: {{ option.requiredFilterOptionName }}\r\n <button mat-raised-button (click)=\"RemoveRequireFilterOption(option)\">Remove</button>\r\n </div>\r\n </div>\r\n <div class=\"filter-options-container\">\r\n <div *ngFor=\"let option of GetFilterOptions(); let i = index;\" class=\"filter-option\">\r\n <div class=\"filter-option-name\">\r\n {{ option.name }}\r\n </div>\r\n <button mat-raised-button (click)=\"RemoveFilterOption(option)\">Remove</button>\r\n <!--<button mat-raised-button [disabled]=\"i == 0\" (click)=\"MoveUpOption(option)\">&#8593;</button>\r\n <button mat-raised-button [disabled]=\"(i + 1) == GetFilterOptions().length\" (click)=\"MoveDownOption(option)\">&#8595;</button>-->\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"InputViewModel.range\">\r\n <div class=\"filter-name\">\r\n <div class=\"flexauto\">\r\n Name: {{ InputViewModel.range.name }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n", styles: [".displayflex{display:flex;gap:10px}.filter-row{font-size:20px;line-height:30px;margin-bottom:10px}.flexauto{flex:auto}.main-content{padding:10px}.filter-name{font-size:20px;padding:10px;border-bottom:1px solid #000;display:flex}.filter-option:hover{background-color:gray}.filter-options-container{border:1px solid #000;padding:10px;margin:10px}.filter-option{padding:5px;border-bottom:1px solid #000;display:flex;gap:5px}.filter-option-name{flex:auto;line-height:30px;font-size:20px}.input-list{max-width:100%;border:solid 1px #ccc;min-height:60px;display:block;background:white;border-radius:4px;overflow:hidden}.input-item{padding:20px 10px;border-bottom:solid 1px #ccc;color:#000000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;cursor:move;background:white;font-size:14px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.input-item:last-child{border:none}.input-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\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: "component", type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i5.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { kind: "directive", type: i6.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i6.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i7.BeheerNavComponent, selector: "app-beheer-nav" }, { kind: "component", type: i8.FabLoaderComponent, selector: "app-fab-loader" }] });
276
+ BeheerFiltersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.0", type: BeheerFiltersComponent, selector: "app-beheer-filters", ngImport: i0, template: "<app-beheer-nav></app-beheer-nav>\r\n\r\n<div *ngIf=\"Loading\">\r\n <app-fab-loader></app-fab-loader>\r\n</div>\r\n\r\n<div *ngIf=\"!Loading\" class=\"main-content\">\r\n <mat-card>\r\n <mat-card-content>\r\n <button mat-raised-button (click)=\"AddCategory()\">Categorie toevoegen</button>\r\n </mat-card-content>\r\n </mat-card>\r\n <br />\r\n <div class=\"displayflex\">\r\n <div>\r\n <mat-card>\r\n <mat-card-content>\r\n <div cdkDropList class=\"input-list\" (cdkDropListDropped)=\"drop($event)\">\r\n <div class=\"input-item\" *ngFor=\"let input of InputsViewModel.inputs\" cdkDrag>\r\n <ng-container *ngIf=\"input.filter\">\r\n {{ input.filter.name }}\r\n </ng-container>\r\n <ng-container *ngIf=\"input.range\">\r\n {{ input.range.name }}\r\n </ng-container>\r\n <button (click)=\"Open(input)\">Select</button>\r\n </div>\r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n <div class=\"flexauto\">\r\n <mat-card>\r\n <mat-card-content>\r\n <div *ngIf=\"InputViewModel != undefined\">\r\n <ng-container *ngIf=\"InputViewModel.filter\">\r\n <div class=\"filter-name\">\r\n <div class=\"flexauto\">\r\n Name: {{ InputViewModel.filter.name }}\r\n </div>\r\n <div>\r\n <button mat-raised-button (click)=\"Sort()\">Sort</button>\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"filter-name\">\r\n <div class=\"flexauto\">\r\n Requires\r\n </div>\r\n <button mat-raised-button (click)=\"RequireFilter()\">Filter</button>\r\n <button mat-raised-button (click)=\"RequireFilterOption()\">FilterOption</button>\r\n </div>\r\n\r\n <div *ngFor=\"let option of InputViewModel.filter.requiresFilterOptions\">\r\n {{ option.requiredFilterName }}: {{ option.requiredFilterOptionName }}\r\n <button mat-raised-button (click)=\"RemoveRequireFilterOption(option)\">Remove</button>\r\n </div>\r\n </div>\r\n <div class=\"filter-options-container\">\r\n <div *ngFor=\"let option of GetFilterOptions(); let i = index;\" class=\"filter-option\">\r\n <div class=\"filter-option-name\">\r\n {{ option.name }}\r\n </div>\r\n <button mat-raised-button (click)=\"RemoveFilterOption(option)\">Remove</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"InputViewModel.range\">\r\n <div class=\"filter-name\">\r\n <div class=\"flexauto\">\r\n Name: {{ InputViewModel.range.name }}\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"filter-name\">\r\n <div class=\"flexauto\">\r\n Requires\r\n </div>\r\n <button mat-raised-button (click)=\"RequireRangeInputFilterOption()\">FilterOption</button>\r\n </div>\r\n\r\n <div *ngFor=\"let option of InputViewModel.range.requiresRangeInputFilterOptions\">\r\n {{ option.requiredFilterName }}: {{ option.requiredFilterOptionName }}\r\n <button mat-raised-button (click)=\"RemoveRequireRangeInputFilterOption(option)\">Remove</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n", styles: [".displayflex{display:flex;gap:10px}.filter-row{font-size:20px;line-height:30px;margin-bottom:10px}.flexauto{flex:auto}.main-content{padding:10px}.filter-name{font-size:20px;padding:10px;border-bottom:1px solid #000;display:flex}.filter-option:hover{background-color:gray}.filter-options-container{border:1px solid #000;padding:10px;margin:10px}.filter-option{padding:5px;border-bottom:1px solid #000;display:flex;gap:5px}.filter-option-name{flex:auto;line-height:30px;font-size:20px}.input-list{max-width:100%;border:solid 1px #ccc;min-height:60px;display:block;background:white;border-radius:4px;overflow-y:scroll;height:calc(100vH - 188px)}.input-item{padding:20px 10px;border-bottom:solid 1px #ccc;color:#000000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;cursor:move;background:white;font-size:14px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.input-item:last-child{border:none}.input-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\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: "component", type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i5.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { kind: "directive", type: i6.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i6.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i7.BeheerNavComponent, selector: "app-beheer-nav" }, { kind: "component", type: i8.FabLoaderComponent, selector: "app-fab-loader" }] });
253
277
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: BeheerFiltersComponent, decorators: [{
254
278
  type: Component,
255
- args: [{ selector: 'app-beheer-filters', template: "<app-beheer-nav></app-beheer-nav>\r\n\r\n<div *ngIf=\"Loading\">\r\n <app-fab-loader></app-fab-loader>\r\n</div>\r\n\r\n<div *ngIf=\"!Loading\" class=\"main-content\">\r\n <mat-card>\r\n <mat-card-content>\r\n <button mat-raised-button (click)=\"AddCategory()\">Categorie toevoegen</button>\r\n </mat-card-content>\r\n </mat-card>\r\n <br />\r\n <div class=\"displayflex\">\r\n <div>\r\n <mat-card>\r\n <mat-card-content>\r\n <div cdkDropList class=\"input-list\" (cdkDropListDropped)=\"drop($event)\">\r\n <div class=\"input-item\" *ngFor=\"let input of InputsViewModel.inputs\" cdkDrag>\r\n <ng-container *ngIf=\"input.filter\">\r\n {{ input.filter.name }}\r\n </ng-container>\r\n <ng-container *ngIf=\"input.range\">\r\n {{ input.range.name }}\r\n </ng-container>\r\n <button (click)=\"Open(input)\">Select</button>\r\n </div>\r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n <div class=\"flexauto\">\r\n <mat-card>\r\n <mat-card-content>\r\n <div *ngIf=\"InputViewModel != undefined\">\r\n <ng-container *ngIf=\"InputViewModel.filter\">\r\n <div class=\"filter-name\">\r\n <div class=\"flexauto\">\r\n Name: {{ InputViewModel.filter.name }}\r\n </div>\r\n <div>\r\n <button mat-raised-button (click)=\"Sort()\">Sort</button>\r\n </div>\r\n </div>\r\n <div >\r\n <div class=\"filter-name\">\r\n <div class=\"flexauto\">\r\n Requires\r\n </div>\r\n <button mat-raised-button (click)=\"RequireFilter()\">Filter</button>\r\n <button mat-raised-button (click)=\"RequireFilterOption()\">FilterOption</button>\r\n </div>\r\n\r\n <div *ngFor=\"let option of InputViewModel.filter.requiresFilterOptions\">\r\n {{ option.requiredFilterName }}: {{ option.requiredFilterOptionName }}\r\n <button mat-raised-button (click)=\"RemoveRequireFilterOption(option)\">Remove</button>\r\n </div>\r\n </div>\r\n <div class=\"filter-options-container\">\r\n <div *ngFor=\"let option of GetFilterOptions(); let i = index;\" class=\"filter-option\">\r\n <div class=\"filter-option-name\">\r\n {{ option.name }}\r\n </div>\r\n <button mat-raised-button (click)=\"RemoveFilterOption(option)\">Remove</button>\r\n <!--<button mat-raised-button [disabled]=\"i == 0\" (click)=\"MoveUpOption(option)\">&#8593;</button>\r\n <button mat-raised-button [disabled]=\"(i + 1) == GetFilterOptions().length\" (click)=\"MoveDownOption(option)\">&#8595;</button>-->\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"InputViewModel.range\">\r\n <div class=\"filter-name\">\r\n <div class=\"flexauto\">\r\n Name: {{ InputViewModel.range.name }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n", styles: [".displayflex{display:flex;gap:10px}.filter-row{font-size:20px;line-height:30px;margin-bottom:10px}.flexauto{flex:auto}.main-content{padding:10px}.filter-name{font-size:20px;padding:10px;border-bottom:1px solid #000;display:flex}.filter-option:hover{background-color:gray}.filter-options-container{border:1px solid #000;padding:10px;margin:10px}.filter-option{padding:5px;border-bottom:1px solid #000;display:flex;gap:5px}.filter-option-name{flex:auto;line-height:30px;font-size:20px}.input-list{max-width:100%;border:solid 1px #ccc;min-height:60px;display:block;background:white;border-radius:4px;overflow:hidden}.input-item{padding:20px 10px;border-bottom:solid 1px #ccc;color:#000000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;cursor:move;background:white;font-size:14px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.input-item:last-child{border:none}.input-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"] }]
279
+ args: [{ selector: 'app-beheer-filters', template: "<app-beheer-nav></app-beheer-nav>\r\n\r\n<div *ngIf=\"Loading\">\r\n <app-fab-loader></app-fab-loader>\r\n</div>\r\n\r\n<div *ngIf=\"!Loading\" class=\"main-content\">\r\n <mat-card>\r\n <mat-card-content>\r\n <button mat-raised-button (click)=\"AddCategory()\">Categorie toevoegen</button>\r\n </mat-card-content>\r\n </mat-card>\r\n <br />\r\n <div class=\"displayflex\">\r\n <div>\r\n <mat-card>\r\n <mat-card-content>\r\n <div cdkDropList class=\"input-list\" (cdkDropListDropped)=\"drop($event)\">\r\n <div class=\"input-item\" *ngFor=\"let input of InputsViewModel.inputs\" cdkDrag>\r\n <ng-container *ngIf=\"input.filter\">\r\n {{ input.filter.name }}\r\n </ng-container>\r\n <ng-container *ngIf=\"input.range\">\r\n {{ input.range.name }}\r\n </ng-container>\r\n <button (click)=\"Open(input)\">Select</button>\r\n </div>\r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n <div class=\"flexauto\">\r\n <mat-card>\r\n <mat-card-content>\r\n <div *ngIf=\"InputViewModel != undefined\">\r\n <ng-container *ngIf=\"InputViewModel.filter\">\r\n <div class=\"filter-name\">\r\n <div class=\"flexauto\">\r\n Name: {{ InputViewModel.filter.name }}\r\n </div>\r\n <div>\r\n <button mat-raised-button (click)=\"Sort()\">Sort</button>\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"filter-name\">\r\n <div class=\"flexauto\">\r\n Requires\r\n </div>\r\n <button mat-raised-button (click)=\"RequireFilter()\">Filter</button>\r\n <button mat-raised-button (click)=\"RequireFilterOption()\">FilterOption</button>\r\n </div>\r\n\r\n <div *ngFor=\"let option of InputViewModel.filter.requiresFilterOptions\">\r\n {{ option.requiredFilterName }}: {{ option.requiredFilterOptionName }}\r\n <button mat-raised-button (click)=\"RemoveRequireFilterOption(option)\">Remove</button>\r\n </div>\r\n </div>\r\n <div class=\"filter-options-container\">\r\n <div *ngFor=\"let option of GetFilterOptions(); let i = index;\" class=\"filter-option\">\r\n <div class=\"filter-option-name\">\r\n {{ option.name }}\r\n </div>\r\n <button mat-raised-button (click)=\"RemoveFilterOption(option)\">Remove</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"InputViewModel.range\">\r\n <div class=\"filter-name\">\r\n <div class=\"flexauto\">\r\n Name: {{ InputViewModel.range.name }}\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"filter-name\">\r\n <div class=\"flexauto\">\r\n Requires\r\n </div>\r\n <button mat-raised-button (click)=\"RequireRangeInputFilterOption()\">FilterOption</button>\r\n </div>\r\n\r\n <div *ngFor=\"let option of InputViewModel.range.requiresRangeInputFilterOptions\">\r\n {{ option.requiredFilterName }}: {{ option.requiredFilterOptionName }}\r\n <button mat-raised-button (click)=\"RemoveRequireRangeInputFilterOption(option)\">Remove</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n", styles: [".displayflex{display:flex;gap:10px}.filter-row{font-size:20px;line-height:30px;margin-bottom:10px}.flexauto{flex:auto}.main-content{padding:10px}.filter-name{font-size:20px;padding:10px;border-bottom:1px solid #000;display:flex}.filter-option:hover{background-color:gray}.filter-options-container{border:1px solid #000;padding:10px;margin:10px}.filter-option{padding:5px;border-bottom:1px solid #000;display:flex;gap:5px}.filter-option-name{flex:auto;line-height:30px;font-size:20px}.input-list{max-width:100%;border:solid 1px #ccc;min-height:60px;display:block;background:white;border-radius:4px;overflow-y:scroll;height:calc(100vH - 188px)}.input-item{padding:20px 10px;border-bottom:solid 1px #ccc;color:#000000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;cursor:move;background:white;font-size:14px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.input-item:last-child{border:none}.input-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"] }]
256
280
  }], ctorParameters: function () { return [{ type: i1.FiltersApiClient }, { type: i2.MatDialog }, { type: i0.ChangeDetectorRef }]; } });
257
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVoZWVyLWZpbHRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2ZhYnJpa2FudGVuY29yZS9iZWhlZXIvY29tcG9uZW50cy9iZWhlZXItZmlsdGVycy9iZWhlZXItZmlsdGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvZmFicmlrYW50ZW5jb3JlL2JlaGVlci9jb21wb25lbnRzL2JlaGVlci1maWx0ZXJzL2JlaGVlci1maWx0ZXJzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBb0YsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQXlCLHdCQUF3QixFQUFFLDhCQUE4QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDL1AsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHNFQUFzRSxDQUFDO0FBQ3pILE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxNQUFNLGtGQUFrRixDQUFDOzs7Ozs7Ozs7O0FBTzNJLE1BQU0sT0FBTyxzQkFBc0I7SUFRakMsWUFBb0IsZ0JBQWtDLEVBQzdDLE1BQWlCLEVBQ2hCLGlCQUFvQztRQUYxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQzdDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDaEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQVJ2QyxZQUFPLEdBQVksSUFBSSxDQUFDO1FBSXhCLG1CQUFjLEdBQStCLFNBQVMsQ0FBQztJQUlaLENBQUM7SUFFbkQsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxDQUFD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RyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDM0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQzthQUM3QztZQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDN0UsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLENBQUMsRUFBRSxDQUFDLEtBQWUsRUFBRSxFQUFFO2dCQUNyQixJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksR0FBRztvQkFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDdkI7b0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO29CQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNwQjtnQkFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7bUhBM1NVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLDBEQ1puQywrNEdBcUZBOzJGRHpFYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWx0ZXJzQXBpQ2xpZW50LCBJbnB1dHNWaWV3TW9kZWwsIEZpbHRlck9wdGlvblJlcXVpcmVkVmlld01vZGVsLCBJbnB1dFZpZXdNb2RlbCwgTW92ZUZpbHRlclJlcXVlc3QsIE1vdmVGaWx0ZXJPcHRpb25SZXF1ZXN0LCBGaWx0ZXJPcHRpb25WaWV3TW9kZWwsIFNldEZpbHRlclJlcXVpcmVkUmVxdWVzdCwgU2V0RmlsdGVyT3B0aW9uUmVxdWlyZWRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vc3dhZ2dlci9Td2FnZ2VyQ2xpZW50JztcclxuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBCZWhlZXJTZWxlY3RGaWx0ZXJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9iZWhlZXItc2VsZWN0LWZpbHRlci1kaWFsb2cvYmVoZWVyLXNlbGVjdC1maWx0ZXItZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEJlaGVlclNlbGVjdEZpbHRlcm9wdGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2JlaGVlci1zZWxlY3QtZmlsdGVyb3B0aW9uLWRpYWxvZy9iZWhlZXItc2VsZWN0LWZpbHRlcm9wdGlvbi1kaWFsb2cuY29tcG9uZW50JztcclxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtYmVoZWVyLWZpbHRlcnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vYmVoZWVyLWZpbHRlcnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9iZWhlZXItZmlsdGVycy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEJlaGVlckZpbHRlcnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyBMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcblxuICBwdWJsaWMgSW5wdXRzVmlld01vZGVsOiBJbnB1dHNWaWV3TW9kZWw7XG5cbiAgcHVibGljIElucHV0Vmlld01vZGVsOiBJbnB1dFZpZXdNb2RlbCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIEZpbHRlcnNBcGlDbGllbnQ6IEZpbHRlcnNBcGlDbGllbnQsXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBDaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuTG9hZElucHV0cygpO1xuICB9XG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XHJcbiAgICBpZiAodGhpcy5JbnB1dHNWaWV3TW9kZWwuaW5wdXRzICE9IG51bGwpIHtcclxuICAgICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuSW5wdXRzVmlld01vZGVsLmlucHV0cywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuXHJcbiAgICAgIHRoaXMuU2F2ZUlucHV0cygpO1xyXG4gICAgfVxyXG4gIH1cblxuICAvL3B1YmxpYyBHZXRGaWx0ZXJzKCk6IEZpbHRlclZpZXdNb2RlbFtdIHtcbiAgLy8gIGlmICh0aGlzLkZpbHRlcnNWaWV3TW9kZWwuZmlsdGVyVmlld01vZGVscyAhPSB1bmRlZmluZWQpIHtcbiAgLy8gICAgcmV0dXJuIHRoaXMuRmlsdGVyc1ZpZXdNb2RlbC5maWx0ZXJWaWV3TW9kZWxzLnNvcnQoKGEsIGIpID0+IChhLnBvc2l0aW9uIC0gYi5wb3NpdGlvbikpO1xyXG4gIC8vICB9XHJcbiAgLy8gIGVsc2Uge1xyXG4gIC8vICAgIHJldHVybiBuZXcgQXJyYXk8RmlsdGVyVmlld01vZGVsPigpO1xyXG4gIC8vICB9XHJcbiAgLy99XG5cbiAgcHVibGljIEdldEZpbHRlck9wdGlvbnMoKTogRmlsdGVyT3B0aW9uVmlld01vZGVsW10ge1xuICAgIGlmICh0aGlzLklucHV0Vmlld01vZGVsPy5maWx0ZXI/LmZpbHRlck9wdGlvblZpZXdNb2RlbHMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5JbnB1dFZpZXdNb2RlbC5maWx0ZXIuZmlsdGVyT3B0aW9uVmlld01vZGVscztcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gbmV3IEFycmF5PEZpbHRlck9wdGlvblZpZXdNb2RlbD4oKTtcclxuICAgIH1cclxuICB9XG5cbiAgLy9wdWJsaWMgTW92ZVVwKGZpbHRlcjogRmlsdGVyVmlld01vZGVsKSB7XG4gIC8vICB0aGlzLkxvYWRpbmdGaWx0ZXJzID0gdHJ1ZTtcblxuICAvLyAgdmFyIHJlcXVlc3QgPSBuZXcgTW92ZUZpbHRlclJlcXVlc3QoKTtcblxuICAvLyAgcmVxdWVzdC5maWx0ZXJJZCA9IGZpbHRlci5pZDtcbiAgLy8gIHJlcXVlc3QudXAgPSB0cnVlO1xuXG4gIC8vICB0aGlzLkZpbHRlcnNBcGlDbGllbnQubW92ZUZpbHRlcihyZXF1ZXN0KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAvLyAgICB0aGlzLkxvYWRGaWx0ZXJzKCk7XG4gIC8vICB9LCAoZXJyb3I6IFJlc3BvbnNlKSA9PiB7XG4gIC8vICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDAwKVxuICAvLyAgICAgIGNvbnNvbGUubG9nKGVycm9yLmpzb24oKSk7XG4gIC8vICAgIGVsc2Uge1xuICAvLyAgICAgIGNvbnNvbGUubG9nKCdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VyZWQnKTtcbiAgLy8gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gIC8vICAgIH1cblxuICAvLyAgICB0aGlzLkxvYWRpbmdGaWx0ZXJzID0gZmFsc2U7XG4gIC8vICB9KTtcclxuICAvL31cblxuICAvL3B1YmxpYyBNb3ZlRG93bihmaWx0ZXI6IEZpbHRlclZpZXdNb2RlbCkge1xuICAvLyAgdGhpcy5Mb2FkaW5nRmlsdGVycyA9IHRydWU7XG5cbiAgLy8gIHZhciByZXF1ZXN0ID0gbmV3IE1vdmVGaWx0ZXJSZXF1ZXN0KCk7XG5cbiAgLy8gIHJlcXVlc3QuZmlsdGVySWQgPSBmaWx0ZXIuaWQ7XG4gIC8vICByZXF1ZXN0LnVwID0gZmFsc2U7XG5cbiAgLy8gIHRoaXMuRmlsdGVyc0FwaUNsaWVudC5tb3ZlRmlsdGVyKHJlcXVlc3QpLnN1YnNjcmliZSgoKSA9PiB7XG4gIC8vICAgIHRoaXMuTG9hZEZpbHRlcnMoKTtcbiAgLy8gIH0sIChlcnJvcjogUmVzcG9uc2UpID0+IHtcbiAgLy8gICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDApXG4gIC8vICAgICAgY29uc29sZS5sb2coZXJyb3IuanNvbigpKTtcbiAgLy8gICAgZWxzZSB7XG4gIC8vICAgICAgY29uc29sZS5sb2coJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJlZCcpO1xuICAvLyAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgLy8gICAgfVxuXG4gIC8vICAgIHRoaXMuTG9hZGluZ0ZpbHRlcnMgPSBmYWxzZTtcbiAgLy8gIH0pO1xyXG4gIC8vfVxuXG4gIHB1YmxpYyBNb3ZlVXBPcHRpb24ob3B0aW9uOiBGaWx0ZXJPcHRpb25WaWV3TW9kZWwpIHtcbiAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgTW92ZUZpbHRlck9wdGlvblJlcXVlc3QoKTtcblxuICAgIHJlcXVlc3QuZmlsdGVyT3B0aW9uSWQgPSBvcHRpb24uaWQ7XG4gICAgcmVxdWVzdC51cCA9IHRydWU7XG5cbiAgICB0aGlzLkZpbHRlcnNBcGlDbGllbnQubW92ZUZpbHRlck9wdGlvbihyZXF1ZXN0KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5Mb2FkSW5wdXRzKCk7XG4gICAgfSwgKGVycm9yOiBSZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDApXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yLmpzb24oKSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJlZCcpO1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuICAgIH0pO1xyXG4gIH1cblxuICBwdWJsaWMgTW92ZURvd25PcHRpb24ob3B0aW9uOiBGaWx0ZXJPcHRpb25WaWV3TW9kZWwpIHtcbiAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgTW92ZUZpbHRlck9wdGlvblJlcXVlc3QoKTtcblxuICAgIHJlcXVlc3QuZmlsdGVyT3B0aW9uSWQgPSBvcHRpb24uaWQ7XG4gICAgcmVxdWVzdC51cCA9IGZhbHNlO1xuXG4gICAgdGhpcy5GaWx0ZXJzQXBpQ2xpZW50Lm1vdmVGaWx0ZXJPcHRpb24ocmVxdWVzdCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuTG9hZElucHV0cygpO1xuICAgIH0sIChlcnJvcjogUmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDAwKVxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5qc29uKCkpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VyZWQnKTtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcclxuICB9XG5cbiAgcHVibGljIE9wZW4oaW5wdXQ6IElucHV0Vmlld01vZGVsKSB7XG4gICAgdGhpcy5JbnB1dFZpZXdNb2RlbCA9IGlucHV0O1xyXG4gIH1cblxuICBwdWJsaWMgQWRkQ2F0ZWdvcnkoKTogdm9pZCB7XG5cclxuICB9XG5cbiAgcHVibGljIFNvcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuSW5wdXRWaWV3TW9kZWw/LmZpbHRlciAhPSBudWxsKSB7XG4gICAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICB2YXIgcmVxdWVzdCA9IG5ldyBNb3ZlRmlsdGVyUmVxdWVzdCgpO1xuXG4gICAgICByZXF1ZXN0LmZpbHRlcklkID0gdGhpcy5JbnB1dFZpZXdNb2RlbC5maWx0ZXIuaWQ7XG5cbiAgICAgIHRoaXMuRmlsdGVyc0FwaUNsaWVudC5zb3J0RmlsdGVyKHJlcXVlc3QpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuTG9hZElucHV0cygpO1xuICAgICAgfSwgKGVycm9yOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwMClcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5qc29uKCkpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cmVkJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XG5cbiAgcHVibGljIFJlcXVpcmVGaWx0ZXIoKTogdm9pZCB7XG4gICAgdmFyIGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQmVoZWVyU2VsZWN0RmlsdGVyRGlhbG9nQ29tcG9uZW50KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQ/LmZpbHRlciAhPSBudWxsICYmIHRoaXMuSW5wdXRWaWV3TW9kZWw/LmZpbHRlciAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5maWx0ZXIgPiAwKSB7XHJcbiAgICAgICAgICBpZiAoY29uZmlybShcIldlZXQgamUgaGV0IHpla2VyP1wiKSkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5DaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBTZXRGaWx0ZXJSZXF1aXJlZFJlcXVlc3QoKTtcclxuXHJcbiAgICAgICAgICAgIHJlcXVlc3QuZmlsdGVyQWZmZWN0c0lkID0gdGhpcy5JbnB1dFZpZXdNb2RlbD8uZmlsdGVyLmlkO1xyXG4gICAgICAgICAgICByZXF1ZXN0LmZpbHRlclJlcXVpcmVkSWQgPSByZXN1bHQuZmlsdGVyO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5GaWx0ZXJzQXBpQ2xpZW50LnNldEZpbHRlclJlcXVpcmVkKHJlcXVlc3QpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuTG9hZElucHV0cygpO1xuICAgICAgICAgICAgfSwgKGVycm9yOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwMClcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5qc29uKCkpO1xuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cmVkJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cblxuICBwdWJsaWMgUmVxdWlyZUZpbHRlck9wdGlvbigpOiB2b2lkIHtcbiAgICB2YXIgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihCZWhlZXJTZWxlY3RGaWx0ZXJvcHRpb25EaWFsb2dDb21wb25lbnQpO1xyXG5cclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdD8uZmlsdGVyb3B0aW9uICE9IG51bGwgJiYgdGhpcy5JbnB1dFZpZXdNb2RlbD8uZmlsdGVyKSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5maWx0ZXJvcHRpb24gPiAwKSB7XHJcbiAgICAgICAgICBpZiAoY29uZmlybShcIldlZXQgamUgaGV0IHpla2VyP1wiKSkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5DaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLkNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gbmV3IFNldEZpbHRlck9wdGlvblJlcXVpcmVkUmVxdWVzdCgpO1xyXG5cclxuICAgICAgICAgICAgcmVxdWVzdC5maWx0ZXJJZCA9IHRoaXMuSW5wdXRWaWV3TW9kZWw/LmZpbHRlci5pZDtcclxuICAgICAgICAgICAgcmVxdWVzdC5maWx0ZXJPcHRpb25JZCA9IHJlc3VsdC5maWx0ZXJvcHRpb247XHJcblxyXG4gICAgICAgICAgICB0aGlzLkZpbHRlcnNBcGlDbGllbnQuc2V0RmlsdGVyT3B0aW9uUmVxdWlyZWQocmVxdWVzdCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5Mb2FkSW5wdXRzKCk7XG4gICAgICAgICAgICB9LCAoZXJyb3I6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDAwKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yLmpzb24oKSk7XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VyZWQnKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxuXG4gIHB1YmxpYyBSZW1vdmVSZXF1aXJlRmlsdGVyT3B0aW9uKHJlcXVpcmU6IEZpbHRlck9wdGlvblJlcXVpcmVkVmlld01vZGVsKTogdm9pZCB7XG5cclxuICB9XG5cbiAgcHVibGljIFJlbW92ZUZpbHRlck9wdGlvbihvcHRpb246IEZpbHRlck9wdGlvblZpZXdNb2RlbCk6IHZvaWQge1xuICAgIHRoaXMuTG9hZGluZyA9IHRydWU7XG5cbiAgICB0aGlzLkZpbHRlcnNBcGlDbGllbnQucmVtb3ZlRmlsdGVyT3B0aW9uKG9wdGlvbikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuTG9hZElucHV0cygpO1xuICAgIH0sIChlcnJvcjogUmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDAwKVxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5qc29uKCkpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VyZWQnKTtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcclxuICB9XG5cbiAgcHJpdmF0ZSBMb2FkSW5wdXRzKCk6IHZvaWQge1xuICAgIHRoaXMuTG9hZGluZyA9IHRydWU7XG5cbiAgICB0aGlzLkZpbHRlcnNBcGlDbGllbnQuZ2V0SW5wdXRzVmlld01vZGVsKCkuc3Vic2NyaWJlKChtb2RlbDogSW5wdXRzVmlld01vZGVsKSA9PiB7XG4gICAgICB0aGlzLklucHV0c1ZpZXdNb2RlbCA9IG1vZGVsO1xuXG4gICAgICBpZiAodGhpcy5JbnB1dFZpZXdNb2RlbCAhPSBudWxsICYmIHRoaXMuSW5wdXRzVmlld01vZGVsLmlucHV0cyAhPSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5JbnB1dHNWaWV3TW9kZWwuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoKHRoaXMuSW5wdXRWaWV3TW9kZWwuZmlsdGVyPy5pZCA9PSB0aGlzLklucHV0c1ZpZXdNb2RlbC5pbnB1dHNbaV0uZmlsdGVyPy5pZCkgJiZcclxuICAgICAgICAgICAgKHRoaXMuSW5wdXRWaWV3TW9kZWwucmFuZ2U/LmlkID09IHRoaXMuSW5wdXRzVmlld01vZGVsLmlucHV0c1tpXS5yYW5nZT8uaWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuSW5wdXRWaWV3TW9kZWwgPSB0aGlzLklucHV0c1ZpZXdNb2RlbC5pbnB1dHNbaV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XG5cbiAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuICAgIH0sIChlcnJvcjogUmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDAwKVxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5qc29uKCkpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VyZWQnKTtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgU2F2ZUlucHV0cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5JbnB1dHNWaWV3TW9kZWwuaW5wdXRzICE9IG51bGwpIHtcbiAgICAgIHRoaXMuTG9hZGluZyA9IHRydWU7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5JbnB1dHNWaWV3TW9kZWwuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuSW5wdXRzVmlld01vZGVsLmlucHV0c1tpXS5wb3NpdGlvbiA9IGk7XHJcbiAgICAgIH1cblxuICAgICAgdGhpcy5GaWx0ZXJzQXBpQ2xpZW50LnNhdmVJbnB1dHNWaWV3TW9kZWwodGhpcy5JbnB1dHNWaWV3TW9kZWwpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuTG9hZElucHV0cygpO1xuICAgICAgfSwgKGVycm9yOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwMClcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5qc29uKCkpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cmVkJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XG59XG4iLCI8YXBwLWJlaGVlci1uYXY+PC9hcHAtYmVoZWVyLW5hdj5cclxuXHJcbjxkaXYgKm5nSWY9XCJMb2FkaW5nXCI+XHJcbiAgPGFwcC1mYWItbG9hZGVyPjwvYXBwLWZhYi1sb2FkZXI+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cIiFMb2FkaW5nXCIgY2xhc3M9XCJtYWluLWNvbnRlbnRcIj5cclxuICA8bWF0LWNhcmQ+XHJcbiAgICA8bWF0LWNhcmQtY29udGVudD5cclxuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiQWRkQ2F0ZWdvcnkoKVwiPkNhdGVnb3JpZSB0b2V2b2VnZW48L2J1dHRvbj5cclxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cclxuICA8L21hdC1jYXJkPlxyXG4gIDxiciAvPlxyXG4gIDxkaXYgY2xhc3M9XCJkaXNwbGF5ZmxleFwiPlxyXG4gICAgPGRpdj5cclxuICAgICAgPG1hdC1jYXJkPlxyXG4gICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgPGRpdiBjZGtEcm9wTGlzdCBjbGFzcz1cImlucHV0LWxpc3RcIiAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtaXRlbVwiICpuZ0Zvcj1cImxldCBpbnB1dCBvZiBJbnB1dHNWaWV3TW9kZWwuaW5wdXRzXCIgY2RrRHJhZz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5wdXQuZmlsdGVyXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBpbnB1dC5maWx0ZXIubmFtZSB9fVxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbnB1dC5yYW5nZVwiPlxyXG4gICAgICAgICAgICAgICAge3sgaW5wdXQucmFuZ2UubmFtZSB9fVxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIk9wZW4oaW5wdXQpXCI+U2VsZWN0PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICA8L21hdC1jYXJkPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleGF1dG9cIj5cclxuICAgICAgPG1hdC1jYXJkPlxyXG4gICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgICA8ZGl2ICpuZ0lmPVwiSW5wdXRWaWV3TW9kZWwgIT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIklucHV0Vmlld01vZGVsLmZpbHRlclwiPlxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4YXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgIE5hbWU6IHt7IElucHV0Vmlld01vZGVsLmZpbHRlci5uYW1lIH19XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIlNvcnQoKVwiPlNvcnQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgIDxkaXYgPlxyXG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleGF1dG9cIj5cclxuICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzXHJcbiAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiUmVxdWlyZUZpbHRlcigpXCI+RmlsdGVyPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiUmVxdWlyZUZpbHRlck9wdGlvbigpXCI+RmlsdGVyT3B0aW9uPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIElucHV0Vmlld01vZGVsLmZpbHRlci5yZXF1aXJlc0ZpbHRlck9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICB7eyBvcHRpb24ucmVxdWlyZWRGaWx0ZXJOYW1lIH19OiB7eyBvcHRpb24ucmVxdWlyZWRGaWx0ZXJPcHRpb25OYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiUmVtb3ZlUmVxdWlyZUZpbHRlck9wdGlvbihvcHRpb24pXCI+UmVtb3ZlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLW9wdGlvbnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBHZXRGaWx0ZXJPcHRpb25zKCk7IGxldCBpID0gaW5kZXg7XCIgY2xhc3M9XCJmaWx0ZXItb3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1vcHRpb24tbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJSZW1vdmVGaWx0ZXJPcHRpb24ob3B0aW9uKVwiPlJlbW92ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgIDwhLS08YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpID09IDBcIiAoY2xpY2spPVwiTW92ZVVwT3B0aW9uKG9wdGlvbilcIj4mIzg1OTM7PC9idXR0b24+XHJcbiAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiKGkgKyAxKSA9PSBHZXRGaWx0ZXJPcHRpb25zKCkubGVuZ3RoXCIgKGNsaWNrKT1cIk1vdmVEb3duT3B0aW9uKG9wdGlvbilcIj4mIzg1OTU7PC9idXR0b24+LS0+XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJJbnB1dFZpZXdNb2RlbC5yYW5nZVwiPlxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4YXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgIE5hbWU6IHt7IElucHV0Vmlld01vZGVsLnJhbmdlLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICBcclxuICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICA8L21hdC1jYXJkPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuIl19
281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVoZWVyLWZpbHRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2ZhYnJpa2FudGVuY29yZS9iZWhlZXIvY29tcG9uZW50cy9iZWhlZXItZmlsdGVycy9iZWhlZXItZmlsdGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvZmFicmlrYW50ZW5jb3JlL2JlaGVlci9jb21wb25lbnRzL2JlaGVlci1maWx0ZXJzL2JlaGVlci1maWx0ZXJzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBNkgsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQXlCLHdCQUF3QixFQUFFLDhCQUE4QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDeFMsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHNFQUFzRSxDQUFDO0FBQ3pILE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxNQUFNLGtGQUFrRixDQUFDOzs7Ozs7Ozs7O0FBTzNJLE1BQU0sT0FBTyxzQkFBc0I7SUFRakMsWUFBb0IsZ0JBQWtDLEVBQzdDLE1BQWlCLEVBQ2hCLGlCQUFvQztRQUYxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQzdDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDaEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQVJ2QyxZQUFPLEdBQVksSUFBSSxDQUFDO1FBSXhCLG1CQUFjLEdBQStCLFNBQVMsQ0FBQztJQUlaLENBQUM7SUFFbkQsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxDQUFD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QU8sR0FBRyxJQUFJLENBQUM7WUFFcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDM0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQzthQUM3QztZQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDN0UsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLENBQUMsRUFBRSxDQUFDLEtBQWUsRUFBRSxFQUFFO2dCQUNyQixJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksR0FBRztvQkFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDdkI7b0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO29CQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNwQjtnQkFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7bUhBelVVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLDBEQ1puQyx5eUhBZ0dBOzJGRHBGYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWx0ZXJzQXBpQ2xpZW50LCBJbnB1dHNWaWV3TW9kZWwsIEZpbHRlck9wdGlvblJlcXVpcmVkVmlld01vZGVsLCBSYW5nZUlucHV0RmlsdGVyT3B0aW9uUmVxdWlyZWRWaWV3TW9kZWwsIElucHV0Vmlld01vZGVsLCBNb3ZlRmlsdGVyUmVxdWVzdCwgTW92ZUZpbHRlck9wdGlvblJlcXVlc3QsIEZpbHRlck9wdGlvblZpZXdNb2RlbCwgU2V0RmlsdGVyUmVxdWlyZWRSZXF1ZXN0LCBTZXRGaWx0ZXJPcHRpb25SZXF1aXJlZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9zd2FnZ2VyL1N3YWdnZXJDbGllbnQnO1xyXG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IEJlaGVlclNlbGVjdEZpbHRlckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2JlaGVlci1zZWxlY3QtZmlsdGVyLWRpYWxvZy9iZWhlZXItc2VsZWN0LWZpbHRlci1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQmVoZWVyU2VsZWN0RmlsdGVyb3B0aW9uRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vYmVoZWVyLXNlbGVjdC1maWx0ZXJvcHRpb24tZGlhbG9nL2JlaGVlci1zZWxlY3QtZmlsdGVyb3B0aW9uLWRpYWxvZy5jb21wb25lbnQnO1xyXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1iZWhlZXItZmlsdGVycycsXG4gIHRlbXBsYXRlVXJsOiAnLi9iZWhlZXItZmlsdGVycy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2JlaGVlci1maWx0ZXJzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQmVoZWVyRmlsdGVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHVibGljIExvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHB1YmxpYyBJbnB1dHNWaWV3TW9kZWw6IElucHV0c1ZpZXdNb2RlbDtcblxuICBwdWJsaWMgSW5wdXRWaWV3TW9kZWw6IElucHV0Vmlld01vZGVsIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgRmlsdGVyc0FwaUNsaWVudDogRmlsdGVyc0FwaUNsaWVudCxcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIENoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5Mb2FkSW5wdXRzKCk7XG4gIH1cblxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4pIHtcclxuICAgIGlmICh0aGlzLklucHV0c1ZpZXdNb2RlbC5pbnB1dHMgIT0gbnVsbCkge1xyXG4gICAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5JbnB1dHNWaWV3TW9kZWwuaW5wdXRzLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xyXG5cclxuICAgICAgdGhpcy5TYXZlSW5wdXRzKCk7XHJcbiAgICB9XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRGaWx0ZXJPcHRpb25zKCk6IEZpbHRlck9wdGlvblZpZXdNb2RlbFtdIHtcbiAgICBpZiAodGhpcy5JbnB1dFZpZXdNb2RlbD8uZmlsdGVyPy5maWx0ZXJPcHRpb25WaWV3TW9kZWxzICE9IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuSW5wdXRWaWV3TW9kZWwuZmlsdGVyLmZpbHRlck9wdGlvblZpZXdNb2RlbHM7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIG5ldyBBcnJheTxGaWx0ZXJPcHRpb25WaWV3TW9kZWw+KCk7XHJcbiAgICB9XHJcbiAgfVxuXG4gIHB1YmxpYyBNb3ZlVXBPcHRpb24ob3B0aW9uOiBGaWx0ZXJPcHRpb25WaWV3TW9kZWwpIHtcbiAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgTW92ZUZpbHRlck9wdGlvblJlcXVlc3QoKTtcblxuICAgIHJlcXVlc3QuZmlsdGVyT3B0aW9uSWQgPSBvcHRpb24uaWQ7XG4gICAgcmVxdWVzdC51cCA9IHRydWU7XG5cbiAgICB0aGlzLkZpbHRlcnNBcGlDbGllbnQubW92ZUZpbHRlck9wdGlvbihyZXF1ZXN0KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5Mb2FkSW5wdXRzKCk7XG4gICAgfSwgKGVycm9yOiBSZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDApXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yLmpzb24oKSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJlZCcpO1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuICAgIH0pO1xyXG4gIH1cblxuICBwdWJsaWMgTW92ZURvd25PcHRpb24ob3B0aW9uOiBGaWx0ZXJPcHRpb25WaWV3TW9kZWwpIHtcbiAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgTW92ZUZpbHRlck9wdGlvblJlcXVlc3QoKTtcblxuICAgIHJlcXVlc3QuZmlsdGVyT3B0aW9uSWQgPSBvcHRpb24uaWQ7XG4gICAgcmVxdWVzdC51cCA9IGZhbHNlO1xuXG4gICAgdGhpcy5GaWx0ZXJzQXBpQ2xpZW50Lm1vdmVGaWx0ZXJPcHRpb24ocmVxdWVzdCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuTG9hZElucHV0cygpO1xuICAgIH0sIChlcnJvcjogUmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDAwKVxuICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5qc29uKCkpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VyZWQnKTtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcclxuICB9XG5cbiAgcHVibGljIE9wZW4oaW5wdXQ6IElucHV0Vmlld01vZGVsKSB7XG4gICAgdGhpcy5JbnB1dFZpZXdNb2RlbCA9IGlucHV0O1xyXG4gIH1cblxuICBwdWJsaWMgQWRkQ2F0ZWdvcnkoKTogdm9pZCB7XG5cclxuICB9XG5cbiAgcHVibGljIFNvcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuSW5wdXRWaWV3TW9kZWw/LmZpbHRlciAhPSBudWxsKSB7XG4gICAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICB2YXIgcmVxdWVzdCA9IG5ldyBNb3ZlRmlsdGVyUmVxdWVzdCgpO1xuXG4gICAgICByZXF1ZXN0LmZpbHRlcklkID0gdGhpcy5JbnB1dFZpZXdNb2RlbC5maWx0ZXIuaWQ7XG5cbiAgICAgIHRoaXMuRmlsdGVyc0FwaUNsaWVudC5zb3J0RmlsdGVyKHJlcXVlc3QpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuTG9hZElucHV0cygpO1xuICAgICAgfSwgKGVycm9yOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwMClcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5qc29uKCkpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cmVkJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XG5cbiAgcHVibGljIFJlcXVpcmVGaWx0ZXIoKTogdm9pZCB7XG4gICAgdmFyIGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQmVoZWVyU2VsZWN0RmlsdGVyRGlhbG9nQ29tcG9uZW50KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQ/LmZpbHRlciAhPSBudWxsICYmIHRoaXMuSW5wdXRWaWV3TW9kZWw/LmZpbHRlciAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5maWx0ZXIgPiAwKSB7XHJcbiAgICAgICAgICBpZiAoY29uZmlybShcIldlZXQgamUgaGV0IHpla2VyP1wiKSkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5DaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBTZXRGaWx0ZXJSZXF1aXJlZFJlcXVlc3QoKTtcclxuXHJcbiAgICAgICAgICAgIHJlcXVlc3QuZmlsdGVyQWZmZWN0c0lkID0gdGhpcy5JbnB1dFZpZXdNb2RlbD8uZmlsdGVyLmlkO1xyXG4gICAgICAgICAgICByZXF1ZXN0LmZpbHRlclJlcXVpcmVkSWQgPSByZXN1bHQuZmlsdGVyO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5GaWx0ZXJzQXBpQ2xpZW50LnNldEZpbHRlclJlcXVpcmVkKHJlcXVlc3QpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuTG9hZElucHV0cygpO1xuICAgICAgICAgICAgfSwgKGVycm9yOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwMClcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5qc29uKCkpO1xuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cmVkJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cblxuICBwdWJsaWMgUmVxdWlyZUZpbHRlck9wdGlvbigpOiB2b2lkIHtcbiAgICB2YXIgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihCZWhlZXJTZWxlY3RGaWx0ZXJvcHRpb25EaWFsb2dDb21wb25lbnQpO1xyXG5cclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdD8uZmlsdGVyb3B0aW9uICE9IG51bGwgJiYgdGhpcy5JbnB1dFZpZXdNb2RlbD8uZmlsdGVyKSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5maWx0ZXJvcHRpb24gPiAwKSB7XHJcbiAgICAgICAgICBpZiAoY29uZmlybShcIldlZXQgamUgaGV0IHpla2VyP1wiKSkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5DaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLkNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gbmV3IFNldEZpbHRlck9wdGlvblJlcXVpcmVkUmVxdWVzdCgpO1xyXG5cclxuICAgICAgICAgICAgcmVxdWVzdC5maWx0ZXJJZCA9IHRoaXMuSW5wdXRWaWV3TW9kZWwuZmlsdGVyLmlkO1xyXG4gICAgICAgICAgICByZXF1ZXN0LnJhbmdlSW5wdXRJZCA9IDA7XHJcbiAgICAgICAgICAgIHJlcXVlc3QuZmlsdGVyT3B0aW9uSWQgPSByZXN1bHQuZmlsdGVyb3B0aW9uO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5GaWx0ZXJzQXBpQ2xpZW50LnNldEZpbHRlck9wdGlvblJlcXVpcmVkKHJlcXVlc3QpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuTG9hZElucHV0cygpO1xuICAgICAgICAgICAgfSwgKGVycm9yOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwMClcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5qc29uKCkpO1xuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cmVkJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cblxuICBwdWJsaWMgUmVtb3ZlUmVxdWlyZUZpbHRlck9wdGlvbihyZXF1aXJlOiBGaWx0ZXJPcHRpb25SZXF1aXJlZFZpZXdNb2RlbCk6IHZvaWQge1xuICAgIGlmIChjb25maXJtKFwiV2VldCBqZSBoZXQgemVrZXI/XCIpKSB7XHJcblxyXG4gICAgICB0aGlzLkNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgIHZhciByZXF1ZXN0ID0gbmV3IFNldEZpbHRlck9wdGlvblJlcXVpcmVkUmVxdWVzdCgpO1xyXG5cclxuICAgICAgcmVxdWVzdC5maWx0ZXJJZCA9IHJlcXVpcmUuYWZmZWN0ZWRGaWx0ZXJJZDtcclxuICAgICAgcmVxdWVzdC5yYW5nZUlucHV0SWQgPSAwO1xyXG4gICAgICByZXF1ZXN0LmZpbHRlck9wdGlvbklkID0gcmVxdWlyZS5yZXF1aXJlZEZpbHRlck9wdGlvbklkO1xyXG5cclxuICAgICAgdGhpcy5GaWx0ZXJzQXBpQ2xpZW50LnJlbW92ZUZpbHRlck9wdGlvblJlcXVpcmVkKHJlcXVlc3QpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuTG9hZElucHV0cygpO1xuICAgICAgfSwgKGVycm9yOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwMClcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5qc29uKCkpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cmVkJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XG5cbiAgcHVibGljIFJlcXVpcmVSYW5nZUlucHV0RmlsdGVyT3B0aW9uKCk6IHZvaWQge1xuICAgIHZhciBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEJlaGVlclNlbGVjdEZpbHRlcm9wdGlvbkRpYWxvZ0NvbXBvbmVudCk7XHJcblxyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0Py5maWx0ZXJvcHRpb24gIT0gbnVsbCAmJiB0aGlzLklucHV0Vmlld01vZGVsPy5yYW5nZSkge1xyXG4gICAgICAgIGlmIChyZXN1bHQuZmlsdGVyb3B0aW9uID4gMCkge1xyXG4gICAgICAgICAgaWYgKGNvbmZpcm0oXCJXZWV0IGplIGhldCB6ZWtlcj9cIikpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuQ2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgU2V0RmlsdGVyT3B0aW9uUmVxdWlyZWRSZXF1ZXN0KCk7XHJcblxyXG4gICAgICAgICAgICByZXF1ZXN0LmZpbHRlcklkID0gMDtcclxuICAgICAgICAgICAgcmVxdWVzdC5yYW5nZUlucHV0SWQgPSB0aGlzLklucHV0Vmlld01vZGVsLnJhbmdlLmlkO1xyXG4gICAgICAgICAgICByZXF1ZXN0LmZpbHRlck9wdGlvbklkID0gcmVzdWx0LmZpbHRlcm9wdGlvbjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuRmlsdGVyc0FwaUNsaWVudC5zZXRGaWx0ZXJPcHRpb25SZXF1aXJlZChyZXF1ZXN0KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLkxvYWRJbnB1dHMoKTtcbiAgICAgICAgICAgIH0sIChlcnJvcjogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDApXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IuanNvbigpKTtcbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJlZCcpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XG5cbiAgcHVibGljIFJlbW92ZVJlcXVpcmVSYW5nZUlucHV0RmlsdGVyT3B0aW9uKHJlcXVpcmU6IFJhbmdlSW5wdXRGaWx0ZXJPcHRpb25SZXF1aXJlZFZpZXdNb2RlbCk6IHZvaWQge1xuICAgIGlmIChjb25maXJtKFwiV2VldCBqZSBoZXQgemVrZXI/XCIpKSB7XHJcblxyXG4gICAgICB0aGlzLkNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgIHZhciByZXF1ZXN0ID0gbmV3IFNldEZpbHRlck9wdGlvblJlcXVpcmVkUmVxdWVzdCgpO1xyXG5cclxuICAgICAgcmVxdWVzdC5maWx0ZXJJZCA9IDA7XHJcbiAgICAgIHJlcXVlc3QucmFuZ2VJbnB1dElkID0gcmVxdWlyZS5hZmZlY3RlZFJhbmdlSW5wdXRJZDtcclxuICAgICAgcmVxdWVzdC5maWx0ZXJPcHRpb25JZCA9IHJlcXVpcmUucmVxdWlyZWRGaWx0ZXJPcHRpb25JZDtcclxuXHJcbiAgICAgIHRoaXMuRmlsdGVyc0FwaUNsaWVudC5yZW1vdmVGaWx0ZXJPcHRpb25SZXF1aXJlZChyZXF1ZXN0KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLkxvYWRJbnB1dHMoKTtcbiAgICAgIH0sIChlcnJvcjogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDApXG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IuanNvbigpKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJlZCcpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxuXG4gIHB1YmxpYyBSZW1vdmVGaWx0ZXJPcHRpb24ob3B0aW9uOiBGaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiB2b2lkIHtcbiAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5GaWx0ZXJzQXBpQ2xpZW50LnJlbW92ZUZpbHRlck9wdGlvbihvcHRpb24pLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLkxvYWRJbnB1dHMoKTtcbiAgICB9LCAoZXJyb3I6IFJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwMClcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IuanNvbigpKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZygnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cmVkJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XHJcbiAgfVxuXG4gIHByaXZhdGUgTG9hZElucHV0cygpOiB2b2lkIHtcbiAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5GaWx0ZXJzQXBpQ2xpZW50LmdldElucHV0c1ZpZXdNb2RlbCgpLnN1YnNjcmliZSgobW9kZWw6IElucHV0c1ZpZXdNb2RlbCkgPT4ge1xuICAgICAgdGhpcy5JbnB1dHNWaWV3TW9kZWwgPSBtb2RlbDtcblxuICAgICAgaWYgKHRoaXMuSW5wdXRWaWV3TW9kZWwgIT0gbnVsbCAmJiB0aGlzLklucHV0c1ZpZXdNb2RlbC5pbnB1dHMgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuSW5wdXRzVmlld01vZGVsLmlucHV0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKCh0aGlzLklucHV0Vmlld01vZGVsLmZpbHRlcj8uaWQgPT0gdGhpcy5JbnB1dHNWaWV3TW9kZWwuaW5wdXRzW2ldLmZpbHRlcj8uaWQpICYmXHJcbiAgICAgICAgICAgICh0aGlzLklucHV0Vmlld01vZGVsLnJhbmdlPy5pZCA9PSB0aGlzLklucHV0c1ZpZXdNb2RlbC5pbnB1dHNbaV0ucmFuZ2U/LmlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLklucHV0Vmlld01vZGVsID0gdGhpcy5JbnB1dHNWaWV3TW9kZWwuaW5wdXRzW2ldO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxuXG4gICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcbiAgICB9LCAoZXJyb3I6IFJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwMClcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IuanNvbigpKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZygnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cmVkJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIFNhdmVJbnB1dHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuSW5wdXRzVmlld01vZGVsLmlucHV0cyAhPSBudWxsKSB7XG4gICAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuSW5wdXRzVmlld01vZGVsLmlucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLklucHV0c1ZpZXdNb2RlbC5pbnB1dHNbaV0ucG9zaXRpb24gPSBpO1xyXG4gICAgICB9XG5cbiAgICAgIHRoaXMuRmlsdGVyc0FwaUNsaWVudC5zYXZlSW5wdXRzVmlld01vZGVsKHRoaXMuSW5wdXRzVmlld01vZGVsKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLkxvYWRJbnB1dHMoKTtcbiAgICAgIH0sIChlcnJvcjogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDApXG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IuanNvbigpKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJlZCcpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxufVxuIiwiPGFwcC1iZWhlZXItbmF2PjwvYXBwLWJlaGVlci1uYXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwiTG9hZGluZ1wiPlxyXG4gIDxhcHAtZmFiLWxvYWRlcj48L2FwcC1mYWItbG9hZGVyPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgKm5nSWY9XCIhTG9hZGluZ1wiIGNsYXNzPVwibWFpbi1jb250ZW50XCI+XHJcbiAgPG1hdC1jYXJkPlxyXG4gICAgPG1hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIkFkZENhdGVnb3J5KClcIj5DYXRlZ29yaWUgdG9ldm9lZ2VuPC9idXR0b24+XHJcbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgPC9tYXQtY2FyZD5cclxuICA8YnIgLz5cclxuICA8ZGl2IGNsYXNzPVwiZGlzcGxheWZsZXhcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxtYXQtY2FyZD5cclxuICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICAgIDxkaXYgY2RrRHJvcExpc3QgY2xhc3M9XCJpbnB1dC1saXN0XCIgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWl0ZW1cIiAqbmdGb3I9XCJsZXQgaW5wdXQgb2YgSW5wdXRzVmlld01vZGVsLmlucHV0c1wiIGNka0RyYWc+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlucHV0LmZpbHRlclwiPlxyXG4gICAgICAgICAgICAgICAge3sgaW5wdXQuZmlsdGVyLm5hbWUgfX1cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5wdXQucmFuZ2VcIj5cclxuICAgICAgICAgICAgICAgIHt7IGlucHV0LnJhbmdlLm5hbWUgfX1cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJPcGVuKGlucHV0KVwiPlNlbGVjdDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cclxuICAgICAgPC9tYXQtY2FyZD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXhhdXRvXCI+XHJcbiAgICAgIDxtYXQtY2FyZD5cclxuICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICAgPGRpdiAqbmdJZj1cIklucHV0Vmlld01vZGVsICE9IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJJbnB1dFZpZXdNb2RlbC5maWx0ZXJcIj5cclxuICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItbmFtZVwiPlxyXG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleGF1dG9cIj5cclxuICAgICAgICAgICAgICAgICBOYW1lOiB7eyBJbnB1dFZpZXdNb2RlbC5maWx0ZXIubmFtZSB9fVxyXG4gICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJTb3J0KClcIj5Tb3J0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleGF1dG9cIj5cclxuICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzXHJcbiAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiUmVxdWlyZUZpbHRlcigpXCI+RmlsdGVyPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiUmVxdWlyZUZpbHRlck9wdGlvbigpXCI+RmlsdGVyT3B0aW9uPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIElucHV0Vmlld01vZGVsLmZpbHRlci5yZXF1aXJlc0ZpbHRlck9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICB7eyBvcHRpb24ucmVxdWlyZWRGaWx0ZXJOYW1lIH19OiB7eyBvcHRpb24ucmVxdWlyZWRGaWx0ZXJPcHRpb25OYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiUmVtb3ZlUmVxdWlyZUZpbHRlck9wdGlvbihvcHRpb24pXCI+UmVtb3ZlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLW9wdGlvbnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBHZXRGaWx0ZXJPcHRpb25zKCk7IGxldCBpID0gaW5kZXg7XCIgY2xhc3M9XCJmaWx0ZXItb3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1vcHRpb24tbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJSZW1vdmVGaWx0ZXJPcHRpb24ob3B0aW9uKVwiPlJlbW92ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiSW5wdXRWaWV3TW9kZWwucmFuZ2VcIj5cclxuICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItbmFtZVwiPlxyXG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleGF1dG9cIj5cclxuICAgICAgICAgICAgICAgICBOYW1lOiB7eyBJbnB1dFZpZXdNb2RlbC5yYW5nZS5uYW1lIH19XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleGF1dG9cIj5cclxuICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzXHJcbiAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiUmVxdWlyZVJhbmdlSW5wdXRGaWx0ZXJPcHRpb24oKVwiPkZpbHRlck9wdGlvbjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBJbnB1dFZpZXdNb2RlbC5yYW5nZS5yZXF1aXJlc1JhbmdlSW5wdXRGaWx0ZXJPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAge3sgb3B0aW9uLnJlcXVpcmVkRmlsdGVyTmFtZSB9fToge3sgb3B0aW9uLnJlcXVpcmVkRmlsdGVyT3B0aW9uTmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIlJlbW92ZVJlcXVpcmVSYW5nZUlucHV0RmlsdGVyT3B0aW9uKG9wdGlvbilcIj5SZW1vdmU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICBcclxuICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICA8L21hdC1jYXJkPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuIl19