fabrikantencore 2.27.6 → 2.28.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.
@@ -0,0 +1,357 @@
1
+ import { Component } from '@angular/core';
2
+ import { TranslationCategory, TranslationSubCategory, TextureRequestModel, TextureMixRequestModel } from '../../swagger/SwaggerClient';
3
+ import { FabDisplayPhotoDialogComponent } from '../fab-display-photo-dialog/fab-display-photo-dialog.component';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../services/mobile.service";
6
+ import * as i2 from "../../services/fabrikanten.service";
7
+ import * as i3 from "../../services/translate.service";
8
+ import * as i4 from "@angular/router";
9
+ import * as i5 from "@angular/material/legacy-dialog";
10
+ import * as i6 from "../../swagger/SwaggerClient";
11
+ import * as i7 from "@angular/common";
12
+ import * as i8 from "@angular/material/legacy-form-field";
13
+ import * as i9 from "@angular/material/legacy-input";
14
+ import * as i10 from "@angular/forms";
15
+ import * as i11 from "@angular/material/legacy-button";
16
+ import * as i12 from "@angular/material/legacy-card";
17
+ import * as i13 from "@angular/material/legacy-progress-spinner";
18
+ import * as i14 from "@angular/material/legacy-select";
19
+ import * as i15 from "@angular/material/legacy-core";
20
+ import * as i16 from "../inputs/fab-input/fab-input.component";
21
+ class FabTextureConfiguratorComponent {
22
+ MobileService;
23
+ FabrikantenService;
24
+ TranslateService;
25
+ ActivatedRoute;
26
+ dialog;
27
+ TextureApiClient;
28
+ ChangeDetectorRef;
29
+ get TranslationCategory() {
30
+ return TranslationCategory;
31
+ }
32
+ get TranslationSubCategory() {
33
+ return TranslationSubCategory;
34
+ }
35
+ SelectedVerbandId = -1;
36
+ SelectedVoegId = -1;
37
+ Lintvoeg = "12";
38
+ Stootvoeg = "10";
39
+ Loading = false;
40
+ mShowMix = false;
41
+ TextureResponseModel = null;
42
+ TextureMixResponseModel = null;
43
+ Steen2 = null;
44
+ Steen3 = null;
45
+ Steen4 = null;
46
+ Steen5 = null;
47
+ constructor(MobileService, FabrikantenService, TranslateService, ActivatedRoute, dialog, TextureApiClient, ChangeDetectorRef) {
48
+ this.MobileService = MobileService;
49
+ this.FabrikantenService = FabrikantenService;
50
+ this.TranslateService = TranslateService;
51
+ this.ActivatedRoute = ActivatedRoute;
52
+ this.dialog = dialog;
53
+ this.TextureApiClient = TextureApiClient;
54
+ this.ChangeDetectorRef = ChangeDetectorRef;
55
+ this.TranslateService.ProcessParameters(this.ActivatedRoute, this.ChangeDetectorRef);
56
+ }
57
+ ngDoCheck() {
58
+ this.SelectFirstChoices();
59
+ this.CleanChoices();
60
+ }
61
+ ngOnInit() {
62
+ this.FabrikantenService.LoadFabrikantenViewModel(this.ChangeDetectorRef, this.ActivatedRoute);
63
+ }
64
+ SelectFirstChoices() {
65
+ if (this.SelectedVerbandId == -1) {
66
+ if (this.FabrikantenService.FabrikantenViewModel?.products != undefined && this.FabrikantenService.FabrikantenViewModel.products.length > 0) {
67
+ for (var i = 0; i < this.FabrikantenService.FabrikantenViewModel.products.length; i++) {
68
+ if (this.FabrikantenService.FabrikantenViewModel.products[i].id == 62) { // halfsteensverband
69
+ this.SelectedVerbandId = this.FabrikantenService.FabrikantenViewModel.products[i].id;
70
+ }
71
+ }
72
+ if (this.SelectedVerbandId == -1) {
73
+ this.SelectedVerbandId = this.FabrikantenService.FabrikantenViewModel.products[0].id;
74
+ }
75
+ }
76
+ }
77
+ if (this.SelectedVoegId == -1) {
78
+ var voeg = this.GetVoeg();
79
+ if (voeg?.filter?.options != undefined && voeg.filter.options.length > 0) {
80
+ this.SelectedVoegId = voeg.filter?.options[0].id;
81
+ }
82
+ }
83
+ }
84
+ CleanChoices() {
85
+ if (!this.IsSteenSelected()) {
86
+ this.mShowMix = false;
87
+ this.TextureMixResponseModel = null;
88
+ this.TextureResponseModel = null;
89
+ this.Steen2 = null;
90
+ this.Steen3 = null;
91
+ this.Steen4 = null;
92
+ this.Steen5 = null;
93
+ }
94
+ }
95
+ TextuurGenereren() {
96
+ this.mShowMix = false;
97
+ var steenid = this.GetSteen()?.filter?.selectedOption;
98
+ if (steenid != undefined) {
99
+ this.Loading = true;
100
+ var request = new TextureRequestModel();
101
+ request.verbandId = this.SelectedVerbandId;
102
+ request.steenId = steenid;
103
+ request.voegId = this.SelectedVoegId;
104
+ if (this.Steen2 == null) {
105
+ request.steen2Id = -1;
106
+ }
107
+ else {
108
+ request.steen2Id = this.Steen2.id;
109
+ }
110
+ if (this.Steen3 == null) {
111
+ request.steen3Id = -1;
112
+ }
113
+ else {
114
+ request.steen3Id = this.Steen3.id;
115
+ }
116
+ if (this.Steen4 == null) {
117
+ request.steen4Id = -1;
118
+ }
119
+ else {
120
+ request.steen4Id = this.Steen4.id;
121
+ }
122
+ if (this.Steen5 == null) {
123
+ request.steen5Id = -1;
124
+ }
125
+ else {
126
+ request.steen5Id = this.Steen5.id;
127
+ }
128
+ request.breedteStootvoeg = parseInt(this.Stootvoeg);
129
+ request.hoogteLintvoeg = parseInt(this.Lintvoeg);
130
+ this.TextureApiClient.getTexture(request).subscribe((model) => {
131
+ this.TextureResponseModel = model;
132
+ this.Loading = false;
133
+ }, (error) => {
134
+ if (error.status == 400)
135
+ console.log(error.json());
136
+ else {
137
+ console.log('An unexpected error occured');
138
+ console.log(error);
139
+ }
140
+ this.Loading = false;
141
+ });
142
+ }
143
+ }
144
+ OpenMix() {
145
+ var steenid = this.GetSteen()?.filter?.selectedOption;
146
+ if (steenid != undefined) {
147
+ this.Loading = true;
148
+ var request = new TextureMixRequestModel();
149
+ request.steenId = steenid;
150
+ this.TextureApiClient.getTextureMix(request).subscribe((model) => {
151
+ this.TextureMixResponseModel = model;
152
+ this.Loading = false;
153
+ this.mShowMix = true;
154
+ }, (error) => {
155
+ if (error.status == 400)
156
+ console.log(error.json());
157
+ else {
158
+ console.log('An unexpected error occured');
159
+ console.log(error);
160
+ }
161
+ this.Loading = false;
162
+ });
163
+ }
164
+ }
165
+ SelectSteen(steen) {
166
+ var processed = false;
167
+ if (this.Steen2 == steen) {
168
+ this.Steen2 = null;
169
+ processed = true;
170
+ }
171
+ if (this.Steen3 == steen) {
172
+ this.Steen2 = null;
173
+ processed = true;
174
+ }
175
+ if (this.Steen4 == steen) {
176
+ this.Steen4 = null;
177
+ processed = true;
178
+ }
179
+ if (this.Steen5 == steen) {
180
+ this.Steen5 = null;
181
+ processed = true;
182
+ }
183
+ if (this.Steen3 != null && this.Steen2 == null) {
184
+ this.Steen2 = this.Steen3;
185
+ this.Steen3 = null;
186
+ }
187
+ if (this.Steen4 != null && this.Steen3 == null) {
188
+ this.Steen3 = this.Steen4;
189
+ this.Steen4 = null;
190
+ }
191
+ if (this.Steen5 != null && this.Steen4 == null) {
192
+ this.Steen4 = this.Steen5;
193
+ this.Steen5 = null;
194
+ }
195
+ if (!processed) {
196
+ if (this.Steen2 == null) {
197
+ this.Steen2 = steen;
198
+ }
199
+ else if (this.Steen3 == null) {
200
+ this.Steen3 = steen;
201
+ }
202
+ else if (this.Steen4 == null) {
203
+ this.Steen4 = steen;
204
+ }
205
+ else if (this.Steen5 == null) {
206
+ this.Steen5 = steen;
207
+ }
208
+ }
209
+ }
210
+ OpenPhoto(url) {
211
+ var dialogRef = this.dialog.open(FabDisplayPhotoDialogComponent, {
212
+ data: {
213
+ url: url
214
+ }
215
+ });
216
+ }
217
+ ShowTexture() {
218
+ if (this.mShowMix) {
219
+ return false;
220
+ }
221
+ if (this.TextureResponseModel != null) {
222
+ return true;
223
+ }
224
+ return false;
225
+ }
226
+ ShowMix() {
227
+ if (!this.IsSteenSelected()) {
228
+ return false;
229
+ }
230
+ if (this.TextureMixResponseModel == null) {
231
+ return false;
232
+ }
233
+ if (this.mShowMix) {
234
+ return true;
235
+ }
236
+ return false;
237
+ }
238
+ IsLoading() {
239
+ if (this.Loading) {
240
+ return true;
241
+ }
242
+ if (this.FabrikantenService.Loading) {
243
+ return true;
244
+ }
245
+ return false;
246
+ }
247
+ IsSteenSelected() {
248
+ var steen = this.GetSteen();
249
+ if (steen?.filled == true) {
250
+ return true;
251
+ }
252
+ return false;
253
+ }
254
+ IsSelected(steen) {
255
+ var steenfilter = this.GetSteen();
256
+ if (steenfilter?.filled == true) {
257
+ if (steenfilter.filter?.selectedOption == steen.id) {
258
+ return true;
259
+ }
260
+ }
261
+ if (this.Steen2 == steen) {
262
+ return true;
263
+ }
264
+ if (this.Steen3 == steen) {
265
+ return true;
266
+ }
267
+ if (this.Steen4 == steen) {
268
+ return true;
269
+ }
270
+ if (this.Steen5 == steen) {
271
+ return true;
272
+ }
273
+ return false;
274
+ }
275
+ IsDisabled(steen) {
276
+ var steenfilter = this.GetSteen();
277
+ if (steenfilter?.filled == true) {
278
+ if (steenfilter.filter?.selectedOption == steen.id) {
279
+ return true;
280
+ }
281
+ }
282
+ if (this.Steen2 != null && this.Steen3 != null && this.Steen4 != null && this.Steen5 != null &&
283
+ this.Steen2 != steen && this.Steen3 != steen && this.Steen4 != steen && this.Steen5 != steen) {
284
+ return true;
285
+ }
286
+ return false;
287
+ }
288
+ GetPatroonDownloadURL() {
289
+ return this.FabrikantenService.FabrikantenSettingsViewModel.bcbWebserviceURLBase + "Download.aspx?file=" + this.TextureResponseModel?.patroonURL + "&doel=" + this.GetActiveSteen() + ".png";
290
+ }
291
+ GetBumpDownloadURL() {
292
+ return this.FabrikantenService.FabrikantenSettingsViewModel.bcbWebserviceURLBase + "Download.aspx?file=" + this.TextureResponseModel?.bumpURL + "&doel=" + this.GetActiveSteen() + "_bump.png";
293
+ }
294
+ CutOffFormat(name) {
295
+ var posstart = name.indexOf('(');
296
+ var posend = name.indexOf(')');
297
+ var newnameafter = name.substring(posend + 1);
298
+ var newname = name.substring(0, posstart);
299
+ return newname + newnameafter;
300
+ }
301
+ GetImagePath(option) {
302
+ var value = option.imagePath + "";
303
+ if (value.indexOf("#BCB#") != -1) {
304
+ var bcburl = this.FabrikantenService.FabrikantenSettingsViewModel.bcbWebserviceURLBase + "";
305
+ bcburl = bcburl.substring(0, bcburl.length - 1);
306
+ value = value.replace("#BCB#", bcburl);
307
+ }
308
+ return value;
309
+ }
310
+ GetSteen() {
311
+ if (this.FabrikantenService.FabrikantenViewModel?.inputs != undefined) {
312
+ for (var i = 0; i < this.FabrikantenService.FabrikantenViewModel.inputs.length; i++) {
313
+ if (this.FabrikantenService.FabrikantenViewModel.inputs[i].filter?.name == "Steen 1") {
314
+ return this.FabrikantenService.FabrikantenViewModel.inputs[i];
315
+ }
316
+ }
317
+ }
318
+ return null;
319
+ }
320
+ GetActiveSteen() {
321
+ var steen = this.GetSteen();
322
+ if (steen?.filter?.options != undefined) {
323
+ for (var i = 0; i < steen.filter.options.length; i++) {
324
+ if (steen.filter.options[i].id == steen.filter.selectedOption) {
325
+ return steen.filter.options[i].urlName + "";
326
+ }
327
+ }
328
+ }
329
+ return "";
330
+ }
331
+ GetVoeg() {
332
+ if (this.FabrikantenService.FabrikantenViewModel?.inputs != undefined) {
333
+ for (var i = 0; i < this.FabrikantenService.FabrikantenViewModel.inputs.length; i++) {
334
+ if (this.FabrikantenService.FabrikantenViewModel.inputs[i].filter?.name == "Voeg") {
335
+ return this.FabrikantenService.FabrikantenViewModel.inputs[i];
336
+ }
337
+ }
338
+ }
339
+ return null;
340
+ }
341
+ GetVerbanden() {
342
+ if (this.FabrikantenService.FabrikantenViewModel?.products != undefined) {
343
+ return this.FabrikantenService.FabrikantenViewModel?.products;
344
+ }
345
+ else {
346
+ return new Array();
347
+ }
348
+ }
349
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FabTextureConfiguratorComponent, deps: [{ token: i1.MobileService }, { token: i2.FabrikantenService }, { token: i3.TranslateService }, { token: i4.ActivatedRoute }, { token: i5.MatLegacyDialog }, { token: i6.TextureApiClient }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
350
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FabTextureConfiguratorComponent, selector: "app-fab-texture-configurator", ngImport: i0, template: "<div *ngIf=\"IsLoading()\" class=\"loader\">\r\n <mat-card class=\"loader-card\">\r\n <mat-card-content>\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </mat-card-content>\r\n <mat-card-subtitle class=\"loader-subtitle\" *ngIf=\"!FabrikantenService.IsStartingDownload()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductsLoading) }}\r\n </mat-card-subtitle>\r\n </mat-card>\r\n</div>\r\n\r\n<div *ngIf=\"!IsLoading()\">\r\n <div class=\"center-block\">\r\n <div>\r\n <div class=\"steen-select\">\r\n <ng-container *ngIf=\"GetSteen() != null\">\r\n <app-fab-input [input]=\"GetSteen()\"></app-fab-input>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"IsSteenSelected()\">\r\n <div *ngIf=\"Steen2 != null\" class=\"steen-div\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, Steen2.id) }}\r\n </div>\r\n\r\n <div *ngIf=\"Steen3 != null\" class=\"steen-div\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, Steen3.id) }}\r\n </div>\r\n\r\n <div *ngIf=\"Steen4 != null\" class=\"steen-div\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, Steen4.id) }}\r\n </div>\r\n\r\n <div *ngIf=\"Steen5 != null\" class=\"steen-div\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, Steen5.id) }}\r\n </div>\r\n\r\n <div class=\"displayflex\">\r\n <div class=\"component-block first-row\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Verband) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVerbandId\">\r\n <ng-container *ngFor=\"let verband of GetVerbanden()\">\r\n <mat-option [value]=\"verband.id\" class=\"select-mat-option\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, verband.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Lintvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"6\" max=\"14\" [(ngModel)]=\"Lintvoeg\">\r\n <!--<mat-error>error</mat-error>-->\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"displayflex\">\r\n <div class=\"component-block first-row\">\r\n <ng-container *ngIf=\"GetVoeg() != null\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Voeg) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVoegId\">\r\n <ng-container *ngFor=\"let voeg of GetVoeg().filter.options\">\r\n <mat-option [value]=\"voeg.id\" class=\"select-mat-option\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, voeg.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Stootvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"6\" max=\"14\" [(ngModel)]=\"Stootvoeg\">\r\n <!--<mat-error>error</mat-error>-->\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"displayflex\">\r\n <button mat-raised-button (click)=\"TextuurGenereren()\" class=\"link\">\r\n Textuur genereren\r\n </button>\r\n <div class=\"flexauto\"></div>\r\n <button mat-raised-button (click)=\"OpenMix()\" class=\"link\">\r\n Mix\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"ShowTexture()\" class=\"main-window flex-col\">\r\n <div class=\"image-row\">\r\n <div>\r\n <div>\r\n <a href=\"{{ TextureResponseModel.patroonURL }}\" target=\"_blank\">\r\n <img class=\"image image-patroon\" src=\"{{ TextureResponseModel.patroonURL }}\" />\r\n </a>\r\n </div>\r\n <div>\r\n <a href=\"{{ GetPatroonDownloadURL() }}\" target=\"_blank\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadTexture) }}\r\n </a>\r\n </div>\r\n <div>\r\n <a href=\"{{ GetBumpDownloadURL() }}\" target=\"_blank\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadBump) }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"ShowMix()\">\r\n <div class=\"main-window flex-col\">\r\n <ng-container *ngFor=\"let option of TextureMixResponseModel.stones\">\r\n <div class=\"filter-option-div\" [ngClass]=\"{'border-selected': IsSelected(option)}\">\r\n <ng-container *ngIf=\"option.imagePath != null && option.imagePath != ''\">\r\n <div class=\"filter-option-image-div\" (click)=\"OpenPhoto(GetImagePath(option))\">\r\n <img src=\"{{ GetImagePath(option) }}\" class=\"filter-option-image\" />\r\n <img class=\"filter-option-image-zoom-in\" />\r\n </div>\r\n </ng-container>\r\n <button mat-raised-button (click)=\"SelectSteen(option)\" class=\"fab-picture-select-button\" [disabled]=\"IsDisabled(option)\">\r\n <span class=\"name-span\">{{ CutOffFormat(TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, option.id)) }}</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".displayflex{display:flex}.steen-select{padding:30px}.fullwidth{width:100%}.first-row{width:300px}.component-block{padding:5px}.center-block{width:-moz-fit-content;width:fit-content;margin:auto;display:flex}.flexauto{flex:auto}.small-input{width:100px}.loader-card{margin:200px auto auto;width:300px}.loader-subtitle{text-align:center}.loader-spinner{margin:auto}.image{width:calc(100vW - 500px);max-width:600px}.image-row{padding:20px}.filter-option-div{border:2px solid #FFF}.steen-div{padding:10px 10px 10px 30px}.border-selected{border:2px solid #0F0}.filter-option-image{max-width:200px;max-height:200px}.filter-option-image-div{width:200px;height:200px;cursor:zoom-in}.main-window{display:flex;flex-wrap:wrap;padding:10px;gap:3px}.fab-picture-select-button{width:100%}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i10.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.MatLegacyButton, 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: i12.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i12.MatLegacyCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { kind: "directive", type: i12.MatLegacyCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "component", type: i13.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i14.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i15.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i16.FabInputComponent, selector: "app-fab-input", inputs: ["input"] }] });
351
+ }
352
+ export { FabTextureConfiguratorComponent };
353
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FabTextureConfiguratorComponent, decorators: [{
354
+ type: Component,
355
+ args: [{ selector: 'app-fab-texture-configurator', template: "<div *ngIf=\"IsLoading()\" class=\"loader\">\r\n <mat-card class=\"loader-card\">\r\n <mat-card-content>\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </mat-card-content>\r\n <mat-card-subtitle class=\"loader-subtitle\" *ngIf=\"!FabrikantenService.IsStartingDownload()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductsLoading) }}\r\n </mat-card-subtitle>\r\n </mat-card>\r\n</div>\r\n\r\n<div *ngIf=\"!IsLoading()\">\r\n <div class=\"center-block\">\r\n <div>\r\n <div class=\"steen-select\">\r\n <ng-container *ngIf=\"GetSteen() != null\">\r\n <app-fab-input [input]=\"GetSteen()\"></app-fab-input>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"IsSteenSelected()\">\r\n <div *ngIf=\"Steen2 != null\" class=\"steen-div\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, Steen2.id) }}\r\n </div>\r\n\r\n <div *ngIf=\"Steen3 != null\" class=\"steen-div\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, Steen3.id) }}\r\n </div>\r\n\r\n <div *ngIf=\"Steen4 != null\" class=\"steen-div\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, Steen4.id) }}\r\n </div>\r\n\r\n <div *ngIf=\"Steen5 != null\" class=\"steen-div\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, Steen5.id) }}\r\n </div>\r\n\r\n <div class=\"displayflex\">\r\n <div class=\"component-block first-row\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Verband) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVerbandId\">\r\n <ng-container *ngFor=\"let verband of GetVerbanden()\">\r\n <mat-option [value]=\"verband.id\" class=\"select-mat-option\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, verband.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Lintvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"6\" max=\"14\" [(ngModel)]=\"Lintvoeg\">\r\n <!--<mat-error>error</mat-error>-->\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"displayflex\">\r\n <div class=\"component-block first-row\">\r\n <ng-container *ngIf=\"GetVoeg() != null\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Voeg) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVoegId\">\r\n <ng-container *ngFor=\"let voeg of GetVoeg().filter.options\">\r\n <mat-option [value]=\"voeg.id\" class=\"select-mat-option\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, voeg.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Stootvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"6\" max=\"14\" [(ngModel)]=\"Stootvoeg\">\r\n <!--<mat-error>error</mat-error>-->\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"displayflex\">\r\n <button mat-raised-button (click)=\"TextuurGenereren()\" class=\"link\">\r\n Textuur genereren\r\n </button>\r\n <div class=\"flexauto\"></div>\r\n <button mat-raised-button (click)=\"OpenMix()\" class=\"link\">\r\n Mix\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"ShowTexture()\" class=\"main-window flex-col\">\r\n <div class=\"image-row\">\r\n <div>\r\n <div>\r\n <a href=\"{{ TextureResponseModel.patroonURL }}\" target=\"_blank\">\r\n <img class=\"image image-patroon\" src=\"{{ TextureResponseModel.patroonURL }}\" />\r\n </a>\r\n </div>\r\n <div>\r\n <a href=\"{{ GetPatroonDownloadURL() }}\" target=\"_blank\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadTexture) }}\r\n </a>\r\n </div>\r\n <div>\r\n <a href=\"{{ GetBumpDownloadURL() }}\" target=\"_blank\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadBump) }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"ShowMix()\">\r\n <div class=\"main-window flex-col\">\r\n <ng-container *ngFor=\"let option of TextureMixResponseModel.stones\">\r\n <div class=\"filter-option-div\" [ngClass]=\"{'border-selected': IsSelected(option)}\">\r\n <ng-container *ngIf=\"option.imagePath != null && option.imagePath != ''\">\r\n <div class=\"filter-option-image-div\" (click)=\"OpenPhoto(GetImagePath(option))\">\r\n <img src=\"{{ GetImagePath(option) }}\" class=\"filter-option-image\" />\r\n <img class=\"filter-option-image-zoom-in\" />\r\n </div>\r\n </ng-container>\r\n <button mat-raised-button (click)=\"SelectSteen(option)\" class=\"fab-picture-select-button\" [disabled]=\"IsDisabled(option)\">\r\n <span class=\"name-span\">{{ CutOffFormat(TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, option.id)) }}</span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".displayflex{display:flex}.steen-select{padding:30px}.fullwidth{width:100%}.first-row{width:300px}.component-block{padding:5px}.center-block{width:-moz-fit-content;width:fit-content;margin:auto;display:flex}.flexauto{flex:auto}.small-input{width:100px}.loader-card{margin:200px auto auto;width:300px}.loader-subtitle{text-align:center}.loader-spinner{margin:auto}.image{width:calc(100vW - 500px);max-width:600px}.image-row{padding:20px}.filter-option-div{border:2px solid #FFF}.steen-div{padding:10px 10px 10px 30px}.border-selected{border:2px solid #0F0}.filter-option-image{max-width:200px;max-height:200px}.filter-option-image-div{width:200px;height:200px;cursor:zoom-in}.main-window{display:flex;flex-wrap:wrap;padding:10px;gap:3px}.fab-picture-select-button{width:100%}\n"] }]
356
+ }], ctorParameters: function () { return [{ type: i1.MobileService }, { type: i2.FabrikantenService }, { type: i3.TranslateService }, { type: i4.ActivatedRoute }, { type: i5.MatLegacyDialog }, { type: i6.TextureApiClient }, { type: i0.ChangeDetectorRef }]; } });
357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9mYWJyaWthbnRlbmNvcmUvY29tcG9uZW50cy9mYWItdGV4dHVyZS1jb25maWd1cmF0b3IvZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9mYWJyaWthbnRlbmNvcmUvY29tcG9uZW50cy9mYWItdGV4dHVyZS1jb25maWd1cmF0b3IvZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUEwQyxNQUFNLGVBQWUsQ0FBQztBQU1yRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQTZHLG1CQUFtQixFQUFpRCxzQkFBc0IsRUFBb0MsTUFBTSw2QkFBNkIsQ0FBQztBQUNuVSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRWhILE1BS2EsK0JBQStCO0lBMkJqQztJQUNBO0lBQ0E7SUFDQztJQUNEO0lBQ0M7SUFDQTtJQS9CVixJQUFXLG1CQUFtQjtRQUM1QixPQUFPLG1CQUFtQixDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFXLHNCQUFzQjtRQUMvQixPQUFPLHNCQUFzQixDQUFDO0lBQ2hDLENBQUM7SUFFTSxpQkFBaUIsR0FBVyxDQUFDLENBQUMsQ0FBQztJQUMvQixjQUFjLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDNUIsUUFBUSxHQUFXLElBQUksQ0FBQztJQUN4QixTQUFTLEdBQVcsSUFBSSxDQUFDO0lBRXpCLE9BQU8sR0FBWSxLQUFLLENBQUM7SUFDeEIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUUzQixvQkFBb0IsR0FBZ0MsSUFBSSxDQUFDO0lBQ3pELHVCQUF1QixHQUFtQyxJQUFJLENBQUM7SUFFL0QsTUFBTSxHQUE0QyxJQUFJLENBQUM7SUFDdkQsTUFBTSxHQUE0QyxJQUFJLENBQUM7SUFDdkQsTUFBTSxHQUE0QyxJQUFJLENBQUM7SUFDdkQsTUFBTSxHQUE0QyxJQUFJLENBQUM7SUFFOUQsWUFDUyxhQUE0QixFQUM1QixrQkFBc0MsRUFDdEMsZ0JBQWtDLEVBQ2pDLGNBQThCLEVBQy9CLE1BQWlCLEVBQ2hCLGdCQUFrQyxFQUNsQyxpQkFBb0M7UUFOckMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2pDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUMvQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUU1QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDaEMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzNJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDckYsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxvQkFBb0I7d0JBQzNGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztxQkFDdEY7aUJBQ0Y7Z0JBRUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDdEY7YUFDRjtTQUNGO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQzdCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUUxQixJQUFJLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN4RSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNsRDtTQUNGO0lBQ0gsQ0FBQztJQUVNLFlBQVk7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRU0sZ0JBQWdCO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO1FBQ3RELElBQUksT0FBTyxJQUFJLFNBQVMsRUFBRTtZQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLE9BQU8sR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFFeEMsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDM0MsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDMUIsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBRXJDLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDdkI7aUJBQ0k7Z0JBQ0gsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzthQUNuQztZQUVELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDdkI7aUJBQ0k7Z0JBQ0gsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzthQUNuQztZQUVELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDdkI7aUJBQ0k7Z0JBQ0gsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzthQUNuQztZQUVELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDdkI7aUJBQ0k7Z0JBQ0gsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzthQUNuQztZQUVELE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVqRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQTJCLEVBQUUsRUFBRTtnQkFDbEYsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztnQkFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDdkIsQ0FBQyxFQUFFLENBQUMsS0FBZSxFQUFFLEVBQUU7Z0JBQ3JCLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxHQUFHO29CQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUN2QjtvQkFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUM7b0JBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3BCO2dCQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRU0sT0FBTztRQUNaLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO1FBQ3RELElBQUksT0FBTyxJQUFJLFNBQVMsRUFBRTtZQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLE9BQU8sR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFFM0MsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFFMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUE4QixFQUFFLEVBQUU7Z0JBQ3hGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUN2QixDQUFDLEVBQUUsQ0FBQyxLQUFlLEVBQUUsRUFBRTtnQkFDckIsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEdBQUc7b0JBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7cUJBQ3ZCO29CQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQztvQkFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDcEI7Z0JBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFTSxXQUFXLENBQUMsS0FBdUM7UUFDeEQsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBRXRCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsU0FBUyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsU0FBUyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsU0FBUyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsU0FBUyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUU7WUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ3BCO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRTtZQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7U0FDcEI7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNwQjtRQUVELElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO2dCQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUNyQjtpQkFDSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO2dCQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUNyQjtpQkFDSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO2dCQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUNyQjtpQkFDSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO2dCQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUNyQjtTQUNGO0lBQ0gsQ0FBQztJQUVNLFNBQVMsQ0FBQyxHQUFXO1FBQzFCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFO1lBQy9ELElBQUksRUFBRTtnQkFDSixHQUFHLEVBQUUsR0FBRzthQUNUO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLEVBQUU7WUFDckMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVNLE9BQU87UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFO1lBQzNCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLEVBQUU7WUFDeEMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU0sU0FBUztRQUNkLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFO1lBQ25DLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxlQUFlO1FBQ3BCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUU1QixJQUFJLEtBQUssRUFBRSxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ3pCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxVQUFVLENBQUMsS0FBdUM7UUFFdkQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWxDLElBQUksV0FBVyxFQUFFLE1BQU0sSUFBSSxJQUFJLEVBQUU7WUFDL0IsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLGNBQWMsSUFBSSxLQUFLLENBQUMsRUFBRSxFQUFFO2dCQUNsRCxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxVQUFVLENBQUMsS0FBdUM7UUFFdkQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWxDLElBQUksV0FBVyxFQUFFLE1BQU0sSUFBSSxJQUFJLEVBQUU7WUFDL0IsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLGNBQWMsSUFBSSxLQUFLLENBQUMsRUFBRSxFQUFFO2dCQUNsRCxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSTtZQUMxRixJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssRUFBRTtZQUM5RixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU0scUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLDRCQUE0QixDQUFDLG9CQUFvQixHQUFHLHFCQUFxQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDL0wsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyw0QkFBNEIsQ0FBQyxvQkFBb0IsR0FBRyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsT0FBTyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsV0FBVyxDQUFDO0lBQ2pNLENBQUM7SUFFTSxZQUFZLENBQUMsSUFBWTtRQUM5QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFL0IsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFMUMsT0FBTyxPQUFPLEdBQUcsWUFBWSxDQUFDO0lBQ2hDLENBQUM7SUFFTSxZQUFZLENBQUMsTUFBd0M7UUFDMUQsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFFbEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ2hDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyw0QkFBNEIsQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7WUFDNUYsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFaEQsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU0sUUFBUTtRQUNiLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixFQUFFLE1BQU0sSUFBSSxTQUFTLEVBQUU7WUFDckUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNuRixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxTQUFTLEVBQUU7b0JBQ3BGLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDL0Q7YUFDRjtTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sY0FBYztRQUNuQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFNUIsSUFBSSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sSUFBSSxTQUFTLEVBQUU7WUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDcEQsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUU7b0JBQzdELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztpQkFDN0M7YUFDRjtTQUNGO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sT0FBTztRQUNaLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixFQUFFLE1BQU0sSUFBSSxTQUFTLEVBQUU7WUFDckUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNuRixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUU7b0JBQ2pGLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDL0Q7YUFDRjtTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sWUFBWTtRQUNqQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLElBQUksU0FBUyxFQUFFO1lBQ3ZFLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQztTQUMvRDthQUNJO1lBQ0gsT0FBTyxJQUFJLEtBQUssRUFBK0IsQ0FBQztTQUNqRDtJQUVILENBQUM7d0dBbFpVLCtCQUErQjs0RkFBL0IsK0JBQStCLG9FQ2Q1Qyw0MU5BK0lBOztTRGpJYSwrQkFBK0I7NEZBQS9CLCtCQUErQjtrQkFMM0MsU0FBUzsrQkFDRSw4QkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkNoYW5nZXMsIERvQ2hlY2ssIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0TGVnYWN5RGlhbG9nIGFzIE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBGYWJyaWthbnRlblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mYWJyaWthbnRlbi5zZXJ2aWNlJztcbmltcG9ydCB7IE1vYmlsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2JpbGUuc2VydmljZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25DYXRlZ29yeSwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeSwgRmFicmlrYW50ZW5UZXh0dXJlQmFzZVZpZXdNb2RlbCwgRmFicmlrYW50ZW5JbnB1dFZpZXdNb2RlbCwgRmFicmlrYW50ZW5Qcm9kdWN0Vmlld01vZGVsLCBUZXh0dXJlQXBpQ2xpZW50LCBUZXh0dXJlUmVxdWVzdE1vZGVsLCBUZXh0dXJlUmVzcG9uc2VNb2RlbCwgVGV4dHVyZU1peFJlc3BvbnNlTW9kZWwsIFRleHR1cmVNaXhSZXF1ZXN0TW9kZWwsIEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsIH0gZnJvbSAnLi4vLi4vc3dhZ2dlci9Td2FnZ2VyQ2xpZW50JztcbmltcG9ydCB7IEZhYkRpc3BsYXlQaG90b0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2ZhYi1kaXNwbGF5LXBob3RvLWRpYWxvZy9mYWItZGlzcGxheS1waG90by1kaWFsb2cuY29tcG9uZW50JztcclxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZmFiLXRleHR1cmUtY29uZmlndXJhdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZhYi10ZXh0dXJlLWNvbmZpZ3VyYXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZhYi10ZXh0dXJlLWNvbmZpZ3VyYXRvci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIERvQ2hlY2sge1xuXG4gIHB1YmxpYyBnZXQgVHJhbnNsYXRpb25DYXRlZ29yeSgpIHtcbiAgICByZXR1cm4gVHJhbnNsYXRpb25DYXRlZ29yeTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgVHJhbnNsYXRpb25TdWJDYXRlZ29yeSgpIHtcbiAgICByZXR1cm4gVHJhbnNsYXRpb25TdWJDYXRlZ29yeTtcbiAgfVxuXG4gIHB1YmxpYyBTZWxlY3RlZFZlcmJhbmRJZDogbnVtYmVyID0gLTE7XG4gIHB1YmxpYyBTZWxlY3RlZFZvZWdJZDogbnVtYmVyID0gLTE7XG4gIHB1YmxpYyBMaW50dm9lZzogc3RyaW5nID0gXCIxMlwiO1xuICBwdWJsaWMgU3Rvb3R2b2VnOiBzdHJpbmcgPSBcIjEwXCI7XG5cbiAgcHVibGljIExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBtU2hvd01peDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBUZXh0dXJlUmVzcG9uc2VNb2RlbDogVGV4dHVyZVJlc3BvbnNlTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIFRleHR1cmVNaXhSZXNwb25zZU1vZGVsOiBUZXh0dXJlTWl4UmVzcG9uc2VNb2RlbCB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBTdGVlbjI6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBTdGVlbjM6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBTdGVlbjQ6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBTdGVlbjU6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIE1vYmlsZVNlcnZpY2U6IE1vYmlsZVNlcnZpY2UsXG4gICAgcHVibGljIEZhYnJpa2FudGVuU2VydmljZTogRmFicmlrYW50ZW5TZXJ2aWNlLFxuICAgIHB1YmxpYyBUcmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgQWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIFRleHR1cmVBcGlDbGllbnQ6IFRleHR1cmVBcGlDbGllbnQsXG4gICAgcHJpdmF0ZSBDaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLlByb2Nlc3NQYXJhbWV0ZXJzKHRoaXMuQWN0aXZhdGVkUm91dGUsIHRoaXMuQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5TZWxlY3RGaXJzdENob2ljZXMoKTtcclxuICAgIHRoaXMuQ2xlYW5DaG9pY2VzKCk7XHJcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkxvYWRGYWJyaWthbnRlblZpZXdNb2RlbCh0aGlzLkNoYW5nZURldGVjdG9yUmVmLCB0aGlzLkFjdGl2YXRlZFJvdXRlKTtcbiAgfVxuXG4gIHB1YmxpYyBTZWxlY3RGaXJzdENob2ljZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuU2VsZWN0ZWRWZXJiYW5kSWQgPT0gLTEpIHtcbiAgICAgIGlmICh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbD8ucHJvZHVjdHMgIT0gdW5kZWZpbmVkICYmIHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLnByb2R1Y3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLnByb2R1Y3RzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwucHJvZHVjdHNbaV0uaWQgPT0gNjIpIHsgLy8gaGFsZnN0ZWVuc3ZlcmJhbmRcclxuICAgICAgICAgICAgdGhpcy5TZWxlY3RlZFZlcmJhbmRJZCA9IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLnByb2R1Y3RzW2ldLmlkO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuU2VsZWN0ZWRWZXJiYW5kSWQgPT0gLTEpIHtcclxuICAgICAgICAgIHRoaXMuU2VsZWN0ZWRWZXJiYW5kSWQgPSB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5wcm9kdWN0c1swXS5pZDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5TZWxlY3RlZFZvZWdJZCA9PSAtMSkge1xuICAgICAgdmFyIHZvZWcgPSB0aGlzLkdldFZvZWcoKTtcclxuXHJcbiAgICAgIGlmICh2b2VnPy5maWx0ZXI/Lm9wdGlvbnMgIT0gdW5kZWZpbmVkICYmIHZvZWcuZmlsdGVyLm9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuU2VsZWN0ZWRWb2VnSWQgPSB2b2VnLmZpbHRlcj8ub3B0aW9uc1swXS5pZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cblxuICBwdWJsaWMgQ2xlYW5DaG9pY2VzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5Jc1N0ZWVuU2VsZWN0ZWQoKSkge1xyXG4gICAgICB0aGlzLm1TaG93TWl4ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuVGV4dHVyZU1peFJlc3BvbnNlTW9kZWwgPSBudWxsO1xyXG4gICAgICB0aGlzLlRleHR1cmVSZXNwb25zZU1vZGVsID0gbnVsbDtcclxuICAgICAgdGhpcy5TdGVlbjIgPSBudWxsO1xyXG4gICAgICB0aGlzLlN0ZWVuMyA9IG51bGw7XHJcbiAgICAgIHRoaXMuU3RlZW40ID0gbnVsbDtcclxuICAgICAgdGhpcy5TdGVlbjUgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cblxuICBwdWJsaWMgVGV4dHV1ckdlbmVyZXJlbigpOiB2b2lkIHtcbiAgICB0aGlzLm1TaG93TWl4ID0gZmFsc2U7XG4gICAgdmFyIHN0ZWVuaWQgPSB0aGlzLkdldFN0ZWVuKCk/LmZpbHRlcj8uc2VsZWN0ZWRPcHRpb247XG4gICAgaWYgKHN0ZWVuaWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xuICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgVGV4dHVyZVJlcXVlc3RNb2RlbCgpO1xyXG5cclxuICAgICAgcmVxdWVzdC52ZXJiYW5kSWQgPSB0aGlzLlNlbGVjdGVkVmVyYmFuZElkO1xyXG4gICAgICByZXF1ZXN0LnN0ZWVuSWQgPSBzdGVlbmlkO1xyXG4gICAgICByZXF1ZXN0LnZvZWdJZCA9IHRoaXMuU2VsZWN0ZWRWb2VnSWQ7XHJcblxyXG4gICAgICBpZiAodGhpcy5TdGVlbjIgPT0gbnVsbCkge1xyXG4gICAgICAgIHJlcXVlc3Quc3RlZW4ySWQgPSAtMTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXF1ZXN0LnN0ZWVuMklkID0gdGhpcy5TdGVlbjIuaWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLlN0ZWVuMyA9PSBudWxsKSB7XHJcbiAgICAgICAgcmVxdWVzdC5zdGVlbjNJZCA9IC0xO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJlcXVlc3Quc3RlZW4zSWQgPSB0aGlzLlN0ZWVuMy5pZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuU3RlZW40ID09IG51bGwpIHtcclxuICAgICAgICByZXF1ZXN0LnN0ZWVuNElkID0gLTE7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmVxdWVzdC5zdGVlbjRJZCA9IHRoaXMuU3RlZW40LmlkO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5TdGVlbjUgPT0gbnVsbCkge1xyXG4gICAgICAgIHJlcXVlc3Quc3RlZW41SWQgPSAtMTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXF1ZXN0LnN0ZWVuNUlkID0gdGhpcy5TdGVlbjUuaWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlcXVlc3QuYnJlZWR0ZVN0b290dm9lZyA9IHBhcnNlSW50KHRoaXMuU3Rvb3R2b2VnKTtcclxuICAgICAgcmVxdWVzdC5ob29ndGVMaW50dm9lZyA9IHBhcnNlSW50KHRoaXMuTGludHZvZWcpO1xyXG5cclxuICAgICAgdGhpcy5UZXh0dXJlQXBpQ2xpZW50LmdldFRleHR1cmUocmVxdWVzdCkuc3Vic2NyaWJlKChtb2RlbDogVGV4dHVyZVJlc3BvbnNlTW9kZWwpID0+IHtcclxuICAgICAgICB0aGlzLlRleHR1cmVSZXNwb25zZU1vZGVsID0gbW9kZWw7XHJcbiAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0sIChlcnJvcjogUmVzcG9uc2UpID0+IHtcclxuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwMClcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yLmpzb24oKSk7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cmVkJyk7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxuXG4gIHB1YmxpYyBPcGVuTWl4KCk6IHZvaWQge1xuICAgIHZhciBzdGVlbmlkID0gdGhpcy5HZXRTdGVlbigpPy5maWx0ZXI/LnNlbGVjdGVkT3B0aW9uO1xuICAgIGlmIChzdGVlbmlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHZhciByZXF1ZXN0ID0gbmV3IFRleHR1cmVNaXhSZXF1ZXN0TW9kZWwoKTtcclxuXHJcbiAgICAgIHJlcXVlc3Quc3RlZW5JZCA9IHN0ZWVuaWQ7XHJcblxyXG4gICAgICB0aGlzLlRleHR1cmVBcGlDbGllbnQuZ2V0VGV4dHVyZU1peChyZXF1ZXN0KS5zdWJzY3JpYmUoKG1vZGVsOiBUZXh0dXJlTWl4UmVzcG9uc2VNb2RlbCkgPT4ge1xyXG4gICAgICAgIHRoaXMuVGV4dHVyZU1peFJlc3BvbnNlTW9kZWwgPSBtb2RlbDtcclxuICAgICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm1TaG93TWl4ID0gdHJ1ZTtcclxuICAgICAgfSwgKGVycm9yOiBSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDAwKVxyXG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IuanNvbigpKTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VyZWQnKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XG5cbiAgcHVibGljIFNlbGVjdFN0ZWVuKHN0ZWVuOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCkge1xuICAgIHZhciBwcm9jZXNzZWQgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLlN0ZWVuMiA9PSBzdGVlbikge1xyXG4gICAgICB0aGlzLlN0ZWVuMiA9IG51bGw7XHJcbiAgICAgIHByb2Nlc3NlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuU3RlZW4zID09IHN0ZWVuKSB7XHJcbiAgICAgIHRoaXMuU3RlZW4yID0gbnVsbDtcclxuICAgICAgcHJvY2Vzc2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5TdGVlbjQgPT0gc3RlZW4pIHtcclxuICAgICAgdGhpcy5TdGVlbjQgPSBudWxsO1xyXG4gICAgICBwcm9jZXNzZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLlN0ZWVuNSA9PSBzdGVlbikge1xyXG4gICAgICB0aGlzLlN0ZWVuNSA9IG51bGw7XHJcbiAgICAgIHByb2Nlc3NlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuU3RlZW4zICE9IG51bGwgJiYgdGhpcy5TdGVlbjIgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLlN0ZWVuMiA9IHRoaXMuU3RlZW4zO1xyXG4gICAgICB0aGlzLlN0ZWVuMyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuU3RlZW40ICE9IG51bGwgJiYgdGhpcy5TdGVlbjMgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLlN0ZWVuMyA9IHRoaXMuU3RlZW40O1xyXG4gICAgICB0aGlzLlN0ZWVuNCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuU3RlZW41ICE9IG51bGwgJiYgdGhpcy5TdGVlbjQgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLlN0ZWVuNCA9IHRoaXMuU3RlZW41O1xyXG4gICAgICB0aGlzLlN0ZWVuNSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFwcm9jZXNzZWQpIHtcclxuICAgICAgaWYgKHRoaXMuU3RlZW4yID09IG51bGwpIHtcclxuICAgICAgICB0aGlzLlN0ZWVuMiA9IHN0ZWVuO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuU3RlZW4zID09IG51bGwpIHtcclxuICAgICAgICB0aGlzLlN0ZWVuMyA9IHN0ZWVuO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuU3RlZW40ID09IG51bGwpIHtcclxuICAgICAgICB0aGlzLlN0ZWVuNCA9IHN0ZWVuO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuU3RlZW41ID09IG51bGwpIHtcclxuICAgICAgICB0aGlzLlN0ZWVuNSA9IHN0ZWVuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxuXG4gIHB1YmxpYyBPcGVuUGhvdG8odXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB2YXIgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihGYWJEaXNwbGF5UGhvdG9EaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHVybDogdXJsXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cblxuICBwdWJsaWMgU2hvd1RleHR1cmUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubVNob3dNaXgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cblxuICAgIGlmICh0aGlzLlRleHR1cmVSZXNwb25zZU1vZGVsICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cblxuICBwdWJsaWMgU2hvd01peCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuSXNTdGVlblNlbGVjdGVkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cblxuICAgIGlmICh0aGlzLlRleHR1cmVNaXhSZXNwb25zZU1vZGVsID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cblxuICAgIGlmICh0aGlzLm1TaG93TWl4KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XG5cbiAgcHVibGljIElzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5Mb2FkaW5nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cblxuICAgIGlmICh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5Mb2FkaW5nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XG5cbiAgcHVibGljIElzU3RlZW5TZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICB2YXIgc3RlZW4gPSB0aGlzLkdldFN0ZWVuKCk7XG5cbiAgICBpZiAoc3RlZW4/LmZpbGxlZCA9PSB0cnVlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XG5cbiAgcHVibGljIElzU2VsZWN0ZWQoc3RlZW46IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogYm9vbGVhbiB7XG5cbiAgICB2YXIgc3RlZW5maWx0ZXIgPSB0aGlzLkdldFN0ZWVuKCk7XG5cbiAgICBpZiAoc3RlZW5maWx0ZXI/LmZpbGxlZCA9PSB0cnVlKSB7XG4gICAgICBpZiAoc3RlZW5maWx0ZXIuZmlsdGVyPy5zZWxlY3RlZE9wdGlvbiA9PSBzdGVlbi5pZCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICBpZiAodGhpcy5TdGVlbjIgPT0gc3RlZW4pIHtcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuU3RlZW4zID09IHN0ZWVuKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cblxuICAgIGlmICh0aGlzLlN0ZWVuNCA9PSBzdGVlbikge1xuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XG5cbiAgICBpZiAodGhpcy5TdGVlbjUgPT0gc3RlZW4pIHtcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cblxuICBwdWJsaWMgSXNEaXNhYmxlZChzdGVlbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiBib29sZWFuIHtcblxuICAgIHZhciBzdGVlbmZpbHRlciA9IHRoaXMuR2V0U3RlZW4oKTtcblxuICAgIGlmIChzdGVlbmZpbHRlcj8uZmlsbGVkID09IHRydWUpIHtcbiAgICAgIGlmIChzdGVlbmZpbHRlci5maWx0ZXI/LnNlbGVjdGVkT3B0aW9uID09IHN0ZWVuLmlkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIGlmICh0aGlzLlN0ZWVuMiAhPSBudWxsICYmIHRoaXMuU3RlZW4zICE9IG51bGwgJiYgdGhpcy5TdGVlbjQgIT0gbnVsbCAmJiB0aGlzLlN0ZWVuNSAhPSBudWxsICYmXG4gICAgICB0aGlzLlN0ZWVuMiAhPSBzdGVlbiAmJiB0aGlzLlN0ZWVuMyAhPSBzdGVlbiAmJiB0aGlzLlN0ZWVuNCAhPSBzdGVlbiAmJiB0aGlzLlN0ZWVuNSAhPSBzdGVlbikge1xuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRQYXRyb29uRG93bmxvYWRVUkwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5TZXR0aW5nc1ZpZXdNb2RlbC5iY2JXZWJzZXJ2aWNlVVJMQmFzZSArIFwiRG93bmxvYWQuYXNweD9maWxlPVwiICsgdGhpcy5UZXh0dXJlUmVzcG9uc2VNb2RlbD8ucGF0cm9vblVSTCArIFwiJmRvZWw9XCIgKyB0aGlzLkdldEFjdGl2ZVN0ZWVuKCkgKyBcIi5wbmdcIjtcclxuICB9XG5cbiAgcHVibGljIEdldEJ1bXBEb3dubG9hZFVSTCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmJjYldlYnNlcnZpY2VVUkxCYXNlICsgXCJEb3dubG9hZC5hc3B4P2ZpbGU9XCIgKyB0aGlzLlRleHR1cmVSZXNwb25zZU1vZGVsPy5idW1wVVJMICsgXCImZG9lbD1cIiArIHRoaXMuR2V0QWN0aXZlU3RlZW4oKSArIFwiX2J1bXAucG5nXCI7XHJcbiAgfVxuXG4gIHB1YmxpYyBDdXRPZmZGb3JtYXQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcG9zc3RhcnQgPSBuYW1lLmluZGV4T2YoJygnKTtcbiAgICB2YXIgcG9zZW5kID0gbmFtZS5pbmRleE9mKCcpJyk7XG5cbiAgICB2YXIgbmV3bmFtZWFmdGVyID0gbmFtZS5zdWJzdHJpbmcocG9zZW5kICsgMSk7XG4gICAgdmFyIG5ld25hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBwb3NzdGFydCk7XG5cbiAgICByZXR1cm4gbmV3bmFtZSArIG5ld25hbWVhZnRlcjtcclxuICB9XG5cbiAgcHVibGljIEdldEltYWdlUGF0aChvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogc3RyaW5nIHtcbiAgICB2YXIgdmFsdWUgPSBvcHRpb24uaW1hZ2VQYXRoICsgXCJcIjtcclxuXHJcbiAgICBpZiAodmFsdWUuaW5kZXhPZihcIiNCQ0IjXCIpICE9IC0xKSB7XHJcbiAgICAgIHZhciBiY2J1cmwgPSB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmJjYldlYnNlcnZpY2VVUkxCYXNlICsgXCJcIjtcclxuICAgICAgYmNidXJsID0gYmNidXJsLnN1YnN0cmluZygwLCBiY2J1cmwubGVuZ3RoIC0gMSk7XHJcblxyXG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoXCIjQkNCI1wiLCBiY2J1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XG5cbiAgcHVibGljIEdldFN0ZWVuKCk6IEZhYnJpa2FudGVuSW5wdXRWaWV3TW9kZWwgfCBudWxsIHtcbiAgICBpZiAodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWw/LmlucHV0cyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmlucHV0c1tpXS5maWx0ZXI/Lm5hbWUgPT0gXCJTdGVlbiAxXCIpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5pbnB1dHNbaV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcclxuICB9XG5cbiAgcHVibGljIEdldEFjdGl2ZVN0ZWVuKCk6IHN0cmluZyB7XG4gICAgdmFyIHN0ZWVuID0gdGhpcy5HZXRTdGVlbigpO1xuXG4gICAgaWYgKHN0ZWVuPy5maWx0ZXI/Lm9wdGlvbnMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZWVuLmZpbHRlci5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHN0ZWVuLmZpbHRlci5vcHRpb25zW2ldLmlkID09IHN0ZWVuLmZpbHRlci5zZWxlY3RlZE9wdGlvbikge1xyXG4gICAgICAgICAgcmV0dXJuIHN0ZWVuLmZpbHRlci5vcHRpb25zW2ldLnVybE5hbWUgKyBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRWb2VnKCk6IEZhYnJpa2FudGVuSW5wdXRWaWV3TW9kZWwgfCBudWxsIHtcbiAgICBpZiAodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWw/LmlucHV0cyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmlucHV0c1tpXS5maWx0ZXI/Lm5hbWUgPT0gXCJWb2VnXCIpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5pbnB1dHNbaV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcclxuICB9XG5cbiAgcHVibGljIEdldFZlcmJhbmRlbigpOiBGYWJyaWthbnRlblByb2R1Y3RWaWV3TW9kZWxbXSB7XG4gICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsPy5wcm9kdWN0cyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbD8ucHJvZHVjdHM7XHJcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEFycmF5PEZhYnJpa2FudGVuUHJvZHVjdFZpZXdNb2RlbD4oKTtcclxuICAgIH1cblxyXG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJJc0xvYWRpbmcoKVwiIGNsYXNzPVwibG9hZGVyXCI+XHJcbiAgPG1hdC1jYXJkIGNsYXNzPVwibG9hZGVyLWNhcmRcIj5cclxuICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICA8bWF0LXNwaW5uZXIgY2xhc3M9XCJsb2FkZXItc3Bpbm5lclwiIFtkaWFtZXRlcl09XCI4MFwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICA8bWF0LWNhcmQtc3VidGl0bGUgY2xhc3M9XCJsb2FkZXItc3VidGl0bGVcIiAqbmdJZj1cIiFGYWJyaWthbnRlblNlcnZpY2UuSXNTdGFydGluZ0Rvd25sb2FkKClcIj5cclxuICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5Qcm9kdWN0c0xvYWRpbmcpIH19XHJcbiAgICA8L21hdC1jYXJkLXN1YnRpdGxlPlxyXG4gIDwvbWF0LWNhcmQ+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cIiFJc0xvYWRpbmcoKVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjZW50ZXItYmxvY2tcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGVlbi1zZWxlY3RcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiR2V0U3RlZW4oKSAhPSBudWxsXCI+XHJcbiAgICAgICAgICA8YXBwLWZhYi1pbnB1dCBbaW5wdXRdPVwiR2V0U3RlZW4oKVwiPjwvYXBwLWZhYi1pbnB1dD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiSXNTdGVlblNlbGVjdGVkKClcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiU3RlZW4yICE9IG51bGxcIiBjbGFzcz1cInN0ZWVuLWRpdlwiPlxyXG4gICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkZpbHRlck9wdGlvbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5OYW1lLCBTdGVlbjIuaWQpIH19XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJTdGVlbjMgIT0gbnVsbFwiIGNsYXNzPVwic3RlZW4tZGl2XCI+XHJcbiAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuRmlsdGVyT3B0aW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk5hbWUsIFN0ZWVuMy5pZCkgfX1cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIlN0ZWVuNCAhPSBudWxsXCIgY2xhc3M9XCJzdGVlbi1kaXZcIj5cclxuICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5GaWx0ZXJPcHRpb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgU3RlZW40LmlkKSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiU3RlZW41ICE9IG51bGxcIiBjbGFzcz1cInN0ZWVuLWRpdlwiPlxyXG4gICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkZpbHRlck9wdGlvbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5OYW1lLCBTdGVlbjUuaWQpIH19XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaXNwbGF5ZmxleFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBvbmVudC1ibG9jayBmaXJzdC1yb3dcIj5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgY2xhc3M9XCJmdWxsd2lkdGhcIj5cclxuICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwic2VsZWN0LW1hdC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5WZXJiYW5kKSB9fVxyXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwiU2VsZWN0ZWRWZXJiYW5kSWRcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZlcmJhbmQgb2YgR2V0VmVyYmFuZGVuKClcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInZlcmJhbmQuaWRcIiBjbGFzcz1cInNlbGVjdC1tYXQtb3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LlByb2R1Y3QsIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgdmVyYmFuZC5pZCkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50LWJsb2NrXCI+XHJcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIGNsYXNzPVwic21hbGwtaW5wdXRcIj5cclxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5MaW50dm9lZykgfX1cclxuICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjZcIiBtYXg9XCIxNFwiIFsobmdNb2RlbCldPVwiTGludHZvZWdcIj5cclxuICAgICAgICAgICAgICA8IS0tPG1hdC1lcnJvcj5lcnJvcjwvbWF0LWVycm9yPi0tPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRpc3BsYXlmbGV4XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50LWJsb2NrIGZpcnN0LXJvd1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiR2V0Vm9lZygpICE9IG51bGxcIj5cclxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBjbGFzcz1cImZ1bGx3aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cInNlbGVjdC1tYXQtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5Wb2VnKSB9fVxyXG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cIlNlbGVjdGVkVm9lZ0lkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZvZWcgb2YgR2V0Vm9lZygpLmZpbHRlci5vcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInZvZWcuaWRcIiBjbGFzcz1cInNlbGVjdC1tYXQtb3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuRmlsdGVyT3B0aW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk5hbWUsIHZvZWcuaWQpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBvbmVudC1ibG9ja1wiPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBjbGFzcz1cInNtYWxsLWlucHV0XCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuU3Rvb3R2b2VnKSB9fVxyXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiNlwiIG1heD1cIjE0XCIgWyhuZ01vZGVsKV09XCJTdG9vdHZvZWdcIj5cclxuICAgICAgICAgICAgICA8IS0tPG1hdC1lcnJvcj5lcnJvcjwvbWF0LWVycm9yPi0tPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaXNwbGF5ZmxleFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiVGV4dHV1ckdlbmVyZXJlbigpXCIgY2xhc3M9XCJsaW5rXCI+XHJcbiAgICAgICAgICAgIFRleHR1dXIgZ2VuZXJlcmVuXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4YXV0b1wiPjwvZGl2PlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiT3Blbk1peCgpXCIgY2xhc3M9XCJsaW5rXCI+XHJcbiAgICAgICAgICAgIE1peFxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIlNob3dUZXh0dXJlKClcIiBjbGFzcz1cIm1haW4td2luZG93IGZsZXgtY29sXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS1yb3dcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGEgaHJlZj1cInt7IFRleHR1cmVSZXNwb25zZU1vZGVsLnBhdHJvb25VUkwgfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5cclxuICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1hZ2UgaW1hZ2UtcGF0cm9vblwiIHNyYz1cInt7IFRleHR1cmVSZXNwb25zZU1vZGVsLnBhdHJvb25VUkwgfX1cIiAvPlxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCJ7eyBHZXRQYXRyb29uRG93bmxvYWRVUkwoKSB9fVwiIHRhcmdldD1cIl9ibGFua1wiPlxyXG4gICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuRG93bmxvYWRUZXh0dXJlKSB9fVxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCJ7eyBHZXRCdW1wRG93bmxvYWRVUkwoKSB9fVwiIHRhcmdldD1cIl9ibGFua1wiPlxyXG4gICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuRG93bmxvYWRCdW1wKSB9fVxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiU2hvd01peCgpXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYWluLXdpbmRvdyBmbGV4LWNvbFwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBUZXh0dXJlTWl4UmVzcG9uc2VNb2RlbC5zdG9uZXNcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItb3B0aW9uLWRpdlwiIFtuZ0NsYXNzXT1cInsnYm9yZGVyLXNlbGVjdGVkJzogSXNTZWxlY3RlZChvcHRpb24pfVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9uLmltYWdlUGF0aCAhPSBudWxsICYmIG9wdGlvbi5pbWFnZVBhdGggIT0gJydcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLW9wdGlvbi1pbWFnZS1kaXZcIiAoY2xpY2spPVwiT3BlblBob3RvKEdldEltYWdlUGF0aChvcHRpb24pKVwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCJ7eyBHZXRJbWFnZVBhdGgob3B0aW9uKSB9fVwiIGNsYXNzPVwiZmlsdGVyLW9wdGlvbi1pbWFnZVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZmlsdGVyLW9wdGlvbi1pbWFnZS16b29tLWluXCIgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIlNlbGVjdFN0ZWVuKG9wdGlvbilcIiBjbGFzcz1cImZhYi1waWN0dXJlLXNlbGVjdC1idXR0b25cIiBbZGlzYWJsZWRdPVwiSXNEaXNhYmxlZChvcHRpb24pXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYW1lLXNwYW5cIj57eyBDdXRPZmZGb3JtYXQoVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkZpbHRlck9wdGlvbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5OYW1lLCBvcHRpb24uaWQpKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==