fx-form-builder-wrapper 0.0.89 → 0.0.91

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.
@@ -28,9 +28,6 @@ export class UploaderComponent extends FxBaseComponent {
28
28
  this._register(this.uploadFileControl);
29
29
  });
30
30
  }
31
- ngOnDestroy() {
32
- throw new Error('Method not implemented.');
33
- }
34
31
  uploadedImages = {};
35
32
  deletedFiles = [];
36
33
  // public ngOnInit(): void {
@@ -116,26 +113,66 @@ export class UploaderComponent extends FxBaseComponent {
116
113
  // }
117
114
  // });
118
115
  // }
116
+ ngOnInit() {
117
+ this.fxBuilderWrapperService.variables$
118
+ .pipe(takeUntil(this.destroy$))
119
+ .subscribe((variables) => {
120
+ if (!variables)
121
+ return;
122
+ const uploadedFilesMap = {};
123
+ // Extract uploader keys and their corresponding URL arrays
124
+ for (const [key, value] of Object.entries(variables)) {
125
+ if (key.includes('uploader') && Array.isArray(value)) {
126
+ uploadedFilesMap[key] = value;
127
+ }
128
+ }
129
+ for (const [uploaderKey, urls] of Object.entries(uploadedFilesMap)) {
130
+ const imageFetches = [];
131
+ urls.forEach((originalUrl) => {
132
+ if (originalUrl) {
133
+ const image$ = this.http.get(originalUrl?.originalUrl, { responseType: 'blob' }).pipe(map((blob) => ({
134
+ result: URL.createObjectURL(blob), // for preview
135
+ originalUrl: originalUrl?.originalUrl // preserve original
136
+ })));
137
+ imageFetches.push(image$);
138
+ }
139
+ });
140
+ if (imageFetches.length > 0) {
141
+ forkJoin(imageFetches).subscribe({
142
+ next: (imageData) => {
143
+ const formatted = imageData.map(item => ({
144
+ id: uuidv4(),
145
+ file: null,
146
+ originalUrl: item.originalUrl,
147
+ result: item.result
148
+ }));
149
+ this.uploadedFiles = [...this.uploadedFiles, ...formatted];
150
+ this.formattedData.uploadedFiles = this.uploadedFiles;
151
+ this.uploadFileControl.setValue(this.formattedData);
152
+ },
153
+ error: (err) => {
154
+ console.error(`Failed to fetch images for ${uploaderKey}:`, err);
155
+ }
156
+ });
157
+ }
158
+ }
159
+ });
160
+ }
119
161
  // ngOnInit(): void {
120
162
  // this.fxBuilderWrapperService.variables$
121
163
  // .pipe(takeUntil(this.destroy$))
122
164
  // .subscribe((variables: any) => {
123
165
  // if (!variables) return;
124
- // const uploadedFilesMap: { [key: string]: string[] } = {};
125
- // // Extract uploader keys and their corresponding URL arrays
126
- // for (const [key, value] of Object.entries(variables)) {
127
- // if (key.includes('uploader') && Array.isArray(value)) {
128
- // uploadedFilesMap[key] = value;
129
- // }
130
- // }
166
+ // const uploadedFilesMap: { [key: string]: { originalUrl: string }[] } = variables.uploadedFiles;
131
167
  // for (const [uploaderKey, urls] of Object.entries(uploadedFilesMap)) {
132
- // const imageFetches: Observable<{ result: string; originalUrl: any }>[] = [];
133
- // urls.forEach((originalUrl:any) => {
168
+ // const imageFetches: Observable<{ result: string; originalUrl: string }>[] = [];
169
+ // urls.forEach((fileObj: any) => {
170
+ // const originalUrl = fileObj?.originalUrl;
134
171
  // if (originalUrl) {
135
- // const image$ = this.http.get(originalUrl?.originalUrl, { responseType: 'blob' }).pipe(
172
+ // const image$ = this.http.get(originalUrl, { responseType: 'blob' }).pipe(
136
173
  // map((blob: Blob) => ({
137
174
  // result: URL.createObjectURL(blob), // for preview
138
- // originalUrl: originalUrl?.originalUrl // preserve original
175
+ // originalUrl
139
176
  // }))
140
177
  // );
141
178
  // imageFetches.push(image$);
@@ -162,46 +199,6 @@ export class UploaderComponent extends FxBaseComponent {
162
199
  // }
163
200
  // });
164
201
  // }
165
- ngOnInit() {
166
- this.fxBuilderWrapperService.variables$
167
- .pipe(takeUntil(this.destroy$))
168
- .subscribe((variables) => {
169
- if (!variables?.uploadedFiles)
170
- return;
171
- const uploadedFilesMap = variables.uploadedFiles;
172
- for (const [uploaderKey, urls] of Object.entries(uploadedFilesMap)) {
173
- const imageFetches = [];
174
- urls.forEach((fileObj) => {
175
- const originalUrl = fileObj?.originalUrl;
176
- if (originalUrl) {
177
- const image$ = this.http.get(originalUrl, { responseType: 'blob' }).pipe(map((blob) => ({
178
- result: URL.createObjectURL(blob), // for preview
179
- originalUrl
180
- })));
181
- imageFetches.push(image$);
182
- }
183
- });
184
- if (imageFetches.length > 0) {
185
- forkJoin(imageFetches).subscribe({
186
- next: (imageData) => {
187
- const formatted = imageData.map(item => ({
188
- id: uuidv4(),
189
- file: null,
190
- originalUrl: item.originalUrl,
191
- result: item.result
192
- }));
193
- this.uploadedFiles = [...this.uploadedFiles, ...formatted];
194
- this.formattedData.uploadedFiles = this.uploadedFiles;
195
- this.uploadFileControl.setValue(this.formattedData);
196
- },
197
- error: (err) => {
198
- console.error(`Failed to fetch images for ${uploaderKey}:`, err);
199
- }
200
- });
201
- }
202
- }
203
- });
204
- }
205
202
  // public onFileSelected(event: Event) {
206
203
  // const input = event.target as HTMLInputElement;
207
204
  // if (input.files) {
@@ -288,10 +285,10 @@ export class UploaderComponent extends FxBaseComponent {
288
285
  return [FxValidatorService.required];
289
286
  }
290
287
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploaderComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.FxBuilderWrapperService }], target: i0.ɵɵFactoryTarget.Component });
291
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UploaderComponent, isStandalone: true, selector: "fx-uploader", usesInheritance: true, ngImport: i0, template: "<fx-component [fxData]=\"fxData\">\r\n <div class=\"custom-upload\">\r\n <button type=\"button\" (click)=\"fileInput.click()\">\r\n {{ setting('upload-text') }}\r\n </button>\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n [multiple]=\"setting('multiple-upload')\"\r\n (change)=\"onFileSelected($event)\"\r\n hidden\r\n />\r\n <div class=\"file-list\">\r\n <ng-container *ngIf=\"uploadedFiles?.length\">\r\n <div *ngFor=\"let file of uploadedFiles; let i = index\" (click)=\"deleteFile(i)\">\r\n <img\r\n class=\"file-thumbnail\"\r\n style=\"border-radius: 4px\"\r\n [src]=\"file?.result\"\r\n alt=\"\"\r\n />\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n </div>\r\n</fx-component>\r\n\r\n", styles: [".custom-upload{display:flex;flex-direction:row;align-items:flex-start}.custom-upload button{padding:10px 20px;font-size:16px;font-weight:700;color:#fff;background-color:#007bff;border:none;border-radius:5px;cursor:pointer;transition:background-color .3s}.custom-upload button:hover{background-color:#0056b3}.custom-upload .file-list{display:flex}.custom-upload .file-list p{margin:0;padding:5px;background-color:#f1f1f1;border:1px solid #ddd;border-radius:3px;font-size:14px}.custom-upload .file-list>div{display:flex;flex-direction:column;align-items:center;justify-content:center}.custom-upload .file-list .file-thumbnail{width:100px;height:100px;object-fit:contain}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FxComponent, selector: "fx-component", inputs: ["fxData"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }] });
288
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UploaderComponent, isStandalone: true, selector: "fx-uploader", usesInheritance: true, ngImport: i0, template: "<fx-component [fxData]=\"fxData\">\r\n <div class=\"custom-upload flex flex-row items-center gap-2 p-2 pb-0 rounded-sm\">\r\n <div class=\"flex flex-col justify-center items-center\" (click)=\"fileInput.click()\">\r\n <div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"29\" height=\"28\" viewBox=\"0 0 29 28\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.001 3.00195C11.5322 3.00195 9.16722 3.86956 7.23641 5.38414L7.23598 4.59695C7.23598 4.52473 7.22175 4.45321 7.19411 4.38648C7.16647 4.31975 7.12596 4.25912 7.07489 4.20804C7.02381 4.15697 6.96318 4.11646 6.89645 4.08882C6.82972 4.06118 6.7582 4.04695 6.68598 4.04695C6.61375 4.04695 6.54223 4.06118 6.4755 4.08882C6.40877 4.11646 6.34814 4.15697 6.29707 4.20804C6.24599 4.25912 6.20548 4.31975 6.17784 4.38648C6.1502 4.45321 6.13598 4.52473 6.13598 4.59695L6.13642 6.68652C6.13643 6.83239 6.19438 6.97228 6.29752 7.07542C6.40067 7.17856 6.54055 7.23651 6.68642 7.23652H8.77598C8.8482 7.23652 8.91972 7.2223 8.98645 7.19466C9.05318 7.16702 9.11381 7.12651 9.16489 7.07543C9.21596 7.02436 9.25647 6.96373 9.28411 6.897C9.31175 6.83027 9.32598 6.75875 9.32598 6.68652C9.32598 6.6143 9.31175 6.54278 9.28411 6.47605C9.25647 6.40932 9.21596 6.34869 9.16489 6.29761C9.11381 6.24654 9.05318 6.20603 8.98645 6.17839C8.91972 6.15075 8.8482 6.13652 8.77598 6.13652H8.0584C9.7702 4.84387 11.8399 4.10195 14.001 4.10195C19.4751 4.10195 23.901 8.52782 23.901 14.002C23.901 19.4761 19.4751 23.902 14.001 23.902C8.52684 23.902 4.10098 19.4761 4.10098 14.002C4.10098 12.6381 4.38263 11.2888 4.92855 10.0389C4.98691 9.90532 4.98982 9.75399 4.93665 9.61822C4.88347 9.48246 4.77855 9.37336 4.64496 9.31492C4.57877 9.28596 4.50753 9.27032 4.4353 9.2689C4.36306 9.26747 4.29126 9.2803 4.22398 9.30663C4.15671 9.33297 4.09528 9.3723 4.04321 9.42238C3.99114 9.47247 3.94944 9.53232 3.92051 9.59852C3.31393 10.9872 3.00098 12.4866 3.00098 14.002C3.00098 20.0706 7.93236 25.002 14.001 25.002C20.0696 25.002 25.001 20.0706 25.001 14.002C25.001 7.93334 20.0696 3.00195 14.001 3.00195Z\"\r\n fill=\"#F3A041\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M13.9988 6.13965C9.6616 6.13965 6.13379 9.66746 6.13379 14.0046C6.13379 18.3418 9.6616 21.8696 13.9988 21.8696C18.336 21.8696 21.8638 18.3418 21.8638 14.0046C21.8638 9.66746 18.336 6.13965 13.9988 6.13965ZM13.9988 8.22965C14.1447 8.22965 14.2846 8.28759 14.3877 8.39074C14.4908 8.49388 14.5488 8.63378 14.5488 8.77965V13.7769L17.5227 16.7508C17.6258 16.8539 17.6837 16.9938 17.6837 17.1396C17.6837 17.2855 17.6258 17.4254 17.5227 17.5285C17.4195 17.6316 17.2796 17.6896 17.1338 17.6896C16.9879 17.6896 16.8481 17.6316 16.7449 17.5285L13.6099 14.3935C13.5068 14.2904 13.4488 14.1505 13.4488 14.0046V8.77965C13.4488 8.63378 13.5067 8.49388 13.6099 8.39074C13.713 8.28759 13.8529 8.22965 13.9988 8.22965Z\"\r\n fill=\"#F3A041\" />\r\n <rect width=\"28.56\" height=\"28\" rx=\"1.51479\" fill=\"#F3A041\" />\r\n <path\r\n d=\"M15.068 22.7391V17.6708H18.4968L14.2108 12.6025L9.9248 17.6708H13.3536V22.7391H9.06759V22.6969C8.92358 22.7053 8.78643 22.7391 8.63899 22.7391C6.93391 22.7391 5.29866 22.0717 4.09298 20.8835C2.8873 19.6954 2.20996 18.084 2.20996 16.4037C2.20996 13.1532 4.70443 10.5042 7.90523 10.141C8.18585 8.6953 8.96892 7.39118 10.1197 6.45292C11.2706 5.51465 12.7172 5.00089 14.2108 5C15.7047 5.00082 17.1515 5.51452 18.3026 6.45277C19.4537 7.39101 20.2371 8.69516 20.5181 10.141C23.7189 10.5042 26.21 13.1532 26.21 16.4037C26.21 18.084 25.5326 19.6954 24.3269 20.8835C23.1213 22.0717 21.486 22.7391 19.7809 22.7391C19.6369 22.7391 19.4981 22.7053 19.3523 22.6969V22.7391H15.068Z\"\r\n fill=\"white\" />\r\n </svg>\r\n </div>\r\n <a type=\"button\" (click)=\"fileInput.click()\" class=\"text-base cursor-pointer\">\r\n {{ setting('upload-text') }}\r\n </a>\r\n </div>\r\n <input #fileInput type=\"file\" [multiple]=\"setting('multiple-upload')\" (change)=\"onFileSelected($event)\" hidden />\r\n <div class=\"separator\"></div>\r\n <div class=\"file-list flex items-center gap-4 flex-wrap\">\r\n <ng-container *ngIf=\"uploadedFiles?.length\">\r\n <div *ngFor=\"let file of uploadedFiles; let i = index\" (click)=\"deleteFile(i)\"\r\n class=\"flex flex-col items-center justify-center\">\r\n <div class=\"relative\">\r\n <div class=\"close_icon cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_6837_29683)\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"#F3A041\" />\r\n <mask id=\"mask0_6837_29683\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"4\" y=\"4\" width=\"24\"\r\n height=\"24\">\r\n <rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_6837_29683)\">\r\n <path\r\n d=\"M8.2045 8.99815L5.81802 6.61167L6.61351 5.81617L9 8.20266L11.3865 5.81617L12.182 6.61167L9.7955 8.99815L12.182 11.3846L11.3865 12.1801L9 9.79365L6.61351 12.1801L5.81802 11.3846L8.2045 8.99815Z\"\r\n fill=\"white\" />\r\n </g>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_6837_29683\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <img class=\"file-thumbnail\" style=\"border-radius: 4px\" [src]=\"file?.result\" alt=\"\" />\r\n </div>\r\n\r\n <p>{{file?.name}}</p>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</fx-component>", styles: [".custom-upload{border:1px solid #ccc}.custom-upload a{color:#000}.custom-upload .file-list .file-thumbnail{width:120px;height:auto;border:1px solid #ccc;background-color:#fff;padding:4px}.custom-upload .separator{height:56px;width:2px;background-color:#ccc;margin:10px}.close_icon{position:absolute;top:-8px;right:-8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FxComponent, selector: "fx-component", inputs: ["fxData"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }] });
292
289
  }
