@dignite-ng/expand.file-explorer 3.0.0-rc.33 → 3.0.0-rc.35

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.
@@ -1,19 +1,24 @@
1
1
  import { Component, EventEmitter, Input, Output, inject } from '@angular/core';
2
2
  import * as FileService from '../../proxy/dignite/file-explorer/files';
3
3
  import { ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
4
- import { ListService, RestService, LocalizationService, LIST_QUERY_DEBOUNCE_TIME } from '@abp/ng.core';
5
- import { FileDescriptorService } from '../../proxy/dignite/file-explorer/files';
4
+ import { ListService, RestService, LocalizationService, LIST_QUERY_DEBOUNCE_TIME, } from '@abp/ng.core';
5
+ import { FileDescriptorService, } from '../../proxy/dignite/file-explorer/files';
6
6
  import { FileApiService } from '../../services/file-api.service';
7
7
  import { SelectionType } from '@swimlane/ngx-datatable';
8
+ import { FormControl, FormGroup, Validators } from '@angular/forms';
9
+ import { finalize } from 'rxjs';
8
10
  import * as i0 from "@angular/core";
9
11
  import * as i1 from "../../proxy/dignite/file-explorer/files";
10
12
  import * as i2 from "@abp/ng.theme.shared";
11
13
  import * as i3 from "@abp/ng.core";
12
14
  import * as i4 from "../../services/file-api.service";
13
- import * as i5 from "@angular/common";
14
- import * as i6 from "@swimlane/ngx-datatable";
15
- import * as i7 from "../file-modal-tree/file-modal-tree.component";
16
- import * as i8 from "../../previews/file-preview.component";
15
+ import * as i5 from "@angular/forms";
16
+ import * as i6 from "@angular/common";
17
+ import * as i7 from "@swimlane/ngx-datatable";
18
+ import * as i8 from "@ngx-validate/core";
19
+ import * as i9 from "../file-modal-tree/file-modal-tree.component";
20
+ import * as i10 from "../../previews/file-preview.component";
21
+ import * as i11 from "../../pipe/get-directory-name.pipe";
17
22
  var that;
18
23
  export class FileModalComponent {
19
24
  constructor(_FileService, toaster, list, _FileApiService, restService, confirmation, _LocalizationService) {
@@ -30,8 +35,8 @@ export class FileModalComponent {
30
35
  /**是否多选 */
31
36
  this._multiple = false;
32
37
  /**文件大小限制
33
- * @param 1mb
34
- */
38
+ * @param 1mb
39
+ */
35
40
  this.sizeLimit = 1048576;
36
41
  /**模态框状态回调 */
37
42
  this.visibleChange = new EventEmitter();
@@ -42,6 +47,9 @@ export class FileModalComponent {
42
47
  /**dignite-file-modal-tree */
43
48
  /**选择的tree节点 */
44
49
  this._theSelectedTreeNode = '';
50
+ this.isCreateList = false;
51
+ /** 从tree获取来的数据 */
52
+ this.fileGroupList = [];
45
53
  /**图片上传-要上传图片的状态文件列表 */
46
54
  this.uploadPictureStatusList = [];
47
55
  /**文件表格-数据*/
@@ -53,45 +61,57 @@ export class FileModalComponent {
53
61
  this.filters = {};
54
62
  /**文件表格-表格自带选择类型 */
55
63
  this.SelectionType = SelectionType;
56
- /**文件表格-选择的表格数据项 */
57
- this.selectedTable = [];
58
- /**当前选择的table项 id */
59
- this.nowSelectId = '';
60
64
  /**选择文件回调 */
61
65
  this.selectFilefn = new EventEmitter();
62
- /**一个布尔or函数,可用于检查是否要根据条件选择特定行。 */
63
- this.selectCheck = (row, column, value) => {
64
- this.nowSelectId = row.id;
65
- return true;
66
- };
67
- /**判断row是否选中 */
68
- this.selectedcheckbox = (id) => {
69
- return this.selectedTable.some(el => el.id == id);
70
- };
71
66
  /**创建图片的接口,代理中的file类型不匹配,切换为any类型 */
72
67
  this.createFile = (input, config) => this.restService.request({
73
68
  method: 'POST',
74
69
  url: '/api/file-explorer/files',
75
- params: { containerName: input.containerName, cellName: input.cellName, directoryId: input.directoryId, entityId: input.entityId },
70
+ params: {
71
+ containerName: input.containerName,
72
+ cellName: input.cellName,
73
+ directoryId: input.directoryId,
74
+ entityId: input.entityId,
75
+ },
76
76
  body: input.file,
77
77
  }, { apiName: 'FileExplorer', ...config });
78
+ /**文件表格-选择的表格数据项 */
79
+ this.selectedTable = [];
80
+ /**当前选择的table项 id */
81
+ this.nowSelectId = '';
82
+ /**是否全选 */
83
+ this.isAllSelected = false;
84
+ /**判断row是否选中 */
85
+ this.selectedcheckbox = id => {
86
+ return this.selectedTable.some(el => el.id === id);
87
+ };
88
+ /**当前编辑的row */
89
+ this.newEditRow = '';
90
+ /**是否正在加载 */
91
+ this.isloading = false;
78
92
  that = this;
79
93
  }
80
94
  /**获取目录配置 */
81
95
  getFilesConfiguration() {
82
- this._FileDescriptorService.getFileContainerConfiguration(this._fileContainerName).subscribe(res => {
83
- this.createDirectoryPermissionName = res?.createDirectoryPermissionName;
96
+ return new Promise((resolve, reject) => {
97
+ this._FileDescriptorService
98
+ .getFileContainerConfiguration(this._fileContainerName)
99
+ .subscribe(res => {
100
+ this.createDirectoryPermissionName = res?.createDirectoryPermissionName;
101
+ resolve(res);
102
+ });
84
103
  });
85
104
  }
86
105
  set fileContainerName(v) {
87
106
  if (v) {
88
107
  this._fileContainerName = v;
89
- this.loadData();
108
+ // this.loadData()
90
109
  }
91
110
  }
92
111
  set multiple(v) {
93
112
  this._multiple = v;
94
- if (v) { }
113
+ if (v) {
114
+ }
95
115
  }
96
116
  set limit(v) {
97
117
  this.sizeLimit = v;
@@ -106,7 +126,13 @@ export class FileModalComponent {
106
126
  /**模态框-状态改变回调 */
107
127
  ModalVisibleChange(event) {
108
128
  if (!event) {
129
+ this.ModalOpen = false;
130
+ this.ModalBusy = false;
109
131
  this.visibleChange.emit(event);
132
+ this.createDirectoryPermissionName = '';
133
+ this._theSelectedTreeNode = '';
134
+ this.selectedTable = [];
135
+ this.uploadPictureStatusList = [];
110
136
  return;
111
137
  }
112
138
  }
@@ -119,12 +145,47 @@ export class FileModalComponent {
119
145
  /**初始化数据 */
120
146
  loadData() {
121
147
  if (this.ModalOpen && this._fileContainerName) {
122
- this.hookToQuery();
148
+ this.list.maxResultCount = 100;
149
+ // this.filters.skipCount = 0;
123
150
  this.getFilesConfiguration();
151
+ if (!this.isCreateList) {
152
+ this.hookToQuery();
153
+ this.isCreateList = true;
154
+ }
155
+ else {
156
+ this.list.get();
157
+ }
124
158
  }
125
159
  }
160
+ /** 从tree获取数据 */
161
+ treeNodeData(event) {
162
+ this.fileGroupList = this.flattenNestedArray(event);
163
+ }
164
+ /**
165
+ * 将嵌套数组扁平化
166
+ * @param {Array} nestedArray - 包含嵌套children的数组
167
+ * @returns {Array} - 扁平化后的数组
168
+ */
169
+ flattenNestedArray(nestedArray) {
170
+ let result = [];
171
+ function flatten(items) {
172
+ if (!items)
173
+ return;
174
+ for (const item of items) {
175
+ // 将当前项添加到结果数组
176
+ result.push({ ...item });
177
+ // 如果有children属性且是数组,递归处理
178
+ if (item.children && Array.isArray(item.children)) {
179
+ flatten(item.children);
180
+ }
181
+ }
182
+ }
183
+ flatten(nestedArray);
184
+ return result;
185
+ }
126
186
  /**tree-节点选择 */
127
187
  _nodeClick(event) {
188
+ this.filters.skipCount = 0;
128
189
  this._theSelectedTreeNode = event;
129
190
  this.list.get();
130
191
  }
@@ -137,12 +198,15 @@ export class FileModalComponent {
137
198
  this.setuploadPictureStatus(file, 2);
138
199
  continue;
139
200
  }
140
- await this.uploadingFile(file).then(() => {
201
+ await this.uploadingFile(file)
202
+ .then(res => {
203
+ this.selectedTable.push(res);
141
204
  this.setuploadPictureStatus(file, 1);
142
- this.list.get();
143
- }).catch(() => {
205
+ // this.list.get()
206
+ })
207
+ .catch(() => {
144
208
  this.setuploadPictureStatus(file, 2);
145
- }); // 等待每个文件上传完成
209
+ }); // 等待每个文件上传完成
146
210
  }
147
211
  this.list.get();
148
212
  let isSubmit = !this.uploadPictureStatusList.some(el => el.status == 2);
@@ -150,7 +214,7 @@ export class FileModalComponent {
150
214
  // this.toaster.success("上传完成");
151
215
  setTimeout(() => {
152
216
  this.uploadPictureStatusList = [];
153
- }, 6000);
217
+ }, 4000);
154
218
  }
155
219
  }
156
220
  /**图片上传-设置uploadPictureStatusList的状态 */
@@ -169,43 +233,156 @@ export class FileModalComponent {
169
233
  file: formData,
170
234
  containerName: this._fileContainerName,
171
235
  directoryId: this._theSelectedTreeNode?.key || '',
172
- entityId: ''
236
+ entityId: '',
173
237
  }).subscribe(res => {
174
- resolve(true);
175
- }, (err) => {
238
+ resolve(res);
239
+ }, err => {
176
240
  rejects(false);
177
241
  });
178
242
  });
179
243
  }
180
- ngOnChanges(changes) {
181
- //Called before any other lifecycle hook. Use it to inject dependencies, but avoid any serious work here.
182
- //Add '${implements OnChanges}' to the class.
183
- this.selectedTable = this._FileApiService.deepClone(this.selectPickerFile);
184
- }
185
244
  /**文件表格-获取表格数据 */
186
245
  hookToQuery() {
187
246
  const getData = (query) => this._FileService.getList({
188
247
  ...query,
189
248
  ...this.filters,
190
249
  containerName: this._fileContainerName,
191
- directoryId: this._theSelectedTreeNode.key
250
+ directoryId: this._theSelectedTreeNode.key,
192
251
  });
193
- const setData = (list) => (this.data = list);
252
+ const setData = (list) => {
253
+ this.data = list;
254
+ this.onPageChange(list.items);
255
+ };
194
256
  this.list.hookToQuery(getData).subscribe(setData);
195
257
  }
196
258
  /**文件表格-查看所有分组的文件数据 */
197
259
  lookAllFile() {
260
+ this.filters.skipCount = 0;
198
261
  this._theSelectedTreeNode = '';
199
262
  this.list.get();
200
263
  }
201
- /**选择表格项 */
202
- onSelectTableItem({ selected }) {
203
- this.selectedTable = this._FileApiService.deepClone(selected);
204
- let selectedTablearr = this.removeDuplicatesById(this.selectedTable);
205
- if (selected.length > selectedTablearr.length) {
206
- selectedTablearr = selectedTablearr.filter(el => el.id !== this.nowSelectId);
264
+ /**删除图片 */
265
+ deleteFile(file) {
266
+ this._FileService.delete(file.id).subscribe(res => {
267
+ this.toaster.success(this._LocalizationService.instant(`FileExplorer::DeletedSuccessfully`));
268
+ this.list.get();
269
+ });
270
+ }
271
+ /**删除所有选中图片 */
272
+ onDeleteAllSelectFile() {
273
+ this.confirmation
274
+ .warn('', {
275
+ key: '',
276
+ defaultValue: this._LocalizationService.instant(`FileExplorer::AreYouSure`),
277
+ })
278
+ .subscribe(async (status) => {
279
+ if (status == 'confirm') {
280
+ let selectedTable = this.selectedTable;
281
+ try {
282
+ const result = await this.batchDeleteItems(selectedTable);
283
+ if (result.success) {
284
+ this.toaster.success(result.message);
285
+ this.list.get();
286
+ // 可能需要刷新表格或更新UI
287
+ }
288
+ else {
289
+ //删除失败的项
290
+ this.list.get();
291
+ // console.warn(result.message);
292
+ // 可以选择展示失败项或重试
293
+ }
294
+ }
295
+ catch (error) {
296
+ //批量删除过程中发生错误
297
+ }
298
+ }
299
+ });
300
+ }
301
+ /**
302
+ * 批量删除表格项
303
+ * @param selectedTable 需要删除的表格项数组
304
+ * @returns 包含成功状态和失败项的结果对象
305
+ */
306
+ async batchDeleteItems(selectedTable) {
307
+ // 存储所有删除请求的Promise
308
+ const deletePromises = selectedTable.map(item => {
309
+ return new Promise((resolve, reject) => {
310
+ this._FileService.delete(item.id).subscribe(() => {
311
+ resolve(null);
312
+ }, () => {
313
+ reject(item);
314
+ });
315
+ });
316
+ });
317
+ // 等待所有请求完成
318
+ const results = await Promise.allSettled(deletePromises);
319
+ console.log(results, 'resultsresultsresults');
320
+ // 收集失败的项
321
+ const failedItems = [];
322
+ results.forEach(result => {
323
+ if (result.status === 'rejected') {
324
+ failedItems.push(result.reason);
325
+ }
326
+ });
327
+ return {
328
+ success: failedItems.length === 0,
329
+ failedItems,
330
+ message: failedItems.length === 0
331
+ ? this._LocalizationService.instant(`FileExplorer::DeletedSuccessfully`)
332
+ : `${failedItems.length}个项删除失败`,
333
+ };
334
+ }
335
+ // 使用示例
336
+ async handleBatchDelete() { }
337
+ /**关闭文件状态弹窗 */
338
+ closeFileStatusModal() {
339
+ this.uploadPictureStatusList = [];
340
+ }
341
+ ngOnChanges(changes) {
342
+ //Called before any other lifecycle hook. Use it to inject dependencies, but avoid any serious work here.
343
+ //Add '${implements OnChanges}' to the class.
344
+ this.selectedTable = this._FileApiService.deepClone(this.selectPickerFile);
345
+ }
346
+ /**表格分页切换 */
347
+ onPageChange(newArray) {
348
+ this.isAllSelected = this.isAllSelectedFn(newArray, this.selectedTable);
349
+ }
350
+ /**行选择框改变 */
351
+ onCheckboxChangeFn(event, row, array) {
352
+ const { checked } = event.target;
353
+ let selectedTableArray = [...this.selectedTable];
354
+ if (this._multiple) {
355
+ if (checked) {
356
+ selectedTableArray.push(row);
357
+ }
358
+ else {
359
+ selectedTableArray = selectedTableArray.filter(el => el.id != row.id);
360
+ }
361
+ this.isAllSelected = this.isAllSelectedFn(array, selectedTableArray);
362
+ }
363
+ else {
364
+ selectedTableArray.length = 0;
365
+ selectedTableArray = checked ? [row] : [];
207
366
  }
208
- this.selectedTable = selectedTablearr;
367
+ this.selectedTable = this.removeDuplicatesById(selectedTableArray);
368
+ }
369
+ /**如果selectedTableArray不含array中的所有项,则将isAllSelected设为true,否则设为false */
370
+ isAllSelectedFn(tolalArray, selectedArray = []) {
371
+ if (tolalArray.length == 0)
372
+ return false;
373
+ return tolalArray.every(item => selectedArray.some(el => el.id === item.id));
374
+ }
375
+ /**选择当前页全部 */
376
+ onSelectAllFn(event, array) {
377
+ let selectedTableArray = this.selectedTable;
378
+ if (event.target.checked) {
379
+ selectedTableArray = this.removeDuplicatesById([...selectedTableArray, ...array]);
380
+ }
381
+ else {
382
+ selectedTableArray = selectedTableArray.filter(el => !array.some(item => item.id === el.id));
383
+ }
384
+ this.isAllSelected = event.target.checked;
385
+ this.selectedTable = selectedTableArray;
209
386
  }
210
387
  /**删除数组中重复的项 */
211
388
  removeDuplicatesById(array) {
@@ -218,32 +395,61 @@ export class FileModalComponent {
218
395
  return false;
219
396
  });
220
397
  }
221
- /**删除图片 */
222
- deleteFile(file) {
223
- this.confirmation
224
- .warn('', { key: '', defaultValue: this._LocalizationService.instant(`AbpUi::ItemWillBeDeletedMessage`) })
225
- .subscribe((status) => {
226
- if (status == 'confirm') {
227
- this._FileService.delete(file.id).subscribe(res => {
228
- this.toaster.success(this._LocalizationService.instant(`AbpUi::DeletedSuccessfully`));
229
- this.list.get();
230
- });
398
+ /**提交FileName编辑 */
399
+ onSubmitFileName(event) {
400
+ let input = this.FileNameForm.value;
401
+ if (!this.FileNameForm.valid)
402
+ return;
403
+ if (this.isloading)
404
+ return;
405
+ this.isloading = true;
406
+ this._FileService
407
+ .update(input.id, {
408
+ name: input.fileName
409
+ })
410
+ .pipe(finalize(() => {
411
+ this.isloading = false;
412
+ }))
413
+ .subscribe(res => {
414
+ //通过当前newEditRow的id,修改data.items中对应项的name
415
+ for (const element of this.data.items) {
416
+ if (element.id == this.newEditRow.id) {
417
+ element.name = input.fileName;
418
+ break;
419
+ }
231
420
  }
421
+ this.FileNameForm = undefined;
422
+ this.newEditRow = '';
423
+ this.toaster.success(this._LocalizationService.instant(`FileExplorer::SavedSuccessfully`));
424
+ // this.list.get();
232
425
  });
233
426
  }
234
- /**关闭文件状态弹窗 */
235
- closeFileStatusModal() {
236
- this.uploadPictureStatusList = [];
427
+ /**打开编辑 */
428
+ onEditFileName(row) {
429
+ this.FileNameForm = new FormGroup({
430
+ fileName: new FormControl('', [Validators.required]),
431
+ id: new FormControl('', [Validators.required]),
432
+ });
433
+ this.FileNameForm.patchValue({
434
+ fileName: row.name,
435
+ id: row.id,
436
+ });
437
+ this.newEditRow = row;
438
+ }
439
+ /**关闭编辑 */
440
+ onCancelFileName(row) {
441
+ this.newEditRow = '';
442
+ this.FileNameForm = undefined;
237
443
  }
238
444
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FileModalComponent, deps: [{ token: i1.FileDescriptorService }, { token: i2.ToasterService }, { token: i3.ListService }, { token: i4.FileApiService }, { token: i3.RestService }, { token: i2.ConfirmationService }, { token: i3.LocalizationService }], target: i0.ɵɵFactoryTarget.Component }); }
239
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.5", type: FileModalComponent, selector: "fe-file-modal", inputs: { fileContainerName: "fileContainerName", multiple: "multiple", limit: "limit", visible: "visible", selectPickerFile: "selectPickerFile" }, outputs: { visibleChange: "visibleChange", selectFilefn: "selectFilefn" }, providers: [
445
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.5", type: FileModalComponent, selector: "fe-file-modal", inputs: { fileContainerName: "fileContainerName", multiple: "multiple", limit: "limit", visible: "visible", selectPickerFile: "selectPickerFile" }, outputs: { visibleChange: "visibleChange", selectFilefn: "selectFilefn" }, providers: [
240
446
  // [Required]
241
447
  ListService,
242
448
  // [Optional]
243
449
  // Provide this token if you want a different debounce time.
244
450
  // Default is 300. Cannot be 0. Any value below 100 is not recommended.
245
451
  { provide: LIST_QUERY_DEBOUNCE_TIME, useValue: 500 },
246
- ], usesOnChanges: true, ngImport: i0, template: "<abp-modal [(visible)]=\"ModalOpen\" (visibleChange)=\"ModalVisibleChange($event)\"\n [options]=\"{ size: 'xl', scrollable: false }\">\n <ng-template #abpHeader>\n <h3>{{'FileExplorer::FileExplorer' | abpLocalization}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <div class=\"row file-explorer-modal-body file-modal\">\n <div class=\"col-3\" *ngIf=\"createDirectoryPermissionName\" style=\"overflow: auto; height: calc(100vh - 240px)\">\n <fe-file-modal-tree [theSelectedTreeNode]=\"_theSelectedTreeNode\" (nodeClick)=\"_nodeClick($event)\"\n [fileContainerName]=\"_fileContainerName\"></fe-file-modal-tree>\n </div>\n <div [class]=\"createDirectoryPermissionName?'col-9':'col-12'\" style=\"height: calc(100vh - 240px)\">\n <div class=\"mb-3 d-flex justify-content-between align-items-center\">\n <div class=\"btn-link\" role=button style=\"flex: 2\" (click)=\"lookAllFile()\">{{'FileExplorer::AllFiles' | abpLocalization}}</div>\n <div class=\"input-group form-file\" style=\"flex: 2\">\n <input type=\"file\" class=\"form-control\" #fileEdit [multiple]=\"_multiple\" \n (change)=\"getFileChange($event)\" />\n </div>\n </div>\n <div>\n <ngx-datatable class=\"material container-height\" [rows]=\"data.items\" [list]=\"list\" columnMode=\"flex\"\n [columns]=\"columns\" [headerHeight]=\"50\" [footerHeight]=\"50\" rowHeight=\"auto\" [scrollbarV]=\"true\"\n [virtualization]=\"false\" [externalPaging]=\"true\" [count]=\"data.totalCount\" [selected]=\"selectedTable\"\n [selectCheck]=\"selectCheck\" [selectionType]=\"_multiple?SelectionType.multiClick:SelectionType.single\" (select)=\"onSelectTableItem($event)\">\n <ngx-datatable-column [width]=\"50\" prop=\"id\" [sortable]=\"false\" [canAutoResize]=\"false\" [draggable]=\"false\"\n [resizeable]=\"false\">\n <ng-template ngx-datatable-header-template let-value=\"value\" let-allRowsSelected=\"allRowsSelected\"\n let-selectFn=\"selectFn\">\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"allRowsSelected\"\n (change)=\"selectFn(!allRowsSelected)\" />\n </ng-template>\n <ng-template ngx-datatable-cell-template let-row=\"row\" let-value=\"value\" let-isSelected=\"isSelected\"\n let-onCheckboxChangeFn=\"onCheckboxChangeFn\">\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"selectedcheckbox(value)\"\n (change)=\"onCheckboxChangeFn($event)\" />\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <fe-file-preview [width]=\"'80px'\" [src]=\"row.url\" [name]=\"row.name\" [type]=\"row.mimeType\" [preview]=\"true\"></fe-file-preview>\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileName' | abpLocalization\" prop=\"name\" [flexGrow]=\"4\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileSize' | abpLocalization\" prop=\"size\" [flexGrow]=\"1.5\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ _FileApiService.formatFileSize(value) }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::Directory' | abpLocalization\" prop=\"cellName\" [flexGrow]=\"1\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::CreationTime' | abpLocalization\" prop=\"creationTime\" [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value | date : 'YYYY/MM/dd HH:mm:s' }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [flexGrow]=\"1\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <button class=\"btn btn-sm btn-light p-0\" (click.stop)=\"deleteFile(row)\">\n <i class=\"fas fa-trash text-primary p-2\"></i>\n </button>\n </ng-template>\n </ngx-datatable-column>\n </ngx-datatable>\n </div>\n <div *ngIf=\"uploadPictureStatusList.length > 0\"\n class=\"position-fixed bottom-0 end-0 shadow-lg file-status-modal m-5\"\n style=\"border-radius: 10px\">\n <div class=\"card p-1\">\n <div class=\"card-header d-flex align-items-center justify-content-between p-0 py-1 border-bottom\">\n <div>{{'FileExplorer::UploadFiles' | abpLocalization}}</div>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click.stop)=\"closeFileStatusModal()\"></button>\n </div>\n <div class=\"card-body\">\n <table class=\"table\">\n <thead>\n <tr>\n <th scope=\"col\">{{'FileExplorer::FileName' | abpLocalization}}</th>\n <th scope=\"col\">{{'FileExplorer::FileSize' | abpLocalization}}</th>\n <th scope=\"col\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of uploadPictureStatusList; let i = index\">\n <tr>\n <th scope=\"row\">\n <div>{{ item.name }}</div>\n <div class=\"form-text text-danger\" *ngIf=\"item.size > sizeLimit\">\n {{'FileExplorer::ExceedsMaximumSize' | abpLocalization:_FileApiService.formatFileSize(sizeLimit)}}\n </div>\n </th>\n <td>{{ item.fileSize }}</td>\n <td>\n <i *ngIf=\"item.status === 1\" class=\"fas fa-check text-primary\"></i>\n <i *ngIf=\"item.status === 2\" class=\"fas fa-times-circle text-danger\"></i>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\n <abp-button iconClass=\"fa fa-check\" (click)=\"modalSave()\">{{'AbpUi::Save' | abpLocalization}}</abp-button>\n </ng-template>\n</abp-modal>", styles: ["::ng-deep .file-modal .container-height{height:calc(100vh - 284px)}::ng-deep .file-modal .file-status-modal{background:#fff}::ng-deep .file-modal .file-status-modal .card-body{max-height:300px;overflow-y:auto}::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active .datatable-row-group{background-color:transparent!important}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper{padding:0}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .custom-node{width:100%}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .selected{background-color:var(--lpx-brand)!important}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .selected .btn{color:var(--lpx-navbar-color)}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:transparent}::ng-deep .file-modal .ngx-datatable.fixed-header .datatable-header .datatable-header-inner .datatable-header-cell,::ng-deep .file-modal .ngx-datatable.material .datatable-body .datatable-body-row .datatable-body-cell{overflow:initial;line-break:anywhere}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "component", type: i6.DatatableComponent, selector: "ngx-datatable", inputs: ["targetMarkerTemplate", "rows", "groupRowsBy", "groupedRows", "columns", "selected", "scrollbarV", "scrollbarH", "rowHeight", "columnMode", "headerHeight", "footerHeight", "externalPaging", "externalSorting", "limit", "count", "offset", "loadingIndicator", "selectionType", "reorderable", "swapColumns", "sortType", "sorts", "cssClasses", "messages", "rowClass", "selectCheck", "displayCheck", "groupExpansionDefault", "trackByProp", "selectAllRowsOnPage", "virtualization", "treeFromRelation", "treeToRelation", "summaryRow", "summaryHeight", "summaryPosition", "rowIdentity"], outputs: ["scroll", "activate", "select", "sort", "page", "reorder", "resize", "tableContextmenu", "treeAction"] }, { kind: "directive", type: i6.DataTableColumnDirective, selector: "ngx-datatable-column", inputs: ["name", "prop", "frozenLeft", "frozenRight", "flexGrow", "resizeable", "comparator", "pipe", "sortable", "draggable", "canAutoResize", "minWidth", "width", "maxWidth", "checkboxable", "headerCheckboxable", "headerClass", "cellClass", "isTreeColumn", "treeLevelIndent", "summaryFunc", "summaryTemplate", "cellTemplate", "headerTemplate", "treeToggleTemplate"] }, { kind: "directive", type: i6.DataTableColumnHeaderDirective, selector: "[ngx-datatable-header-template]" }, { kind: "directive", type: i6.DataTableColumnCellDirective, selector: "[ngx-datatable-cell-template]" }, { kind: "directive", type: i2.NgxDatatableListDirective, selector: "ngx-datatable[list]", inputs: ["list"], exportAs: ["ngxDatatableList"] }, { kind: "component", type: i2.ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: i2.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: i2.ModalCloseDirective, selector: "[abpClose]" }, { kind: "component", type: i7.FileModalTreeComponent, selector: "fe-file-modal-tree", inputs: ["theSelectedTreeNode", "fileContainerName"], outputs: ["nodeClick"] }, { kind: "component", type: i8.FilePreviewComponent, selector: "fe-file-preview", inputs: ["width", "src", "preview", "type", "name", "className"] }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i3.LocalizationPipe, name: "abpLocalization" }] }); }
452
+ ], usesOnChanges: true, ngImport: i0, template: "<abp-modal [(visible)]=\"ModalOpen\" (visibleChange)=\"ModalVisibleChange($event)\"\n [options]=\"{ size: 'xl', scrollable: false }\">\n <ng-template #abpHeader>\n <h3>{{'FileExplorer::FileExplorer' | abpLocalization}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <div class=\"row file-explorer-modal-body file-modal\" *ngIf=\"ModalOpen\">\n <div class=\"col-3\" *ngIf=\"createDirectoryPermissionName\" style=\"overflow: auto; height: calc(100vh - 240px)\">\n <fe-file-modal-tree [theSelectedTreeNode]=\"_theSelectedTreeNode\" (nodeClick)=\"_nodeClick($event)\"\n (lookAllBtn)=\"lookAllFile()\" (treeNodeData)=\"treeNodeData($event)\"\n [fileContainerName]=\"_fileContainerName\"></fe-file-modal-tree>\n </div>\n <div [class]=\"createDirectoryPermissionName?'col-9':'col-12'\" style=\"height: calc(100vh - 240px)\">\n <div class=\"mb-3 d-flex justify-content-between align-items-center\">\n <div style=\"flex: 2\"><span *ngIf=\"selectedTable.length>1\" class=\"btn-link\"\n (click.stop)=\"onDeleteAllSelectFile()\" role=\"button\">{{'FileExplorer::Delete' | abpLocalization}}</span>\n </div>\n <div class=\"input-group form-file\" style=\"flex: 2\">\n <input type=\"file\" class=\"form-control\" #fileEdit [multiple]=\"_multiple\" (change)=\"getFileChange($event)\" />\n </div>\n </div>\n <div>\n <!-- [selectionType]=\"_multiple?SelectionType.checkbox:SelectionType.single\" -->\n <!-- [selectCheck]=\"selectCheck\" -->\n <ngx-datatable class=\"material container-height\" [rows]=\"data.items\" [list]=\"list\" columnMode=\"flex\"\n [headerHeight]=\"50\" [footerHeight]=\"50\" rowHeight=\"auto\" [scrollbarV]=\"true\" [virtualization]=\"false\"\n [externalPaging]=\"true\" [count]=\"data.totalCount\">\n <ngx-datatable-column [width]=\"50\" prop=\"id\" [sortable]=\"false\" [canAutoResize]=\"false\" [draggable]=\"false\"\n [resizeable]=\"false\">\n <ng-template ngx-datatable-header-template let-value=\"value\" let-allRowsSelected=\"allRowsSelected\"\n let-selectFn=\"selectFn\">\n <input type=\"checkbox\" class=\"form-check-input\" *ngIf=\"_multiple\" [checked]=\"isAllSelected\"\n (change)=\"onSelectAllFn($event,data.items)\" />\n </ng-template>\n <ng-template ngx-datatable-cell-template let-row=\"row\" let-value=\"value\">\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"selectedcheckbox(value)\"\n (change)=\"onCheckboxChangeFn($event,row,data.items)\" />\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [sortable]=\"false\" [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <fe-file-preview [width]=\"'80px'\" [src]=\"row.url\" [name]=\"row.name\" [type]=\"row.mimeType\"\n [preview]=\"true\"></fe-file-preview>\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileName' | abpLocalization\" prop=\"name\" [sortable]=\"false\"\n [flexGrow]=\"4\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <div class=\"d-flex align-items-start titlehover\" *ngIf=\"newEditRow.id!==row.id\">\n <span class=\"me-2\">{{ value }}</span>\n <i class=\"fa fa-pencil-square-o\" role=\"button\" (click.stop)=\"onEditFileName(row)\" style=\"line-height:2;\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"FileNameForm&&newEditRow.id===row.id\">\n <form [formGroup]=\"FileNameForm\" (ngSubmit)=\"onSubmitFileName($event)\">\n <div class=\"d-flex align-items-start\">\n <div class=\"me-2\">\n <input class=\"form-control \" type=\"text\" formControlName=\"fileName\">\n </div>\n <button class=\" btn btn-sm\" type=\"submit\">\n <i class=\"fa-spin fa fa-spinner\" *ngIf=\"isloading\"></i>\n <i class=\"fa fa-check\" aria-hidden=\"true\" *ngIf=\"!isloading\"></i></button>\n <button class=\" btn btn-sm\" (click.stop)=\"onCancelFileName(row)\"><i class=\"fa fa-times\" type=\"reset\" aria-hidden=\"true\"></i></button>\n \n </div>\n </form>\n </div>\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileSize' | abpLocalization\" prop=\"size\" [flexGrow]=\"1.5\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ _FileApiService.formatFileSize(value) }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::Directory' | abpLocalization\" prop=\"directoryId\"\n [sortable]=\"false\" [flexGrow]=\"1\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value|getDirectoryName:fileGroupList }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::CreationTime' | abpLocalization\" prop=\"creationTime\"\n [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value | date : 'YYYY/MM/dd HH:mm:s' }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [flexGrow]=\"1\" [sortable]=\"false\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <button class=\"btn btn-sm btn-light p-0\" (click.stop)=\"deleteFile(row)\">\n <i class=\"fas fa-trash text-primary p-2\"></i>\n </button>\n </ng-template>\n </ngx-datatable-column>\n </ngx-datatable>\n </div>\n <div *ngIf=\"uploadPictureStatusList.length > 0\"\n class=\"position-fixed bottom-0 end-0 shadow-lg file-status-modal m-5\" style=\"border-radius: 10px\">\n <div class=\"card p-1\">\n <div class=\"card-header d-flex align-items-center justify-content-between p-0 py-1 border-bottom\">\n <div>{{'FileExplorer::UploadFiles' | abpLocalization}}</div>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click.stop)=\"closeFileStatusModal()\"></button>\n </div>\n <div class=\"card-body\">\n <table class=\"table\">\n <thead>\n <tr>\n <th scope=\"col\">{{'FileExplorer::FileName' | abpLocalization}}</th>\n <th scope=\"col\">{{'FileExplorer::FileSize' | abpLocalization}}</th>\n <th scope=\"col\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of uploadPictureStatusList; let i = index\">\n <tr>\n <th scope=\"row\">\n <div>{{ item.name }}</div>\n <div class=\"form-text text-danger\" *ngIf=\"item.size > sizeLimit\">\n {{'FileExplorer::ExceedsMaximumSize' |\n abpLocalization:_FileApiService.formatFileSize(sizeLimit)}}\n </div>\n </th>\n <td>{{ item.fileSize }}</td>\n <td>\n <i *ngIf=\"item.status === 1\" class=\"fas fa-check text-primary\"></i>\n <i *ngIf=\"item.status === 2\" class=\"fas fa-times-circle text-danger\"></i>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\n <abp-button iconClass=\"fa fa-check\" (click)=\"modalSave()\">{{'FileExplorer::Confirm' | abpLocalization}}\n @if(selectedTable.length>0){\n ({{selectedTable.length}})\n }\n </abp-button>\n </ng-template>\n</abp-modal>", styles: ["::ng-deep .file-modal .container-height{height:calc(100vh - 284px)}::ng-deep .file-modal .file-status-modal{background:#fff}::ng-deep .file-modal .file-status-modal .card-body{max-height:300px;overflow-y:auto}::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active .datatable-row-group{background-color:transparent!important}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper{padding:0}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .ng-star-inserted[title]{padding:0 10px}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .custom-node{width:100%}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .selected{background-color:var(--lpx-brand)!important;color:var(--lpx-brand-text)}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:transparent}::ng-deep .file-modal .ngx-datatable.fixed-header .datatable-header .datatable-header-inner .datatable-header-cell,::ng-deep .file-modal .ngx-datatable.material .datatable-body .datatable-body-row .datatable-body-cell{overflow:initial;line-break:anywhere}::ng-deep .file-modal input[type=checkbox]{cursor:pointer}::ng-deep .file-modal .titlehover i{display:none}::ng-deep .file-modal .titlehover:hover i{display:block}\n"], dependencies: [{ kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormSubmitDirective, selector: "form[ngSubmit][formGroup]", inputs: ["debounce", "notValidateOnSubmit", "markAsDirtyWhenSubmit"], outputs: ["ngSubmit"] }, { kind: "directive", type: i3.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "component", type: i7.DatatableComponent, selector: "ngx-datatable", inputs: ["targetMarkerTemplate", "rows", "groupRowsBy", "groupedRows", "columns", "selected", "scrollbarV", "scrollbarH", "rowHeight", "columnMode", "headerHeight", "footerHeight", "externalPaging", "externalSorting", "limit", "count", "offset", "loadingIndicator", "selectionType", "reorderable", "swapColumns", "sortType", "sorts", "cssClasses", "messages", "rowClass", "selectCheck", "displayCheck", "groupExpansionDefault", "trackByProp", "selectAllRowsOnPage", "virtualization", "treeFromRelation", "treeToRelation", "summaryRow", "summaryHeight", "summaryPosition", "rowIdentity"], outputs: ["scroll", "activate", "select", "sort", "page", "reorder", "resize", "tableContextmenu", "treeAction"] }, { kind: "directive", type: i7.DataTableColumnDirective, selector: "ngx-datatable-column", inputs: ["name", "prop", "frozenLeft", "frozenRight", "flexGrow", "resizeable", "comparator", "pipe", "sortable", "draggable", "canAutoResize", "minWidth", "width", "maxWidth", "checkboxable", "headerCheckboxable", "headerClass", "cellClass", "isTreeColumn", "treeLevelIndent", "summaryFunc", "summaryTemplate", "cellTemplate", "headerTemplate", "treeToggleTemplate"] }, { kind: "directive", type: i7.DataTableColumnHeaderDirective, selector: "[ngx-datatable-header-template]" }, { kind: "directive", type: i7.DataTableColumnCellDirective, selector: "[ngx-datatable-cell-template]" }, { kind: "directive", type: i8.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i8.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "directive", type: i2.NgxDatatableListDirective, selector: "ngx-datatable[list]", inputs: ["list"], exportAs: ["ngxDatatableList"] }, { kind: "component", type: i2.ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: i2.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: i2.ModalCloseDirective, selector: "[abpClose]" }, { kind: "component", type: i9.FileModalTreeComponent, selector: "fe-file-modal-tree", inputs: ["theSelectedTreeNode", "fileContainerName"], outputs: ["nodeClick", "treeNodeData", "lookAllBtn"] }, { kind: "component", type: i10.FilePreviewComponent, selector: "fe-file-preview", inputs: ["width", "src", "preview", "type", "name", "className"] }, { kind: "pipe", type: i6.DatePipe, name: "date" }, { kind: "pipe", type: i3.LocalizationPipe, name: "abpLocalization" }, { kind: "pipe", type: i11.GetDirectoryNamePipe, name: "getDirectoryName" }] }); }
247
453
  }
248
454
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FileModalComponent, decorators: [{
249
455
  type: Component,
@@ -254,7 +460,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
254
460
  // Provide this token if you want a different debounce time.
255
461
  // Default is 300. Cannot be 0. Any value below 100 is not recommended.
256
462
  { provide: LIST_QUERY_DEBOUNCE_TIME, useValue: 500 },
257
- ], template: "<abp-modal [(visible)]=\"ModalOpen\" (visibleChange)=\"ModalVisibleChange($event)\"\n [options]=\"{ size: 'xl', scrollable: false }\">\n <ng-template #abpHeader>\n <h3>{{'FileExplorer::FileExplorer' | abpLocalization}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <div class=\"row file-explorer-modal-body file-modal\">\n <div class=\"col-3\" *ngIf=\"createDirectoryPermissionName\" style=\"overflow: auto; height: calc(100vh - 240px)\">\n <fe-file-modal-tree [theSelectedTreeNode]=\"_theSelectedTreeNode\" (nodeClick)=\"_nodeClick($event)\"\n [fileContainerName]=\"_fileContainerName\"></fe-file-modal-tree>\n </div>\n <div [class]=\"createDirectoryPermissionName?'col-9':'col-12'\" style=\"height: calc(100vh - 240px)\">\n <div class=\"mb-3 d-flex justify-content-between align-items-center\">\n <div class=\"btn-link\" role=button style=\"flex: 2\" (click)=\"lookAllFile()\">{{'FileExplorer::AllFiles' | abpLocalization}}</div>\n <div class=\"input-group form-file\" style=\"flex: 2\">\n <input type=\"file\" class=\"form-control\" #fileEdit [multiple]=\"_multiple\" \n (change)=\"getFileChange($event)\" />\n </div>\n </div>\n <div>\n <ngx-datatable class=\"material container-height\" [rows]=\"data.items\" [list]=\"list\" columnMode=\"flex\"\n [columns]=\"columns\" [headerHeight]=\"50\" [footerHeight]=\"50\" rowHeight=\"auto\" [scrollbarV]=\"true\"\n [virtualization]=\"false\" [externalPaging]=\"true\" [count]=\"data.totalCount\" [selected]=\"selectedTable\"\n [selectCheck]=\"selectCheck\" [selectionType]=\"_multiple?SelectionType.multiClick:SelectionType.single\" (select)=\"onSelectTableItem($event)\">\n <ngx-datatable-column [width]=\"50\" prop=\"id\" [sortable]=\"false\" [canAutoResize]=\"false\" [draggable]=\"false\"\n [resizeable]=\"false\">\n <ng-template ngx-datatable-header-template let-value=\"value\" let-allRowsSelected=\"allRowsSelected\"\n let-selectFn=\"selectFn\">\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"allRowsSelected\"\n (change)=\"selectFn(!allRowsSelected)\" />\n </ng-template>\n <ng-template ngx-datatable-cell-template let-row=\"row\" let-value=\"value\" let-isSelected=\"isSelected\"\n let-onCheckboxChangeFn=\"onCheckboxChangeFn\">\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"selectedcheckbox(value)\"\n (change)=\"onCheckboxChangeFn($event)\" />\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <fe-file-preview [width]=\"'80px'\" [src]=\"row.url\" [name]=\"row.name\" [type]=\"row.mimeType\" [preview]=\"true\"></fe-file-preview>\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileName' | abpLocalization\" prop=\"name\" [flexGrow]=\"4\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileSize' | abpLocalization\" prop=\"size\" [flexGrow]=\"1.5\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ _FileApiService.formatFileSize(value) }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::Directory' | abpLocalization\" prop=\"cellName\" [flexGrow]=\"1\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::CreationTime' | abpLocalization\" prop=\"creationTime\" [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value | date : 'YYYY/MM/dd HH:mm:s' }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [flexGrow]=\"1\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <button class=\"btn btn-sm btn-light p-0\" (click.stop)=\"deleteFile(row)\">\n <i class=\"fas fa-trash text-primary p-2\"></i>\n </button>\n </ng-template>\n </ngx-datatable-column>\n </ngx-datatable>\n </div>\n <div *ngIf=\"uploadPictureStatusList.length > 0\"\n class=\"position-fixed bottom-0 end-0 shadow-lg file-status-modal m-5\"\n style=\"border-radius: 10px\">\n <div class=\"card p-1\">\n <div class=\"card-header d-flex align-items-center justify-content-between p-0 py-1 border-bottom\">\n <div>{{'FileExplorer::UploadFiles' | abpLocalization}}</div>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click.stop)=\"closeFileStatusModal()\"></button>\n </div>\n <div class=\"card-body\">\n <table class=\"table\">\n <thead>\n <tr>\n <th scope=\"col\">{{'FileExplorer::FileName' | abpLocalization}}</th>\n <th scope=\"col\">{{'FileExplorer::FileSize' | abpLocalization}}</th>\n <th scope=\"col\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of uploadPictureStatusList; let i = index\">\n <tr>\n <th scope=\"row\">\n <div>{{ item.name }}</div>\n <div class=\"form-text text-danger\" *ngIf=\"item.size > sizeLimit\">\n {{'FileExplorer::ExceedsMaximumSize' | abpLocalization:_FileApiService.formatFileSize(sizeLimit)}}\n </div>\n </th>\n <td>{{ item.fileSize }}</td>\n <td>\n <i *ngIf=\"item.status === 1\" class=\"fas fa-check text-primary\"></i>\n <i *ngIf=\"item.status === 2\" class=\"fas fa-times-circle text-danger\"></i>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\n <abp-button iconClass=\"fa fa-check\" (click)=\"modalSave()\">{{'AbpUi::Save' | abpLocalization}}</abp-button>\n </ng-template>\n</abp-modal>", styles: ["::ng-deep .file-modal .container-height{height:calc(100vh - 284px)}::ng-deep .file-modal .file-status-modal{background:#fff}::ng-deep .file-modal .file-status-modal .card-body{max-height:300px;overflow-y:auto}::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active .datatable-row-group{background-color:transparent!important}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper{padding:0}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .custom-node{width:100%}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .selected{background-color:var(--lpx-brand)!important}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .selected .btn{color:var(--lpx-navbar-color)}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:transparent}::ng-deep .file-modal .ngx-datatable.fixed-header .datatable-header .datatable-header-inner .datatable-header-cell,::ng-deep .file-modal .ngx-datatable.material .datatable-body .datatable-body-row .datatable-body-cell{overflow:initial;line-break:anywhere}\n"] }]
463
+ ], template: "<abp-modal [(visible)]=\"ModalOpen\" (visibleChange)=\"ModalVisibleChange($event)\"\n [options]=\"{ size: 'xl', scrollable: false }\">\n <ng-template #abpHeader>\n <h3>{{'FileExplorer::FileExplorer' | abpLocalization}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <div class=\"row file-explorer-modal-body file-modal\" *ngIf=\"ModalOpen\">\n <div class=\"col-3\" *ngIf=\"createDirectoryPermissionName\" style=\"overflow: auto; height: calc(100vh - 240px)\">\n <fe-file-modal-tree [theSelectedTreeNode]=\"_theSelectedTreeNode\" (nodeClick)=\"_nodeClick($event)\"\n (lookAllBtn)=\"lookAllFile()\" (treeNodeData)=\"treeNodeData($event)\"\n [fileContainerName]=\"_fileContainerName\"></fe-file-modal-tree>\n </div>\n <div [class]=\"createDirectoryPermissionName?'col-9':'col-12'\" style=\"height: calc(100vh - 240px)\">\n <div class=\"mb-3 d-flex justify-content-between align-items-center\">\n <div style=\"flex: 2\"><span *ngIf=\"selectedTable.length>1\" class=\"btn-link\"\n (click.stop)=\"onDeleteAllSelectFile()\" role=\"button\">{{'FileExplorer::Delete' | abpLocalization}}</span>\n </div>\n <div class=\"input-group form-file\" style=\"flex: 2\">\n <input type=\"file\" class=\"form-control\" #fileEdit [multiple]=\"_multiple\" (change)=\"getFileChange($event)\" />\n </div>\n </div>\n <div>\n <!-- [selectionType]=\"_multiple?SelectionType.checkbox:SelectionType.single\" -->\n <!-- [selectCheck]=\"selectCheck\" -->\n <ngx-datatable class=\"material container-height\" [rows]=\"data.items\" [list]=\"list\" columnMode=\"flex\"\n [headerHeight]=\"50\" [footerHeight]=\"50\" rowHeight=\"auto\" [scrollbarV]=\"true\" [virtualization]=\"false\"\n [externalPaging]=\"true\" [count]=\"data.totalCount\">\n <ngx-datatable-column [width]=\"50\" prop=\"id\" [sortable]=\"false\" [canAutoResize]=\"false\" [draggable]=\"false\"\n [resizeable]=\"false\">\n <ng-template ngx-datatable-header-template let-value=\"value\" let-allRowsSelected=\"allRowsSelected\"\n let-selectFn=\"selectFn\">\n <input type=\"checkbox\" class=\"form-check-input\" *ngIf=\"_multiple\" [checked]=\"isAllSelected\"\n (change)=\"onSelectAllFn($event,data.items)\" />\n </ng-template>\n <ng-template ngx-datatable-cell-template let-row=\"row\" let-value=\"value\">\n <input type=\"checkbox\" class=\"form-check-input\" [checked]=\"selectedcheckbox(value)\"\n (change)=\"onCheckboxChangeFn($event,row,data.items)\" />\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [sortable]=\"false\" [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <fe-file-preview [width]=\"'80px'\" [src]=\"row.url\" [name]=\"row.name\" [type]=\"row.mimeType\"\n [preview]=\"true\"></fe-file-preview>\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileName' | abpLocalization\" prop=\"name\" [sortable]=\"false\"\n [flexGrow]=\"4\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <div class=\"d-flex align-items-start titlehover\" *ngIf=\"newEditRow.id!==row.id\">\n <span class=\"me-2\">{{ value }}</span>\n <i class=\"fa fa-pencil-square-o\" role=\"button\" (click.stop)=\"onEditFileName(row)\" style=\"line-height:2;\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"FileNameForm&&newEditRow.id===row.id\">\n <form [formGroup]=\"FileNameForm\" (ngSubmit)=\"onSubmitFileName($event)\">\n <div class=\"d-flex align-items-start\">\n <div class=\"me-2\">\n <input class=\"form-control \" type=\"text\" formControlName=\"fileName\">\n </div>\n <button class=\" btn btn-sm\" type=\"submit\">\n <i class=\"fa-spin fa fa-spinner\" *ngIf=\"isloading\"></i>\n <i class=\"fa fa-check\" aria-hidden=\"true\" *ngIf=\"!isloading\"></i></button>\n <button class=\" btn btn-sm\" (click.stop)=\"onCancelFileName(row)\"><i class=\"fa fa-times\" type=\"reset\" aria-hidden=\"true\"></i></button>\n \n </div>\n </form>\n </div>\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::FileSize' | abpLocalization\" prop=\"size\" [flexGrow]=\"1.5\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ _FileApiService.formatFileSize(value) }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::Directory' | abpLocalization\" prop=\"directoryId\"\n [sortable]=\"false\" [flexGrow]=\"1\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value|getDirectoryName:fileGroupList }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [name]=\"'FileExplorer::CreationTime' | abpLocalization\" prop=\"creationTime\"\n [flexGrow]=\"2\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n {{ value | date : 'YYYY/MM/dd HH:mm:s' }}\n </ng-template>\n </ngx-datatable-column>\n <ngx-datatable-column [flexGrow]=\"1\" [sortable]=\"false\">\n <ng-template let-row=\"row\" let-value=\"value\" ngx-datatable-cell-template>\n <button class=\"btn btn-sm btn-light p-0\" (click.stop)=\"deleteFile(row)\">\n <i class=\"fas fa-trash text-primary p-2\"></i>\n </button>\n </ng-template>\n </ngx-datatable-column>\n </ngx-datatable>\n </div>\n <div *ngIf=\"uploadPictureStatusList.length > 0\"\n class=\"position-fixed bottom-0 end-0 shadow-lg file-status-modal m-5\" style=\"border-radius: 10px\">\n <div class=\"card p-1\">\n <div class=\"card-header d-flex align-items-center justify-content-between p-0 py-1 border-bottom\">\n <div>{{'FileExplorer::UploadFiles' | abpLocalization}}</div>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click.stop)=\"closeFileStatusModal()\"></button>\n </div>\n <div class=\"card-body\">\n <table class=\"table\">\n <thead>\n <tr>\n <th scope=\"col\">{{'FileExplorer::FileName' | abpLocalization}}</th>\n <th scope=\"col\">{{'FileExplorer::FileSize' | abpLocalization}}</th>\n <th scope=\"col\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of uploadPictureStatusList; let i = index\">\n <tr>\n <th scope=\"row\">\n <div>{{ item.name }}</div>\n <div class=\"form-text text-danger\" *ngIf=\"item.size > sizeLimit\">\n {{'FileExplorer::ExceedsMaximumSize' |\n abpLocalization:_FileApiService.formatFileSize(sizeLimit)}}\n </div>\n </th>\n <td>{{ item.fileSize }}</td>\n <td>\n <i *ngIf=\"item.status === 1\" class=\"fas fa-check text-primary\"></i>\n <i *ngIf=\"item.status === 2\" class=\"fas fa-times-circle text-danger\"></i>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\n <abp-button iconClass=\"fa fa-check\" (click)=\"modalSave()\">{{'FileExplorer::Confirm' | abpLocalization}}\n @if(selectedTable.length>0){\n ({{selectedTable.length}})\n }\n </abp-button>\n </ng-template>\n</abp-modal>", styles: ["::ng-deep .file-modal .container-height{height:calc(100vh - 284px)}::ng-deep .file-modal .file-status-modal{background:#fff}::ng-deep .file-modal .file-status-modal .card-body{max-height:300px;overflow-y:auto}::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.single-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-selection .datatable-body-row.active .datatable-row-group,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active,::ng-deep .file-modal .ngx-datatable.material.multi-click-selection .datatable-body-row.active .datatable-row-group{background-color:transparent!important}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper{padding:0}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .ng-star-inserted[title]{padding:0 10px}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .custom-node{width:100%}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper .selected{background-color:var(--lpx-brand)!important;color:var(--lpx-brand-text)}::ng-deep .file-modal .ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:transparent}::ng-deep .file-modal .ngx-datatable.fixed-header .datatable-header .datatable-header-inner .datatable-header-cell,::ng-deep .file-modal .ngx-datatable.material .datatable-body .datatable-body-row .datatable-body-cell{overflow:initial;line-break:anywhere}::ng-deep .file-modal input[type=checkbox]{cursor:pointer}::ng-deep .file-modal .titlehover i{display:none}::ng-deep .file-modal .titlehover:hover i{display:block}\n"] }]
258
464
  }], ctorParameters: () => [{ type: i1.FileDescriptorService }, { type: i2.ToasterService }, { type: i3.ListService }, { type: i4.FileApiService }, { type: i3.RestService }, { type: i2.ConfirmationService }, { type: i3.LocalizationService }], propDecorators: { fileContainerName: [{
259
465
  type: Input
260
466
  }], multiple: [{
@@ -265,9 +471,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
265
471
  type: Input
266
472
  }], visibleChange: [{
267
473
  type: Output
268
- }], selectPickerFile: [{
269
- type: Input
270
474
  }], selectFilefn: [{
271
475
  type: Output
476
+ }], selectPickerFile: [{
477
+ type: Input
272
478
  }] } });