293
290
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploaderComponent, decorators: [{
294
291
  type: Component,
295
- args: [{ selector: 'fx-uploader', standalone: true, imports: [CommonModule, FxComponent, FormsModule, ReactiveFormsModule], template: "<fx-component [fxData]=\"fxData\">\r\n <div class=\"custom-upload\">\r\n <button type=\"button\" (click)=\"fileInput.click()\">\r\n {{ setting('upload-text') }}\r\n </button>\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n [multiple]=\"setting('multiple-upload')\"\r\n (change)=\"onFileSelected($event)\"\r\n hidden\r\n />\r\n <div class=\"file-list\">\r\n <ng-container *ngIf=\"uploadedFiles?.length\">\r\n <div *ngFor=\"let file of uploadedFiles; let i = index\" (click)=\"deleteFile(i)\">\r\n <img\r\n class=\"file-thumbnail\"\r\n style=\"border-radius: 4px\"\r\n [src]=\"file?.result\"\r\n alt=\"\"\r\n />\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n </div>\r\n</fx-component>\r\n\r\n", styles: [".custom-upload{display:flex;flex-direction:row;align-items:flex-start}.custom-upload button{padding:10px 20px;font-size:16px;font-weight:700;color:#fff;background-color:#007bff;border:none;border-radius:5px;cursor:pointer;transition:background-color .3s}.custom-upload button:hover{background-color:#0056b3}.custom-upload .file-list{display:flex}.custom-upload .file-list p{margin:0;padding:5px;background-color:#f1f1f1;border:1px solid #ddd;border-radius:3px;font-size:14px}.custom-upload .file-list>div{display:flex;flex-direction:column;align-items:center;justify-content:center}.custom-upload .file-list .file-thumbnail{width:100px;height:100px;object-fit:contain}\n"] }]
292
+ args: [{ selector: 'fx-uploader', standalone: true, imports: [CommonModule, FxComponent, FormsModule, ReactiveFormsModule], template: "<fx-component [fxData]=\"fxData\">\r\n <div class=\"custom-upload flex flex-row items-center gap-2 p-2 pb-0 rounded-sm\">\r\n <div class=\"flex flex-col justify-center items-center\" (click)=\"fileInput.click()\">\r\n <div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"29\" height=\"28\" viewBox=\"0 0 29 28\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.001 3.00195C11.5322 3.00195 9.16722 3.86956 7.23641 5.38414L7.23598 4.59695C7.23598 4.52473 7.22175 4.45321 7.19411 4.38648C7.16647 4.31975 7.12596 4.25912 7.07489 4.20804C7.02381 4.15697 6.96318 4.11646 6.89645 4.08882C6.82972 4.06118 6.7582 4.04695 6.68598 4.04695C6.61375 4.04695 6.54223 4.06118 6.4755 4.08882C6.40877 4.11646 6.34814 4.15697 6.29707 4.20804C6.24599 4.25912 6.20548 4.31975 6.17784 4.38648C6.1502 4.45321 6.13598 4.52473 6.13598 4.59695L6.13642 6.68652C6.13643 6.83239 6.19438 6.97228 6.29752 7.07542C6.40067 7.17856 6.54055 7.23651 6.68642 7.23652H8.77598C8.8482 7.23652 8.91972 7.2223 8.98645 7.19466C9.05318 7.16702 9.11381 7.12651 9.16489 7.07543C9.21596 7.02436 9.25647 6.96373 9.28411 6.897C9.31175 6.83027 9.32598 6.75875 9.32598 6.68652C9.32598 6.6143 9.31175 6.54278 9.28411 6.47605C9.25647 6.40932 9.21596 6.34869 9.16489 6.29761C9.11381 6.24654 9.05318 6.20603 8.98645 6.17839C8.91972 6.15075 8.8482 6.13652 8.77598 6.13652H8.0584C9.7702 4.84387 11.8399 4.10195 14.001 4.10195C19.4751 4.10195 23.901 8.52782 23.901 14.002C23.901 19.4761 19.4751 23.902 14.001 23.902C8.52684 23.902 4.10098 19.4761 4.10098 14.002C4.10098 12.6381 4.38263 11.2888 4.92855 10.0389C4.98691 9.90532 4.98982 9.75399 4.93665 9.61822C4.88347 9.48246 4.77855 9.37336 4.64496 9.31492C4.57877 9.28596 4.50753 9.27032 4.4353 9.2689C4.36306 9.26747 4.29126 9.2803 4.22398 9.30663C4.15671 9.33297 4.09528 9.3723 4.04321 9.42238C3.99114 9.47247 3.94944 9.53232 3.92051 9.59852C3.31393 10.9872 3.00098 12.4866 3.00098 14.002C3.00098 20.0706 7.93236 25.002 14.001 25.002C20.0696 25.002 25.001 20.0706 25.001 14.002C25.001 7.93334 20.0696 3.00195 14.001 3.00195Z\"\r\n fill=\"#F3A041\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M13.9988 6.13965C9.6616 6.13965 6.13379 9.66746 6.13379 14.0046C6.13379 18.3418 9.6616 21.8696 13.9988 21.8696C18.336 21.8696 21.8638 18.3418 21.8638 14.0046C21.8638 9.66746 18.336 6.13965 13.9988 6.13965ZM13.9988 8.22965C14.1447 8.22965 14.2846 8.28759 14.3877 8.39074C14.4908 8.49388 14.5488 8.63378 14.5488 8.77965V13.7769L17.5227 16.7508C17.6258 16.8539 17.6837 16.9938 17.6837 17.1396C17.6837 17.2855 17.6258 17.4254 17.5227 17.5285C17.4195 17.6316 17.2796 17.6896 17.1338 17.6896C16.9879 17.6896 16.8481 17.6316 16.7449 17.5285L13.6099 14.3935C13.5068 14.2904 13.4488 14.1505 13.4488 14.0046V8.77965C13.4488 8.63378 13.5067 8.49388 13.6099 8.39074C13.713 8.28759 13.8529 8.22965 13.9988 8.22965Z\"\r\n fill=\"#F3A041\" />\r\n <rect width=\"28.56\" height=\"28\" rx=\"1.51479\" fill=\"#F3A041\" />\r\n <path\r\n d=\"M15.068 22.7391V17.6708H18.4968L14.2108 12.6025L9.9248 17.6708H13.3536V22.7391H9.06759V22.6969C8.92358 22.7053 8.78643 22.7391 8.63899 22.7391C6.93391 22.7391 5.29866 22.0717 4.09298 20.8835C2.8873 19.6954 2.20996 18.084 2.20996 16.4037C2.20996 13.1532 4.70443 10.5042 7.90523 10.141C8.18585 8.6953 8.96892 7.39118 10.1197 6.45292C11.2706 5.51465 12.7172 5.00089 14.2108 5C15.7047 5.00082 17.1515 5.51452 18.3026 6.45277C19.4537 7.39101 20.2371 8.69516 20.5181 10.141C23.7189 10.5042 26.21 13.1532 26.21 16.4037C26.21 18.084 25.5326 19.6954 24.3269 20.8835C23.1213 22.0717 21.486 22.7391 19.7809 22.7391C19.6369 22.7391 19.4981 22.7053 19.3523 22.6969V22.7391H15.068Z\"\r\n fill=\"white\" />\r\n </svg>\r\n </div>\r\n <a type=\"button\" (click)=\"fileInput.click()\" class=\"text-base cursor-pointer\">\r\n {{ setting('upload-text') }}\r\n </a>\r\n </div>\r\n <input #fileInput type=\"file\" [multiple]=\"setting('multiple-upload')\" (change)=\"onFileSelected($event)\" hidden />\r\n <div class=\"separator\"></div>\r\n <div class=\"file-list flex items-center gap-4 flex-wrap\">\r\n <ng-container *ngIf=\"uploadedFiles?.length\">\r\n <div *ngFor=\"let file of uploadedFiles; let i = index\" (click)=\"deleteFile(i)\"\r\n class=\"flex flex-col items-center justify-center\">\r\n <div class=\"relative\">\r\n <div class=\"close_icon cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_6837_29683)\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"#F3A041\" />\r\n <mask id=\"mask0_6837_29683\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"4\" y=\"4\" width=\"24\"\r\n height=\"24\">\r\n <rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_6837_29683)\">\r\n <path\r\n d=\"M8.2045 8.99815L5.81802 6.61167L6.61351 5.81617L9 8.20266L11.3865 5.81617L12.182 6.61167L9.7955 8.99815L12.182 11.3846L11.3865 12.1801L9 9.79365L6.61351 12.1801L5.81802 11.3846L8.2045 8.99815Z\"\r\n fill=\"white\" />\r\n </g>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_6837_29683\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <img class=\"file-thumbnail\" style=\"border-radius: 4px\" [src]=\"file?.result\" alt=\"\" />\r\n </div>\r\n\r\n <p>{{file?.name}}</p>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</fx-component>", styles: [".custom-upload{border:1px solid #ccc}.custom-upload a{color:#000}.custom-upload .file-list .file-thumbnail{width:120px;height:auto;border:1px solid #ccc;background-color:#fff;padding:4px}.custom-upload .separator{height:56px;width:2px;background-color:#ccc;margin:10px}.close_icon{position:absolute;top:-8px;right:-8px}\n"] }]
296
293
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.FxBuilderWrapperService }] });
297
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZngtYnVpbGRlci13cmFwcGVyL3NyYy9saWIvY29tcG9uZW50cy91cGxvYWRlci91cGxvYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL3VwbG9hZGVyL3VwbG9hZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFvQyxTQUFTLEVBQUUsTUFBTSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBc0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRyxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQWEsZUFBZSxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxKLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckUsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7QUFTbkMsTUFBTSxPQUFPLGlCQUFrQixTQUFRLGVBQWU7SUFVaEM7SUFBK0I7SUFUbkQsdURBQXVEO0lBQ2hELGlCQUFpQixHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDdEMsYUFBYSxHQUFlLEVBQUUsQ0FBQztJQUMvQixhQUFhLEdBQVE7UUFDMUIsYUFBYSxFQUFFLEVBQUU7UUFDakIsWUFBWSxFQUFFLEVBQUU7S0FDakIsQ0FBQztJ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QVE7UUFDaEIsT0FBTztZQUNMLElBQUksZUFBZSxDQUFDLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUMsQ0FBQztZQUN2RixJQUFJLGVBQWUsQ0FBQyxFQUFDLEdBQUcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBQyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsRUFBRSxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7U0FDN0osQ0FBQztJQUNKLENBQUM7SUFFUyxXQUFXO1FBQ25CLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO3dHQXBVVSxpQkFBaUI7NEZBQWpCLGlCQUFpQiw4RkNoQjlCLHEwQkE0QkEsdXRCRGhCWSxZQUFZLGdRQUFFLFdBQVcsNEVBQUUsV0FBVyw4QkFBRSxtQkFBbUI7OzRGQUkxRCxpQkFBaUI7a0JBUDdCLFNBQVM7K0JBQ0UsYUFBYSxjQUNYLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgaW5qZWN0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFVudHlwZWRGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRnhCYXNlQ29tcG9uZW50LCBGeENvbXBvbmVudCwgRnhTZWxlY3RTZXR0aW5nLCBGeFNldHRpbmcsIEZ4U3RyaW5nU2V0dGluZywgRnhWYWxpZGF0aW9uLCBGeFZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICdAaW5zdGFudHN5cy1sYWJzL2Z4JztcclxuaW1wb3J0IHsgRnhCdWlsZGVyV3JhcHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9meC1idWlsZGVyLXdyYXBwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBtYXAsIE9ic2VydmFibGUsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjR9IGZyb20gJ3V1aWQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdmeC11cGxvYWRlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGeENvbXBvbmVudCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91cGxvYWRlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3VwbG9hZGVyLmNvbXBvbmVudC5jc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVcGxvYWRlckNvbXBvbmVudCBleHRlbmRzIEZ4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvLyBwdWJsaWMgdXBsb2FkRmlsZUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XHJcbiAgcHVibGljIHVwbG9hZEZpbGVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XHJcbiAgcHVibGljIHVwbG9hZGVkRmlsZXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBwdWJsaWMgZm9ybWF0dGVkRGF0YTogYW55ID0ge1xyXG4gICAgdXBsb2FkZWRGaWxlczogW10sXHJcbiAgICBkZWxldGVkRmlsZXM6IFtdXHJcbiAgfTtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Qm9vbGVhbj4oKTtcclxuICBwcml2YXRlIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLHByaXZhdGUgZnhCdWlsZGVyV3JhcHBlclNlcnZpY2U6IEZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihjZHIpXHJcbiAgICB0aGlzLm9uSW5pdC5zdWJzY3JpYmUoKGZ4RGF0YSk9PntcclxuICAgICAgdGhpcy5fcmVnaXN0ZXIodGhpcy51cGxvYWRGaWxlQ29udHJvbCk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XHJcbiAgfVxyXG5cclxuICB1cGxvYWRlZEltYWdlczogeyBba2V5OiBzdHJpbmddOiB7IHJlc3VsdDogc3RyaW5nLCBmaWxlOiBGaWxlIHwgbnVsbCB9W10gfSA9IHt9O1xyXG4gIGRlbGV0ZWRGaWxlczogYW55W10gPSBbXTtcclxuICAvLyBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLmZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlLnZhcmlhYmxlcyRcclxuICAvLyAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gIC8vICAgICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgIGlmICghdmFyaWFibGVzKSByZXR1cm47XHJcbiAgXHJcbiAgLy8gICAgICAgY29uc3QgdXBsb2FkZWRGaWxlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XHJcbiAgXHJcbiAgLy8gICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVzKSkge1xyXG4gIC8vICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygndXBsb2FkZXInKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gIC8vICAgICAgICAgICB1cGxvYWRlZEZpbGVzW2tleV0gPSB2YWx1ZTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgXHJcbiAgLy8gICAgICAgZm9yIChjb25zdCBbdXBsb2FkZXJLZXksIHVybHNdIG9mIE9iamVjdC5lbnRyaWVzKHVwbG9hZGVkRmlsZXMpKSB7XHJcbiAgLy8gICAgICAgICBjb25zdCBpbWFnZUZldGNoZXM6IE9ic2VydmFibGU8c3RyaW5nPltdID0gW107XHJcbiAgXHJcbiAgLy8gICAgICAgICB1cmxzLmZvckVhY2goKHVybDogc3RyaW5nKSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGlmICh1cmwpIHtcclxuICAvLyAgICAgICAgICAgICBjb25zdCBpbWFnZSQgPSB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJyB9KS5waXBlKFxyXG4gIC8vICAgICAgICAgICAgICAgbWFwKChibG9iOiBCbG9iKSA9PiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpKVxyXG4gIC8vICAgICAgICAgICAgICk7XHJcbiAgLy8gICAgICAgICAgICAgaW1hZ2VGZXRjaGVzLnB1c2goaW1hZ2UkKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfSk7XHJcbiAgXHJcbiAgLy8gICAgICAgICBpZiAoaW1hZ2VGZXRjaGVzLmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgICBmb3JrSm9pbihpbWFnZUZldGNoZXMpLnN1YnNjcmliZSh7XHJcbiAgLy8gICAgICAgICAgICAgbmV4dDogKGltYWdlVXJsczogc3RyaW5nW10pID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRJbWFnZXNbdXBsb2FkZXJLZXldID0gaW1hZ2VVcmxzLm1hcChyZXN1bHQgPT4gKHtcclxuICAvLyAgICAgICAgICAgICAgICAgcmVzdWx0LFxyXG4gIC8vICAgICAgICAgICAgICAgICBmaWxlOiBudWxsXHJcbiAgLy8gICAgICAgICAgICAgICB9KSk7XHJcbiAgLy8gICAgICAgICAgICAgICAvLyB0aGlzLnVwbG9hZGVkRmlsZXMgPSBbLi4udGhpcy51cGxvYWRlZEltYWdlc11cclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IE9iamVjdC52YWx1ZXModGhpcy51cGxvYWRlZEltYWdlcykuZmxhdCgpO1xyXG4gIC8vICAgICAgICAgICAgIH0sXHJcbiAgLy8gICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCBpbWFnZXMgZm9yICR7dXBsb2FkZXJLZXl9OmAsIGVycik7XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vIH1cclxuICBcclxuICAvLyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAvLyAgIHRoaXMuZnhCdWlsZGVyV3JhcHBlclNlcnZpY2UudmFyaWFibGVzJFxyXG4gIC8vICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgLy8gICAgIC5zdWJzY3JpYmUoKHZhcmlhYmxlczogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKCF2YXJpYWJsZXMpIHJldHVybjtcclxuXHJcbiAgLy8gICAgICAgY29uc3QgdXBsb2FkZWRGaWxlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XHJcblxyXG4gIC8vICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykpIHtcclxuICAvLyAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ3VwbG9hZGVyJykgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAvLyAgICAgICAgICAgdXBsb2FkZWRGaWxlc1trZXldID0gdmFsdWU7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG5cclxuICAvLyAgICAgICBmb3IgKGNvbnN0IFt1cGxvYWRlcktleSwgdXJsc10gb2YgT2JqZWN0LmVudHJpZXModXBsb2FkZWRGaWxlcykpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IGltYWdlRmV0Y2hlczogT2JzZXJ2YWJsZTx7IHJlc3VsdDogc3RyaW5nLCBvcmlnaW5hbFVybDogc3RyaW5nIH0+W10gPSBbXTtcclxuXHJcbiAgLy8gICAgICAgICB1cmxzLmZvckVhY2goKHVybDogc3RyaW5nKSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGlmICh1cmwpIHtcclxuICAvLyAgICAgICAgICAgICBjb25zdCBpbWFnZSQgPSB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJyB9KS5waXBlKFxyXG4gIC8vICAgICAgICAgICAgICAgbWFwKChibG9iOiBCbG9iKSA9PiAoe1xyXG4gIC8vICAgICAgICAgICAgICAgICByZXN1bHQ6IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYiksIC8vIGp1c3QgZm9yIHByZXZpZXdcclxuICAvLyAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmw6IHVybFxyXG4gIC8vICAgICAgICAgICAgICAgfSkpXHJcbiAgLy8gICAgICAgICAgICAgKTtcclxuICAvLyAgICAgICAgICAgICBpbWFnZUZldGNoZXMucHVzaChpbWFnZSQpO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9KTtcclxuXHJcbiAgLy8gICAgICAgICBpZiAoaW1hZ2VGZXRjaGVzLmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgICBmb3JrSm9pbihpbWFnZUZldGNoZXMpLnN1YnNjcmliZSh7XHJcbiAgLy8gICAgICAgICAgICAgbmV4dDogKGltYWdlRGF0YSkgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gaW1hZ2VEYXRhLm1hcChpdGVtID0+ICh7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGlkOiB1dWlkdjQoKSxcclxuICAvLyAgICAgICAgICAgICAgICAgZmlsZTogbnVsbCxcclxuICAvLyAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmw6IGl0ZW0ub3JpZ2luYWxVcmwsXHJcbiAgLy8gICAgICAgICAgICAgICAgIHJlc3VsdDogaXRlbS5yZXN1bHRcclxuICAvLyAgICAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSBbLi4udGhpcy51cGxvYWRlZEZpbGVzLCAuLi5mb3JtYXR0ZWRdO1xyXG4gIC8vICAgICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnVwbG9hZGVkRmlsZXMpO1xyXG4gIC8vICAgICAgICAgICAgIH0sXHJcbiAgLy8gICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCBpbWFnZXMgZm9yICR7dXBsb2FkZXJLZXl9OmAsIGVycik7XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLmZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlLnZhcmlhYmxlcyRcclxuICAvLyAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gIC8vICAgICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgIGlmICghdmFyaWFibGVzKSByZXR1cm47XHJcbiAgXHJcbiAgLy8gICAgICAgY29uc3QgdXBsb2FkZWRGaWxlc01hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XHJcbiAgXHJcbiAgLy8gICAgICAgLy8gRXh0cmFjdCB1cGxvYWRlciBrZXlzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIFVSTCBhcnJheXNcclxuICAvLyAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMpKSB7XHJcbiAgLy8gICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCd1cGxvYWRlcicpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgLy8gICAgICAgICAgIHVwbG9hZGVkRmlsZXNNYXBba2V5XSA9IHZhbHVlO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICBcclxuICAvLyAgICAgICBmb3IgKGNvbnN0IFt1cGxvYWRlcktleSwgdXJsc10gb2YgT2JqZWN0LmVudHJpZXModXBsb2FkZWRGaWxlc01hcCkpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IGltYWdlRmV0Y2hlczogT2JzZXJ2YWJsZTx7IHJlc3VsdDogc3RyaW5nOyBvcmlnaW5hbFVybDogYW55IH0+W10gPSBbXTtcclxuICBcclxuICAvLyAgICAgICAgIHVybHMuZm9yRWFjaCgob3JpZ2luYWxVcmw6YW55KSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGlmIChvcmlnaW5hbFVybCkge1xyXG4gIC8vICAgICAgICAgICAgIGNvbnN0IGltYWdlJCA9IHRoaXMuaHR0cC5nZXQob3JpZ2luYWxVcmw/Lm9yaWdpbmFsVXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pLnBpcGUoXHJcbiAgLy8gICAgICAgICAgICAgICBtYXAoKGJsb2I6IEJsb2IpID0+ICh7XHJcbiAgLy8gICAgICAgICAgICAgICAgIHJlc3VsdDogVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSwgLy8gZm9yIHByZXZpZXdcclxuICAvLyAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmw6IG9yaWdpbmFsVXJsPy5vcmlnaW5hbFVybCAgICAgICAgICAvLyBwcmVzZXJ2ZSBvcmlnaW5hbFxyXG4gIC8vICAgICAgICAgICAgICAgfSkpXHJcbiAgLy8gICAgICAgICAgICAgKTtcclxuICAvLyAgICAgICAgICAgICBpbWFnZUZldGNoZXMucHVzaChpbWFnZSQpO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9KTtcclxuICBcclxuICAvLyAgICAgICAgIGlmIChpbWFnZUZldGNoZXMubGVuZ3RoID4gMCkge1xyXG4gIC8vICAgICAgICAgICBmb3JrSm9pbihpbWFnZUZldGNoZXMpLnN1YnNjcmliZSh7XHJcbiAgLy8gICAgICAgICAgICAgbmV4dDogKGltYWdlRGF0YSkgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gaW1hZ2VEYXRhLm1hcChpdGVtID0+ICh7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGlkOiB1dWlkdjQoKSxcclxuICAvLyAgICAgICAgICAgICAgICAgZmlsZTogbnVsbCxcclxuICAvLyAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmw6IGl0ZW0ub3JpZ2luYWxVcmwsXHJcbiAgLy8gICAgICAgICAgICAgICAgIHJlc3VsdDogaXRlbS5yZXN1bHRcclxuICAvLyAgICAgICAgICAgICAgIH0pKTtcclxuICBcclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IFsuLi50aGlzLnVwbG9hZGVkRmlsZXMsIC4uLmZvcm1hdHRlZF07XHJcbiAgLy8gICAgICAgICAgICAgICB0aGlzLmZvcm1hdHRlZERhdGEudXBsb2FkZWRGaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlcztcclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5mb3JtYXR0ZWREYXRhKTtcclxuICAvLyAgICAgICAgICAgICB9LFxyXG4gIC8vICAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggaW1hZ2VzIGZvciAke3VwbG9hZGVyS2V5fTpgLCBlcnIpO1xyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgfSk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KTtcclxuICAvLyB9XHJcbiAgXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlLnZhcmlhYmxlcyRcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghdmFyaWFibGVzPy51cGxvYWRlZEZpbGVzKSByZXR1cm47XHJcbiAgXHJcbiAgICAgICAgY29uc3QgdXBsb2FkZWRGaWxlc01hcDogeyBba2V5OiBzdHJpbmddOiB7IG9yaWdpbmFsVXJsOiBzdHJpbmcgfVtdIH0gPSB2YXJpYWJsZXMudXBsb2FkZWRGaWxlcztcclxuICBcclxuICAgICAgICBmb3IgKGNvbnN0IFt1cGxvYWRlcktleSwgdXJsc10gb2YgT2JqZWN0LmVudHJpZXModXBsb2FkZWRGaWxlc01hcCkpIHtcclxuICAgICAgICAgIGNvbnN0IGltYWdlRmV0Y2hlczogT2JzZXJ2YWJsZTx7IHJlc3VsdDogc3RyaW5nOyBvcmlnaW5hbFVybDogc3RyaW5nIH0+W10gPSBbXTtcclxuICBcclxuICAgICAgICAgIHVybHMuZm9yRWFjaCgoZmlsZU9iajogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVXJsID0gZmlsZU9iaj8ub3JpZ2luYWxVcmw7XHJcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFVybCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGltYWdlJCA9IHRoaXMuaHR0cC5nZXQob3JpZ2luYWxVcmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSkucGlwZShcclxuICAgICAgICAgICAgICAgIG1hcCgoYmxvYjogQmxvYikgPT4gKHtcclxuICAgICAgICAgICAgICAgICAgcmVzdWx0OiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpLCAvLyBmb3IgcHJldmlld1xyXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbFVybFxyXG4gICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBpbWFnZUZldGNoZXMucHVzaChpbWFnZSQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICBcclxuICAgICAgICAgIGlmIChpbWFnZUZldGNoZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3JrSm9pbihpbWFnZUZldGNoZXMpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgbmV4dDogKGltYWdlRGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gaW1hZ2VEYXRhLm1hcChpdGVtID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgIGlkOiB1dWlkdjQoKSxcclxuICAgICAgICAgICAgICAgICAgZmlsZTogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmw6IGl0ZW0ub3JpZ2luYWxVcmwsXHJcbiAgICAgICAgICAgICAgICAgIHJlc3VsdDogaXRlbS5yZXN1bHRcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICBcclxuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IFsuLi50aGlzLnVwbG9hZGVkRmlsZXMsIC4uLmZvcm1hdHRlZF07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdHRlZERhdGEudXBsb2FkZWRGaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlcztcclxuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5mb3JtYXR0ZWREYXRhKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggaW1hZ2VzIGZvciAke3VwbG9hZGVyS2V5fTpgLCBlcnIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcbiAgXHJcblxyXG4gIC8vIHB1YmxpYyBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpIHtcclxuICAvLyAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgLy8gICBpZiAoaW5wdXQuZmlsZXMpIHtcclxuICAvLyAgICAgZm9yKGxldCBpID0gMDsgaSA8IGlucHV0Py5maWxlcz8ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXNbaV07XHJcbiAgLy8gICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAvLyAgICAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XHJcbiAgLy8gICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMucHVzaCh7XHJcbiAgLy8gICAgICAgICAgIGZpbGU6IGZpbGUsXHJcbiAgLy8gICAgICAgICAgIHJlc3VsdDogZS50YXJnZXQ/LnJlc3VsdCxcclxuICAvLyAgICAgICAgICAgbmFtZTogZmlsZT8ubmFtZSxcclxuICAvLyAgICAgICAgICAgaWQ6IHV1aWR2NCgpXHJcbiAgLy8gICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnVwbG9hZGVkRmlsZXMpO1xyXG4gIC8vICAgICAgICAgY29uc29sZS5sb2codGhpcy51cGxvYWRGaWxlQ29udHJvbCk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBpZiAoaW5wdXQuZmlsZXMpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5maWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGZpbGUgPSBpbnB1dC5maWxlc1tpXTtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBuZXdGaWxlID0ge1xyXG4gICAgICAgICAgICBpZDogdXVpZHY0KCksXHJcbiAgICAgICAgICAgIGZpbGU6IGZpbGUsXHJcbiAgICAgICAgICAgIG9yaWdpbmFsVXJsOiBudWxsLFxyXG4gICAgICAgICAgICByZXN1bHQ6IGUudGFyZ2V0Py5yZXN1bHQsXHJcbiAgICAgICAgICAgIG5hbWU6IGZpbGUubmFtZVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMucHVzaChuZXdGaWxlKTtcclxuICAgICAgICAgIHRoaXMuZm9ybWF0dGVkRGF0YS51cGxvYWRlZEZpbGVzID0gdGhpcy51cGxvYWRlZEZpbGVzO1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdHRlZERhdGEpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gcHVibGljIGRlbGV0ZUZpbGUoaWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gIC8vICAgdGhpcy51cGxvYWRlZEZpbGVzID0gdGhpcy51cGxvYWRlZEZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGU/LmlkICE9PSBpZCk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBkZWxldGVGaWxlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAvLyAgIGNvbnN0IFtkZWxldGVkRmlsZV0gPSB0aGlzLnVwbG9hZGVkRmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICBcclxuICAvLyAgIGlmIChkZWxldGVkRmlsZSkge1xyXG4gIC8vICAgICB0aGlzLmRlbGV0ZWRGaWxlcy5wdXNoKGRlbGV0ZWRGaWxlKTtcclxuICAvLyAgICAgdGhpcy5mb3JtYXR0ZWREYXRhID0ge1xyXG4gIC8vICAgICAgIC4uLnRoaXMuZm9ybWF0dGVkRGF0YSxcclxuICAvLyAgICAgICB1cGxvYWRlZEZpbGVzOiBbLi4udGhpcy51cGxvYWRlZEZpbGVzXSxcclxuICAvLyAgICAgICBkZWxldGVkRmlsZXM6IFsuLi50aGlzLmRlbGV0ZWRGaWxlc11cclxuICAvLyAgICAgfTtcclxuICAvLyAgICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdHRlZERhdGEpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgZGVsZXRlRmlsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBkZWxldGVkRmlsZSA9IHRoaXMudXBsb2FkZWRGaWxlcz8uW2luZGV4XTtcclxuICAgIGlmICghZGVsZXRlZEZpbGUpIHJldHVybjtcclxuICBcclxuICAgIC8vIEVuc3VyZSBmb3JtYXR0ZWREYXRhIGV4aXN0cyBhbmQgaW5pdGlhbGl6ZSBpZiB1bmRlZmluZWRcclxuICAgIHRoaXMuZm9ybWF0dGVkRGF0YSA9IHRoaXMuZm9ybWF0dGVkRGF0YSB8fCB7IHVwbG9hZGVkRmlsZXM6IFtdLCBkZWxldGVkRmlsZXM6IFtdIH07XHJcbiAgXHJcbiAgICAvLyBBZGQgdGhlIGRlbGV0ZWQgZmlsZSB0byB0aGUgZGVsZXRlZEZpbGVzIGFycmF5XHJcbiAgICB0aGlzLmRlbGV0ZWRGaWxlcyA9IFsuLi50aGlzLmRlbGV0ZWRGaWxlcywgZGVsZXRlZEZpbGVdO1xyXG4gIFxyXG4gICAgLy8gUmVtb3ZlIHRoZSBmaWxlIGZyb20gdXBsb2FkZWRGaWxlcyB1c2luZyBmaWx0ZXIgZm9yIGltbXV0YWJpbGl0eVxyXG4gICAgdGhpcy51cGxvYWRlZEZpbGVzID0gdGhpcy51cGxvYWRlZEZpbGVzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xyXG4gIFxyXG4gICAgLy8gVXBkYXRlIGZvcm1hdHRlZERhdGFcclxuICAgIHRoaXMuZm9ybWF0dGVkRGF0YSA9IHtcclxuICAgICAgLi4udGhpcy5mb3JtYXR0ZWREYXRhLFxyXG4gICAgICB1cGxvYWRlZEZpbGVzOiB0aGlzLnVwbG9hZGVkRmlsZXMsXHJcbiAgICAgIGRlbGV0ZWRGaWxlczogdGhpcy5kZWxldGVkRmlsZXNcclxuICAgIH07XHJcbiAgXHJcbiAgICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSB1cGxvYWRGaWxlQ29udHJvbFxyXG4gICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdHRlZERhdGEpO1xyXG4gIH1cclxuICBcclxuICBcclxuXHJcbiAgcHJvdGVjdGVkIHNldHRpbmdzKCk6IEZ4U2V0dGluZ1tdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICd1cGxvYWQtdGV4dCcsICR0aXRsZTogJ1VwbG9hZCBUZXh0JywgdmFsdWU6ICdVcGxvYWQgRmlsZSd9KSxcclxuICAgICAgbmV3IEZ4U2VsZWN0U2V0dGluZyh7a2V5OiAnbXVsdGlwbGUtdXBsb2FkJywgJHRpdGxlOiAnTXVsdGlwbGUgVXBsb2FkJywgdmFsdWU6IGZhbHNlfSwgW3tvcHRpb246ICdFbmFibGUnLCB2YWx1ZTogdHJ1ZX0sIHtvcHRpb246ICdEaXNhYmxlJywgdmFsdWU6IGZhbHNlfV0pXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHZhbGlkYXRpb25zKCk6IEZ4VmFsaWRhdGlvbltdIHtcclxuICAgIHJldHVybiBbRnhWYWxpZGF0b3JTZXJ2aWNlLnJlcXVpcmVkXTtcclxuICB9XHJcbn1cclxuIiwiPGZ4LWNvbXBvbmVudCBbZnhEYXRhXT1cImZ4RGF0YVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjdXN0b20tdXBsb2FkXCI+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIj5cclxuICAgICAge3sgc2V0dGluZygndXBsb2FkLXRleHQnKSB9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8aW5wdXRcclxuICAgICAgI2ZpbGVJbnB1dFxyXG4gICAgICB0eXBlPVwiZmlsZVwiXHJcbiAgICAgIFttdWx0aXBsZV09XCJzZXR0aW5nKCdtdWx0aXBsZS11cGxvYWQnKVwiXHJcbiAgICAgIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiXHJcbiAgICAgIGhpZGRlblxyXG4gICAgLz5cclxuICAgIDxkaXYgY2xhc3M9XCJmaWxlLWxpc3RcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVwbG9hZGVkRmlsZXM/Lmxlbmd0aFwiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpbGUgb2YgdXBsb2FkZWRGaWxlczsgbGV0IGkgPSBpbmRleFwiIChjbGljayk9XCJkZWxldGVGaWxlKGkpXCI+XHJcbiAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZmlsZS10aHVtYm5haWxcIlxyXG4gICAgICAgICAgICBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDRweFwiXHJcbiAgICAgICAgICAgIFtzcmNdPVwiZmlsZT8ucmVzdWx0XCJcclxuICAgICAgICAgICAgYWx0PVwiXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICBcclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Z4LWNvbXBvbmVudD5cclxuXHJcbiJdfQ==
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZngtYnVpbGRlci13cmFwcGVyL3NyYy9saWIvY29tcG9uZW50cy91cGxvYWRlci91cGxvYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL3VwbG9hZGVyL3VwbG9hZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFvQyxTQUFTLEVBQUUsTUFBTSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBc0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRyxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQWEsZUFBZSxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxKLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckUsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7QUFTbkMsTUFBTSxPQUFPLGlCQUFrQixTQUFRLGVBQWU7SUFVaEM7SUFBK0I7SUFUbkQsdURBQXVEO0lBQ2hELGlCQUFpQixHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDdEMsYUFBYSxHQUFlLEVBQUUsQ0FBQztJQUMvQixhQUFhLEdBQVE7UUFDMUIsYUFBYSxFQUFFLEVBQUU7UUFDakIsWUFBWSxFQUFFLEVBQUU7S0FDakIsQ0FBQztJ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LFlBQVk7U0FDaEMsQ0FBQztRQUVGLHlDQUF5QztRQUN6QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBSVMsUUFBUTtRQUNoQixPQUFPO1lBQ0wsSUFBSSxlQUFlLENBQUMsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBQyxDQUFDO1lBQ3ZGLElBQUksZUFBZSxDQUFDLEVBQUMsR0FBRyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxFQUFFLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztTQUM3SixDQUFDO0lBQ0osQ0FBQztJQUVTLFdBQVc7UUFDbkIsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7d0dBalVVLGlCQUFpQjs0RkFBakIsaUJBQWlCLDhGQ2hCOUIsdzNMQXlEZSwwWEQ3Q0gsWUFBWSxnUUFBRSxXQUFXLDRFQUFFLFdBQVcsOEJBQUUsbUJBQW1COzs0RkFJMUQsaUJBQWlCO2tCQVA3QixTQUFTOytCQUNFLGFBQWEsY0FDWCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGluamVjdCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEZ4QmFzZUNvbXBvbmVudCwgRnhDb21wb25lbnQsIEZ4U2VsZWN0U2V0dGluZywgRnhTZXR0aW5nLCBGeFN0cmluZ1NldHRpbmcsIEZ4VmFsaWRhdGlvbiwgRnhWYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnQGluc3RhbnRzeXMtbGFicy9meCc7XHJcbmltcG9ydCB7IEZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZngtYnVpbGRlci13cmFwcGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBmb3JrSm9pbiwgbWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdjQgYXMgdXVpZHY0fSBmcm9tICd1dWlkJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZngtdXBsb2FkZXInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRnhDb21wb25lbnQsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vdXBsb2FkZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi91cGxvYWRlci5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVXBsb2FkZXJDb21wb25lbnQgZXh0ZW5kcyBGeEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXR7XHJcbiAgLy8gcHVibGljIHVwbG9hZEZpbGVDb250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xyXG4gIHB1YmxpYyB1cGxvYWRGaWxlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG4gIHB1YmxpYyB1cGxvYWRlZEZpbGVzOiBBcnJheTxhbnk+ID0gW107XHJcbiAgcHVibGljIGZvcm1hdHRlZERhdGE6IGFueSA9IHtcclxuICAgIHVwbG9hZGVkRmlsZXM6IFtdLFxyXG4gICAgZGVsZXRlZEZpbGVzOiBbXVxyXG4gIH07XHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PEJvb2xlYW4+KCk7XHJcbiAgcHJpdmF0ZSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQpO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixwcml2YXRlIGZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlOiBGeEJ1aWxkZXJXcmFwcGVyU2VydmljZSkge1xyXG4gICAgc3VwZXIoY2RyKVxyXG4gICAgdGhpcy5vbkluaXQuc3Vic2NyaWJlKChmeERhdGEpPT57XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyKHRoaXMudXBsb2FkRmlsZUNvbnRyb2wpO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuICB1cGxvYWRlZEltYWdlczogeyBba2V5OiBzdHJpbmddOiB7IHJlc3VsdDogc3RyaW5nLCBmaWxlOiBGaWxlIHwgbnVsbCB9W10gfSA9IHt9O1xyXG4gIGRlbGV0ZWRGaWxlczogYW55W10gPSBbXTtcclxuICAvLyBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLmZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlLnZhcmlhYmxlcyRcclxuICAvLyAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gIC8vICAgICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgIGlmICghdmFyaWFibGVzKSByZXR1cm47XHJcbiAgXHJcbiAgLy8gICAgICAgY29uc3QgdXBsb2FkZWRGaWxlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XHJcbiAgXHJcbiAgLy8gICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVzKSkge1xyXG4gIC8vICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygndXBsb2FkZXInKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gIC8vICAgICAgICAgICB1cGxvYWRlZEZpbGVzW2tleV0gPSB2YWx1ZTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgXHJcbiAgLy8gICAgICAgZm9yIChjb25zdCBbdXBsb2FkZXJLZXksIHVybHNdIG9mIE9iamVjdC5lbnRyaWVzKHVwbG9hZGVkRmlsZXMpKSB7XHJcbiAgLy8gICAgICAgICBjb25zdCBpbWFnZUZldGNoZXM6IE9ic2VydmFibGU8c3RyaW5nPltdID0gW107XHJcbiAgXHJcbiAgLy8gICAgICAgICB1cmxzLmZvckVhY2goKHVybDogc3RyaW5nKSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGlmICh1cmwpIHtcclxuICAvLyAgICAgICAgICAgICBjb25zdCBpbWFnZSQgPSB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJyB9KS5waXBlKFxyXG4gIC8vICAgICAgICAgICAgICAgbWFwKChibG9iOiBCbG9iKSA9PiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpKVxyXG4gIC8vICAgICAgICAgICAgICk7XHJcbiAgLy8gICAgICAgICAgICAgaW1hZ2VGZXRjaGVzLnB1c2goaW1hZ2UkKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfSk7XHJcbiAgXHJcbiAgLy8gICAgICAgICBpZiAoaW1hZ2VGZXRjaGVzLmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgICBmb3JrSm9pbihpbWFnZUZldGNoZXMpLnN1YnNjcmliZSh7XHJcbiAgLy8gICAgICAgICAgICAgbmV4dDogKGltYWdlVXJsczogc3RyaW5nW10pID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRJbWFnZXNbdXBsb2FkZXJLZXldID0gaW1hZ2VVcmxzLm1hcChyZXN1bHQgPT4gKHtcclxuICAvLyAgICAgICAgICAgICAgICAgcmVzdWx0LFxyXG4gIC8vICAgICAgICAgICAgICAgICBmaWxlOiBudWxsXHJcbiAgLy8gICAgICAgICAgICAgICB9KSk7XHJcbiAgLy8gICAgICAgICAgICAgICAvLyB0aGlzLnVwbG9hZGVkRmlsZXMgPSBbLi4udGhpcy51cGxvYWRlZEltYWdlc11cclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IE9iamVjdC52YWx1ZXModGhpcy51cGxvYWRlZEltYWdlcykuZmxhdCgpO1xyXG4gIC8vICAgICAgICAgICAgIH0sXHJcbiAgLy8gICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCBpbWFnZXMgZm9yICR7dXBsb2FkZXJLZXl9OmAsIGVycik7XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vIH1cclxuICBcclxuICAvLyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAvLyAgIHRoaXMuZnhCdWlsZGVyV3JhcHBlclNlcnZpY2UudmFyaWFibGVzJFxyXG4gIC8vICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgLy8gICAgIC5zdWJzY3JpYmUoKHZhcmlhYmxlczogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKCF2YXJpYWJsZXMpIHJldHVybjtcclxuXHJcbiAgLy8gICAgICAgY29uc3QgdXBsb2FkZWRGaWxlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XHJcblxyXG4gIC8vICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykpIHtcclxuICAvLyAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ3VwbG9hZGVyJykgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAvLyAgICAgICAgICAgdXBsb2FkZWRGaWxlc1trZXldID0gdmFsdWU7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG5cclxuICAvLyAgICAgICBmb3IgKGNvbnN0IFt1cGxvYWRlcktleSwgdXJsc10gb2YgT2JqZWN0LmVudHJpZXModXBsb2FkZWRGaWxlcykpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IGltYWdlRmV0Y2hlczogT2JzZXJ2YWJsZTx7IHJlc3VsdDogc3RyaW5nLCBvcmlnaW5hbFVybDogc3RyaW5nIH0+W10gPSBbXTtcclxuXHJcbiAgLy8gICAgICAgICB1cmxzLmZvckVhY2goKHVybDogc3RyaW5nKSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGlmICh1cmwpIHtcclxuICAvLyAgICAgICAgICAgICBjb25zdCBpbWFnZSQgPSB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJyB9KS5waXBlKFxyXG4gIC8vICAgICAgICAgICAgICAgbWFwKChibG9iOiBCbG9iKSA9PiAoe1xyXG4gIC8vICAgICAgICAgICAgICAgICByZXN1bHQ6IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYiksIC8vIGp1c3QgZm9yIHByZXZpZXdcclxuICAvLyAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmw6IHVybFxyXG4gIC8vICAgICAgICAgICAgICAgfSkpXHJcbiAgLy8gICAgICAgICAgICAgKTtcclxuICAvLyAgICAgICAgICAgICBpbWFnZUZldGNoZXMucHVzaChpbWFnZSQpO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9KTtcclxuXHJcbiAgLy8gICAgICAgICBpZiAoaW1hZ2VGZXRjaGVzLmxlbmd0aCkge1xyXG4gIC8vICAgICAgICAgICBmb3JrSm9pbihpbWFnZUZldGNoZXMpLnN1YnNjcmliZSh7XHJcbiAgLy8gICAgICAgICAgICAgbmV4dDogKGltYWdlRGF0YSkgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gaW1hZ2VEYXRhLm1hcChpdGVtID0+ICh7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGlkOiB1dWlkdjQoKSxcclxuICAvLyAgICAgICAgICAgICAgICAgZmlsZTogbnVsbCxcclxuICAvLyAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmw6IGl0ZW0ub3JpZ2luYWxVcmwsXHJcbiAgLy8gICAgICAgICAgICAgICAgIHJlc3VsdDogaXRlbS5yZXN1bHRcclxuICAvLyAgICAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgLy8gICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSBbLi4udGhpcy51cGxvYWRlZEZpbGVzLCAuLi5mb3JtYXR0ZWRdO1xyXG4gIC8vICAgICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnVwbG9hZGVkRmlsZXMpO1xyXG4gIC8vICAgICAgICAgICAgIH0sXHJcbiAgLy8gICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAvLyAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCBpbWFnZXMgZm9yICR7dXBsb2FkZXJLZXl9OmAsIGVycik7XHJcbiAgLy8gICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlLnZhcmlhYmxlcyRcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghdmFyaWFibGVzKSByZXR1cm47XHJcbiAgXHJcbiAgICAgICAgY29uc3QgdXBsb2FkZWRGaWxlc01hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XHJcbiAgXHJcbiAgICAgICAgLy8gRXh0cmFjdCB1cGxvYWRlciBrZXlzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIFVSTCBhcnJheXNcclxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMpKSB7XHJcbiAgICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCd1cGxvYWRlcicpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHVwbG9hZGVkRmlsZXNNYXBba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICBmb3IgKGNvbnN0IFt1cGxvYWRlcktleSwgdXJsc10gb2YgT2JqZWN0LmVudHJpZXModXBsb2FkZWRGaWxlc01hcCkpIHtcclxuICAgICAgICAgIGNvbnN0IGltYWdlRmV0Y2hlczogT2JzZXJ2YWJsZTx7IHJlc3VsdDogc3RyaW5nOyBvcmlnaW5hbFVybDogYW55IH0+W10gPSBbXTtcclxuICBcclxuICAgICAgICAgIHVybHMuZm9yRWFjaCgob3JpZ2luYWxVcmw6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFVybCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGltYWdlJCA9IHRoaXMuaHR0cC5nZXQob3JpZ2luYWxVcmw/Lm9yaWdpbmFsVXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXAoKGJsb2I6IEJsb2IpID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgIHJlc3VsdDogVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSwgLy8gZm9yIHByZXZpZXdcclxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmw6IG9yaWdpbmFsVXJsPy5vcmlnaW5hbFVybCAgICAgICAgICAvLyBwcmVzZXJ2ZSBvcmlnaW5hbFxyXG4gICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBpbWFnZUZldGNoZXMucHVzaChpbWFnZSQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICBcclxuICAgICAgICAgIGlmIChpbWFnZUZldGNoZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3JrSm9pbihpbWFnZUZldGNoZXMpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgbmV4dDogKGltYWdlRGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gaW1hZ2VEYXRhLm1hcChpdGVtID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgIGlkOiB1dWlkdjQoKSxcclxuICAgICAgICAgICAgICAgICAgZmlsZTogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmw6IGl0ZW0ub3JpZ2luYWxVcmwsXHJcbiAgICAgICAgICAgICAgICAgIHJlc3VsdDogaXRlbS5yZXN1bHRcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICBcclxuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IFsuLi50aGlzLnVwbG9hZGVkRmlsZXMsIC4uLmZvcm1hdHRlZF07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdHRlZERhdGEudXBsb2FkZWRGaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlcztcclxuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5mb3JtYXR0ZWREYXRhKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggaW1hZ2VzIGZvciAke3VwbG9hZGVyS2V5fTpgLCBlcnIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcbiAgXHJcbiAgLy8gbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLmZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlLnZhcmlhYmxlcyRcclxuICAvLyAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gIC8vICAgICAuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgIGlmICghdmFyaWFibGVzKSByZXR1cm47XHJcbiAgXHJcbiAgLy8gICAgICAgY29uc3QgdXBsb2FkZWRGaWxlc01hcDogeyBba2V5OiBzdHJpbmddOiB7IG9yaWdpbmFsVXJsOiBzdHJpbmcgfVtdIH0gPSB2YXJpYWJsZXMudXBsb2FkZWRGaWxlcztcclxuICBcclxuICAvLyAgICAgICBmb3IgKGNvbnN0IFt1cGxvYWRlcktleSwgdXJsc10gb2YgT2JqZWN0LmVudHJpZXModXBsb2FkZWRGaWxlc01hcCkpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IGltYWdlRmV0Y2hlczogT2JzZXJ2YWJsZTx7IHJlc3VsdDogc3RyaW5nOyBvcmlnaW5hbFVybDogc3RyaW5nIH0+W10gPSBbXTtcclxuICBcclxuICAvLyAgICAgICAgIHVybHMuZm9yRWFjaCgoZmlsZU9iajogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVXJsID0gZmlsZU9iaj8ub3JpZ2luYWxVcmw7XHJcbiAgLy8gICAgICAgICAgIGlmIChvcmlnaW5hbFVybCkge1xyXG4gIC8vICAgICAgICAgICAgIGNvbnN0IGltYWdlJCA9IHRoaXMuaHR0cC5nZXQob3JpZ2luYWxVcmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSkucGlwZShcclxuICAvLyAgICAgICAgICAgICAgIG1hcCgoYmxvYjogQmxvYikgPT4gKHtcclxuICAvLyAgICAgICAgICAgICAgICAgcmVzdWx0OiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpLCAvLyBmb3IgcHJldmlld1xyXG4gIC8vICAgICAgICAgICAgICAgICBvcmlnaW5hbFVybFxyXG4gIC8vICAgICAgICAgICAgICAgfSkpXHJcbiAgLy8gICAgICAgICAgICAgKTtcclxuICAvLyAgICAgICAgICAgICBpbWFnZUZldGNoZXMucHVzaChpbWFnZSQpO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9KTtcclxuICBcclxuICAvLyAgICAgICAgIGlmIChpbWFnZUZldGNoZXMubGVuZ3RoID4gMCkge1xyXG4gIC8vICAgICAgICAgICBmb3JrSm9pbihpbWFnZUZldGNoZXMpLnN1YnNjcmliZSh7XHJcbiAgLy8gICAgICAgICAgICAgbmV4dDogKGltYWdlRGF0YSkgPT4ge1xyXG4gIC8vICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gaW1hZ2VEYXRhLm1hcChpdGVtID0+ICh7XHJcbiAgLy8gICAgICAgICAgICAgICAgIGlkOiB1dWlkdjQoKSxcclxuICAvLyAgICAgICAgICAgICAgICAgZmlsZTogbnVsbCxcclxuICAvLyAgICAgICAgICAgICAgICAgb3JpZ2luYWxVcmw6IGl0ZW0ub3JpZ2luYWxVcmwsXHJcbiAgLy8gICAgICAgICAgICAgICAgIHJlc3VsdDogaXRlbS5yZXN1bHRcclxuICAvLyAgICAgICAgICAgICAgIH0pKTtcclxuICBcclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcyA9IFsuLi50aGlzLnVwbG9hZGVkRmlsZXMsIC4uLmZvcm1hdHRlZF07XHJcbiAgLy8gICAgICAgICAgICAgICB0aGlzLmZvcm1hdHRlZERhdGEudXBsb2FkZWRGaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlcztcclxuICAvLyAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5mb3JtYXR0ZWREYXRhKTtcclxuICAvLyAgICAgICAgICAgICB9LFxyXG4gIC8vICAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggaW1hZ2VzIGZvciAke3VwbG9hZGVyS2V5fTpgLCBlcnIpO1xyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgfSk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KTtcclxuICAvLyB9XHJcbiAgXHJcblxyXG4gIC8vIHB1YmxpYyBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpIHtcclxuICAvLyAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgLy8gICBpZiAoaW5wdXQuZmlsZXMpIHtcclxuICAvLyAgICAgZm9yKGxldCBpID0gMDsgaSA8IGlucHV0Py5maWxlcz8ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXNbaV07XHJcbiAgLy8gICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAvLyAgICAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XHJcbiAgLy8gICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMucHVzaCh7XHJcbiAgLy8gICAgICAgICAgIGZpbGU6IGZpbGUsXHJcbiAgLy8gICAgICAgICAgIHJlc3VsdDogZS50YXJnZXQ/LnJlc3VsdCxcclxuICAvLyAgICAgICAgICAgbmFtZTogZmlsZT8ubmFtZSxcclxuICAvLyAgICAgICAgICAgaWQ6IHV1aWR2NCgpXHJcbiAgLy8gICAgICAgICB9KVxyXG4gIC8vICAgICAgICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnVwbG9hZGVkRmlsZXMpO1xyXG4gIC8vICAgICAgICAgY29uc29sZS5sb2codGhpcy51cGxvYWRGaWxlQ29udHJvbCk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBpZiAoaW5wdXQuZmlsZXMpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5maWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGZpbGUgPSBpbnB1dC5maWxlc1tpXTtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBuZXdGaWxlID0ge1xyXG4gICAgICAgICAgICBpZDogdXVpZHY0KCksXHJcbiAgICAgICAgICAgIGZpbGU6IGZpbGUsXHJcbiAgICAgICAgICAgIG9yaWdpbmFsVXJsOiBudWxsLFxyXG4gICAgICAgICAgICByZXN1bHQ6IGUudGFyZ2V0Py5yZXN1bHQsXHJcbiAgICAgICAgICAgIG5hbWU6IGZpbGUubmFtZVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMucHVzaChuZXdGaWxlKTtcclxuICAgICAgICAgIHRoaXMuZm9ybWF0dGVkRGF0YS51cGxvYWRlZEZpbGVzID0gdGhpcy51cGxvYWRlZEZpbGVzO1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdHRlZERhdGEpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gcHVibGljIGRlbGV0ZUZpbGUoaWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gIC8vICAgdGhpcy51cGxvYWRlZEZpbGVzID0gdGhpcy51cGxvYWRlZEZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGU/LmlkICE9PSBpZCk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBkZWxldGVGaWxlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAvLyAgIGNvbnN0IFtkZWxldGVkRmlsZV0gPSB0aGlzLnVwbG9hZGVkRmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICBcclxuICAvLyAgIGlmIChkZWxldGVkRmlsZSkge1xyXG4gIC8vICAgICB0aGlzLmRlbGV0ZWRGaWxlcy5wdXNoKGRlbGV0ZWRGaWxlKTtcclxuICAvLyAgICAgdGhpcy5mb3JtYXR0ZWREYXRhID0ge1xyXG4gIC8vICAgICAgIC4uLnRoaXMuZm9ybWF0dGVkRGF0YSxcclxuICAvLyAgICAgICB1cGxvYWRlZEZpbGVzOiBbLi4udGhpcy51cGxvYWRlZEZpbGVzXSxcclxuICAvLyAgICAgICBkZWxldGVkRmlsZXM6IFsuLi50aGlzLmRlbGV0ZWRGaWxlc11cclxuICAvLyAgICAgfTtcclxuICAvLyAgICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdHRlZERhdGEpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgZGVsZXRlRmlsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBkZWxldGVkRmlsZSA9IHRoaXMudXBsb2FkZWRGaWxlcz8uW2luZGV4XTtcclxuICAgIGlmICghZGVsZXRlZEZpbGUpIHJldHVybjtcclxuICBcclxuICAgIC8vIEVuc3VyZSBmb3JtYXR0ZWREYXRhIGV4aXN0cyBhbmQgaW5pdGlhbGl6ZSBpZiB1bmRlZmluZWRcclxuICAgIHRoaXMuZm9ybWF0dGVkRGF0YSA9IHRoaXMuZm9ybWF0dGVkRGF0YSB8fCB7IHVwbG9hZGVkRmlsZXM6IFtdLCBkZWxldGVkRmlsZXM6IFtdIH07XHJcbiAgXHJcbiAgICAvLyBBZGQgdGhlIGRlbGV0ZWQgZmlsZSB0byB0aGUgZGVsZXRlZEZpbGVzIGFycmF5XHJcbiAgICB0aGlzLmRlbGV0ZWRGaWxlcyA9IFsuLi50aGlzLmRlbGV0ZWRGaWxlcywgZGVsZXRlZEZpbGVdO1xyXG4gIFxyXG4gICAgLy8gUmVtb3ZlIHRoZSBmaWxlIGZyb20gdXBsb2FkZWRGaWxlcyB1c2luZyBmaWx0ZXIgZm9yIGltbXV0YWJpbGl0eVxyXG4gICAgdGhpcy51cGxvYWRlZEZpbGVzID0gdGhpcy51cGxvYWRlZEZpbGVzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xyXG4gIFxyXG4gICAgLy8gVXBkYXRlIGZvcm1hdHRlZERhdGFcclxuICAgIHRoaXMuZm9ybWF0dGVkRGF0YSA9IHtcclxuICAgICAgLi4udGhpcy5mb3JtYXR0ZWREYXRhLFxyXG4gICAgICB1cGxvYWRlZEZpbGVzOiB0aGlzLnVwbG9hZGVkRmlsZXMsXHJcbiAgICAgIGRlbGV0ZWRGaWxlczogdGhpcy5kZWxldGVkRmlsZXNcclxuICAgIH07XHJcbiAgXHJcbiAgICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSB1cGxvYWRGaWxlQ29udHJvbFxyXG4gICAgdGhpcy51cGxvYWRGaWxlQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZvcm1hdHRlZERhdGEpO1xyXG4gIH1cclxuICBcclxuICBcclxuXHJcbiAgcHJvdGVjdGVkIHNldHRpbmdzKCk6IEZ4U2V0dGluZ1tdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICd1cGxvYWQtdGV4dCcsICR0aXRsZTogJ1VwbG9hZCBUZXh0JywgdmFsdWU6ICdVcGxvYWQgRmlsZSd9KSxcclxuICAgICAgbmV3IEZ4U2VsZWN0U2V0dGluZyh7a2V5OiAnbXVsdGlwbGUtdXBsb2FkJywgJHRpdGxlOiAnTXVsdGlwbGUgVXBsb2FkJywgdmFsdWU6IGZhbHNlfSwgW3tvcHRpb246ICdFbmFibGUnLCB2YWx1ZTogdHJ1ZX0sIHtvcHRpb246ICdEaXNhYmxlJywgdmFsdWU6IGZhbHNlfV0pXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHZhbGlkYXRpb25zKCk6IEZ4VmFsaWRhdGlvbltdIHtcclxuICAgIHJldHVybiBbRnhWYWxpZGF0b3JTZXJ2aWNlLnJlcXVpcmVkXTtcclxuICB9XHJcbn1cclxuIiwiPGZ4LWNvbXBvbmVudCBbZnhEYXRhXT1cImZ4RGF0YVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjdXN0b20tdXBsb2FkIGZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGdhcC0yIHAtMiBwYi0wIHJvdW5kZWQtc21cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjlcIiBoZWlnaHQ9XCIyOFwiIHZpZXdCb3g9XCIwIDAgMjkgMjhcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICBkPVwiTTE0LjAwMSAzLjAwMTk1QzExLjUzMjIgMy4wMDE5NSA5LjE2NzIyIDMuODY5NTYgNy4yMzY0MSA1LjM4NDE0TDcuMjM1OTggNC41OTY5NUM3LjIzNTk4IDQuNTI0NzMgNy4yMjE3NSA0LjQ1MzIxIDcuMTk0MTEgNC4zODY0OEM3LjE2NjQ3IDQuMzE5NzUgNy4xMjU5NiA0LjI1OTEyIDcuMDc0ODkgNC4yMDgwNEM3LjAyMzgxIDQuMTU2OTcgNi45NjMxOCA0LjExNjQ2IDYuODk2NDUgNC4wODg4MkM2LjgyOTcyIDQuMDYxMTggNi43NTgyIDQuMDQ2OTUgNi42ODU5OCA0LjA0Njk1QzYuNjEzNzUgNC4wNDY5NSA2LjU0MjIzIDQuMDYxMTggNi40NzU1IDQuMDg4ODJDNi40MDg3NyA0LjExNjQ2IDYuMzQ4MTQgNC4xNTY5NyA2LjI5NzA3IDQuMjA4MDRDNi4yNDU5OSA0LjI1OTEyIDYuMjA1NDggNC4zMTk3NSA2LjE3Nzg0IDQuMzg2NDhDNi4xNTAyIDQuNDUzMjEgNi4xMzU5OCA0LjUyNDczIDYuMTM1OTggNC41OTY5NUw2LjEzNjQyIDYuNjg2NTJDNi4xMzY0MyA2LjgzMjM5IDYuMTk0MzggNi45NzIyOCA2LjI5NzUyIDcuMDc1NDJDNi40MDA2NyA3LjE3ODU2IDYuNTQwNTUgNy4yMzY1MSA2LjY4NjQyIDcuMjM2NTJIOC43NzU5OEM4Ljg0ODIgNy4yMzY1MiA4LjkxOTcyIDcuMjIyMyA4Ljk4NjQ1IDcuMTk0NjZDOS4wNTMxOCA3LjE2NzAyIDkuMTEzODEgNy4xMjY1MSA5LjE2NDg5IDcuMDc1NDNDOS4yMTU5NiA3LjAyNDM2IDkuMjU2NDcgNi45NjM3MyA5LjI4NDExIDYuODk3QzkuMzExNzUgNi44MzAyNyA5LjMyNTk4IDYuNzU4NzUgOS4zMjU5OCA2LjY4NjUyQzkuMzI1OTggNi42MTQzIDkuMzExNzUgNi41NDI3OCA5LjI4NDExIDYuNDc2MDVDOS4yNTY0NyA2LjQwOTMyIDkuMjE1OTYgNi4zNDg2OSA5LjE2NDg5IDYuMjk3NjFDOS4xMTM4MSA2LjI0NjU0IDkuMDUzMTggNi4yMDYwMyA4Ljk4NjQ1IDYuMTc4MzlDOC45MTk3MiA2LjE1MDc1IDguODQ4MiA2LjEzNjUyIDguNzc1OTggNi4xMzY1Mkg4LjA1ODRDOS43NzAyIDQuODQzODcgMTEuODM5OSA0LjEwMTk1IDE0LjAwMSA0LjEwMTk1QzE5LjQ3NTEgNC4xMDE5NSAyMy45MDEgOC41Mjc4MiAyMy45MDEgMTQuMDAyQzIzLjkwMSAxOS40NzYxIDE5LjQ3NTEgMjMuOTAyIDE0LjAwMSAyMy45MDJDOC41MjY4NCAyMy45MDIgNC4xMDA5OCAxOS40NzYxIDQuMTAwOTggMTQuMDAyQzQuMTAwOTggMTIuNjM4MSA0LjM4MjYzIDExLjI4ODggNC45Mjg1NSAxMC4wMzg5QzQuOTg2OTEgOS45MDUzMiA0Ljk4OTgyIDkuNzUzOTkgNC45MzY2NSA5LjYxODIyQzQuODgzNDcgOS40ODI0NiA0Ljc3ODU1IDkuMzczMzYgNC42NDQ5NiA5LjMxNDkyQzQuNTc4NzcgOS4yODU5NiA0LjUwNzUzIDkuMjcwMzIgNC40MzUzIDkuMjY4OUM0LjM2MzA2IDkuMjY3NDcgNC4yOTEyNiA5LjI4MDMgNC4yMjM5OCA5LjMwNjYzQzQuMTU2NzEgOS4zMzI5NyA0LjA5NTI4IDkuMzcyMyA0LjA0MzIxIDkuNDIyMzhDMy45OTExNCA5LjQ3MjQ3IDMuOTQ5NDQgOS41MzIzMiAzLjkyMDUxIDkuNTk4NTJDMy4zMTM5MyAxMC45ODcyIDMuMDAwOTggMTIuNDg2NiAzLjAwMDk4IDE0LjAwMkMzLjAwMDk4IDIwLjA3MDYgNy45MzIzNiAyNS4wMDIgMTQuMDAxIDI1LjAwMkMyMC4wNjk2IDI1LjAwMiAyNS4wMDEgMjAuMDcwNiAyNS4wMDEgMTQuMDAyQzI1LjAwMSA3LjkzMzM0IDIwLjA2OTYgMy4wMDE5NSAxNC4wMDEgMy4wMDE5NVpcIlxyXG4gICAgICAgICAgICBmaWxsPVwiI0YzQTA0MVwiIC8+XHJcbiAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgIGQ9XCJNMTMuOTk4OCA2LjEzOTY1QzkuNjYxNiA2LjEzOTY1IDYuMTMzNzkgOS42Njc0NiA2LjEzMzc5IDE0LjAwNDZDNi4xMzM3OSAxOC4zNDE4IDkuNjYxNiAyMS44Njk2IDEzLjk5ODggMjEuODY5NkMxOC4zMzYgMjEuODY5NiAyMS44NjM4IDE4LjM0MTggMjEuODYzOCAxNC4wMDQ2QzIxLjg2MzggOS42Njc0NiAxOC4zMzYgNi4xMzk2NSAxMy45OTg4IDYuMTM5NjVaTTEzLjk5ODggOC4yMjk2NUMxNC4xNDQ3IDguMjI5NjUgMTQuMjg0NiA4LjI4NzU5IDE0LjM4NzcgOC4zOTA3NEMxNC40OTA4IDguNDkzODggMTQuNTQ4OCA4LjYzMzc4IDE0LjU0ODggOC43Nzk2NVYxMy43NzY5TDE3LjUyMjcgMTYuNzUwOEMxNy42MjU4IDE2Ljg1MzkgMTcuNjgzNyAxNi45OTM4IDE3LjY4MzcgMTcuMTM5NkMxNy42ODM3IDE3LjI4NTUgMTcuNjI1OCAxNy40MjU0IDE3LjUyMjcgMTcuNTI4NUMxNy40MTk1IDE3LjYzMTYgMTcuMjc5NiAxNy42ODk2IDE3LjEzMzggMTcuNjg5NkMxNi45ODc5IDE3LjY4OTYgMTYuODQ4MSAxNy42MzE2IDE2Ljc0NDkgMTcuNTI4NUwxMy42MDk5IDE0LjM5MzVDMTMuNTA2OCAxNC4yOTA0IDEzLjQ0ODggMTQuMTUwNSAxMy40NDg4IDE0LjAwNDZWOC43Nzk2NUMxMy40NDg4IDguNjMzNzggMTMuNTA2NyA4LjQ5Mzg4IDEzLjYwOTkgOC4zOTA3NEMxMy43MTMgOC4yODc1OSAxMy44NTI5IDguMjI5NjUgMTMuOTk4OCA4LjIyOTY1WlwiXHJcbiAgICAgICAgICAgIGZpbGw9XCIjRjNBMDQxXCIgLz5cclxuICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjguNTZcIiBoZWlnaHQ9XCIyOFwiIHJ4PVwiMS41MTQ3OVwiIGZpbGw9XCIjRjNBMDQxXCIgLz5cclxuICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgIGQ9XCJNMTUuMDY4IDIyLjczOTFWMTcuNjcwOEgxOC40OTY4TDE0LjIxMDggMTIuNjAyNUw5LjkyNDggMTcuNjcwOEgxMy4zNTM2VjIyLjczOTFIOS4wNjc1OVYyMi42OTY5QzguOTIzNTggMjIuNzA1MyA4Ljc4NjQzIDIyLjczOTEgOC42Mzg5OSAyMi43MzkxQzYuOTMzOTEgMjIuNzM5MSA1LjI5ODY2IDIyLjA3MTcgNC4wOTI5OCAyMC44ODM1QzIuODg3MyAxOS42OTU0IDIuMjA5OTYgMTguMDg0IDIuMjA5OTYgMTYuNDAzN0MyLjIwOTk2IDEzLjE1MzIgNC43MDQ0MyAxMC41MDQyIDcuOTA1MjMgMTAuMTQxQzguMTg1ODUgOC42OTUzIDguOTY4OTIgNy4zOTExOCAxMC4xMTk3IDYuNDUyOTJDMTEuMjcwNiA1LjUxNDY1IDEyLjcxNzIgNS4wMDA4OSAxNC4yMTA4IDVDMTUuNzA0NyA1LjAwMDgyIDE3LjE1MTUgNS41MTQ1MiAxOC4zMDI2IDYuNDUyNzdDMTkuNDUzNyA3LjM5MTAxIDIwLjIzNzEgOC42OTUxNiAyMC41MTgxIDEwLjE0MUMyMy43MTg5IDEwLjUwNDIgMjYuMjEgMTMuMTUzMiAyNi4yMSAxNi40MDM3QzI2LjIxIDE4LjA4NCAyNS41MzI2IDE5LjY5NTQgMjQuMzI2OSAyMC44ODM1QzIzLjEyMTMgMjIuMDcxNyAyMS40ODYgMjIuNzM5MSAxOS43ODA5IDIyLjczOTFDMTkuNjM2OSAyMi43MzkxIDE5LjQ5ODEgMjIuNzA1MyAxOS4zNTIzIDIyLjY5NjlWMjIuNzM5MUgxNS4wNjhaXCJcclxuICAgICAgICAgICAgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxhIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIiBjbGFzcz1cInRleHQtYmFzZSBjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgIHt7IHNldHRpbmcoJ3VwbG9hZC10ZXh0JykgfX1cclxuICAgICAgPC9hPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8aW5wdXQgI2ZpbGVJbnB1dCB0eXBlPVwiZmlsZVwiIFttdWx0aXBsZV09XCJzZXR0aW5nKCdtdWx0aXBsZS11cGxvYWQnKVwiIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiIGhpZGRlbiAvPlxyXG4gICAgPGRpdiBjbGFzcz1cInNlcGFyYXRvclwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImZpbGUtbGlzdCBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNCBmbGV4LXdyYXBcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVwbG9hZGVkRmlsZXM/Lmxlbmd0aFwiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpbGUgb2YgdXBsb2FkZWRGaWxlczsgbGV0IGkgPSBpbmRleFwiIChjbGljayk9XCJkZWxldGVGaWxlKGkpXCJcclxuICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xvc2VfaWNvbiBjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF82ODM3XzI5NjgzKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiByeD1cIjlcIiBmaWxsPVwiI0YzQTA0MVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXNrIGlkPVwibWFzazBfNjgzN18yOTY4M1wiIHN0eWxlPVwibWFzay10eXBlOmFscGhhXCIgbWFza1VuaXRzPVwidXNlclNwYWNlT25Vc2VcIiB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCIyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgZmlsbD1cIiNEOUQ5RDlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L21hc2s+XHJcbiAgICAgICAgICAgICAgICAgIDxnIG1hc2s9XCJ1cmwoI21hc2swXzY4MzdfMjk2ODMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4yMDQ1IDguOTk4MTVMNS44MTgwMiA2LjYxMTY3TDYuNjEzNTEgNS44MTYxN0w5IDguMjAyNjZMMTEuMzg2NSA1LjgxNjE3TDEyLjE4MiA2LjYxMTY3TDkuNzk1NSA4Ljk5ODE1TDEyLjE4MiAxMS4zODQ2TDExLjM4NjUgMTIuMTgwMUw5IDkuNzkzNjVMNi42MTM1MSAxMi4xODAxTDUuODE4MDIgMTEuMzg0Nkw4LjIwNDUgOC45OTgxNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzY4MzdfMjk2ODNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiByeD1cIjlcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGltZyBjbGFzcz1cImZpbGUtdGh1bWJuYWlsXCIgc3R5bGU9XCJib3JkZXItcmFkaXVzOiA0cHhcIiBbc3JjXT1cImZpbGU/LnJlc3VsdFwiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8cD57e2ZpbGU/Lm5hbWV9fTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9meC1jb21wb25lbnQ+Il19