273
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9maWxlLWV4cGxvcmVyL3NyYy9saWIvY29tcG9uZW50cy9maWxlLW1vZGFsL2ZpbGUtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1tb2RhbC9maWxlLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWlCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEtBQUssV0FBVyxNQUFNLHlDQUF5QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBZ0IsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekYsT0FBTyxFQUF1QixXQUFXLEVBQVEsV0FBVyxFQUFFLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xJLE9BQU8sRUFBcUIscUJBQXFCLEVBQWlCLE1BQU0seUNBQXlDLENBQUM7QUFDbEgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7Ozs7OztBQUN4RCxJQUFJLElBQUksQ0FBQTtBQWVSLE1BQU0sT0FBTyxrQkFBa0I7SUFFN0IsWUFDVSxZQUErQyxFQUMvQyxPQUF1QixFQUNmLElBQWlCLEVBQzFCLGVBQStCLEVBQzlCLFdBQXdCLEVBQ3hCLFlBQWlDLEVBQ2pDLG9CQUF5QztRQU56QyxpQkFBWSxHQUFaLFlBQVksQ0FBbUM7UUFDL0MsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDZixTQUFJLEdBQUosSUFBSSxD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QyxDQUFBO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGNBQWM7SUFDZCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEVBQUUsQ0FBQTtJQUNuQyxDQUFDOzhHQXRRVSxrQkFBa0I7a0dBQWxCLGtCQUFrQix1UUFUbEI7WUFDVCxhQUFhO1lBQ2IsV0FBVztZQUNYLGFBQWE7WUFDYiw0REFBNEQ7WUFDNUQsdUVBQXVFO1lBQ3ZFLEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7U0FDckQsK0NDcEJILG8vTkFvSFk7OzJGRDlGQyxrQkFBa0I7a0JBZDlCLFNBQVM7K0JBRUUsZUFBZSxhQUdkO3dCQUNULGFBQWE7d0JBQ2IsV0FBVzt3QkFDWCxhQUFhO3dCQUNiLDREQUE0RDt3QkFDNUQsdUVBQXVFO3dCQUN2RSxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO3FCQUNyRDs0UUE4QlUsaUJBQWlCO3NCQUQzQixLQUFLO2dCQVdLLFFBQVE7c0JBRGxCLEtBQUs7Z0JBV0ssS0FBSztzQkFEZixLQUFLO2dCQU1LLE9BQU87c0JBRGpCLEtBQUs7Z0JBU0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFxSEUsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQVdJLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBGaWxlU2VydmljZSBmcm9tICcuLi8uLi9wcm94eS9kaWduaXRlL2ZpbGUtZXhwbG9yZXIvZmlsZXMnO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uLCBDb25maXJtYXRpb25TZXJ2aWNlLCBUb2FzdGVyU2VydmljZSB9IGZyb20gJ0BhYnAvbmcudGhlbWUuc2hhcmVkJztcbmltcG9ydCB7IFBhZ2VkUmVzdWx0RHRvLCBBQlAsIExpc3RTZXJ2aWNlLCBSZXN0LCBSZXN0U2VydmljZSwgTG9jYWxpemF0aW9uU2VydmljZSwgTElTVF9RVUVSWV9ERUJPVU5DRV9USU1FIH0gZnJvbSAnQGFicC9uZy5jb3JlJztcbmltcG9ydCB7IEZpbGVEZXNjcmlwdG9yRHRvLCBGaWxlRGVzY3JpcHRvclNlcnZpY2UsIEdldEZpbGVzSW5wdXQgfSBmcm9tICcuLi8uLi9wcm94eS9kaWduaXRlL2ZpbGUtZXhwbG9yZXIvZmlsZXMnO1xuaW1wb3J0IHsgRmlsZUFwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWxlLWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGlvblR5cGUgfSBmcm9tICdAc3dpbWxhbmUvbmd4LWRhdGF0YWJsZSc7XG52YXIgdGhhdFxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnZmUtZmlsZS1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxlLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmlsZS1tb2RhbC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICAvLyBbUmVxdWlyZWRdXG4gICAgTGlzdFNlcnZpY2UsXG4gICAgLy8gW09wdGlvbmFsXVxuICAgIC8vIFByb3ZpZGUgdGhpcyB0b2tlbiBpZiB5b3Ugd2FudCBhIGRpZmZlcmVudCBkZWJvdW5jZSB0aW1lLlxuICAgIC8vIERlZmF1bHQgaXMgMzAwLiBDYW5ub3QgYmUgMC4gQW55IHZhbHVlIGJlbG93IDEwMCBpcyBub3QgcmVjb21tZW5kZWQuXG4gICAgeyBwcm92aWRlOiBMSVNUX1FVRVJZX0RFQk9VTkNFX1RJTUUsIHVzZVZhbHVlOiA1MDAgfSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBGaWxlTW9kYWxDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX0ZpbGVTZXJ2aWNlOiBGaWxlU2VydmljZS5GaWxlRGVzY3JpcHRvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdGVyOiBUb2FzdGVyU2VydmljZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbGlzdDogTGlzdFNlcnZpY2UsXG4gICAgcHVibGljIF9GaWxlQXBpU2VydmljZTogRmlsZUFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZXN0U2VydmljZTogUmVzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maXJtYXRpb246IENvbmZpcm1hdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfTG9jYWxpemF0aW9uU2VydmljZTogTG9jYWxpemF0aW9uU2VydmljZSxcbiAgKSB7XG4gICAgdGhhdCA9IHRoaXNcbiAgICBcbiAgfVxuXG4gIHByaXZhdGUgX0ZpbGVEZXNjcmlwdG9yU2VydmljZT1pbmplY3QoRmlsZURlc2NyaXB0b3JTZXJ2aWNlKVxuICAvKirojrflj5bnm67lvZXphY3nva4gKi9cbiAgZ2V0RmlsZXNDb25maWd1cmF0aW9uKCl7XG4gICAgdGhpcy5fRmlsZURlc2NyaXB0b3JTZXJ2aWNlLmdldEZpbGVDb250YWluZXJDb25maWd1cmF0aW9uKHRoaXMuX2ZpbGVDb250YWluZXJOYW1lKS5zdWJzY3JpYmUocmVzPT57XG4gICAgICB0aGlzLmNyZWF0ZURpcmVjdG9yeVBlcm1pc3Npb25OYW1lPXJlcz8uY3JlYXRlRGlyZWN0b3J5UGVybWlzc2lvbk5hbWVcbiAgICB9KVxuICB9XG4gIC8qKuebruW9leeahOadg+mZkOWQjeensCAqL1xuICBjcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZTpzdHJpbmc9bnVsbFxuXG4gIC8qKuWbvueJh+WuueWZqCAqL1xuICBfZmlsZUNvbnRhaW5lck5hbWU6IHN0cmluZ1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGZpbGVDb250YWluZXJOYW1lKHY6IHN0cmluZykge1xuICAgIGlmICh2KSB7XG4gICAgICB0aGlzLl9maWxlQ29udGFpbmVyTmFtZSA9IHY7XG4gICAgICB0aGlzLmxvYWREYXRhKClcbiAgICB9XG4gIH1cblxuICAvKirmmK/lkKblpJrpgIkgKi9cbiAgX211bHRpcGxlOiBib29sZWFuID0gZmFsc2VcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBtdWx0aXBsZSh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5fbXVsdGlwbGUgPSB2O1xuICAgIGlmICh2KSB7IH1cbiAgfVxuXG4gIC8qKuaWh+S7tuWkp+Wwj+mZkOWItiBcbiogQHBhcmFtIDFtYlxuKi9cbiAgc2l6ZUxpbWl0OiBudW1iZXIgPSAxMDQ4NTc2XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbGltaXQodjogbnVtYmVyKSB7XG4gICAgdGhpcy5zaXplTGltaXQgPSB2O1xuICB9XG4gIC8qKueItue7hOS7tuS8oOmAkueahOaooeaAgeahhueKtuaAgSAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHZpc2libGUodjogYm9vbGVhbikge1xuICAgIHRoaXMuTW9kYWxPcGVuID0gdjtcbiAgICBpZiAodikge1xuICAgICAgdGhpcy5sb2FkRGF0YSgpXG4gICAgfVxuICB9XG5cbiAgLyoq5qih5oCB5qGG54q25oCB5Zue6LCDICovXG4gIEBPdXRwdXQoKSB2aXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cblxuXG4gIC8qKuaooeaAgeahhi3nirbmgIEt5piv5ZCm5omT5byAICovXG4gIE1vZGFsT3BlbjogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoq5qih5oCB5qGGLee5geW/meeKtuaAgS3nlKjkuo7noa7lrprmqKHmgIHnmoTnuYHlv5nnirbmgIHmmK/lkKbkuLrnnJ8gKi9cbiAgTW9kYWxCdXN5OiBib29sZWFuID0gZmFsc2VcblxuXG5cbiAgLyoq5qih5oCB5qGGLeeKtuaAgeaUueWPmOWbnuiwgyAqL1xuICBNb2RhbFZpc2libGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdChldmVudClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIC8qKuaooeaAgeahhuS/neWtmCAqL1xuICBtb2RhbFNhdmUoKSB7XG4gICAgbGV0IHNlbGVjdGVkVGFibGVhcnIgPSB0aGlzLl9GaWxlQXBpU2VydmljZS5kZWVwQ2xvbmUodGhpcy5zZWxlY3RlZFRhYmxlKVxuICAgIHRoaXMuc2VsZWN0RmlsZWZuLmVtaXQoc2VsZWN0ZWRUYWJsZWFycilcblxuICAgIHRoaXMuTW9kYWxWaXNpYmxlQ2hhbmdlKGZhbHNlKVxuICB9XG4gIC8qKmRpZ25pdGUtZmlsZS1tb2RhbC10cmVlICovXG4gIC8qKumAieaLqeeahHRyZWXoioLngrkgKi9cbiAgX3RoZVNlbGVjdGVkVHJlZU5vZGU6IGFueSA9ICcnXG5cbiAgLyoq5Yid5aeL5YyW5pWw5o2uICovXG4gIGxvYWREYXRhKCkge1xuICAgIGlmICh0aGlzLk1vZGFsT3BlbiAmJiB0aGlzLl9maWxlQ29udGFpbmVyTmFtZSkge1xuICAgICAgdGhpcy5ob29rVG9RdWVyeSgpXG4gICAgICB0aGlzLmdldEZpbGVzQ29uZmlndXJhdGlvbigpXG4gICAgfVxuICB9XG5cbiAgLyoqdHJlZS3oioLngrnpgInmi6kgKi9cbiAgX25vZGVDbGljayhldmVudCkge1xuICAgIHRoaXMuX3RoZVNlbGVjdGVkVHJlZU5vZGUgPSBldmVudFxuICAgIHRoaXMubGlzdC5nZXQoKVxuICB9XG5cbiAgLyoq5Zu+54mH5LiK5LygLeimgeS4iuS8oOWbvueJh+eahOeKtuaAgeaWh+S7tuWIl+ihqCAqL1xuICB1cGxvYWRQaWN0dXJlU3RhdHVzTGlzdDogYW55W10gPSBbXVxuXG4gIC8qKuWbvueJh+S4iuS8oC3ojrflj5bmlofku7bkv6Hmga/mlLnlj5ggKi9cbiAgYXN5bmMgZ2V0RmlsZUNoYW5nZShldmVudCkge1xuICAgIGxldCBmaWxlcyA9IG5ldyBBcnJheSguLi5ldmVudC50YXJnZXQuZmlsZXMpXG4gICAgdGhpcy51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdCA9IGZpbGVzXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBpZiAoZmlsZS5zaXplID4gdGhpcy5zaXplTGltaXQpIHtcbiAgICAgICAgdGhpcy5zZXR1cGxvYWRQaWN0dXJlU3RhdHVzKGZpbGUsIDIpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy51cGxvYWRpbmdGaWxlKGZpbGUpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNldHVwbG9hZFBpY3R1cmVTdGF0dXMoZmlsZSwgMSlcbiAgICAgICAgdGhpcy5saXN0LmdldCgpXG4gICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0dXBsb2FkUGljdHVyZVN0YXR1cyhmaWxlLCAyKVxuICAgICAgfSk7IC8vIOetieW+heavj+S4quaWh+S7tuS4iuS8oOWujOaIkCAgXG4gICAgfVxuICAgIHRoaXMubGlzdC5nZXQoKVxuICAgIGxldCBpc1N1Ym1pdCA9ICF0aGlzLnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0LnNvbWUoZWwgPT4gZWwuc3RhdHVzID09IDIpO1xuICAgIGlmIChpc1N1Ym1pdCkge1xuICAgICAgLy8gdGhpcy50b2FzdGVyLnN1Y2Nlc3MoXCLkuIrkvKDlrozmiJBcIik7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdCA9IFtdXG4gICAgICB9LCA2MDAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKuWbvueJh+S4iuS8oC3orr7nva51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdOeahOeKtuaAgSAqL1xuICBzZXR1cGxvYWRQaWN0dXJlU3RhdHVzKGZpbGUsIHR5cGUpIHtcbiAgICB0aGlzLnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0Lm1hcChlbCA9PiB7XG4gICAgICBpZiAoZWwgPT0gZmlsZSkgZWwuc3RhdHVzID0gdHlwZVxuICAgIH0pXG4gIH1cblxuXG4gIC8qKuWbvueJh+S4iuS8oC3pgJLlvZLmjInpobrluo/kuIrkvKAgKi9cbiAgdXBsb2FkaW5nRmlsZShmaWxlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3RzKSA9PiB7XG4gICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSk7XG4gICAgICB0aGlzLmNyZWF0ZUZpbGUoe1xuICAgICAgICBmaWxlOiBmb3JtRGF0YSxcbiAgICAgICAgY29udGFpbmVyTmFtZTogdGhpcy5fZmlsZUNvbnRhaW5lck5hbWUsXG4gICAgICAgIGRpcmVjdG9yeUlkOiB0aGlzLl90aGVTZWxlY3RlZFRyZWVOb2RlPy5rZXkgfHwgJycsXG4gICAgICAgIGVudGl0eUlkOiAnJ1xuICAgICAgfSkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgcmVqZWN0cyhmYWxzZSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG5cbiAgLyoq5paH5Lu26KGo5qC8LeaVsOaNriovXG4gIGRhdGE6IFBhZ2VkUmVzdWx0RHRvPEZpbGVEZXNjcmlwdG9yRHRvPiA9IHtcbiAgICBpdGVtczogW10sXG4gICAgdG90YWxDb3VudDogMCxcbiAgfTtcblxuICAvKirmlofku7booajmoLwt5p2h5Lu2Ki9cbiAgZmlsdGVycyA9IHt9IGFzIEdldEZpbGVzSW5wdXQ7XG5cbiAgLyoq5paH5Lu26KGo5qC8LeihqOagvOiHquW4pumAieaLqeexu+WeiyAqL1xuICBTZWxlY3Rpb25UeXBlID0gU2VsZWN0aW9uVHlwZTtcblxuICAvKirmlofku7booajmoLwt6YCJ5oup55qE6KGo5qC85pWw5o2u6aG5ICovXG4gIHNlbGVjdGVkVGFibGUgPSBbXVxuXG4gIC8qKuW3sumAieWumueahOaWh+S7tiAqL1xuICBASW5wdXQoKSBzZWxlY3RQaWNrZXJGaWxlOiBhbnlbXVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvL0NhbGxlZCBiZWZvcmUgYW55IG90aGVyIGxpZmVjeWNsZSBob29rLiBVc2UgaXQgdG8gaW5qZWN0IGRlcGVuZGVuY2llcywgYnV0IGF2b2lkIGFueSBzZXJpb3VzIHdvcmsgaGVyZS5cbiAgICAvL0FkZCAnJHtpbXBsZW1lbnRzIE9uQ2hhbmdlc30nIHRvIHRoZSBjbGFzcy5cbiAgICB0aGlzLnNlbGVjdGVkVGFibGUgPSB0aGlzLl9GaWxlQXBpU2VydmljZS5kZWVwQ2xvbmUodGhpcy5zZWxlY3RQaWNrZXJGaWxlKVxuICB9XG4gIC8qKuW9k+WJjemAieaLqeeahHRhYmxl6aG5IGlkICovXG4gIG5vd1NlbGVjdElkOiBhbnkgPSAnJ1xuXG4gIC8qKumAieaLqeaWh+S7tuWbnuiwgyAqL1xuICBAT3V0cHV0KCkgc2VsZWN0RmlsZWZuID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKVxuXG4gIC8qKuaWh+S7tuihqOagvC3ojrflj5booajmoLzmlbDmja4gKi9cbiAgaG9va1RvUXVlcnkoKSB7XG4gICAgY29uc3QgZ2V0RGF0YSA9IChxdWVyeTogQUJQLlBhZ2VRdWVyeVBhcmFtcykgPT4gdGhpcy5fRmlsZVNlcnZpY2UuZ2V0TGlzdCh7XG4gICAgICAuLi5xdWVyeSxcbiAgICAgIC4uLnRoaXMuZmlsdGVycyxcbiAgICAgIGNvbnRhaW5lck5hbWU6IHRoaXMuX2ZpbGVDb250YWluZXJOYW1lLFxuICAgICAgZGlyZWN0b3J5SWQ6IHRoaXMuX3RoZVNlbGVjdGVkVHJlZU5vZGUua2V5XG4gICAgfSk7XG4gICAgY29uc3Qgc2V0RGF0YSA9IChsaXN0OiBQYWdlZFJlc3VsdER0bzxGaWxlRGVzY3JpcHRvckR0bz4pID0+ICh0aGlzLmRhdGEgPSBsaXN0KTtcbiAgICB0aGlzLmxpc3QuaG9va1RvUXVlcnkoZ2V0RGF0YSkuc3Vic2NyaWJlKHNldERhdGEpO1xuICB9XG5cbiAgLyoq5paH5Lu26KGo5qC8Leafpeeci+aJgOacieWIhue7hOeahOaWh+S7tuaVsOaNriAqL1xuICBsb29rQWxsRmlsZSgpIHtcbiAgICB0aGlzLl90aGVTZWxlY3RlZFRyZWVOb2RlID0gJydcbiAgICB0aGlzLmxpc3QuZ2V0KClcbiAgfVxuXG4gIC8qKumAieaLqeihqOagvOmhuSAqL1xuICBvblNlbGVjdFRhYmxlSXRlbSh7IHNlbGVjdGVkIH0pIHtcbiAgICB0aGlzLnNlbGVjdGVkVGFibGUgPSB0aGlzLl9GaWxlQXBpU2VydmljZS5kZWVwQ2xvbmUoc2VsZWN0ZWQpXG4gICAgbGV0IHNlbGVjdGVkVGFibGVhcnIgPSB0aGlzLnJlbW92ZUR1cGxpY2F0ZXNCeUlkKHRoaXMuc2VsZWN0ZWRUYWJsZSlcbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gc2VsZWN0ZWRUYWJsZWFyci5sZW5ndGgpIHtcbiAgICAgIHNlbGVjdGVkVGFibGVhcnIgPSBzZWxlY3RlZFRhYmxlYXJyLmZpbHRlcihlbCA9PiBlbC5pZCAhPT0gdGhpcy5ub3dTZWxlY3RJZClcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFRhYmxlID0gc2VsZWN0ZWRUYWJsZWFyclxuICB9XG5cbiAgLyoq5Yig6Zmk5pWw57uE5Lit6YeN5aSN55qE6aG5ICovXG4gIHJlbW92ZUR1cGxpY2F0ZXNCeUlkKGFycmF5KSB7XG4gICAgY29uc3Qgc2VlbklkcyA9IHt9O1xuICAgIHJldHVybiBhcnJheS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBpZiAoIXNlZW5JZHNbaXRlbS5pZF0pIHtcbiAgICAgICAgc2Vlbklkc1tpdGVtLmlkXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoq5LiA5Liq5biD5bCUb3Llh73mlbDvvIzlj6/nlKjkuo7mo4Dmn6XmmK/lkKbopoHmoLnmja7mnaHku7bpgInmi6nnibnlrprooYzjgIIgKi9cbiAgc2VsZWN0Q2hlY2sgPSAocm93LCBjb2x1bW4sIHZhbHVlKSA9PiB7XG4gICAgdGhpcy5ub3dTZWxlY3RJZCA9IHJvdy5pZFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoq5Yik5patcm935piv5ZCm6YCJ5LitICovXG4gIHNlbGVjdGVkY2hlY2tib3ggPSAoaWQpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRhYmxlLnNvbWUoZWwgPT4gZWwuaWQgPT0gaWQpXG4gIH1cblxuXG5cbiAgLyoq5Yig6Zmk5Zu+54mHICovXG4gIGRlbGV0ZUZpbGUoZmlsZSkge1xuXG4gICAgdGhpcy5jb25maXJtYXRpb25cbiAgICAgIC53YXJuKCcnLCB7IGtleTogJycsIGRlZmF1bHRWYWx1ZTogdGhpcy5fTG9jYWxpemF0aW9uU2VydmljZS5pbnN0YW50KGBBYnBVaTo6SXRlbVdpbGxCZURlbGV0ZWRNZXNzYWdlYCkgfSlcbiAgICAgIC5zdWJzY3JpYmUoKHN0YXR1czogQ29uZmlybWF0aW9uLlN0YXR1cykgPT4ge1xuICAgICAgICBpZiAoc3RhdHVzID09ICdjb25maXJtJykge1xuICAgICAgICAgIHRoaXMuX0ZpbGVTZXJ2aWNlLmRlbGV0ZShmaWxlLmlkKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3Rlci5zdWNjZXNzKHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChgQWJwVWk6OkRlbGV0ZWRTdWNjZXNzZnVsbHlgKSk7XG4gICAgICAgICAgICB0aGlzLmxpc3QuZ2V0KClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKuWFs+mXreaWh+S7tueKtuaAgeW8ueeqlyAqL1xuICBjbG9zZUZpbGVTdGF0dXNNb2RhbCgpIHtcbiAgICB0aGlzLnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0ID0gW11cbiAgfVxuXG4gIC8qKuWIm+W7uuWbvueJh+eahOaOpeWPo++8jOS7o+eQhuS4reeahGZpbGXnsbvlnovkuI3ljLnphY3vvIzliIfmjaLkuLphbnnnsbvlnosgKi9cbiAgY3JlYXRlRmlsZSA9IChpbnB1dDogYW55LCBjb25maWc/OiBQYXJ0aWFsPFJlc3QuQ29uZmlnPikgPT5cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLnJlcXVlc3Q8YW55LCBGaWxlRGVzY3JpcHRvckR0bz4oe1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICB1cmw6ICcvYXBpL2ZpbGUtZXhwbG9yZXIvZmlsZXMnLFxuICAgICAgcGFyYW1zOiB7IGNvbnRhaW5lck5hbWU6IGlucHV0LmNvbnRhaW5lck5hbWUsIGNlbGxOYW1lOiBpbnB1dC5jZWxsTmFtZSwgZGlyZWN0b3J5SWQ6IGlucHV0LmRpcmVjdG9yeUlkLCBlbnRpdHlJZDogaW5wdXQuZW50aXR5SWQgfSxcbiAgICAgIGJvZHk6IGlucHV0LmZpbGUsXG4gICAgfSxcbiAgICAgIHsgYXBpTmFtZTogJ0ZpbGVFeHBsb3JlcicsIC4uLmNvbmZpZyB9KTtcbn1cbiIsIjxhYnAtbW9kYWwgWyh2aXNpYmxlKV09XCJNb2RhbE9wZW5cIiAodmlzaWJsZUNoYW5nZSk9XCJNb2RhbFZpc2libGVDaGFuZ2UoJGV2ZW50KVwiXG4gIFtvcHRpb25zXT1cInsgc2l6ZTogJ3hsJywgc2Nyb2xsYWJsZTogZmFsc2UgfVwiPlxuICA8bmctdGVtcGxhdGUgI2FicEhlYWRlcj5cbiAgICA8aDM+e3snRmlsZUV4cGxvcmVyOjpGaWxlRXhwbG9yZXInIHwgYWJwTG9jYWxpemF0aW9ufX08L2gzPlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgI2FicEJvZHk+XG4gICAgPGRpdiBjbGFzcz1cInJvdyBmaWxlLWV4cGxvcmVyLW1vZGFsLWJvZHkgZmlsZS1tb2RhbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCIgKm5nSWY9XCJjcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZVwiICBzdHlsZT1cIm92ZXJmbG93OiBhdXRvOyBoZWlnaHQ6IGNhbGMoMTAwdmggLSAyNDBweClcIj5cbiAgICAgICAgPGZlLWZpbGUtbW9kYWwtdHJlZSBbdGhlU2VsZWN0ZWRUcmVlTm9kZV09XCJfdGhlU2VsZWN0ZWRUcmVlTm9kZVwiIChub2RlQ2xpY2spPVwiX25vZGVDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICBbZmlsZUNvbnRhaW5lck5hbWVdPVwiX2ZpbGVDb250YWluZXJOYW1lXCI+PC9mZS1maWxlLW1vZGFsLXRyZWU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgW2NsYXNzXT1cImNyZWF0ZURpcmVjdG9yeVBlcm1pc3Npb25OYW1lPydjb2wtOSc6J2NvbC0xMidcIiBzdHlsZT1cImhlaWdodDogY2FsYygxMDB2aCAtIDI0MHB4KVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1saW5rXCIgcm9sZT1idXR0b24gc3R5bGU9XCJmbGV4OiAyXCIgKGNsaWNrKT1cImxvb2tBbGxGaWxlKClcIj57eydGaWxlRXhwbG9yZXI6OkFsbEZpbGVzJyB8IGFicExvY2FsaXphdGlvbn19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGZvcm0tZmlsZVwiIHN0eWxlPVwiZmxleDogMlwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAjZmlsZUVkaXQgW211bHRpcGxlXT1cIl9tdWx0aXBsZVwiIFxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImdldEZpbGVDaGFuZ2UoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlIGNsYXNzPVwibWF0ZXJpYWwgY29udGFpbmVyLWhlaWdodFwiIFtyb3dzXT1cImRhdGEuaXRlbXNcIiBbbGlzdF09XCJsaXN0XCIgY29sdW1uTW9kZT1cImZsZXhcIlxuICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiIFtoZWFkZXJIZWlnaHRdPVwiNTBcIiBbZm9vdGVySGVpZ2h0XT1cIjUwXCIgcm93SGVpZ2h0PVwiYXV0b1wiIFtzY3JvbGxiYXJWXT1cInRydWVcIlxuICAgICAgICAgICAgW3ZpcnR1YWxpemF0aW9uXT1cImZhbHNlXCIgW2V4dGVybmFsUGFnaW5nXT1cInRydWVcIiBbY291bnRdPVwiZGF0YS50b3RhbENvdW50XCIgW3NlbGVjdGVkXT1cInNlbGVjdGVkVGFibGVcIlxuICAgICAgICAgICAgW3NlbGVjdENoZWNrXT1cInNlbGVjdENoZWNrXCIgW3NlbGVjdGlvblR5cGVdPVwiX211bHRpcGxlP1NlbGVjdGlvblR5cGUubXVsdGlDbGljazpTZWxlY3Rpb25UeXBlLnNpbmdsZVwiIChzZWxlY3QpPVwib25TZWxlY3RUYWJsZUl0ZW0oJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uIFt3aWR0aF09XCI1MFwiIHByb3A9XCJpZFwiIFtzb3J0YWJsZV09XCJmYWxzZVwiIFtjYW5BdXRvUmVzaXplXT1cImZhbHNlXCIgW2RyYWdnYWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtyZXNpemVhYmxlXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ3gtZGF0YXRhYmxlLWhlYWRlci10ZW1wbGF0ZSBsZXQtdmFsdWU9XCJ2YWx1ZVwiIGxldC1hbGxSb3dzU2VsZWN0ZWQ9XCJhbGxSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIGxldC1zZWxlY3RGbj1cInNlbGVjdEZuXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIFtjaGVja2VkXT1cImFsbFJvd3NTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNlbGVjdEZuKCFhbGxSb3dzU2VsZWN0ZWQpXCIgLz5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBsZXQtaXNTZWxlY3RlZD1cImlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIGxldC1vbkNoZWNrYm94Q2hhbmdlRm49XCJvbkNoZWNrYm94Q2hhbmdlRm5cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgW2NoZWNrZWRdPVwic2VsZWN0ZWRjaGVja2JveCh2YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlRm4oJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25neC1kYXRhdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uICAgW2ZsZXhHcm93XT1cIjJcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8ZmUtZmlsZS1wcmV2aWV3IFt3aWR0aF09XCInODBweCdcIiBbc3JjXT1cInJvdy51cmxcIiBbbmFtZV09XCJyb3cubmFtZVwiIFt0eXBlXT1cInJvdy5taW1lVHlwZVwiIFtwcmV2aWV3XT1cInRydWVcIj48L2ZlLWZpbGUtcHJldmlldz5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmd4LWRhdGF0YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICA8bmd4LWRhdGF0YWJsZS1jb2x1bW4gW25hbWVdPVwiJ0ZpbGVFeHBsb3Jlcjo6RmlsZU5hbWUnIHwgYWJwTG9jYWxpemF0aW9uXCIgcHJvcD1cIm5hbWVcIiBbZmxleEdyb3ddPVwiNFwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCIgbmd4LWRhdGF0YWJsZS1jZWxsLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIHt7IHZhbHVlIH19XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25neC1kYXRhdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uICBbbmFtZV09XCInRmlsZUV4cGxvcmVyOjpGaWxlU2l6ZScgfCBhYnBMb2NhbGl6YXRpb25cIiBwcm9wPVwic2l6ZVwiIFtmbGV4R3Jvd109XCIxLjVcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICB7eyBfRmlsZUFwaVNlcnZpY2UuZm9ybWF0RmlsZVNpemUodmFsdWUpIH19XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25neC1kYXRhdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uICBbbmFtZV09XCInRmlsZUV4cGxvcmVyOjpEaXJlY3RvcnknIHwgYWJwTG9jYWxpemF0aW9uXCIgcHJvcD1cImNlbGxOYW1lXCIgW2ZsZXhHcm93XT1cIjFcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICB7eyB2YWx1ZSB9fVxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiBbbmFtZV09XCInRmlsZUV4cGxvcmVyOjpDcmVhdGlvblRpbWUnIHwgYWJwTG9jYWxpemF0aW9uXCIgcHJvcD1cImNyZWF0aW9uVGltZVwiIFtmbGV4R3Jvd109XCIyXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAge3sgdmFsdWUgfCBkYXRlIDogJ1lZWVkvTU0vZGQgSEg6bW06cycgfX1cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmd4LWRhdGF0YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICA8bmd4LWRhdGF0YWJsZS1jb2x1bW4gW2ZsZXhHcm93XT1cIjFcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQgcC0wXCIgKGNsaWNrLnN0b3ApPVwiZGVsZXRlRmlsZShyb3cpXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaCB0ZXh0LXByaW1hcnkgcC0yXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICA8L25neC1kYXRhdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwidXBsb2FkUGljdHVyZVN0YXR1c0xpc3QubGVuZ3RoID4gMFwiXG4gICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1maXhlZCBib3R0b20tMCBlbmQtMCBzaGFkb3ctbGcgZmlsZS1zdGF0dXMtbW9kYWwgICBtLTVcIlxuICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLXJhZGl1czogMTBweFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtMVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gcC0wIHB5LTEgYm9yZGVyLWJvdHRvbVwiPlxuICAgICAgICAgICAgICA8ZGl2Pnt7J0ZpbGVFeHBsb3Jlcjo6VXBsb2FkRmlsZXMnIHwgYWJwTG9jYWxpemF0aW9ufX08L2Rpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2suc3RvcCk9XCJjbG9zZUZpbGVTdGF0dXNNb2RhbCgpXCI+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cbiAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGVcIj5cbiAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPnt7J0ZpbGVFeHBsb3Jlcjo6RmlsZU5hbWUnIHwgYWJwTG9jYWxpemF0aW9ufX08L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydGaWxlRXhwbG9yZXI6OkZpbGVTaXplJyB8IGFicExvY2FsaXphdGlvbn19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0OyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgaXRlbS5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS10ZXh0IHRleHQtZGFuZ2VyXCIgKm5nSWY9XCJpdGVtLnNpemUgPiBzaXplTGltaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3snRmlsZUV4cGxvcmVyOjpFeGNlZWRzTWF4aW11bVNpemUnIHwgYWJwTG9jYWxpemF0aW9uOl9GaWxlQXBpU2VydmljZS5mb3JtYXRGaWxlU2l6ZShzaXplTGltaXQpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IGl0ZW0uZmlsZVNpemUgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiaXRlbS5zdGF0dXMgPT09IDFcIiBjbGFzcz1cImZhcyBmYS1jaGVjayB0ZXh0LXByaW1hcnlcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cIml0ZW0uc3RhdHVzID09PSAyXCIgY2xhc3M9XCJmYXMgZmEtdGltZXMtY2lyY2xlIHRleHQtZGFuZ2VyXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSAjYWJwRm9vdGVyPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBhYnBDbG9zZT57eydBYnBVaTo6Q2xvc2UnIHwgYWJwTG9jYWxpemF0aW9ufX08L2J1dHRvbj5cbiAgICA8YWJwLWJ1dHRvbiBpY29uQ2xhc3M9XCJmYSBmYS1jaGVja1wiIChjbGljayk9XCJtb2RhbFNhdmUoKVwiPnt7J0FicFVpOjpTYXZlJyB8IGFicExvY2FsaXphdGlvbn19PC9hYnAtYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9hYnAtbW9kYWw+Il19
479
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9maWxlLWV4cGxvcmVyL3NyYy9saWIvY29tcG9uZW50cy9maWxlLW1vZGFsL2ZpbGUtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1tb2RhbC9maWxlLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWlCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEtBQUssV0FBVyxNQUFNLHlDQUF5QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBZ0IsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekYsT0FBTyxFQUdMLFdBQVcsRUFFWCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLHdCQUF3QixHQUN6QixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBRUwscUJBQXFCLEdBRXRCLE1BQU0seUNBQXlDLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBQ2hDLElBQUksSUFBSSxDQUFDO0FBZVQsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUNVLFlBQStDLEVBQy9DLE9BQXVCLEVBQ2YsSUFBaUIsRUFDMUIsZUFBK0IsRUFDOUIs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QUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztJQUN4QixDQUFDO0lBQ0QsVUFBVTtJQUNWLGdCQUFnQixDQUFDLEdBQUc7UUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7SUFDaEMsQ0FBQzs4R0F2ZFUsa0JBQWtCO2tHQUFsQixrQkFBa0IsdVFBVGxCO1lBQ1QsYUFBYTtZQUNiLFdBQVc7WUFDWCxhQUFhO1lBQ2IsNERBQTREO1lBQzVELHVFQUF1RTtZQUN2RSxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO1NBQ3JELCtDQ2xDSCw0aVJBK0lZOzsyRkQzR0Msa0JBQWtCO2tCQWQ5QixTQUFTOytCQUVFLGVBQWUsYUFHZDt3QkFDVCxhQUFhO3dCQUNiLFdBQVc7d0JBQ1gsYUFBYTt3QkFDYiw0REFBNEQ7d0JBQzVELHVFQUF1RTt3QkFDdkUsRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtxQkFDckQ7NFFBaUNVLGlCQUFpQjtzQkFEM0IsS0FBSztnQkFXSyxRQUFRO3NCQURsQixLQUFLO2dCQVlLLEtBQUs7c0JBRGYsS0FBSztnQkFNSyxPQUFPO3NCQURqQixLQUFLO2dCQVNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBOEpHLFlBQVk7c0JBQXJCLE1BQU07Z0JBd0lFLGdCQUFnQjtzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIEZpbGVTZXJ2aWNlIGZyb20gJy4uLy4uL3Byb3h5L2RpZ25pdGUvZmlsZS1leHBsb3Jlci9maWxlcyc7XG5pbXBvcnQgeyBDb25maXJtYXRpb24sIENvbmZpcm1hdGlvblNlcnZpY2UsIFRvYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy50aGVtZS5zaGFyZWQnO1xuaW1wb3J0IHtcbiAgUGFnZWRSZXN1bHREdG8sXG4gIEFCUCxcbiAgTGlzdFNlcnZpY2UsXG4gIFJlc3QsXG4gIFJlc3RTZXJ2aWNlLFxuICBMb2NhbGl6YXRpb25TZXJ2aWNlLFxuICBMSVNUX1FVRVJZX0RFQk9VTkNFX1RJTUUsXG59IGZyb20gJ0BhYnAvbmcuY29yZSc7XG5pbXBvcnQge1xuICBGaWxlRGVzY3JpcHRvckR0byxcbiAgRmlsZURlc2NyaXB0b3JTZXJ2aWNlLFxuICBHZXRGaWxlc0lucHV0LFxufSBmcm9tICcuLi8uLi9wcm94eS9kaWduaXRlL2ZpbGUtZXhwbG9yZXIvZmlsZXMnO1xuaW1wb3J0IHsgRmlsZUFwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWxlLWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGlvblR5cGUgfSBmcm9tICdAc3dpbWxhbmUvbmd4LWRhdGF0YWJsZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzJztcbnZhciB0aGF0O1xuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnZmUtZmlsZS1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxlLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmlsZS1tb2RhbC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICAvLyBbUmVxdWlyZWRdXG4gICAgTGlzdFNlcnZpY2UsXG4gICAgLy8gW09wdGlvbmFsXVxuICAgIC8vIFByb3ZpZGUgdGhpcyB0b2tlbiBpZiB5b3Ugd2FudCBhIGRpZmZlcmVudCBkZWJvdW5jZSB0aW1lLlxuICAgIC8vIERlZmF1bHQgaXMgMzAwLiBDYW5ub3QgYmUgMC4gQW55IHZhbHVlIGJlbG93IDEwMCBpcyBub3QgcmVjb21tZW5kZWQuXG4gICAgeyBwcm92aWRlOiBMSVNUX1FVRVJZX0RFQk9VTkNFX1RJTUUsIHVzZVZhbHVlOiA1MDAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRmlsZU1vZGFsQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfRmlsZVNlcnZpY2U6IEZpbGVTZXJ2aWNlLkZpbGVEZXNjcmlwdG9yU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0ZXI6IFRvYXN0ZXJTZXJ2aWNlLFxuICAgIHB1YmxpYyByZWFkb25seSBsaXN0OiBMaXN0U2VydmljZSxcbiAgICBwdWJsaWMgX0ZpbGVBcGlTZXJ2aWNlOiBGaWxlQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHJlc3RTZXJ2aWNlOiBSZXN0U2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpcm1hdGlvbjogQ29uZmlybWF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIF9Mb2NhbGl6YXRpb25TZXJ2aWNlOiBMb2NhbGl6YXRpb25TZXJ2aWNlXG4gICkge1xuICAgIHRoYXQgPSB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBfRmlsZURlc2NyaXB0b3JTZXJ2aWNlID0gaW5qZWN0KEZpbGVEZXNjcmlwdG9yU2VydmljZSk7XG4gIC8qKuiOt+WPluebruW9lemFjee9riAqL1xuICBnZXRGaWxlc0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX0ZpbGVEZXNjcmlwdG9yU2VydmljZVxuICAgICAgICAuZ2V0RmlsZUNvbnRhaW5lckNvbmZpZ3VyYXRpb24odGhpcy5fZmlsZUNvbnRhaW5lck5hbWUpXG4gICAgICAgIC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZURpcmVjdG9yeVBlcm1pc3Npb25OYW1lID0gcmVzPy5jcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZTtcbiAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIC8qKuebruW9leeahOadg+mZkOWQjeensCAqL1xuICBjcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZTogc3RyaW5nID0gbnVsbDtcblxuICAvKirlm77niYflrrnlmaggKi9cbiAgX2ZpbGVDb250YWluZXJOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZmlsZUNvbnRhaW5lck5hbWUodjogc3RyaW5nKSB7XG4gICAgaWYgKHYpIHtcbiAgICAgIHRoaXMuX2ZpbGVDb250YWluZXJOYW1lID0gdjtcbiAgICAgIC8vIHRoaXMubG9hZERhdGEoKVxuICAgIH1cbiAgfVxuXG4gIC8qKuaYr+WQpuWkmumAiSAqL1xuICBfbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBtdWx0aXBsZSh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5fbXVsdGlwbGUgPSB2O1xuICAgIGlmICh2KSB7XG4gICAgfVxuICB9XG5cbiAgLyoq5paH5Lu25aSn5bCP6ZmQ5Yi2XG4gICAqIEBwYXJhbSAxbWJcbiAgICovXG4gIHNpemVMaW1pdDogbnVtYmVyID0gMTA0ODU3NjtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBsaW1pdCh2OiBudW1iZXIpIHtcbiAgICB0aGlzLnNpemVMaW1pdCA9IHY7XG4gIH1cbiAgLyoq54i257uE5Lu25Lyg6YCS55qE5qih5oCB5qGG54q25oCBICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgdmlzaWJsZSh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5Nb2RhbE9wZW4gPSB2O1xuICAgIGlmICh2KSB7XG4gICAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgLyoq5qih5oCB5qGG54q25oCB5Zue6LCDICovXG4gIEBPdXRwdXQoKSB2aXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKuaooeaAgeahhi3nirbmgIEt5piv5ZCm5omT5byAICovXG4gIE1vZGFsT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKuaooeaAgeahhi3nuYHlv5nnirbmgIEt55So5LqO56Gu5a6a5qih5oCB55qE57mB5b+Z54q25oCB5piv5ZCm5Li655yfICovXG4gIE1vZGFsQnVzeTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKuaooeaAgeahhi3nirbmgIHmlLnlj5jlm57osIMgKi9cbiAgTW9kYWxWaXNpYmxlQ2hhbmdlKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgdGhpcy5Nb2RhbE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuTW9kYWxCdXN5ID0gZmFsc2U7XG4gICAgICB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdChldmVudCk7XG4gICAgICB0aGlzLmNyZWF0ZURpcmVjdG9yeVBlcm1pc3Npb25OYW1lID0gJyc7XG4gICAgICB0aGlzLl90aGVTZWxlY3RlZFRyZWVOb2RlID0gJyc7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFibGUgPSBbXTtcbiAgICAgIHRoaXMudXBsb2FkUGljdHVyZVN0YXR1c0xpc3QgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKirmqKHmgIHmoYbkv53lrZggKi9cbiAgbW9kYWxTYXZlKCkge1xuICAgIGxldCBzZWxlY3RlZFRhYmxlYXJyID0gdGhpcy5fRmlsZUFwaVNlcnZpY2UuZGVlcENsb25lKHRoaXMuc2VsZWN0ZWRUYWJsZSk7XG4gICAgdGhpcy5zZWxlY3RGaWxlZm4uZW1pdChzZWxlY3RlZFRhYmxlYXJyKTtcbiAgICB0aGlzLk1vZGFsVmlzaWJsZUNoYW5nZShmYWxzZSk7XG4gIH1cbiAgLyoqZGlnbml0ZS1maWxlLW1vZGFsLXRyZWUgKi9cbiAgLyoq6YCJ5oup55qEdHJlZeiKgueCuSAqL1xuICBfdGhlU2VsZWN0ZWRUcmVlTm9kZTogYW55ID0gJyc7XG4gIGlzQ3JlYXRlTGlzdDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKirliJ3lp4vljJbmlbDmja4gKi9cbiAgbG9hZERhdGEoKSB7XG4gICAgaWYgKHRoaXMuTW9kYWxPcGVuICYmIHRoaXMuX2ZpbGVDb250YWluZXJOYW1lKSB7XG4gICAgICB0aGlzLmxpc3QubWF4UmVzdWx0Q291bnQgPSAxMDA7XG4gICAgICAvLyB0aGlzLmZpbHRlcnMuc2tpcENvdW50ID0gMDtcbiAgICAgIHRoaXMuZ2V0RmlsZXNDb25maWd1cmF0aW9uKCk7XG4gICAgICBpZiAoIXRoaXMuaXNDcmVhdGVMaXN0KSB7XG4gICAgICAgIHRoaXMuaG9va1RvUXVlcnkoKTtcbiAgICAgICAgdGhpcy5pc0NyZWF0ZUxpc3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5saXN0LmdldCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKiog5LuOdHJlZeiOt+WPluadpeeahOaVsOaNriAqL1xuICBmaWxlR3JvdXBMaXN0OiBhbnlbXSA9IFtdO1xuICAvKiog5LuOdHJlZeiOt+WPluaVsOaNriAqL1xuICB0cmVlTm9kZURhdGEoZXZlbnQpIHtcbiAgICB0aGlzLmZpbGVHcm91cExpc3QgPSB0aGlzLmZsYXR0ZW5OZXN0ZWRBcnJheShldmVudCk7XG4gIH1cbiAgLyoqXG4gICAqIOWwhuW1jOWll+aVsOe7hOaJgeW5s+WMllxuICAgKiBAcGFyYW0ge0FycmF5fSBuZXN0ZWRBcnJheSAtIOWMheWQq+W1jOWll2NoaWxkcmVu55qE5pWw57uEXG4gICAqIEByZXR1cm5zIHtBcnJheX0gLSDmiYHlubPljJblkI7nmoTmlbDnu4RcbiAgICovXG4gIGZsYXR0ZW5OZXN0ZWRBcnJheShuZXN0ZWRBcnJheSkge1xuICAgIGxldCByZXN1bHQgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGZsYXR0ZW4oaXRlbXMpIHtcbiAgICAgIGlmICghaXRlbXMpIHJldHVybjtcblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIC8vIOWwhuW9k+WJjemhuea3u+WKoOWIsOe7k+aenOaVsOe7hFxuICAgICAgICByZXN1bHQucHVzaCh7IC4uLml0ZW0gfSk7XG5cbiAgICAgICAgLy8g5aaC5p6c5pyJY2hpbGRyZW7lsZ7mgKfkuJTmmK/mlbDnu4TvvIzpgJLlvZLlpITnkIZcbiAgICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgQXJyYXkuaXNBcnJheShpdGVtLmNoaWxkcmVuKSkge1xuICAgICAgICAgIGZsYXR0ZW4oaXRlbS5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbGF0dGVuKG5lc3RlZEFycmF5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqdHJlZS3oioLngrnpgInmi6kgKi9cbiAgX25vZGVDbGljayhldmVudCkge1xuICAgIHRoaXMuZmlsdGVycy5za2lwQ291bnQgPSAwO1xuICAgIHRoaXMuX3RoZVNlbGVjdGVkVHJlZU5vZGUgPSBldmVudDtcbiAgICB0aGlzLmxpc3QuZ2V0KCk7XG4gIH1cblxuICAvKirlm77niYfkuIrkvKAt6KaB5LiK5Lyg5Zu+54mH55qE54q25oCB5paH5Lu25YiX6KGoICovXG4gIHVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0OiBhbnlbXSA9IFtdO1xuXG4gIC8qKuWbvueJh+S4iuS8oC3ojrflj5bmlofku7bkv6Hmga/mlLnlj5ggKi9cbiAgYXN5bmMgZ2V0RmlsZUNoYW5nZShldmVudCkge1xuICAgIGxldCBmaWxlcyA9IG5ldyBBcnJheSguLi5ldmVudC50YXJnZXQuZmlsZXMpO1xuICAgIHRoaXMudXBsb2FkUGljdHVyZVN0YXR1c0xpc3QgPSBmaWxlcztcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGlmIChmaWxlLnNpemUgPiB0aGlzLnNpemVMaW1pdCkge1xuICAgICAgICB0aGlzLnNldHVwbG9hZFBpY3R1cmVTdGF0dXMoZmlsZSwgMik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy51cGxvYWRpbmdGaWxlKGZpbGUpXG4gICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYmxlLnB1c2gocmVzKTtcbiAgICAgICAgICB0aGlzLnNldHVwbG9hZFBpY3R1cmVTdGF0dXMoZmlsZSwgMSk7XG4gICAgICAgICAgLy8gdGhpcy5saXN0LmdldCgpXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXR1cGxvYWRQaWN0dXJlU3RhdHVzKGZpbGUsIDIpO1xuICAgICAgICB9KTsgLy8g562J5b6F5q+P5Liq5paH5Lu25LiK5Lyg5a6M5oiQXG4gICAgfVxuICAgIHRoaXMubGlzdC5nZXQoKTtcbiAgICBsZXQgaXNTdWJtaXQgPSAhdGhpcy51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdC5zb21lKGVsID0+IGVsLnN0YXR1cyA9PSAyKTtcbiAgICBpZiAoaXNTdWJtaXQpIHtcbiAgICAgIC8vIHRoaXMudG9hc3Rlci5zdWNjZXNzKFwi5LiK5Lyg5a6M5oiQXCIpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudXBsb2FkUGljdHVyZVN0YXR1c0xpc3QgPSBbXTtcbiAgICAgIH0sIDQwMDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKuWbvueJh+S4iuS8oC3orr7nva51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdOeahOeKtuaAgSAqL1xuICBzZXR1cGxvYWRQaWN0dXJlU3RhdHVzKGZpbGUsIHR5cGUpIHtcbiAgICB0aGlzLnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0Lm1hcChlbCA9PiB7XG4gICAgICBpZiAoZWwgPT0gZmlsZSkgZWwuc3RhdHVzID0gdHlwZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKuWbvueJh+S4iuS8oC3pgJLlvZLmjInpobrluo/kuIrkvKAgKi9cbiAgdXBsb2FkaW5nRmlsZShmaWxlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3RzKSA9PiB7XG4gICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSk7XG4gICAgICB0aGlzLmNyZWF0ZUZpbGUoe1xuICAgICAgICBmaWxlOiBmb3JtRGF0YSxcbiAgICAgICAgY29udGFpbmVyTmFtZTogdGhpcy5fZmlsZUNvbnRhaW5lck5hbWUsXG4gICAgICAgIGRpcmVjdG9yeUlkOiB0aGlzLl90aGVTZWxlY3RlZFRyZWVOb2RlPy5rZXkgfHwgJycsXG4gICAgICAgIGVudGl0eUlkOiAnJyxcbiAgICAgIH0pLnN1YnNjcmliZShcbiAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgcmVqZWN0cyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKirmlofku7booajmoLwt5pWw5o2uKi9cbiAgZGF0YTogUGFnZWRSZXN1bHREdG88RmlsZURlc2NyaXB0b3JEdG8+ID0ge1xuICAgIGl0ZW1zOiBbXSxcbiAgICB0b3RhbENvdW50OiAwLFxuICB9O1xuXG4gIC8qKuaWh+S7tuihqOagvC3mnaHku7YqL1xuICBmaWx0ZXJzID0ge30gYXMgR2V0RmlsZXNJbnB1dDtcblxuICAvKirmlofku7booajmoLwt6KGo5qC86Ieq5bim6YCJ5oup57G75Z6LICovXG4gIFNlbGVjdGlvblR5cGUgPSBTZWxlY3Rpb25UeXBlO1xuXG4gIC8qKumAieaLqeaWh+S7tuWbnuiwgyAqL1xuICBAT3V0cHV0KCkgc2VsZWN0RmlsZWZuID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAvKirmlofku7booajmoLwt6I635Y+W6KGo5qC85pWw5o2uICovXG4gIGhvb2tUb1F1ZXJ5KCkge1xuICAgIGNvbnN0IGdldERhdGEgPSAocXVlcnk6IEFCUC5QYWdlUXVlcnlQYXJhbXMpID0+XG4gICAgICB0aGlzLl9GaWxlU2VydmljZS5nZXRMaXN0KHtcbiAgICAgICAgLi4ucXVlcnksXG4gICAgICAgIC4uLnRoaXMuZmlsdGVycyxcbiAgICAgICAgY29udGFpbmVyTmFtZTogdGhpcy5fZmlsZUNvbnRhaW5lck5hbWUsXG4gICAgICAgIGRpcmVjdG9yeUlkOiB0aGlzLl90aGVTZWxlY3RlZFRyZWVOb2RlLmtleSxcbiAgICAgIH0pO1xuICAgIGNvbnN0IHNldERhdGEgPSAobGlzdDogUGFnZWRSZXN1bHREdG88RmlsZURlc2NyaXB0b3JEdG8+KSA9PiB7XG4gICAgICB0aGlzLmRhdGEgPSBsaXN0O1xuICAgICAgdGhpcy5vblBhZ2VDaGFuZ2UobGlzdC5pdGVtcyk7XG4gICAgfTtcbiAgICB0aGlzLmxpc3QuaG9va1RvUXVlcnkoZ2V0RGF0YSkuc3Vic2NyaWJlKHNldERhdGEpO1xuICB9XG5cbiAgLyoq5paH5Lu26KGo5qC8Leafpeeci+aJgOacieWIhue7hOeahOaWh+S7tuaVsOaNriAqL1xuICBsb29rQWxsRmlsZSgpIHtcbiAgICB0aGlzLmZpbHRlcnMuc2tpcENvdW50ID0gMDtcbiAgICB0aGlzLl90aGVTZWxlY3RlZFRyZWVOb2RlID0gJyc7XG4gICAgdGhpcy5saXN0LmdldCgpO1xuICB9XG5cbiAgLyoq5Yig6Zmk5Zu+54mHICovXG4gIGRlbGV0ZUZpbGUoZmlsZSkge1xuICAgIHRoaXMuX0ZpbGVTZXJ2aWNlLmRlbGV0ZShmaWxlLmlkKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgIHRoaXMudG9hc3Rlci5zdWNjZXNzKHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChgRmlsZUV4cGxvcmVyOjpEZWxldGVkU3VjY2Vzc2Z1bGx5YCkpO1xuICAgICAgdGhpcy5saXN0LmdldCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoq5Yig6Zmk5omA5pyJ6YCJ5Lit5Zu+54mHICovXG4gIG9uRGVsZXRlQWxsU2VsZWN0RmlsZSgpIHtcbiAgICB0aGlzLmNvbmZpcm1hdGlvblxuICAgICAgLndhcm4oJycsIHtcbiAgICAgICAga2V5OiAnJyxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLl9Mb2NhbGl6YXRpb25TZXJ2aWNlLmluc3RhbnQoYEZpbGVFeHBsb3Jlcjo6QXJlWW91U3VyZWApLFxuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKHN0YXR1czogQ29uZmlybWF0aW9uLlN0YXR1cykgPT4ge1xuICAgICAgICBpZiAoc3RhdHVzID09ICdjb25maXJtJykge1xuICAgICAgICAgIGxldCBzZWxlY3RlZFRhYmxlID0gdGhpcy5zZWxlY3RlZFRhYmxlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJhdGNoRGVsZXRlSXRlbXMoc2VsZWN0ZWRUYWJsZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgdGhpcy50b2FzdGVyLnN1Y2Nlc3MocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICB0aGlzLmxpc3QuZ2V0KCk7XG4gICAgICAgICAgICAgIC8vIOWPr+iDvemcgOimgeWIt+aWsOihqOagvOaIluabtOaWsFVJXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvL+WIoOmZpOWksei0peeahOmhuVxuICAgICAgICAgICAgICB0aGlzLmxpc3QuZ2V0KCk7XG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgIC8vIOWPr+S7pemAieaLqeWxleekuuWksei0pemhueaIlumHjeivlVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvL+aJuemHj+WIoOmZpOi/h+eoi+S4reWPkeeUn+mUmeivr1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5om56YeP5Yig6Zmk6KGo5qC86aG5XG4gICAqIEBwYXJhbSBzZWxlY3RlZFRhYmxlIOmcgOimgeWIoOmZpOeahOihqOagvOmhueaVsOe7hFxuICAgKiBAcmV0dXJucyDljIXlkKvmiJDlip/nirbmgIHlkozlpLHotKXpobnnmoTnu5Pmnpzlr7nosaFcbiAgICovXG4gIGFzeW5jIGJhdGNoRGVsZXRlSXRlbXMoc2VsZWN0ZWRUYWJsZTogYW55W10pIHtcbiAgICAvLyDlrZjlgqjmiYDmnInliKDpmaTor7fmsYLnmoRQcm9taXNlXG4gICAgY29uc3QgZGVsZXRlUHJvbWlzZXMgPSBzZWxlY3RlZFRhYmxlLm1hcChpdGVtID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuX0ZpbGVTZXJ2aWNlLmRlbGV0ZShpdGVtLmlkKS5zdWJzY3JpYmUoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIOetieW+heaJgOacieivt+axguWujOaIkFxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoZGVsZXRlUHJvbWlzZXMpO1xuICAgIGNvbnNvbGUubG9nKHJlc3VsdHMsICdyZXN1bHRzcmVzdWx0c3Jlc3VsdHMnKTtcbiAgICAvLyDmlLbpm4blpLHotKXnmoTpoblcbiAgICBjb25zdCBmYWlsZWRJdGVtczogYW55W10gPSBbXTtcbiAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIGZhaWxlZEl0ZW1zLnB1c2gocmVzdWx0LnJlYXNvbik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFpbGVkSXRlbXMubGVuZ3RoID09PSAwLFxuICAgICAgZmFpbGVkSXRlbXMsXG4gICAgICBtZXNzYWdlOlxuICAgICAgICBmYWlsZWRJdGVtcy5sZW5ndGggPT09IDBcbiAgICAgICAgICA/IHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChgRmlsZUV4cGxvcmVyOjpEZWxldGVkU3VjY2Vzc2Z1bGx5YClcbiAgICAgICAgICA6IGAke2ZhaWxlZEl0ZW1zLmxlbmd0aH3kuKrpobnliKDpmaTlpLHotKVgLFxuICAgIH07XG4gIH1cblxuICAvLyDkvb/nlKjnpLrkvotcbiAgYXN5bmMgaGFuZGxlQmF0Y2hEZWxldGUoKSB7fVxuXG4gIC8qKuWFs+mXreaWh+S7tueKtuaAgeW8ueeqlyAqL1xuICBjbG9zZUZpbGVTdGF0dXNNb2RhbCgpIHtcbiAgICB0aGlzLnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0ID0gW107XG4gIH1cblxuICAvKirliJvlu7rlm77niYfnmoTmjqXlj6PvvIzku6PnkIbkuK3nmoRmaWxl57G75Z6L5LiN5Yy56YWN77yM5YiH5o2i5Li6YW5557G75Z6LICovXG4gIGNyZWF0ZUZpbGUgPSAoaW5wdXQ6IGFueSwgY29uZmlnPzogUGFydGlhbDxSZXN0LkNvbmZpZz4pID0+XG4gICAgdGhpcy5yZXN0U2VydmljZS5yZXF1ZXN0PGFueSwgRmlsZURlc2NyaXB0b3JEdG8+KFxuICAgICAge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgdXJsOiAnL2FwaS9maWxlLWV4cGxvcmVyL2ZpbGVzJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgY29udGFpbmVyTmFtZTogaW5wdXQuY29udGFpbmVyTmFtZSxcbiAgICAgICAgICBjZWxsTmFtZTogaW5wdXQuY2VsbE5hbWUsXG4gICAgICAgICAgZGlyZWN0b3J5SWQ6IGlucHV0LmRpcmVjdG9yeUlkLFxuICAgICAgICAgIGVudGl0eUlkOiBpbnB1dC5lbnRpdHlJZCxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogaW5wdXQuZmlsZSxcbiAgICAgIH0sXG4gICAgICB7IGFwaU5hbWU6ICdGaWxlRXhwbG9yZXInLCAuLi5jb25maWcgfVxuICAgICk7XG5cbiAgLyoq5paH5Lu26KGo5qC8LemAieaLqeeahOihqOagvOaVsOaNrumhuSAqL1xuICBzZWxlY3RlZFRhYmxlID0gW107XG4gIC8qKuW9k+WJjemAieaLqeeahHRhYmxl6aG5IGlkICovXG4gIG5vd1NlbGVjdElkOiBhbnkgPSAnJztcbiAgLyoq5piv5ZCm5YWo6YCJICovXG4gIGlzQWxsU2VsZWN0ZWQgPSBmYWxzZTtcblxuICAvKirlt7LpgInlrprnmoTmlofku7YgKi9cbiAgQElucHV0KCkgc2VsZWN0UGlja2VyRmlsZTogYW55W107XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vQ2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgbGlmZWN5Y2xlIGhvb2suIFVzZSBpdCB0byBpbmplY3QgZGVwZW5kZW5jaWVzLCBidXQgYXZvaWQgYW55IHNlcmlvdXMgd29yayBoZXJlLlxuICAgIC8vQWRkICcke2ltcGxlbWVudHMgT25DaGFuZ2VzfScgdG8gdGhlIGNsYXNzLlxuICAgIHRoaXMuc2VsZWN0ZWRUYWJsZSA9IHRoaXMuX0ZpbGVBcGlTZXJ2aWNlLmRlZXBDbG9uZSh0aGlzLnNlbGVjdFBpY2tlckZpbGUpO1xuICB9XG4gIC8qKuihqOagvOWIhumhteWIh+aNoiAqL1xuICBvblBhZ2VDaGFuZ2UobmV3QXJyYXkpIHtcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSB0aGlzLmlzQWxsU2VsZWN0ZWRGbihuZXdBcnJheSwgdGhpcy5zZWxlY3RlZFRhYmxlKTtcbiAgfVxuICAvKirooYzpgInmi6nmoYbmlLnlj5ggKi9cbiAgb25DaGVja2JveENoYW5nZUZuKGV2ZW50LCByb3csIGFycmF5OiBhbnlbXSkge1xuICAgIGNvbnN0IHsgY2hlY2tlZCB9ID0gZXZlbnQudGFyZ2V0O1xuICAgIGxldCBzZWxlY3RlZFRhYmxlQXJyYXkgPSBbLi4udGhpcy5zZWxlY3RlZFRhYmxlXTtcbiAgICBpZiAodGhpcy5fbXVsdGlwbGUpIHtcbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIHNlbGVjdGVkVGFibGVBcnJheS5wdXNoKHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZFRhYmxlQXJyYXkgPSBzZWxlY3RlZFRhYmxlQXJyYXkuZmlsdGVyKGVsID0+IGVsLmlkICE9IHJvdy5pZCk7XG4gICAgICB9XG4gICAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSB0aGlzLmlzQWxsU2VsZWN0ZWRGbihhcnJheSwgc2VsZWN0ZWRUYWJsZUFycmF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWRUYWJsZUFycmF5Lmxlbmd0aCA9IDA7XG4gICAgICBzZWxlY3RlZFRhYmxlQXJyYXkgPSBjaGVja2VkID8gW3Jvd10gOiBbXTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFRhYmxlID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVzQnlJZChzZWxlY3RlZFRhYmxlQXJyYXkpO1xuICB9XG4gIC8qKuWmguaenHNlbGVjdGVkVGFibGVBcnJheeS4jeWQq2FycmF55Lit55qE5omA5pyJ6aG577yM5YiZ5bCGaXNBbGxTZWxlY3RlZOiuvuS4unRydWUs5ZCm5YiZ6K6+5Li6ZmFsc2UgKi9cbiAgaXNBbGxTZWxlY3RlZEZuKHRvbGFsQXJyYXk6IGFueVtdLCBzZWxlY3RlZEFycmF5OiBhbnlbXSA9IFtdKSB7XG4gICAgaWYodG9sYWxBcnJheS5sZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0b2xhbEFycmF5LmV2ZXJ5KGl0ZW0gPT4gc2VsZWN0ZWRBcnJheS5zb21lKGVsID0+IGVsLmlkID09PSBpdGVtLmlkKSk7XG4gIH1cbiAgLyoq6YCJ5oup5b2T5YmN6aG15YWo6YOoICovXG4gIG9uU2VsZWN0QWxsRm4oZXZlbnQ6IGFueSwgYXJyYXk6IGFueVtdKSB7XG4gICAgbGV0IHNlbGVjdGVkVGFibGVBcnJheSA9IHRoaXMuc2VsZWN0ZWRUYWJsZTtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgIHNlbGVjdGVkVGFibGVBcnJheSA9IHRoaXMucmVtb3ZlRHVwbGljYXRlc0J5SWQoWy4uLnNlbGVjdGVkVGFibGVBcnJheSwgLi4uYXJyYXldKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWRUYWJsZUFycmF5ID0gc2VsZWN0ZWRUYWJsZUFycmF5LmZpbHRlcihlbCA9PiAhYXJyYXkuc29tZShpdGVtID0+IGl0ZW0uaWQgPT09IGVsLmlkKSk7XG4gICAgfVxuICAgIHRoaXMuaXNBbGxTZWxlY3RlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xuICAgIHRoaXMuc2VsZWN0ZWRUYWJsZSA9IHNlbGVjdGVkVGFibGVBcnJheTtcbiAgfVxuXG4gIC8qKuWIpOaWrXJvd+aYr+WQpumAieS4rSAqL1xuICBzZWxlY3RlZGNoZWNrYm94ID0gaWQgPT4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVGFibGUuc29tZShlbCA9PiBlbC5pZCA9PT0gaWQpO1xuICB9O1xuICAvKirliKDpmaTmlbDnu4TkuK3ph43lpI3nmoTpobkgKi9cbiAgcmVtb3ZlRHVwbGljYXRlc0J5SWQoYXJyYXkpIHtcbiAgICBjb25zdCBzZWVuSWRzID0ge307XG4gICAgcmV0dXJuIGFycmF5LmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGlmICghc2Vlbklkc1tpdGVtLmlkXSkge1xuICAgICAgICBzZWVuSWRzW2l0ZW0uaWRdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cbiAgLyoq55So5LqO57yW6L6R55qE6KGo5Y2V77yM5ZCM5pe25Y+q6IO95pi+56S657yW6L6R5LiA5LiqICovXG4gIEZpbGVOYW1lRm9ybTogRm9ybUdyb3VwIHwgYW55O1xuICAvKirlvZPliY3nvJbovpHnmoRyb3cgKi9cbiAgbmV3RWRpdFJvdzogYW55ID0gJyc7XG4gIC8qKuaYr+WQpuato+WcqOWKoOi9vSAqL1xuICBpc2xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoq5o+Q5LqkRmlsZU5hbWXnvJbovpEgKi9cbiAgb25TdWJtaXRGaWxlTmFtZShldmVudCkge1xuICAgIGxldCBpbnB1dCA9IHRoaXMuRmlsZU5hbWVGb3JtLnZhbHVlO1xuICAgIGlmICghdGhpcy5GaWxlTmFtZUZvcm0udmFsaWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc2xvYWRpbmcpIHJldHVybjtcbiAgICB0aGlzLmlzbG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5fRmlsZVNlcnZpY2VcbiAgICAgIC51cGRhdGUoaW5wdXQuaWQsIHtcbiAgICAgICAgbmFtZTppbnB1dC5maWxlTmFtZVxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc2xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgLy/pgJrov4flvZPliY1uZXdFZGl0Um9355qEaWQs5L+u5pS5ZGF0YS5pdGVtc+S4reWvueW6lOmhueeahG5hbWVcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuZGF0YS5pdGVtcykge1xuICAgICAgICAgIGlmIChlbGVtZW50LmlkID09IHRoaXMubmV3RWRpdFJvdy5pZCkge1xuICAgICAgICAgICAgZWxlbWVudC5uYW1lID0gaW5wdXQuZmlsZU5hbWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLkZpbGVOYW1lRm9ybSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5uZXdFZGl0Um93ID0gJyc7XG4gICAgICAgIHRoaXMudG9hc3Rlci5zdWNjZXNzKHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChgRmlsZUV4cGxvcmVyOjpTYXZlZFN1Y2Nlc3NmdWxseWApKTtcbiAgICAgICAgLy8gdGhpcy5saXN0LmdldCgpO1xuICAgICAgfSk7XG4gIH1cbiAgLyoq5omT5byA57yW6L6RICovXG4gIG9uRWRpdEZpbGVOYW1lKHJvdykge1xuICAgIHRoaXMuRmlsZU5hbWVGb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICBmaWxlTmFtZTogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgaWQ6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICB9KTtcbiAgICB0aGlzLkZpbGVOYW1lRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIGZpbGVOYW1lOiByb3cubmFtZSxcbiAgICAgIGlkOiByb3cuaWQsXG4gICAgfSk7XG4gICAgdGhpcy5uZXdFZGl0Um93ID0gcm93O1xuICB9XG4gIC8qKuWFs+mXree8lui+kSAqL1xuICBvbkNhbmNlbEZpbGVOYW1lKHJvdykge1xuICAgIHRoaXMubmV3RWRpdFJvdyA9ICcnO1xuICAgIHRoaXMuRmlsZU5hbWVGb3JtID0gdW5kZWZpbmVkO1xuICB9XG59XG4iLCI8YWJwLW1vZGFsIFsodmlzaWJsZSldPVwiTW9kYWxPcGVuXCIgKHZpc2libGVDaGFuZ2UpPVwiTW9kYWxWaXNpYmxlQ2hhbmdlKCRldmVudClcIlxuICBbb3B0aW9uc109XCJ7IHNpemU6ICd4bCcsIHNjcm9sbGFibGU6IGZhbHNlIH1cIj5cbiAgPG5nLXRlbXBsYXRlICNhYnBIZWFkZXI+XG4gICAgPGgzPnt7J0ZpbGVFeHBsb3Jlcjo6RmlsZUV4cGxvcmVyJyB8IGFicExvY2FsaXphdGlvbn19PC9oMz5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlICNhYnBCb2R5PlxuICAgIDxkaXYgY2xhc3M9XCJyb3cgZmlsZS1leHBsb3Jlci1tb2RhbC1ib2R5IGZpbGUtbW9kYWxcIiAqbmdJZj1cIk1vZGFsT3BlblwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCIgKm5nSWY9XCJjcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZVwiIHN0eWxlPVwib3ZlcmZsb3c6IGF1dG87IGhlaWdodDogY2FsYygxMDB2aCAtIDI0MHB4KVwiPlxuICAgICAgICA8ZmUtZmlsZS1tb2RhbC10cmVlIFt0aGVTZWxlY3RlZFRyZWVOb2RlXT1cIl90aGVTZWxlY3RlZFRyZWVOb2RlXCIgKG5vZGVDbGljayk9XCJfbm9kZUNsaWNrKCRldmVudClcIlxuICAgICAgICAgIChsb29rQWxsQnRuKT1cImxvb2tBbGxGaWxlKClcIiAodHJlZU5vZGVEYXRhKT1cInRyZWVOb2RlRGF0YSgkZXZlbnQpXCJcbiAgICAgICAgICBbZmlsZUNvbnRhaW5lck5hbWVdPVwiX2ZpbGVDb250YWluZXJOYW1lXCI+PC9mZS1maWxlLW1vZGFsLXRyZWU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgW2NsYXNzXT1cImNyZWF0ZURpcmVjdG9yeVBlcm1pc3Npb25OYW1lPydjb2wtOSc6J2NvbC0xMidcIiBzdHlsZT1cImhlaWdodDogY2FsYygxMDB2aCAtIDI0MHB4KVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMyBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDJcIj48c3BhbiAqbmdJZj1cInNlbGVjdGVkVGFibGUubGVuZ3RoPjFcIiBjbGFzcz1cImJ0bi1saW5rXCJcbiAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwib25EZWxldGVBbGxTZWxlY3RGaWxlKClcIiByb2xlPVwiYnV0dG9uXCI+e3snRmlsZUV4cGxvcmVyOjpEZWxldGUnIHwgYWJwTG9jYWxpemF0aW9ufX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGZvcm0tZmlsZVwiIHN0eWxlPVwiZmxleDogMlwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAjZmlsZUVkaXQgW211bHRpcGxlXT1cIl9tdWx0aXBsZVwiIChjaGFuZ2UpPVwiZ2V0RmlsZUNoYW5nZSgkZXZlbnQpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPCEtLSBbc2VsZWN0aW9uVHlwZV09XCJfbXVsdGlwbGU/U2VsZWN0aW9uVHlwZS5jaGVja2JveDpTZWxlY3Rpb25UeXBlLnNpbmdsZVwiIC0tPlxuICAgICAgICAgIDwhLS0gW3NlbGVjdENoZWNrXT1cInNlbGVjdENoZWNrXCIgLS0+XG4gICAgICAgICAgPG5neC1kYXRhdGFibGUgY2xhc3M9XCJtYXRlcmlhbCBjb250YWluZXItaGVpZ2h0XCIgW3Jvd3NdPVwiZGF0YS5pdGVtc1wiIFtsaXN0XT1cImxpc3RcIiBjb2x1bW5Nb2RlPVwiZmxleFwiXG4gICAgICAgICAgICBbaGVhZGVySGVpZ2h0XT1cIjUwXCIgW2Zvb3RlckhlaWdodF09XCI1MFwiIHJvd0hlaWdodD1cImF1dG9cIiBbc2Nyb2xsYmFyVl09XCJ0cnVlXCIgW3ZpcnR1YWxpemF0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtleHRlcm5hbFBhZ2luZ109XCJ0cnVlXCIgW2NvdW50XT1cImRhdGEudG90YWxDb3VudFwiPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uIFt3aWR0aF09XCI1MFwiIHByb3A9XCJpZFwiIFtzb3J0YWJsZV09XCJmYWxzZVwiIFtjYW5BdXRvUmVzaXplXT1cImZhbHNlXCIgW2RyYWdnYWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtyZXNpemVhYmxlXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ3gtZGF0YXRhYmxlLWhlYWRlci10ZW1wbGF0ZSBsZXQtdmFsdWU9XCJ2YWx1ZVwiIGxldC1hbGxSb3dzU2VsZWN0ZWQ9XCJhbGxSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIGxldC1zZWxlY3RGbj1cInNlbGVjdEZuXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiICpuZ0lmPVwiX211bHRpcGxlXCIgW2NoZWNrZWRdPVwiaXNBbGxTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsRm4oJGV2ZW50LGRhdGEuaXRlbXMpXCIgLz5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgW2NoZWNrZWRdPVwic2VsZWN0ZWRjaGVja2JveCh2YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlRm4oJGV2ZW50LHJvdyxkYXRhLml0ZW1zKVwiIC8+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25neC1kYXRhdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uIFtzb3J0YWJsZV09XCJmYWxzZVwiIFtmbGV4R3Jvd109XCIyXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPGZlLWZpbGUtcHJldmlldyBbd2lkdGhdPVwiJzgwcHgnXCIgW3NyY109XCJyb3cudXJsXCIgW25hbWVdPVwicm93Lm5hbWVcIiBbdHlwZV09XCJyb3cubWltZVR5cGVcIlxuICAgICAgICAgICAgICAgICAgW3ByZXZpZXddPVwidHJ1ZVwiPjwvZmUtZmlsZS1wcmV2aWV3PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiBbbmFtZV09XCInRmlsZUV4cGxvcmVyOjpGaWxlTmFtZScgfCBhYnBMb2NhbGl6YXRpb25cIiBwcm9wPVwibmFtZVwiIFtzb3J0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtmbGV4R3Jvd109XCI0XCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCB0aXRsZWhvdmVyXCIgKm5nSWY9XCJuZXdFZGl0Um93LmlkIT09cm93LmlkXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTJcIj57eyB2YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGVuY2lsLXNxdWFyZS1vXCIgcm9sZT1cImJ1dHRvblwiIChjbGljay5zdG9wKT1cIm9uRWRpdEZpbGVOYW1lKHJvdylcIiBzdHlsZT1cImxpbmUtaGVpZ2h0OjI7XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJGaWxlTmFtZUZvcm0mJm5ld0VkaXRSb3cuaWQ9PT1yb3cuaWRcIj5cbiAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiRmlsZU5hbWVGb3JtXCIgKG5nU3VibWl0KT1cIm9uU3VibWl0RmlsZU5hbWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBcIiB0eXBlPVwidGV4dFwiICBmb3JtQ29udHJvbE5hbWU9XCJmaWxlTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIgYnRuIGJ0bi1zbVwiIHR5cGU9XCJzdWJtaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEtc3BpbiBmYSBmYS1zcGlubmVyXCIgKm5nSWY9XCJpc2xvYWRpbmdcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZWNrXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgKm5nSWY9XCIhaXNsb2FkaW5nXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCIgYnRuIGJ0bi1zbVwiIChjbGljay5zdG9wKT1cIm9uQ2FuY2VsRmlsZU5hbWUocm93KVwiPjxpIGNsYXNzPVwiZmEgZmEtdGltZXNcIiB0eXBlPVwicmVzZXRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiBbbmFtZV09XCInRmlsZUV4cGxvcmVyOjpGaWxlU2l6ZScgfCBhYnBMb2NhbGl6YXRpb25cIiBwcm9wPVwic2l6ZVwiIFtmbGV4R3Jvd109XCIxLjVcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICB7eyBfRmlsZUFwaVNlcnZpY2UuZm9ybWF0RmlsZVNpemUodmFsdWUpIH19XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25neC1kYXRhdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uIFtuYW1lXT1cIidGaWxlRXhwbG9yZXI6OkRpcmVjdG9yeScgfCBhYnBMb2NhbGl6YXRpb25cIiBwcm9wPVwiZGlyZWN0b3J5SWRcIlxuICAgICAgICAgICAgICBbc29ydGFibGVdPVwiZmFsc2VcIiBbZmxleEdyb3ddPVwiMVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCIgbmd4LWRhdGF0YWJsZS1jZWxsLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIHt7IHZhbHVlfGdldERpcmVjdG9yeU5hbWU6ZmlsZUdyb3VwTGlzdCB9fVxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiBbbmFtZV09XCInRmlsZUV4cGxvcmVyOjpDcmVhdGlvblRpbWUnIHwgYWJwTG9jYWxpemF0aW9uXCIgcHJvcD1cImNyZWF0aW9uVGltZVwiXG4gICAgICAgICAgICAgIFtmbGV4R3Jvd109XCIyXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAge3sgdmFsdWUgfCBkYXRlIDogJ1lZWVkvTU0vZGQgSEg6bW06cycgfX1cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmd4LWRhdGF0YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICA8bmd4LWRhdGF0YWJsZS1jb2x1bW4gW2ZsZXhHcm93XT1cIjFcIiBbc29ydGFibGVdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQgcC0wXCIgKGNsaWNrLnN0b3ApPVwiZGVsZXRlRmlsZShyb3cpXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaCB0ZXh0LXByaW1hcnkgcC0yXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICA8L25neC1kYXRhdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwidXBsb2FkUGljdHVyZVN0YXR1c0xpc3QubGVuZ3RoID4gMFwiXG4gICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1maXhlZCBib3R0b20tMCBlbmQtMCBzaGFkb3ctbGcgZmlsZS1zdGF0dXMtbW9kYWwgICBtLTVcIiBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDEwcHhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHAtMCBweS0xIGJvcmRlci1ib3R0b21cIj5cbiAgICAgICAgICAgICAgPGRpdj57eydGaWxlRXhwbG9yZXI6OlVwbG9hZEZpbGVzJyB8IGFicExvY2FsaXphdGlvbn19PC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrLnN0b3ApPVwiY2xvc2VGaWxlU3RhdHVzTW9kYWwoKVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydGaWxlRXhwbG9yZXI6OkZpbGVOYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snRmlsZUV4cGxvcmVyOjpGaWxlU2l6ZScgfCBhYnBMb2NhbGl6YXRpb259fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiB1cGxvYWRQaWN0dXJlU3RhdHVzTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGl0ZW0ubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tdGV4dCB0ZXh0LWRhbmdlclwiICpuZ0lmPVwiaXRlbS5zaXplID4gc2l6ZUxpbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0ZpbGVFeHBsb3Jlcjo6RXhjZWVkc01heGltdW1TaXplJyB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbjpfRmlsZUFwaVNlcnZpY2UuZm9ybWF0RmlsZVNpemUoc2l6ZUxpbWl0KX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBpdGVtLmZpbGVTaXplIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cIml0ZW0uc3RhdHVzID09PSAxXCIgY2xhc3M9XCJmYXMgZmEtY2hlY2sgdGV4dC1wcmltYXJ5XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PT0gMlwiIGNsYXNzPVwiZmFzIGZhLXRpbWVzLWNpcmNsZSB0ZXh0LWRhbmdlclwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgI2FicEZvb3Rlcj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgYWJwQ2xvc2U+e3snQWJwVWk6OkNsb3NlJyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XG4gICAgPGFicC1idXR0b24gaWNvbkNsYXNzPVwiZmEgZmEtY2hlY2tcIiAoY2xpY2spPVwibW9kYWxTYXZlKClcIj57eydGaWxlRXhwbG9yZXI6OkNvbmZpcm0nIHwgYWJwTG9jYWxpemF0aW9ufX1cbiAgICAgIEBpZihzZWxlY3RlZFRhYmxlLmxlbmd0aD4wKXtcbiAgICAgICh7e3NlbGVjdGVkVGFibGUubGVuZ3RofX0pXG4gICAgICB9XG4gICAgPC9hYnAtYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9hYnAtbW9kYWw+Il19