@dignite-ng/expand.file-explorer 3.0.0-rc.8 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +128 -24
- package/esm2022/config/dignite-ng-expand.file-explorer-config.mjs +1 -1
- package/esm2022/config/enums/index.mjs +1 -1
- package/esm2022/config/enums/route-names.mjs +1 -1
- package/esm2022/config/file-config.module.mjs +1 -1
- package/esm2022/config/providers/index.mjs +1 -1
- package/esm2022/config/providers/route.provider.mjs +1 -1
- package/esm2022/config/public-api.mjs +1 -1
- package/esm2022/dignite-ng-expand.file-explorer.mjs +1 -1
- package/esm2022/lib/components/dome/file-dome.component.mjs +2 -4
- package/esm2022/lib/components/dynamic-form/file-explorer/file-explorer-config.component.mjs +3 -2
- package/esm2022/lib/components/dynamic-form/file-explorer/file-explorer-config.mjs +1 -1
- package/esm2022/lib/components/dynamic-form/file-explorer/file-explorer-control.component.mjs +3 -3
- package/esm2022/lib/components/dynamic-form/file-explorer/file-explorer-view.component.mjs +3 -3
- package/esm2022/lib/components/dynamic-form/file-explorer/index.mjs +1 -1
- package/esm2022/lib/components/dynamic-form/form-control-group.mjs +1 -1
- package/esm2022/lib/components/file-edit/file-edit.component.mjs +34 -24
- package/esm2022/lib/components/file-modal/file-modal.component.mjs +293 -85
- package/esm2022/lib/components/file-modal-tree/file-modal-tree.component.mjs +135 -60
- package/esm2022/lib/components/file-picker/file-picker.component.mjs +20 -12
- package/esm2022/lib/components/index.mjs +1 -1
- package/esm2022/lib/file-explorer-routing.module.mjs +1 -1
- package/esm2022/lib/file-explorer.module.mjs +36 -11
- package/esm2022/lib/pipe/format-file-size.pipe.mjs +35 -0
- package/esm2022/lib/pipe/get-directory-name.pipe.mjs +20 -0
- package/esm2022/lib/previews/file-preview.component.mjs +2 -1
- package/esm2022/lib/previews/index.mjs +1 -1
- package/esm2022/lib/previews/models.mjs +1 -1
- package/esm2022/lib/proxy/dignite/file-explorer/directories/file-descriptor.service.mjs +2 -1
- package/esm2022/lib/proxy/dignite/file-explorer/directories/index.mjs +1 -1
- package/esm2022/lib/proxy/dignite/file-explorer/directories/models.mjs +1 -1
- package/esm2022/lib/proxy/dignite/file-explorer/files/file-descriptor.service.mjs +11 -3
- package/esm2022/lib/proxy/dignite/file-explorer/files/index.mjs +1 -1
- package/esm2022/lib/proxy/dignite/file-explorer/files/models.mjs +1 -1
- package/esm2022/lib/proxy/microsoft/asp-net-core/mvc/models.mjs +1 -1
- package/esm2022/lib/proxy/microsoft/extensions/primitives/models.mjs +1 -1
- package/esm2022/lib/proxy/microsoft/net/http/headers/models.mjs +1 -1
- package/esm2022/lib/proxy/volo/abp/content/models.mjs +1 -1
- package/esm2022/public-api.mjs +1 -3
- package/fesm2022/dignite-ng-expand.file-explorer-config.mjs.map +1 -1
- package/fesm2022/dignite-ng-expand.file-explorer.mjs +541 -238
- package/fesm2022/dignite-ng-expand.file-explorer.mjs.map +1 -1
- package/lib/components/dome/file-dome.component.d.ts +0 -1
- package/lib/components/file-edit/file-edit.component.d.ts +6 -4
- package/lib/components/file-modal/file-modal.component.d.ts +63 -25
- package/lib/components/file-modal-tree/file-modal-tree.component.d.ts +21 -12
- package/lib/components/file-picker/file-picker.component.d.ts +2 -3
- package/lib/file-explorer.module.d.ts +5 -1
- package/lib/pipe/format-file-size.pipe.d.ts +14 -0
- package/lib/pipe/get-directory-name.pipe.d.ts +7 -0
- package/lib/proxy/dignite/file-explorer/files/file-descriptor.service.d.ts +3 -1
- package/lib/proxy/dignite/file-explorer/files/models.d.ts +5 -2
- package/package.json +25 -7
- package/esm2022/lib/services/file-api.service.mjs +0 -68
- package/lib/services/file-api.service.d.ts +0 -14
|
@@ -1,23 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-this-alias */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
3
|
+
import { Component, EventEmitter, Input, Output, inject, } from '@angular/core';
|
|
4
|
+
import * as FileService from '../../proxy/dignite/file-explorer/files';
|
|
5
|
+
import { ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
|
|
6
|
+
import { ListService, RestService, LocalizationService, LIST_QUERY_DEBOUNCE_TIME, } from '@abp/ng.core';
|
|
7
|
+
import { FileDescriptorService, } from '../../proxy/dignite/file-explorer/files';
|
|
4
8
|
import { SelectionType } from '@swimlane/ngx-datatable';
|
|
9
|
+
import { FormControl, FormGroup, Validators } from '@angular/forms';
|
|
10
|
+
import { finalize } from 'rxjs';
|
|
5
11
|
import * as i0 from "@angular/core";
|
|
6
12
|
import * as i1 from "../../proxy/dignite/file-explorer/files";
|
|
7
13
|
import * as i2 from "@abp/ng.theme.shared";
|
|
8
14
|
import * as i3 from "@abp/ng.core";
|
|
9
|
-
import * as i4 from "
|
|
15
|
+
import * as i4 from "@angular/forms";
|
|
10
16
|
import * as i5 from "@angular/common";
|
|
11
17
|
import * as i6 from "@swimlane/ngx-datatable";
|
|
12
|
-
import * as i7 from "
|
|
13
|
-
import * as i8 from "
|
|
14
|
-
|
|
18
|
+
import * as i7 from "@ngx-validate/core";
|
|
19
|
+
import * as i8 from "../file-modal-tree/file-modal-tree.component";
|
|
20
|
+
import * as i9 from "../../previews/file-preview.component";
|
|
21
|
+
import * as i10 from "../../pipe/get-directory-name.pipe";
|
|
22
|
+
import * as i11 from "../../pipe/format-file-size.pipe";
|
|
15
23
|
export class FileModalComponent {
|
|
16
|
-
constructor(_FileService, toaster, list,
|
|
24
|
+
constructor(_FileService, toaster, list, restService, confirmation, _LocalizationService) {
|
|
17
25
|
this._FileService = _FileService;
|
|
18
26
|
this.toaster = toaster;
|
|
19
27
|
this.list = list;
|
|
20
|
-
this._FileApiService = _FileApiService;
|
|
21
28
|
this.restService = restService;
|
|
22
29
|
this.confirmation = confirmation;
|
|
23
30
|
this._LocalizationService = _LocalizationService;
|
|
@@ -27,8 +34,8 @@ export class FileModalComponent {
|
|
|
27
34
|
/**是否多选 */
|
|
28
35
|
this._multiple = false;
|
|
29
36
|
/**文件大小限制
|
|
30
|
-
|
|
31
|
-
|
|
37
|
+
* @param 1mb
|
|
38
|
+
*/
|
|
32
39
|
this.sizeLimit = 1048576;
|
|
33
40
|
/**模态框状态回调 */
|
|
34
41
|
this.visibleChange = new EventEmitter();
|
|
@@ -39,6 +46,9 @@ export class FileModalComponent {
|
|
|
39
46
|
/**dignite-file-modal-tree */
|
|
40
47
|
/**选择的tree节点 */
|
|
41
48
|
this._theSelectedTreeNode = '';
|
|
49
|
+
this.isCreateList = false;
|
|
50
|
+
/** 从tree获取来的数据 */
|
|
51
|
+
this.fileGroupList = [];
|
|
42
52
|
/**图片上传-要上传图片的状态文件列表 */
|
|
43
53
|
this.uploadPictureStatusList = [];
|
|
44
54
|
/**文件表格-数据*/
|
|
@@ -50,45 +60,54 @@ export class FileModalComponent {
|
|
|
50
60
|
this.filters = {};
|
|
51
61
|
/**文件表格-表格自带选择类型 */
|
|
52
62
|
this.SelectionType = SelectionType;
|
|
53
|
-
/**文件表格-选择的表格数据项 */
|
|
54
|
-
this.selectedTable = [];
|
|
55
|
-
/**当前选择的table项 id */
|
|
56
|
-
this.nowSelectId = '';
|
|
57
63
|
/**选择文件回调 */
|
|
58
64
|
this.selectFilefn = new EventEmitter();
|
|
59
|
-
/**一个布尔or函数,可用于检查是否要根据条件选择特定行。 */
|
|
60
|
-
this.selectCheck = (row, column, value) => {
|
|
61
|
-
this.nowSelectId = row.id;
|
|
62
|
-
return true;
|
|
63
|
-
};
|
|
64
|
-
/**判断row是否选中 */
|
|
65
|
-
this.selectedcheckbox = (id) => {
|
|
66
|
-
return this.selectedTable.some(el => el.id == id);
|
|
67
|
-
};
|
|
68
65
|
/**创建图片的接口,代理中的file类型不匹配,切换为any类型 */
|
|
69
66
|
this.createFile = (input, config) => this.restService.request({
|
|
70
67
|
method: 'POST',
|
|
71
68
|
url: '/api/file-explorer/files',
|
|
72
|
-
params: {
|
|
69
|
+
params: {
|
|
70
|
+
containerName: input.containerName,
|
|
71
|
+
cellName: input.cellName,
|
|
72
|
+
directoryId: input.directoryId,
|
|
73
|
+
entityId: input.entityId,
|
|
74
|
+
},
|
|
73
75
|
body: input.file,
|
|
74
76
|
}, { apiName: 'FileExplorer', ...config });
|
|
75
|
-
|
|
77
|
+
/**文件表格-选择的表格数据项 */
|
|
78
|
+
this.selectedTable = [];
|
|
79
|
+
/**当前选择的table项 id */
|
|
80
|
+
this.nowSelectId = '';
|
|
81
|
+
/**是否全选 */
|
|
82
|
+
this.isAllSelected = false;
|
|
83
|
+
/**判断row是否选中 */
|
|
84
|
+
this.selectedcheckbox = id => {
|
|
85
|
+
return this.selectedTable.some(el => el.id === id);
|
|
86
|
+
};
|
|
87
|
+
/**当前编辑的row */
|
|
88
|
+
this.newEditRow = '';
|
|
89
|
+
/**是否正在加载 */
|
|
90
|
+
this.isloading = false;
|
|
76
91
|
}
|
|
77
92
|
/**获取目录配置 */
|
|
78
93
|
getFilesConfiguration() {
|
|
79
|
-
|
|
80
|
-
this.
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
this._FileDescriptorService
|
|
96
|
+
.getFileContainerConfiguration(this._fileContainerName)
|
|
97
|
+
.subscribe(res => {
|
|
98
|
+
this.createDirectoryPermissionName = res?.createDirectoryPermissionName;
|
|
99
|
+
resolve(res);
|
|
100
|
+
});
|
|
81
101
|
});
|
|
82
102
|
}
|
|
83
103
|
set fileContainerName(v) {
|
|
84
104
|
if (v) {
|
|
85
105
|
this._fileContainerName = v;
|
|
86
|
-
this.loadData()
|
|
106
|
+
// this.loadData()
|
|
87
107
|
}
|
|
88
108
|
}
|
|
89
109
|
set multiple(v) {
|
|
90
110
|
this._multiple = v;
|
|
91
|
-
if (v) { }
|
|
92
111
|
}
|
|
93
112
|
set limit(v) {
|
|
94
113
|
this.sizeLimit = v;
|
|
@@ -103,52 +122,98 @@ export class FileModalComponent {
|
|
|
103
122
|
/**模态框-状态改变回调 */
|
|
104
123
|
ModalVisibleChange(event) {
|
|
105
124
|
if (!event) {
|
|
125
|
+
this.ModalOpen = false;
|
|
126
|
+
this.ModalBusy = false;
|
|
106
127
|
this.visibleChange.emit(event);
|
|
128
|
+
this.createDirectoryPermissionName = '';
|
|
129
|
+
this._theSelectedTreeNode = '';
|
|
130
|
+
this.selectedTable = [];
|
|
131
|
+
this.uploadPictureStatusList = [];
|
|
107
132
|
return;
|
|
108
133
|
}
|
|
109
134
|
}
|
|
110
135
|
/**模态框保存 */
|
|
111
136
|
modalSave() {
|
|
112
|
-
|
|
137
|
+
const selectedTablearr = structuredClone(this.selectedTable);
|
|
113
138
|
this.selectFilefn.emit(selectedTablearr);
|
|
114
139
|
this.ModalVisibleChange(false);
|
|
115
140
|
}
|
|
116
141
|
/**初始化数据 */
|
|
117
142
|
loadData() {
|
|
118
143
|
if (this.ModalOpen && this._fileContainerName) {
|
|
119
|
-
this.
|
|
144
|
+
this.list.maxResultCount = 100;
|
|
145
|
+
// this.filters.skipCount = 0;
|
|
120
146
|
this.getFilesConfiguration();
|
|
147
|
+
if (!this.isCreateList) {
|
|
148
|
+
this.hookToQuery();
|
|
149
|
+
this.isCreateList = true;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
this.list.get();
|
|
153
|
+
}
|
|
121
154
|
}
|
|
122
155
|
}
|
|
156
|
+
/** 从tree获取数据 */
|
|
157
|
+
treeNodeData(event) {
|
|
158
|
+
this.fileGroupList = this.flattenNestedArray(event);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* 将嵌套数组扁平化
|
|
162
|
+
* @param {Array} nestedArray - 包含嵌套children的数组
|
|
163
|
+
* @returns {Array} - 扁平化后的数组
|
|
164
|
+
*/
|
|
165
|
+
flattenNestedArray(nestedArray) {
|
|
166
|
+
const result = [];
|
|
167
|
+
function flatten(items) {
|
|
168
|
+
if (!items)
|
|
169
|
+
return;
|
|
170
|
+
for (const item of items) {
|
|
171
|
+
// 将当前项添加到结果数组
|
|
172
|
+
result.push({ ...item });
|
|
173
|
+
// 如果有children属性且是数组,递归处理
|
|
174
|
+
if (item.children && Array.isArray(item.children)) {
|
|
175
|
+
flatten(item.children);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
flatten(nestedArray);
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
123
182
|
/**tree-节点选择 */
|
|
124
183
|
_nodeClick(event) {
|
|
184
|
+
this.filters.skipCount = 0;
|
|
125
185
|
this._theSelectedTreeNode = event;
|
|
126
186
|
this.list.get();
|
|
127
187
|
}
|
|
128
188
|
/**图片上传-获取文件信息改变 */
|
|
129
189
|
async getFileChange(event) {
|
|
130
|
-
|
|
190
|
+
const _that = this;
|
|
191
|
+
const files = new Array(...event.target.files);
|
|
131
192
|
this.uploadPictureStatusList = files;
|
|
193
|
+
const uploadPromises = [];
|
|
132
194
|
for (const file of files) {
|
|
133
195
|
if (file.size > this.sizeLimit) {
|
|
134
196
|
this.setuploadPictureStatus(file, 2);
|
|
135
197
|
continue;
|
|
136
198
|
}
|
|
137
|
-
|
|
199
|
+
uploadPromises.push(this.uploadingFile(file)
|
|
200
|
+
.then(res => {
|
|
138
201
|
this.setuploadPictureStatus(file, 1);
|
|
139
|
-
|
|
140
|
-
|
|
202
|
+
})
|
|
203
|
+
.catch(function (err) {
|
|
141
204
|
this.setuploadPictureStatus(file, 2);
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
this.list.get();
|
|
145
|
-
let isSubmit = !this.uploadPictureStatusList.some(el => el.status == 2);
|
|
146
|
-
if (isSubmit) {
|
|
147
|
-
// this.toaster.success("上传完成");
|
|
148
|
-
setTimeout(() => {
|
|
149
|
-
this.uploadPictureStatusList = [];
|
|
150
|
-
}, 6000);
|
|
205
|
+
return err;
|
|
206
|
+
}));
|
|
151
207
|
}
|
|
208
|
+
Promise.all(uploadPromises).then((results) => {
|
|
209
|
+
_that.list.get();
|
|
210
|
+
const isSubmit = !_that.uploadPictureStatusList.some(el => el.status == 2);
|
|
211
|
+
if (isSubmit) {
|
|
212
|
+
setTimeout(() => {
|
|
213
|
+
_that.uploadPictureStatusList = [];
|
|
214
|
+
}, 4000);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
152
217
|
}
|
|
153
218
|
/**图片上传-设置uploadPictureStatusList的状态 */
|
|
154
219
|
setuploadPictureStatus(file, type) {
|
|
@@ -160,49 +225,163 @@ export class FileModalComponent {
|
|
|
160
225
|
/**图片上传-递归按顺序上传 */
|
|
161
226
|
uploadingFile(file) {
|
|
162
227
|
return new Promise((resolve, rejects) => {
|
|
163
|
-
|
|
228
|
+
const formData = new FormData();
|
|
164
229
|
formData.append('file', file, file.name);
|
|
165
230
|
this.createFile({
|
|
166
231
|
file: formData,
|
|
167
232
|
containerName: this._fileContainerName,
|
|
168
233
|
directoryId: this._theSelectedTreeNode?.key || '',
|
|
169
|
-
entityId: ''
|
|
234
|
+
entityId: '',
|
|
170
235
|
}).subscribe(res => {
|
|
171
|
-
resolve(
|
|
172
|
-
},
|
|
173
|
-
rejects(
|
|
236
|
+
resolve({ file: file.name, status: 'success', response: res });
|
|
237
|
+
}, err => {
|
|
238
|
+
rejects({ file: file.name, status: 'fail', error: err });
|
|
174
239
|
});
|
|
175
240
|
});
|
|
176
241
|
}
|
|
177
|
-
ngOnChanges(changes) {
|
|
178
|
-
//Called before any other lifecycle hook. Use it to inject dependencies, but avoid any serious work here.
|
|
179
|
-
//Add '${implements OnChanges}' to the class.
|
|
180
|
-
this.selectedTable = this._FileApiService.deepClone(this.selectPickerFile);
|
|
181
|
-
}
|
|
182
242
|
/**文件表格-获取表格数据 */
|
|
183
243
|
hookToQuery() {
|
|
184
244
|
const getData = (query) => this._FileService.getList({
|
|
185
245
|
...query,
|
|
186
246
|
...this.filters,
|
|
187
247
|
containerName: this._fileContainerName,
|
|
188
|
-
directoryId: this._theSelectedTreeNode.key
|
|
248
|
+
directoryId: this._theSelectedTreeNode.key,
|
|
189
249
|
});
|
|
190
|
-
const setData = (list) =>
|
|
250
|
+
const setData = (list) => {
|
|
251
|
+
this.data = list;
|
|
252
|
+
this.onPageChange(list.items);
|
|
253
|
+
};
|
|
191
254
|
this.list.hookToQuery(getData).subscribe(setData);
|
|
192
255
|
}
|
|
193
256
|
/**文件表格-查看所有分组的文件数据 */
|
|
194
257
|
lookAllFile() {
|
|
258
|
+
this.filters.skipCount = 0;
|
|
195
259
|
this._theSelectedTreeNode = '';
|
|
196
260
|
this.list.get();
|
|
197
261
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
this.
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
262
|
+
/**删除图片 */
|
|
263
|
+
deleteFile(file) {
|
|
264
|
+
this._FileService.delete(file.id).subscribe(res => {
|
|
265
|
+
this.toaster.success(this._LocalizationService.instant(`FileExplorer::DeletedSuccessfully`));
|
|
266
|
+
this.list.get();
|
|
267
|
+
const selectedTables = this.selectedTable;
|
|
268
|
+
this.selectedTable = selectedTables.filter(el => el.id != file.id);
|
|
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
|
+
const selectedTable = this.selectedTable;
|
|
281
|
+
try {
|
|
282
|
+
const result = await this.batchDeleteItems(selectedTable);
|
|
283
|
+
console.log(result, 'resultresultresult');
|
|
284
|
+
if (result.success) {
|
|
285
|
+
this.toaster.success(result.message);
|
|
286
|
+
this.list.get();
|
|
287
|
+
this.selectedTable = [];
|
|
288
|
+
// 可能需要刷新表格或更新UI
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
//删除失败的项
|
|
292
|
+
this.list.get();
|
|
293
|
+
// 可以选择展示失败项或重试
|
|
294
|
+
this.selectedTable = result.failedItems;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
//批量删除过程中发生错误
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* 批量删除表格项
|
|
305
|
+
* @param selectedTable 需要删除的表格项数组
|
|
306
|
+
* @returns 包含成功状态和失败项的结果对象
|
|
307
|
+
*/
|
|
308
|
+
async batchDeleteItems(selectedTable) {
|
|
309
|
+
// 存储所有删除请求的Promise
|
|
310
|
+
const deletePromises = selectedTable.map(item => {
|
|
311
|
+
return new Promise((resolve, reject) => {
|
|
312
|
+
this._FileService.delete(item.id).subscribe(() => {
|
|
313
|
+
resolve(null);
|
|
314
|
+
}, () => {
|
|
315
|
+
reject(item);
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
// 等待所有请求完成
|
|
320
|
+
const results = await Promise.allSettled(deletePromises);
|
|
321
|
+
// 收集失败的项
|
|
322
|
+
const failedItems = [];
|
|
323
|
+
results.forEach(result => {
|
|
324
|
+
if (result.status === 'rejected') {
|
|
325
|
+
failedItems.push(result.reason);
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
return {
|
|
329
|
+
success: failedItems.length === 0,
|
|
330
|
+
failedItems,
|
|
331
|
+
message: failedItems.length === 0
|
|
332
|
+
? this._LocalizationService.instant(`FileExplorer::DeletedSuccessfully`)
|
|
333
|
+
: `${failedItems.length}个项删除失败`,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
/**关闭文件状态弹窗 */
|
|
337
|
+
closeFileStatusModal() {
|
|
338
|
+
this.uploadPictureStatusList = [];
|
|
339
|
+
}
|
|
340
|
+
ngOnChanges(changes) {
|
|
341
|
+
//Called before any other lifecycle hook. Use it to inject dependencies, but avoid any serious work here.
|
|
342
|
+
//Add '${implements OnChanges}' to the class.
|
|
343
|
+
this.selectedTable = structuredClone(this.selectPickerFile);
|
|
344
|
+
}
|
|
345
|
+
/**表格分页切换 */
|
|
346
|
+
onPageChange(newArray) {
|
|
347
|
+
this.isAllSelected = this.isAllSelectedFn(newArray, this.selectedTable);
|
|
348
|
+
}
|
|
349
|
+
/**行选择框改变 */
|
|
350
|
+
onCheckboxChangeFn(event, row, array) {
|
|
351
|
+
const { checked } = event.target;
|
|
352
|
+
let selectedTableArray = [...this.selectedTable];
|
|
353
|
+
if (this._multiple) {
|
|
354
|
+
if (checked) {
|
|
355
|
+
selectedTableArray.push(row);
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
selectedTableArray = selectedTableArray.filter(el => el.id != row.id);
|
|
359
|
+
}
|
|
360
|
+
this.isAllSelected = this.isAllSelectedFn(array, selectedTableArray);
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
selectedTableArray.length = 0;
|
|
364
|
+
selectedTableArray = checked ? [row] : [];
|
|
204
365
|
}
|
|
205
|
-
this.selectedTable =
|
|
366
|
+
this.selectedTable = this.removeDuplicatesById(selectedTableArray);
|
|
367
|
+
}
|
|
368
|
+
/**如果selectedTableArray不含array中的所有项,则将isAllSelected设为true,否则设为false */
|
|
369
|
+
isAllSelectedFn(tolalArray, selectedArray = []) {
|
|
370
|
+
if (tolalArray.length == 0)
|
|
371
|
+
return false;
|
|
372
|
+
return tolalArray.every(item => selectedArray.some(el => el.id === item.id));
|
|
373
|
+
}
|
|
374
|
+
/**选择当前页全部 */
|
|
375
|
+
onSelectAllFn(event, array) {
|
|
376
|
+
let selectedTableArray = this.selectedTable;
|
|
377
|
+
if (event.target.checked) {
|
|
378
|
+
selectedTableArray = this.removeDuplicatesById([...selectedTableArray, ...array]);
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
selectedTableArray = selectedTableArray.filter(el => !array.some(item => item.id === el.id));
|
|
382
|
+
}
|
|
383
|
+
this.isAllSelected = event.target.checked;
|
|
384
|
+
this.selectedTable = selectedTableArray;
|
|
206
385
|
}
|
|
207
386
|
/**删除数组中重复的项 */
|
|
208
387
|
removeDuplicatesById(array) {
|
|
@@ -215,32 +394,61 @@ export class FileModalComponent {
|
|
|
215
394
|
return false;
|
|
216
395
|
});
|
|
217
396
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
this.
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
397
|
+
/**提交FileName编辑 */
|
|
398
|
+
onSubmitFileName(event) {
|
|
399
|
+
const input = this.FileNameForm.value;
|
|
400
|
+
if (!this.FileNameForm.valid)
|
|
401
|
+
return;
|
|
402
|
+
if (this.isloading)
|
|
403
|
+
return;
|
|
404
|
+
this.isloading = true;
|
|
405
|
+
this._FileService
|
|
406
|
+
.update(input.id, {
|
|
407
|
+
name: input.fileName,
|
|
408
|
+
})
|
|
409
|
+
.pipe(finalize(() => {
|
|
410
|
+
this.isloading = false;
|
|
411
|
+
}))
|
|
412
|
+
.subscribe(res => {
|
|
413
|
+
//通过当前newEditRow的id,修改data.items中对应项的name
|
|
414
|
+
for (const element of this.data.items) {
|
|
415
|
+
if (element.id == this.newEditRow.id) {
|
|
416
|
+
element.name = input.fileName;
|
|
417
|
+
break;
|
|
418
|
+
}
|
|
228
419
|
}
|
|
420
|
+
this.FileNameForm = undefined;
|
|
421
|
+
this.newEditRow = '';
|
|
422
|
+
this.toaster.success(this._LocalizationService.instant(`FileExplorer::SavedSuccessfully`));
|
|
423
|
+
// this.list.get();
|
|
229
424
|
});
|
|
230
425
|
}
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
this.
|
|
426
|
+
/**打开编辑 */
|
|
427
|
+
onEditFileName(row) {
|
|
428
|
+
this.FileNameForm = new FormGroup({
|
|
429
|
+
fileName: new FormControl('', [Validators.required]),
|
|
430
|
+
id: new FormControl('', [Validators.required]),
|
|
431
|
+
});
|
|
432
|
+
this.FileNameForm.patchValue({
|
|
433
|
+
fileName: row.name,
|
|
434
|
+
id: row.id,
|
|
435
|
+
});
|
|
436
|
+
this.newEditRow = row;
|
|
234
437
|
}
|
|
235
|
-
|
|
236
|
-
|
|
438
|
+
/**关闭编辑 */
|
|
439
|
+
onCancelFileName(row) {
|
|
440
|
+
this.newEditRow = '';
|
|
441
|
+
this.FileNameForm = undefined;
|
|
442
|
+
}
|
|
443
|
+
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: i3.RestService }, { token: i2.ConfirmationService }, { token: i3.LocalizationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
444
|
+
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: [
|
|
237
445
|
// [Required]
|
|
238
446
|
ListService,
|
|
239
447
|
// [Optional]
|
|
240
448
|
// Provide this token if you want a different debounce time.
|
|
241
449
|
// Default is 300. Cannot be 0. Any value below 100 is not recommended.
|
|
242
450
|
{ provide: LIST_QUERY_DEBOUNCE_TIME, useValue: 500 },
|
|
243
|
-
], 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" }] }); }
|
|
451
|
+
], 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 {{(value|formatFileSize) }}\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:(sizeLimit|formatFileSize)}}\n </div>\n </th>\n <td>{{ item.size | formatFileSize }}</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: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { 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: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.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: 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: i7.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i7.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: i8.FileModalTreeComponent, selector: "fe-file-modal-tree", inputs: ["theSelectedTreeNode", "fileContainerName"], outputs: ["nodeClick", "treeNodeData", "lookAllBtn"] }, { kind: "component", type: i9.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" }, { kind: "pipe", type: i10.GetDirectoryNamePipe, name: "getDirectoryName" }, { kind: "pipe", type: i11.FormatFileSizePipe, name: "formatFileSize" }] }); }
|
|
244
452
|
}
|
|
245
453
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FileModalComponent, decorators: [{
|
|
246
454
|
type: Component,
|
|
@@ -251,8 +459,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
|
|
|
251
459
|
// Provide this token if you want a different debounce time.
|
|
252
460
|
// Default is 300. Cannot be 0. Any value below 100 is not recommended.
|
|
253
461
|
{ provide: LIST_QUERY_DEBOUNCE_TIME, useValue: 500 },
|
|
254
|
-
], 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"] }]
|
|
255
|
-
}], ctorParameters: () => [{ type: i1.FileDescriptorService }, { type: i2.ToasterService }, { type: i3.ListService }, { type:
|
|
462
|
+
], 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 {{(value|formatFileSize) }}\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:(sizeLimit|formatFileSize)}}\n </div>\n </th>\n <td>{{ item.size | formatFileSize }}</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"] }]
|
|
463
|
+
}], ctorParameters: () => [{ type: i1.FileDescriptorService }, { type: i2.ToasterService }, { type: i3.ListService }, { type: i3.RestService }, { type: i2.ConfirmationService }, { type: i3.LocalizationService }], propDecorators: { fileContainerName: [{
|
|
256
464
|
type: Input
|
|
257
465
|
}], multiple: [{
|
|
258
466
|
type: Input
|
|
@@ -262,9 +470,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
|
|
|
262
470
|
type: Input
|
|
263
471
|
}], visibleChange: [{
|
|
264
472
|
type: Output
|
|
265
|
-
}], selectPickerFile: [{
|
|
266
|
-
type: Input
|
|
267
473
|
}], selectFilefn: [{
|
|
268
474
|
type: Output
|
|
475
|
+
}], selectPickerFile: [{
|
|
476
|
+
type: Input
|
|
269
477
|
}] } });
|
|
270
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9maWxlLWV4cGxvcmVyL3NyYy9saWIvY29tcG9uZW50cy9maWxlLW1vZGFsL2ZpbGUtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1tb2RhbC9maWxlLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWlCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc5RixPQUFPLEVBQXVCLFdBQVcsRUFBMEMsd0JBQXdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbEksT0FBTyxFQUFxQixxQkFBcUIsRUFBaUIsTUFBTSx5Q0FBeUMsQ0FBQztBQUVsSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7Ozs7QUFDeEQsSUFBSSxJQUFJLENBQUE7QUFlUixNQUFNLE9BQU8sa0JBQWtCO0lBRTdCLFlBQ1UsWUFBK0MsRUFDL0MsT0FBdUIsRUFDZixJQUFpQixFQUMxQixlQUErQixFQUM5QixXQUF3QixFQUN4QixZQUFpQyxFQUNqQyxvQkFBeUM7UUFOekMsaUJBQVksR0FBWixZQUFZLENBQW1DO1FBQy9DLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ2YsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUMxQixvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBcUI7UUFNM0MsMkJBQXNCLEdBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUE7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QUNiLFdBQVc7WUFDWCxhQUFhO1lBQ2IsNERBQTREO1lBQzVELHVFQUF1RTtZQUN2RSxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO1NBQ3JELCtDQ3BCSCxvL05Bb0hZOzsyRkQ5RkMsa0JBQWtCO2tCQWQ5QixTQUFTOytCQUVFLGVBQWUsYUFHZDt3QkFDVCxhQUFhO3dCQUNiLFdBQVc7d0JBQ1gsYUFBYTt3QkFDYiw0REFBNEQ7d0JBQzVELHVFQUF1RTt3QkFDdkUsRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtxQkFDckQ7NFFBOEJVLGlCQUFpQjtzQkFEM0IsS0FBSztnQkFXSyxRQUFRO3NCQURsQixLQUFLO2dCQVdLLEtBQUs7c0JBRGYsS0FBSztnQkFNSyxPQUFPO3NCQURqQixLQUFLO2dCQVNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBcUhFLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFXSSxZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgRmlsZVNlcnZpY2UgZnJvbSAnLi4vLi4vcHJveHkvZGlnbml0ZS9maWxlLWV4cGxvcmVyL2ZpbGVzJztcbmltcG9ydCB7IENvbmZpcm1hdGlvbiwgQ29uZmlybWF0aW9uU2VydmljZSwgVG9hc3RlclNlcnZpY2UgfSBmcm9tICdAYWJwL25nLnRoZW1lLnNoYXJlZCc7XG5pbXBvcnQgeyBQYWdlZFJlc3VsdER0bywgQUJQLCBMaXN0U2VydmljZSwgUmVzdCwgUmVzdFNlcnZpY2UsIExvY2FsaXphdGlvblNlcnZpY2UsIExJU1RfUVVFUllfREVCT1VOQ0VfVElNRSB9IGZyb20gJ0BhYnAvbmcuY29yZSc7XG5pbXBvcnQgeyBGaWxlRGVzY3JpcHRvckR0bywgRmlsZURlc2NyaXB0b3JTZXJ2aWNlLCBHZXRGaWxlc0lucHV0IH0gZnJvbSAnLi4vLi4vcHJveHkvZGlnbml0ZS9maWxlLWV4cGxvcmVyL2ZpbGVzJztcbmltcG9ydCB7IEZpbGVBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmlsZS1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25UeXBlIH0gZnJvbSAnQHN3aW1sYW5lL25neC1kYXRhdGFibGUnO1xudmFyIHRoYXRcbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2ZlLWZpbGUtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgLy8gW1JlcXVpcmVkXVxuICAgIExpc3RTZXJ2aWNlLFxuICAgIC8vIFtPcHRpb25hbF1cbiAgICAvLyBQcm92aWRlIHRoaXMgdG9rZW4gaWYgeW91IHdhbnQgYSBkaWZmZXJlbnQgZGVib3VuY2UgdGltZS5cbiAgICAvLyBEZWZhdWx0IGlzIDMwMC4gQ2Fubm90IGJlIDAuIEFueSB2YWx1ZSBiZWxvdyAxMDAgaXMgbm90IHJlY29tbWVuZGVkLlxuICAgIHsgcHJvdmlkZTogTElTVF9RVUVSWV9ERUJPVU5DRV9USU1FLCB1c2VWYWx1ZTogNTAwIH0sXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRmlsZU1vZGFsQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9GaWxlU2VydmljZTogRmlsZVNlcnZpY2UuRmlsZURlc2NyaXB0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RlcjogVG9hc3RlclNlcnZpY2UsXG4gICAgcHVibGljIHJlYWRvbmx5IGxpc3Q6IExpc3RTZXJ2aWNlLFxuICAgIHB1YmxpYyBfRmlsZUFwaVNlcnZpY2U6IEZpbGVBcGlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlybWF0aW9uOiBDb25maXJtYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgX0xvY2FsaXphdGlvblNlcnZpY2U6IExvY2FsaXphdGlvblNlcnZpY2UsXG4gICkge1xuICAgIHRoYXQgPSB0aGlzXG4gICAgXG4gIH1cblxuICBwcml2YXRlIF9GaWxlRGVzY3JpcHRvclNlcnZpY2U9aW5qZWN0KEZpbGVEZXNjcmlwdG9yU2VydmljZSlcbiAgLyoq6I635Y+W55uu5b2V6YWN572uICovXG4gIGdldEZpbGVzQ29uZmlndXJhdGlvbigpe1xuICAgIHRoaXMuX0ZpbGVEZXNjcmlwdG9yU2VydmljZS5nZXRGaWxlQ29udGFpbmVyQ29uZmlndXJhdGlvbih0aGlzLl9maWxlQ29udGFpbmVyTmFtZSkuc3Vic2NyaWJlKHJlcz0+e1xuICAgICAgdGhpcy5jcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZT1yZXM/LmNyZWF0ZURpcmVjdG9yeVBlcm1pc3Npb25OYW1lXG4gICAgfSlcbiAgfVxuICAvKirnm67lvZXnmoTmnYPpmZDlkI3np7AgKi9cbiAgY3JlYXRlRGlyZWN0b3J5UGVybWlzc2lvbk5hbWU6c3RyaW5nPW51bGxcblxuICAvKirlm77niYflrrnlmaggKi9cbiAgX2ZpbGVDb250YWluZXJOYW1lOiBzdHJpbmdcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBmaWxlQ29udGFpbmVyTmFtZSh2OiBzdHJpbmcpIHtcbiAgICBpZiAodikge1xuICAgICAgdGhpcy5fZmlsZUNvbnRhaW5lck5hbWUgPSB2O1xuICAgICAgdGhpcy5sb2FkRGF0YSgpXG4gICAgfVxuICB9XG5cbiAgLyoq5piv5ZCm5aSa6YCJICovXG4gIF9tdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbXVsdGlwbGUodjogYm9vbGVhbikge1xuICAgIHRoaXMuX211bHRpcGxlID0gdjtcbiAgICBpZiAodikgeyB9XG4gIH1cblxuICAvKirmlofku7blpKflsI/pmZDliLYgXG4qIEBwYXJhbSAxbWJcbiovXG4gIHNpemVMaW1pdDogbnVtYmVyID0gMTA0ODU3NlxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGxpbWl0KHY6IG51bWJlcikge1xuICAgIHRoaXMuc2l6ZUxpbWl0ID0gdjtcbiAgfVxuICAvKirniLbnu4Tku7bkvKDpgJLnmoTmqKHmgIHmoYbnirbmgIEgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCB2aXNpYmxlKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLk1vZGFsT3BlbiA9IHY7XG4gICAgaWYgKHYpIHtcbiAgICAgIHRoaXMubG9hZERhdGEoKVxuICAgIH1cbiAgfVxuXG4gIC8qKuaooeaAgeahhueKtuaAgeWbnuiwgyAqL1xuICBAT3V0cHV0KCkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG5cblxuICAvKirmqKHmgIHmoYYt54q25oCBLeaYr+WQpuaJk+W8gCAqL1xuICBNb2RhbE9wZW46IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKuaooeaAgeahhi3nuYHlv5nnirbmgIEt55So5LqO56Gu5a6a5qih5oCB55qE57mB5b+Z54q25oCB5piv5ZCm5Li655yfICovXG4gIE1vZGFsQnVzeTogYm9vbGVhbiA9IGZhbHNlXG5cblxuXG4gIC8qKuaooeaAgeahhi3nirbmgIHmlLnlj5jlm57osIMgKi9cbiAgTW9kYWxWaXNpYmxlQ2hhbmdlKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQoZXZlbnQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICAvKirmqKHmgIHmoYbkv53lrZggKi9cbiAgbW9kYWxTYXZlKCkge1xuICAgIGxldCBzZWxlY3RlZFRhYmxlYXJyID0gdGhpcy5fRmlsZUFwaVNlcnZpY2UuZGVlcENsb25lKHRoaXMuc2VsZWN0ZWRUYWJsZSlcbiAgICB0aGlzLnNlbGVjdEZpbGVmbi5lbWl0KHNlbGVjdGVkVGFibGVhcnIpXG5cbiAgICB0aGlzLk1vZGFsVmlzaWJsZUNoYW5nZShmYWxzZSlcbiAgfVxuICAvKipkaWduaXRlLWZpbGUtbW9kYWwtdHJlZSAqL1xuICAvKirpgInmi6nnmoR0cmVl6IqC54K5ICovXG4gIF90aGVTZWxlY3RlZFRyZWVOb2RlOiBhbnkgPSAnJ1xuXG4gIC8qKuWIneWni+WMluaVsOaNriAqL1xuICBsb2FkRGF0YSgpIHtcbiAgICBpZiAodGhpcy5Nb2RhbE9wZW4gJiYgdGhpcy5fZmlsZUNvbnRhaW5lck5hbWUpIHtcbiAgICAgIHRoaXMuaG9va1RvUXVlcnkoKVxuICAgICAgdGhpcy5nZXRGaWxlc0NvbmZpZ3VyYXRpb24oKVxuICAgIH1cbiAgfVxuXG4gIC8qKnRyZWUt6IqC54K56YCJ5oupICovXG4gIF9ub2RlQ2xpY2soZXZlbnQpIHtcbiAgICB0aGlzLl90aGVTZWxlY3RlZFRyZWVOb2RlID0gZXZlbnRcbiAgICB0aGlzLmxpc3QuZ2V0KClcbiAgfVxuXG4gIC8qKuWbvueJh+S4iuS8oC3opoHkuIrkvKDlm77niYfnmoTnirbmgIHmlofku7bliJfooaggKi9cbiAgdXBsb2FkUGljdHVyZVN0YXR1c0xpc3Q6IGFueVtdID0gW11cblxuICAvKirlm77niYfkuIrkvKAt6I635Y+W5paH5Lu25L+h5oGv5pS55Y+YICovXG4gIGFzeW5jIGdldEZpbGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBsZXQgZmlsZXMgPSBuZXcgQXJyYXkoLi4uZXZlbnQudGFyZ2V0LmZpbGVzKVxuICAgIHRoaXMudXBsb2FkUGljdHVyZVN0YXR1c0xpc3QgPSBmaWxlc1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgaWYgKGZpbGUuc2l6ZSA+IHRoaXMuc2l6ZUxpbWl0KSB7XG4gICAgICAgIHRoaXMuc2V0dXBsb2FkUGljdHVyZVN0YXR1cyhmaWxlLCAyKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMudXBsb2FkaW5nRmlsZShmaWxlKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXR1cGxvYWRQaWN0dXJlU3RhdHVzKGZpbGUsIDEpXG4gICAgICAgIHRoaXMubGlzdC5nZXQoKVxuICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aGlzLnNldHVwbG9hZFBpY3R1cmVTdGF0dXMoZmlsZSwgMilcbiAgICAgIH0pOyAvLyDnrYnlvoXmr4/kuKrmlofku7bkuIrkvKDlrozmiJAgIFxuICAgIH1cbiAgICB0aGlzLmxpc3QuZ2V0KClcbiAgICBsZXQgaXNTdWJtaXQgPSAhdGhpcy51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdC5zb21lKGVsID0+IGVsLnN0YXR1cyA9PSAyKTtcbiAgICBpZiAoaXNTdWJtaXQpIHtcbiAgICAgIC8vIHRoaXMudG9hc3Rlci5zdWNjZXNzKFwi5LiK5Lyg5a6M5oiQXCIpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudXBsb2FkUGljdHVyZVN0YXR1c0xpc3QgPSBbXVxuICAgICAgfSwgNjAwMClcbiAgICB9XG4gIH1cblxuICAvKirlm77niYfkuIrkvKAt6K6+572udXBsb2FkUGljdHVyZVN0YXR1c0xpc3TnmoTnirbmgIEgKi9cbiAgc2V0dXBsb2FkUGljdHVyZVN0YXR1cyhmaWxlLCB0eXBlKSB7XG4gICAgdGhpcy51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdC5tYXAoZWwgPT4ge1xuICAgICAgaWYgKGVsID09IGZpbGUpIGVsLnN0YXR1cyA9IHR5cGVcbiAgICB9KVxuICB9XG5cblxuICAvKirlm77niYfkuIrkvKAt6YCS5b2S5oyJ6aG65bqP5LiK5LygICovXG4gIHVwbG9hZGluZ0ZpbGUoZmlsZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0cykgPT4ge1xuICAgICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCBmaWxlLm5hbWUpO1xuICAgICAgdGhpcy5jcmVhdGVGaWxlKHtcbiAgICAgICAgZmlsZTogZm9ybURhdGEsXG4gICAgICAgIGNvbnRhaW5lck5hbWU6IHRoaXMuX2ZpbGVDb250YWluZXJOYW1lLFxuICAgICAgICBkaXJlY3RvcnlJZDogdGhpcy5fdGhlU2VsZWN0ZWRUcmVlTm9kZT8ua2V5IHx8ICcnLFxuICAgICAgICBlbnRpdHlJZDogJydcbiAgICAgIH0pLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgIHJlamVjdHMoZmFsc2UpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuXG4gIC8qKuaWh+S7tuihqOagvC3mlbDmja4qL1xuICBkYXRhOiBQYWdlZFJlc3VsdER0bzxGaWxlRGVzY3JpcHRvckR0bz4gPSB7XG4gICAgaXRlbXM6IFtdLFxuICAgIHRvdGFsQ291bnQ6IDAsXG4gIH07XG5cbiAgLyoq5paH5Lu26KGo5qC8LeadoeS7tiovXG4gIGZpbHRlcnMgPSB7fSBhcyBHZXRGaWxlc0lucHV0O1xuXG4gIC8qKuaWh+S7tuihqOagvC3ooajmoLzoh6rluKbpgInmi6nnsbvlnosgKi9cbiAgU2VsZWN0aW9uVHlwZSA9IFNlbGVjdGlvblR5cGU7XG5cbiAgLyoq5paH5Lu26KGo5qC8LemAieaLqeeahOihqOagvOaVsOaNrumhuSAqL1xuICBzZWxlY3RlZFRhYmxlID0gW11cblxuICAvKirlt7LpgInlrprnmoTmlofku7YgKi9cbiAgQElucHV0KCkgc2VsZWN0UGlja2VyRmlsZTogYW55W11cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy9DYWxsZWQgYmVmb3JlIGFueSBvdGhlciBsaWZlY3ljbGUgaG9vay4gVXNlIGl0IHRvIGluamVjdCBkZXBlbmRlbmNpZXMsIGJ1dCBhdm9pZCBhbnkgc2VyaW91cyB3b3JrIGhlcmUuXG4gICAgLy9BZGQgJyR7aW1wbGVtZW50cyBPbkNoYW5nZXN9JyB0byB0aGUgY2xhc3MuXG4gICAgdGhpcy5zZWxlY3RlZFRhYmxlID0gdGhpcy5fRmlsZUFwaVNlcnZpY2UuZGVlcENsb25lKHRoaXMuc2VsZWN0UGlja2VyRmlsZSlcbiAgfVxuICAvKirlvZPliY3pgInmi6nnmoR0YWJsZemhuSBpZCAqL1xuICBub3dTZWxlY3RJZDogYW55ID0gJydcblxuICAvKirpgInmi6nmlofku7blm57osIMgKi9cbiAgQE91dHB1dCgpIHNlbGVjdEZpbGVmbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KClcblxuICAvKirmlofku7booajmoLwt6I635Y+W6KGo5qC85pWw5o2uICovXG4gIGhvb2tUb1F1ZXJ5KCkge1xuICAgIGNvbnN0IGdldERhdGEgPSAocXVlcnk6IEFCUC5QYWdlUXVlcnlQYXJhbXMpID0+IHRoaXMuX0ZpbGVTZXJ2aWNlLmdldExpc3Qoe1xuICAgICAgLi4ucXVlcnksXG4gICAgICAuLi50aGlzLmZpbHRlcnMsXG4gICAgICBjb250YWluZXJOYW1lOiB0aGlzLl9maWxlQ29udGFpbmVyTmFtZSxcbiAgICAgIGRpcmVjdG9yeUlkOiB0aGlzLl90aGVTZWxlY3RlZFRyZWVOb2RlLmtleVxuICAgIH0pO1xuICAgIGNvbnN0IHNldERhdGEgPSAobGlzdDogUGFnZWRSZXN1bHREdG88RmlsZURlc2NyaXB0b3JEdG8+KSA9PiAodGhpcy5kYXRhID0gbGlzdCk7XG4gICAgdGhpcy5saXN0Lmhvb2tUb1F1ZXJ5KGdldERhdGEpLnN1YnNjcmliZShzZXREYXRhKTtcbiAgfVxuXG4gIC8qKuaWh+S7tuihqOagvC3mn6XnnIvmiYDmnInliIbnu4TnmoTmlofku7bmlbDmja4gKi9cbiAgbG9va0FsbEZpbGUoKSB7XG4gICAgdGhpcy5fdGhlU2VsZWN0ZWRUcmVlTm9kZSA9ICcnXG4gICAgdGhpcy5saXN0LmdldCgpXG4gIH1cblxuICAvKirpgInmi6nooajmoLzpobkgKi9cbiAgb25TZWxlY3RUYWJsZUl0ZW0oeyBzZWxlY3RlZCB9KSB7XG4gICAgdGhpcy5zZWxlY3RlZFRhYmxlID0gdGhpcy5fRmlsZUFwaVNlcnZpY2UuZGVlcENsb25lKHNlbGVjdGVkKVxuICAgIGxldCBzZWxlY3RlZFRhYmxlYXJyID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVzQnlJZCh0aGlzLnNlbGVjdGVkVGFibGUpXG4gICAgaWYgKHNlbGVjdGVkLmxlbmd0aCA+IHNlbGVjdGVkVGFibGVhcnIubGVuZ3RoKSB7XG4gICAgICBzZWxlY3RlZFRhYmxlYXJyID0gc2VsZWN0ZWRUYWJsZWFyci5maWx0ZXIoZWwgPT4gZWwuaWQgIT09IHRoaXMubm93U2VsZWN0SWQpXG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRUYWJsZSA9IHNlbGVjdGVkVGFibGVhcnJcbiAgfVxuXG4gIC8qKuWIoOmZpOaVsOe7hOS4remHjeWkjeeahOmhuSAqL1xuICByZW1vdmVEdXBsaWNhdGVzQnlJZChhcnJheSkge1xuICAgIGNvbnN0IHNlZW5JZHMgPSB7fTtcbiAgICByZXR1cm4gYXJyYXkuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgaWYgKCFzZWVuSWRzW2l0ZW0uaWRdKSB7XG4gICAgICAgIHNlZW5JZHNbaXRlbS5pZF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKuS4gOS4quW4g+WwlG9y5Ye95pWw77yM5Y+v55So5LqO5qOA5p+l5piv5ZCm6KaB5qC55o2u5p2h5Lu26YCJ5oup54m55a6a6KGM44CCICovXG4gIHNlbGVjdENoZWNrID0gKHJvdywgY29sdW1uLCB2YWx1ZSkgPT4ge1xuICAgIHRoaXMubm93U2VsZWN0SWQgPSByb3cuaWRcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKuWIpOaWrXJvd+aYr+WQpumAieS4rSAqL1xuICBzZWxlY3RlZGNoZWNrYm94ID0gKGlkKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUYWJsZS5zb21lKGVsID0+IGVsLmlkID09IGlkKVxuICB9XG5cblxuXG4gIC8qKuWIoOmZpOWbvueJhyAqL1xuICBkZWxldGVGaWxlKGZpbGUpIHtcblxuICAgIHRoaXMuY29uZmlybWF0aW9uXG4gICAgICAud2FybignJywgeyBrZXk6ICcnLCBkZWZhdWx0VmFsdWU6IHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChgQWJwVWk6Okl0ZW1XaWxsQmVEZWxldGVkTWVzc2FnZWApIH0pXG4gICAgICAuc3Vic2NyaWJlKChzdGF0dXM6IENvbmZpcm1hdGlvbi5TdGF0dXMpID0+IHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PSAnY29uZmlybScpIHtcbiAgICAgICAgICB0aGlzLl9GaWxlU2VydmljZS5kZWxldGUoZmlsZS5pZCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXIuc3VjY2Vzcyh0aGlzLl9Mb2NhbGl6YXRpb25TZXJ2aWNlLmluc3RhbnQoYEFicFVpOjpEZWxldGVkU3VjY2Vzc2Z1bGx5YCkpO1xuICAgICAgICAgICAgdGhpcy5saXN0LmdldCgpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKirlhbPpl63mlofku7bnirbmgIHlvLnnqpcgKi9cbiAgY2xvc2VGaWxlU3RhdHVzTW9kYWwoKSB7XG4gICAgdGhpcy51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdCA9IFtdXG4gIH1cblxuICAvKirliJvlu7rlm77niYfnmoTmjqXlj6PvvIzku6PnkIbkuK3nmoRmaWxl57G75Z6L5LiN5Yy56YWN77yM5YiH5o2i5Li6YW5557G75Z6LICovXG4gIGNyZWF0ZUZpbGUgPSAoaW5wdXQ6IGFueSwgY29uZmlnPzogUGFydGlhbDxSZXN0LkNvbmZpZz4pID0+XG4gICAgdGhpcy5yZXN0U2VydmljZS5yZXF1ZXN0PGFueSwgRmlsZURlc2NyaXB0b3JEdG8+KHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdXJsOiAnL2FwaS9maWxlLWV4cGxvcmVyL2ZpbGVzJyxcbiAgICAgIHBhcmFtczogeyBjb250YWluZXJOYW1lOiBpbnB1dC5jb250YWluZXJOYW1lLCBjZWxsTmFtZTogaW5wdXQuY2VsbE5hbWUsIGRpcmVjdG9yeUlkOiBpbnB1dC5kaXJlY3RvcnlJZCwgZW50aXR5SWQ6IGlucHV0LmVudGl0eUlkIH0sXG4gICAgICBib2R5OiBpbnB1dC5maWxlLFxuICAgIH0sXG4gICAgICB7IGFwaU5hbWU6ICdGaWxlRXhwbG9yZXInLCAuLi5jb25maWcgfSk7XG59XG4iLCI8YWJwLW1vZGFsIFsodmlzaWJsZSldPVwiTW9kYWxPcGVuXCIgKHZpc2libGVDaGFuZ2UpPVwiTW9kYWxWaXNpYmxlQ2hhbmdlKCRldmVudClcIlxuICBbb3B0aW9uc109XCJ7IHNpemU6ICd4bCcsIHNjcm9sbGFibGU6IGZhbHNlIH1cIj5cbiAgPG5nLXRlbXBsYXRlICNhYnBIZWFkZXI+XG4gICAgPGgzPnt7J0ZpbGVFeHBsb3Jlcjo6RmlsZUV4cGxvcmVyJyB8IGFicExvY2FsaXphdGlvbn19PC9oMz5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlICNhYnBCb2R5PlxuICAgIDxkaXYgY2xhc3M9XCJyb3cgZmlsZS1leHBsb3Jlci1tb2RhbC1ib2R5IGZpbGUtbW9kYWxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiICpuZ0lmPVwiY3JlYXRlRGlyZWN0b3J5UGVybWlzc2lvbk5hbWVcIiAgc3R5bGU9XCJvdmVyZmxvdzogYXV0bzsgaGVpZ2h0OiBjYWxjKDEwMHZoIC0gMjQwcHgpXCI+XG4gICAgICAgIDxmZS1maWxlLW1vZGFsLXRyZWUgW3RoZVNlbGVjdGVkVHJlZU5vZGVdPVwiX3RoZVNlbGVjdGVkVHJlZU5vZGVcIiAobm9kZUNsaWNrKT1cIl9ub2RlQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgW2ZpbGVDb250YWluZXJOYW1lXT1cIl9maWxlQ29udGFpbmVyTmFtZVwiPjwvZmUtZmlsZS1tb2RhbC10cmVlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IFtjbGFzc109XCJjcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZT8nY29sLTknOidjb2wtMTInXCIgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoMTAwdmggLSAyNDBweClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tbGlua1wiIHJvbGU9YnV0dG9uIHN0eWxlPVwiZmxleDogMlwiIChjbGljayk9XCJsb29rQWxsRmlsZSgpXCI+e3snRmlsZUV4cGxvcmVyOjpBbGxGaWxlcycgfCBhYnBMb2NhbGl6YXRpb259fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBmb3JtLWZpbGVcIiBzdHlsZT1cImZsZXg6IDJcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgI2ZpbGVFZGl0IFttdWx0aXBsZV09XCJfbXVsdGlwbGVcIiBcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJnZXRGaWxlQ2hhbmdlKCRldmVudClcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bmd4LWRhdGF0YWJsZSBjbGFzcz1cIm1hdGVyaWFsIGNvbnRhaW5lci1oZWlnaHRcIiBbcm93c109XCJkYXRhLml0ZW1zXCIgW2xpc3RdPVwibGlzdFwiIGNvbHVtbk1vZGU9XCJmbGV4XCJcbiAgICAgICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIiBbaGVhZGVySGVpZ2h0XT1cIjUwXCIgW2Zvb3RlckhlaWdodF09XCI1MFwiIHJvd0hlaWdodD1cImF1dG9cIiBbc2Nyb2xsYmFyVl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2aXJ0dWFsaXphdGlvbl09XCJmYWxzZVwiIFtleHRlcm5hbFBhZ2luZ109XCJ0cnVlXCIgW2NvdW50XT1cImRhdGEudG90YWxDb3VudFwiIFtzZWxlY3RlZF09XCJzZWxlY3RlZFRhYmxlXCJcbiAgICAgICAgICAgIFtzZWxlY3RDaGVja109XCJzZWxlY3RDaGVja1wiIFtzZWxlY3Rpb25UeXBlXT1cIl9tdWx0aXBsZT9TZWxlY3Rpb25UeXBlLm11bHRpQ2xpY2s6U2VsZWN0aW9uVHlwZS5zaW5nbGVcIiAoc2VsZWN0KT1cIm9uU2VsZWN0VGFibGVJdGVtKCRldmVudClcIj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiBbd2lkdGhdPVwiNTBcIiBwcm9wPVwiaWRcIiBbc29ydGFibGVdPVwiZmFsc2VcIiBbY2FuQXV0b1Jlc2l6ZV09XCJmYWxzZVwiIFtkcmFnZ2FibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbcmVzaXplYWJsZV09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmd4LWRhdGF0YWJsZS1oZWFkZXItdGVtcGxhdGUgbGV0LXZhbHVlPVwidmFsdWVcIiBsZXQtYWxsUm93c1NlbGVjdGVkPVwiYWxsUm93c1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBsZXQtc2VsZWN0Rm49XCJzZWxlY3RGblwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBbY2hlY2tlZF09XCJhbGxSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RGbighYWxsUm93c1NlbGVjdGVkKVwiIC8+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCIgbGV0LWlzU2VsZWN0ZWQ9XCJpc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBsZXQtb25DaGVja2JveENoYW5nZUZuPVwib25DaGVja2JveENoYW5nZUZuXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIFtjaGVja2VkXT1cInNlbGVjdGVkY2hlY2tib3godmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGVja2JveENoYW5nZUZuKCRldmVudClcIiAvPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiAgIFtmbGV4R3Jvd109XCIyXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPGZlLWZpbGUtcHJldmlldyBbd2lkdGhdPVwiJzgwcHgnXCIgW3NyY109XCJyb3cudXJsXCIgW25hbWVdPVwicm93Lm5hbWVcIiBbdHlwZV09XCJyb3cubWltZVR5cGVcIiBbcHJldmlld109XCJ0cnVlXCI+PC9mZS1maWxlLXByZXZpZXc+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25neC1kYXRhdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uIFtuYW1lXT1cIidGaWxlRXhwbG9yZXI6OkZpbGVOYW1lJyB8IGFicExvY2FsaXphdGlvblwiIHByb3A9XCJuYW1lXCIgW2ZsZXhHcm93XT1cIjRcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICB7eyB2YWx1ZSB9fVxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiAgW25hbWVdPVwiJ0ZpbGVFeHBsb3Jlcjo6RmlsZVNpemUnIHwgYWJwTG9jYWxpemF0aW9uXCIgcHJvcD1cInNpemVcIiBbZmxleEdyb3ddPVwiMS41XCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAge3sgX0ZpbGVBcGlTZXJ2aWNlLmZvcm1hdEZpbGVTaXplKHZhbHVlKSB9fVxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiAgW25hbWVdPVwiJ0ZpbGVFeHBsb3Jlcjo6RGlyZWN0b3J5JyB8IGFicExvY2FsaXphdGlvblwiIHByb3A9XCJjZWxsTmFtZVwiIFtmbGV4R3Jvd109XCIxXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAge3sgdmFsdWUgfX1cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmd4LWRhdGF0YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICA8bmd4LWRhdGF0YWJsZS1jb2x1bW4gW25hbWVdPVwiJ0ZpbGVFeHBsb3Jlcjo6Q3JlYXRpb25UaW1lJyB8IGFicExvY2FsaXphdGlvblwiIHByb3A9XCJjcmVhdGlvblRpbWVcIiBbZmxleEdyb3ddPVwiMlwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCIgbmd4LWRhdGF0YWJsZS1jZWxsLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIHt7IHZhbHVlIHwgZGF0ZSA6ICdZWVlZL01NL2RkIEhIOm1tOnMnIH19XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25neC1kYXRhdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uIFtmbGV4R3Jvd109XCIxXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0IHAtMFwiIChjbGljay5zdG9wKT1cImRlbGV0ZUZpbGUocm93KVwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2ggdGV4dC1wcmltYXJ5IHAtMlwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmd4LWRhdGF0YWJsZS1jb2x1bW4+XG4gICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0Lmxlbmd0aCA+IDBcIlxuICAgICAgICAgIGNsYXNzPVwicG9zaXRpb24tZml4ZWQgYm90dG9tLTAgZW5kLTAgc2hhZG93LWxnIGZpbGUtc3RhdHVzLW1vZGFsICAgbS01XCJcbiAgICAgICAgICBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDEwcHhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHAtMCBweS0xIGJvcmRlci1ib3R0b21cIj5cbiAgICAgICAgICAgICAgPGRpdj57eydGaWxlRXhwbG9yZXI6OlVwbG9hZEZpbGVzJyB8IGFicExvY2FsaXphdGlvbn19PC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrLnN0b3ApPVwiY2xvc2VGaWxlU3RhdHVzTW9kYWwoKVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydGaWxlRXhwbG9yZXI6OkZpbGVOYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snRmlsZUV4cGxvcmVyOjpGaWxlU2l6ZScgfCBhYnBMb2NhbGl6YXRpb259fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiB1cGxvYWRQaWN0dXJlU3RhdHVzTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGl0ZW0ubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tdGV4dCB0ZXh0LWRhbmdlclwiICpuZ0lmPVwiaXRlbS5zaXplID4gc2l6ZUxpbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0ZpbGVFeHBsb3Jlcjo6RXhjZWVkc01heGltdW1TaXplJyB8IGFicExvY2FsaXphdGlvbjpfRmlsZUFwaVNlcnZpY2UuZm9ybWF0RmlsZVNpemUoc2l6ZUxpbWl0KX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBpdGVtLmZpbGVTaXplIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cIml0ZW0uc3RhdHVzID09PSAxXCIgY2xhc3M9XCJmYXMgZmEtY2hlY2sgdGV4dC1wcmltYXJ5XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PT0gMlwiIGNsYXNzPVwiZmFzIGZhLXRpbWVzLWNpcmNsZSB0ZXh0LWRhbmdlclwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgI2FicEZvb3Rlcj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgYWJwQ2xvc2U+e3snQWJwVWk6OkNsb3NlJyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XG4gICAgPGFicC1idXR0b24gaWNvbkNsYXNzPVwiZmEgZmEtY2hlY2tcIiAoY2xpY2spPVwibW9kYWxTYXZlKClcIj57eydBYnBVaTo6U2F2ZScgfCBhYnBMb2NhbGl6YXRpb259fTwvYWJwLWJ1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvYWJwLW1vZGFsPiJdfQ==
|
|
478
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9maWxlLWV4cGxvcmVyL3NyYy9saWIvY29tcG9uZW50cy9maWxlLW1vZGFsL2ZpbGUtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1tb2RhbC9maWxlLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFEQUFxRDtBQUNyRCxzREFBc0Q7QUFDdEQsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFFTixNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLFdBQVcsTUFBTSx5Q0FBeUMsQ0FBQztBQUN2RSxPQUFPLEVBQWdCLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pGLE9BQU8sRUFHTCxXQUFXLEVBRVgsV0FBVyxFQUNYLG1CQUFtQixFQUNuQix3QkFBd0IsR0FDekIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUVMLHFCQUFxQixHQUV0QixNQUFNLHlDQUF5QyxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBZWhDLE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFDVSxZQUErQyxFQUMvQyxPQUF1QixFQUNmLElBQWlCLEVBQ3pCLFdBQXdCLEVBQ3hCLFlBQWlDLEVBQ2pDLG9CQUF5QztRQUx6QyxpQkFBWSxHQUFaLFlB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ZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBpbmplY3QsXG4gIE9uQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBGaWxlU2VydmljZSBmcm9tICcuLi8uLi9wcm94eS9kaWduaXRlL2ZpbGUtZXhwbG9yZXIvZmlsZXMnO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uLCBDb25maXJtYXRpb25TZXJ2aWNlLCBUb2FzdGVyU2VydmljZSB9IGZyb20gJ0BhYnAvbmcudGhlbWUuc2hhcmVkJztcbmltcG9ydCB7XG4gIFBhZ2VkUmVzdWx0RHRvLFxuICBBQlAsXG4gIExpc3RTZXJ2aWNlLFxuICBSZXN0LFxuICBSZXN0U2VydmljZSxcbiAgTG9jYWxpemF0aW9uU2VydmljZSxcbiAgTElTVF9RVUVSWV9ERUJPVU5DRV9USU1FLFxufSBmcm9tICdAYWJwL25nLmNvcmUnO1xuaW1wb3J0IHtcbiAgRmlsZURlc2NyaXB0b3JEdG8sXG4gIEZpbGVEZXNjcmlwdG9yU2VydmljZSxcbiAgR2V0RmlsZXNJbnB1dCxcbn0gZnJvbSAnLi4vLi4vcHJveHkvZGlnbml0ZS9maWxlLWV4cGxvcmVyL2ZpbGVzJztcbmltcG9ydCB7IFNlbGVjdGlvblR5cGUgfSBmcm9tICdAc3dpbWxhbmUvbmd4LWRhdGF0YWJsZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzJztcbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2ZlLWZpbGUtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgLy8gW1JlcXVpcmVkXVxuICAgIExpc3RTZXJ2aWNlLFxuICAgIC8vIFtPcHRpb25hbF1cbiAgICAvLyBQcm92aWRlIHRoaXMgdG9rZW4gaWYgeW91IHdhbnQgYSBkaWZmZXJlbnQgZGVib3VuY2UgdGltZS5cbiAgICAvLyBEZWZhdWx0IGlzIDMwMC4gQ2Fubm90IGJlIDAuIEFueSB2YWx1ZSBiZWxvdyAxMDAgaXMgbm90IHJlY29tbWVuZGVkLlxuICAgIHsgcHJvdmlkZTogTElTVF9RVUVSWV9ERUJPVU5DRV9USU1FLCB1c2VWYWx1ZTogNTAwIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX0ZpbGVTZXJ2aWNlOiBGaWxlU2VydmljZS5GaWxlRGVzY3JpcHRvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdGVyOiBUb2FzdGVyU2VydmljZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbGlzdDogTGlzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZXN0U2VydmljZTogUmVzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maXJtYXRpb246IENvbmZpcm1hdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfTG9jYWxpemF0aW9uU2VydmljZTogTG9jYWxpemF0aW9uU2VydmljZSxcbiAgKSB7fVxuXG4gIHByaXZhdGUgX0ZpbGVEZXNjcmlwdG9yU2VydmljZSA9IGluamVjdChGaWxlRGVzY3JpcHRvclNlcnZpY2UpO1xuICAvKirojrflj5bnm67lvZXphY3nva4gKi9cbiAgZ2V0RmlsZXNDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl9GaWxlRGVzY3JpcHRvclNlcnZpY2VcbiAgICAgICAgLmdldEZpbGVDb250YWluZXJDb25maWd1cmF0aW9uKHRoaXMuX2ZpbGVDb250YWluZXJOYW1lKVxuICAgICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZSA9IHJlcz8uY3JlYXRlRGlyZWN0b3J5UGVybWlzc2lvbk5hbWU7XG4gICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvKirnm67lvZXnmoTmnYPpmZDlkI3np7AgKi9cbiAgY3JlYXRlRGlyZWN0b3J5UGVybWlzc2lvbk5hbWU6IHN0cmluZyA9IG51bGw7XG5cbiAgLyoq5Zu+54mH5a655ZmoICovXG4gIF9maWxlQ29udGFpbmVyTmFtZTogc3RyaW5nO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGZpbGVDb250YWluZXJOYW1lKHY6IHN0cmluZykge1xuICAgIGlmICh2KSB7XG4gICAgICB0aGlzLl9maWxlQ29udGFpbmVyTmFtZSA9IHY7XG4gICAgICAvLyB0aGlzLmxvYWREYXRhKClcbiAgICB9XG4gIH1cblxuICAvKirmmK/lkKblpJrpgIkgKi9cbiAgX211bHRpcGxlID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbXVsdGlwbGUodjogYm9vbGVhbikge1xuICAgIHRoaXMuX211bHRpcGxlID0gdjtcbiAgfVxuXG4gIC8qKuaWh+S7tuWkp+Wwj+mZkOWItlxuICAgKiBAcGFyYW0gMW1iXG4gICAqL1xuICBzaXplTGltaXQgPSAxMDQ4NTc2O1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGxpbWl0KHY6IG51bWJlcikge1xuICAgIHRoaXMuc2l6ZUxpbWl0ID0gdjtcbiAgfVxuICAvKirniLbnu4Tku7bkvKDpgJLnmoTmqKHmgIHmoYbnirbmgIEgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCB2aXNpYmxlKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLk1vZGFsT3BlbiA9IHY7XG4gICAgaWYgKHYpIHtcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICB9XG4gIH1cblxuICAvKirmqKHmgIHmoYbnirbmgIHlm57osIMgKi9cbiAgQE91dHB1dCgpIHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoq5qih5oCB5qGGLeeKtuaAgS3mmK/lkKbmiZPlvIAgKi9cbiAgTW9kYWxPcGVuID0gZmFsc2U7XG5cbiAgLyoq5qih5oCB5qGGLee5geW/meeKtuaAgS3nlKjkuo7noa7lrprmqKHmgIHnmoTnuYHlv5nnirbmgIHmmK/lkKbkuLrnnJ8gKi9cbiAgTW9kYWxCdXN5ID0gZmFsc2U7XG5cbiAgLyoq5qih5oCB5qGGLeeKtuaAgeaUueWPmOWbnuiwgyAqL1xuICBNb2RhbFZpc2libGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICB0aGlzLk1vZGFsT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5Nb2RhbEJ1c3kgPSBmYWxzZTtcbiAgICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICAgIHRoaXMuY3JlYXRlRGlyZWN0b3J5UGVybWlzc2lvbk5hbWUgPSAnJztcbiAgICAgIHRoaXMuX3RoZVNlbGVjdGVkVHJlZU5vZGUgPSAnJztcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZSA9IFtdO1xuICAgICAgdGhpcy51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdCA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKuaooeaAgeahhuS/neWtmCAqL1xuICBtb2RhbFNhdmUoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRUYWJsZWFyciA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLnNlbGVjdGVkVGFibGUpO1xuICAgIHRoaXMuc2VsZWN0RmlsZWZuLmVtaXQoc2VsZWN0ZWRUYWJsZWFycik7XG4gICAgdGhpcy5Nb2RhbFZpc2libGVDaGFuZ2UoZmFsc2UpO1xuICB9XG4gIC8qKmRpZ25pdGUtZmlsZS1tb2RhbC10cmVlICovXG4gIC8qKumAieaLqeeahHRyZWXoioLngrkgKi9cbiAgX3RoZVNlbGVjdGVkVHJlZU5vZGU6IGFueSA9ICcnO1xuICBpc0NyZWF0ZUxpc3QgPSBmYWxzZTtcbiAgLyoq5Yid5aeL5YyW5pWw5o2uICovXG4gIGxvYWREYXRhKCkge1xuICAgIGlmICh0aGlzLk1vZGFsT3BlbiAmJiB0aGlzLl9maWxlQ29udGFpbmVyTmFtZSkge1xuICAgICAgdGhpcy5saXN0Lm1heFJlc3VsdENvdW50ID0gMTAwO1xuICAgICAgLy8gdGhpcy5maWx0ZXJzLnNraXBDb3VudCA9IDA7XG4gICAgICB0aGlzLmdldEZpbGVzQ29uZmlndXJhdGlvbigpO1xuICAgICAgaWYgKCF0aGlzLmlzQ3JlYXRlTGlzdCkge1xuICAgICAgICB0aGlzLmhvb2tUb1F1ZXJ5KCk7XG4gICAgICAgIHRoaXMuaXNDcmVhdGVMaXN0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGlzdC5nZXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqIOS7jnRyZWXojrflj5bmnaXnmoTmlbDmja4gKi9cbiAgZmlsZUdyb3VwTGlzdDogYW55W10gPSBbXTtcbiAgLyoqIOS7jnRyZWXojrflj5bmlbDmja4gKi9cbiAgdHJlZU5vZGVEYXRhKGV2ZW50KSB7XG4gICAgdGhpcy5maWxlR3JvdXBMaXN0ID0gdGhpcy5mbGF0dGVuTmVzdGVkQXJyYXkoZXZlbnQpO1xuICB9XG4gIC8qKlxuICAgKiDlsIbltYzlpZfmlbDnu4TmiYHlubPljJZcbiAgICogQHBhcmFtIHtBcnJheX0gbmVzdGVkQXJyYXkgLSDljIXlkKvltYzlpZdjaGlsZHJlbueahOaVsOe7hFxuICAgKiBAcmV0dXJucyB7QXJyYXl9IC0g5omB5bmz5YyW5ZCO55qE5pWw57uEXG4gICAqL1xuICBmbGF0dGVuTmVzdGVkQXJyYXkobmVzdGVkQXJyYXkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGZsYXR0ZW4oaXRlbXMpIHtcbiAgICAgIGlmICghaXRlbXMpIHJldHVybjtcblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIC8vIOWwhuW9k+WJjemhuea3u+WKoOWIsOe7k+aenOaVsOe7hFxuICAgICAgICByZXN1bHQucHVzaCh7IC4uLml0ZW0gfSk7XG5cbiAgICAgICAgLy8g5aaC5p6c5pyJY2hpbGRyZW7lsZ7mgKfkuJTmmK/mlbDnu4TvvIzpgJLlvZLlpITnkIZcbiAgICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgQXJyYXkuaXNBcnJheShpdGVtLmNoaWxkcmVuKSkge1xuICAgICAgICAgIGZsYXR0ZW4oaXRlbS5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbGF0dGVuKG5lc3RlZEFycmF5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqdHJlZS3oioLngrnpgInmi6kgKi9cbiAgX25vZGVDbGljayhldmVudCkge1xuICAgIHRoaXMuZmlsdGVycy5za2lwQ291bnQgPSAwO1xuICAgIHRoaXMuX3RoZVNlbGVjdGVkVHJlZU5vZGUgPSBldmVudDtcbiAgICB0aGlzLmxpc3QuZ2V0KCk7XG4gIH1cblxuICAvKirlm77niYfkuIrkvKAt6KaB5LiK5Lyg5Zu+54mH55qE54q25oCB5paH5Lu25YiX6KGoICovXG4gIHVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0OiBhbnlbXSA9IFtdO1xuXG4gIC8qKuWbvueJh+S4iuS8oC3ojrflj5bmlofku7bkv6Hmga/mlLnlj5ggKi9cbiAgYXN5bmMgZ2V0RmlsZUNoYW5nZShldmVudCkge1xuICAgIGNvbnN0IF90aGF0PXRoaXM7XG4gICAgY29uc3QgZmlsZXMgPSBuZXcgQXJyYXkoLi4uZXZlbnQudGFyZ2V0LmZpbGVzKTtcbiAgICB0aGlzLnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0ID0gZmlsZXM7XG4gICAgY29uc3QgdXBsb2FkUHJvbWlzZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGlmIChmaWxlLnNpemUgPiB0aGlzLnNpemVMaW1pdCkge1xuICAgICAgICB0aGlzLnNldHVwbG9hZFBpY3R1cmVTdGF0dXMoZmlsZSwgMik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdXBsb2FkUHJvbWlzZXMucHVzaChcbiAgICAgICAgdGhpcy51cGxvYWRpbmdGaWxlKGZpbGUpXG4gICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBsb2FkUGljdHVyZVN0YXR1cyhmaWxlLCAxKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwbG9hZFBpY3R1cmVTdGF0dXMoZmlsZSwgMik7XG4gICAgICAgICAgICByZXR1cm4gZXJyO1xuICAgICAgICAgIH0pLCAvLyDkv53or4HmiYDmnIlQcm9taXNl6YO9cmVzb2x2ZVxuICAgICAgKTtcbiAgICB9XG4gICAgUHJvbWlzZS5hbGwodXBsb2FkUHJvbWlzZXMpLnRoZW4oIChyZXN1bHRzKT0+IHtcbiAgICAgIF90aGF0Lmxpc3QuZ2V0KCk7XG4gICAgICBjb25zdCBpc1N1Ym1pdCA9ICFfdGhhdC51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdC5zb21lKGVsID0+IGVsLnN0YXR1cyA9PSAyKTtcbiAgICAgIGlmIChpc1N1Ym1pdCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBfdGhhdC51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdCA9IFtdO1xuICAgICAgICB9LCA0MDAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgLyoq5Zu+54mH5LiK5LygLeiuvue9rnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN055qE54q25oCBICovXG4gIHNldHVwbG9hZFBpY3R1cmVTdGF0dXMoZmlsZSwgdHlwZSkge1xuICAgIHRoaXMudXBsb2FkUGljdHVyZVN0YXR1c0xpc3QubWFwKGVsID0+IHtcbiAgICAgIGlmIChlbCA9PSBmaWxlKSBlbC5zdGF0dXMgPSB0eXBlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoq5Zu+54mH5LiK5LygLemAkuW9kuaMiemhuuW6j+S4iuS8oCAqL1xuICB1cGxvYWRpbmdGaWxlKGZpbGUpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdHMpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCBmaWxlLm5hbWUpO1xuICAgICAgdGhpcy5jcmVhdGVGaWxlKHtcbiAgICAgICAgZmlsZTogZm9ybURhdGEsXG4gICAgICAgIGNvbnRhaW5lck5hbWU6IHRoaXMuX2ZpbGVDb250YWluZXJOYW1lLFxuICAgICAgICBkaXJlY3RvcnlJZDogdGhpcy5fdGhlU2VsZWN0ZWRUcmVlTm9kZT8ua2V5IHx8ICcnLFxuICAgICAgICBlbnRpdHlJZDogJycsXG4gICAgICB9KS5zdWJzY3JpYmUoXG4gICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh7IGZpbGU6IGZpbGUubmFtZSwgc3RhdHVzOiAnc3VjY2VzcycsIHJlc3BvbnNlOiByZXMgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgcmVqZWN0cyh7IGZpbGU6IGZpbGUubmFtZSwgc3RhdHVzOiAnZmFpbCcsIGVycm9yOiBlcnIgfSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoq5paH5Lu26KGo5qC8LeaVsOaNriovXG4gIGRhdGE6IFBhZ2VkUmVzdWx0RHRvPEZpbGVEZXNjcmlwdG9yRHRvPiA9IHtcbiAgICBpdGVtczogW10sXG4gICAgdG90YWxDb3VudDogMCxcbiAgfTtcblxuICAvKirmlofku7booajmoLwt5p2h5Lu2Ki9cbiAgZmlsdGVycyA9IHt9IGFzIEdldEZpbGVzSW5wdXQ7XG5cbiAgLyoq5paH5Lu26KGo5qC8LeihqOagvOiHquW4pumAieaLqeexu+WeiyAqL1xuICBTZWxlY3Rpb25UeXBlID0gU2VsZWN0aW9uVHlwZTtcblxuICAvKirpgInmi6nmlofku7blm57osIMgKi9cbiAgQE91dHB1dCgpIHNlbGVjdEZpbGVmbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG5cbiAgLyoq5paH5Lu26KGo5qC8LeiOt+WPluihqOagvOaVsOaNriAqL1xuICBob29rVG9RdWVyeSgpIHtcbiAgICBjb25zdCBnZXREYXRhID0gKHF1ZXJ5OiBBQlAuUGFnZVF1ZXJ5UGFyYW1zKSA9PlxuICAgICAgdGhpcy5fRmlsZVNlcnZpY2UuZ2V0TGlzdCh7XG4gICAgICAgIC4uLnF1ZXJ5LFxuICAgICAgICAuLi50aGlzLmZpbHRlcnMsXG4gICAgICAgIGNvbnRhaW5lck5hbWU6IHRoaXMuX2ZpbGVDb250YWluZXJOYW1lLFxuICAgICAgICBkaXJlY3RvcnlJZDogdGhpcy5fdGhlU2VsZWN0ZWRUcmVlTm9kZS5rZXksXG4gICAgICB9KTtcbiAgICBjb25zdCBzZXREYXRhID0gKGxpc3Q6IFBhZ2VkUmVzdWx0RHRvPEZpbGVEZXNjcmlwdG9yRHRvPikgPT4ge1xuICAgICAgdGhpcy5kYXRhID0gbGlzdDtcbiAgICAgIHRoaXMub25QYWdlQ2hhbmdlKGxpc3QuaXRlbXMpO1xuICAgIH07XG4gICAgdGhpcy5saXN0Lmhvb2tUb1F1ZXJ5KGdldERhdGEpLnN1YnNjcmliZShzZXREYXRhKTtcbiAgfVxuXG4gIC8qKuaWh+S7tuihqOagvC3mn6XnnIvmiYDmnInliIbnu4TnmoTmlofku7bmlbDmja4gKi9cbiAgbG9va0FsbEZpbGUoKSB7XG4gICAgdGhpcy5maWx0ZXJzLnNraXBDb3VudCA9IDA7XG4gICAgdGhpcy5fdGhlU2VsZWN0ZWRUcmVlTm9kZSA9ICcnO1xuICAgIHRoaXMubGlzdC5nZXQoKTtcbiAgfVxuXG4gIC8qKuWIoOmZpOWbvueJhyAqL1xuICBkZWxldGVGaWxlKGZpbGUpIHtcbiAgICB0aGlzLl9GaWxlU2VydmljZS5kZWxldGUoZmlsZS5pZCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICB0aGlzLnRvYXN0ZXIuc3VjY2Vzcyh0aGlzLl9Mb2NhbGl6YXRpb25TZXJ2aWNlLmluc3RhbnQoYEZpbGVFeHBsb3Jlcjo6RGVsZXRlZFN1Y2Nlc3NmdWxseWApKTtcbiAgICAgIHRoaXMubGlzdC5nZXQoKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkVGFibGVzPXRoaXMuc2VsZWN0ZWRUYWJsZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZT1zZWxlY3RlZFRhYmxlcy5maWx0ZXIoZWwgPT4gZWwuaWQgIT0gZmlsZS5pZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKirliKDpmaTmiYDmnInpgInkuK3lm77niYcgKi9cbiAgb25EZWxldGVBbGxTZWxlY3RGaWxlKCkge1xuICAgIHRoaXMuY29uZmlybWF0aW9uXG4gICAgICAud2FybignJywge1xuICAgICAgICBrZXk6ICcnLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChgRmlsZUV4cGxvcmVyOjpBcmVZb3VTdXJlYCksXG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZShhc3luYyAoc3RhdHVzOiBDb25maXJtYXRpb24uU3RhdHVzKSA9PiB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gJ2NvbmZpcm0nKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWJsZSA9IHRoaXMuc2VsZWN0ZWRUYWJsZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5iYXRjaERlbGV0ZUl0ZW1zKHNlbGVjdGVkVGFibGUpO1xuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LCdyZXN1bHRyZXN1bHRyZXN1bHQnKVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIHRoaXMudG9hc3Rlci5zdWNjZXNzKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgdGhpcy5saXN0LmdldCgpO1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFibGU9W107XG4gICAgICAgICAgICAgIC8vIOWPr+iDvemcgOimgeWIt+aWsOihqOagvOaIluabtOaWsFVJXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvL+WIoOmZpOWksei0peeahOmhuVxuICAgICAgICAgICAgICB0aGlzLmxpc3QuZ2V0KCk7XG4gICAgICAgICAgICAgIC8vIOWPr+S7pemAieaLqeWxleekuuWksei0pemhueaIlumHjeivlVxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFibGU9IHJlc3VsdC5mYWlsZWRJdGVtcztcblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvL+aJuemHj+WIoOmZpOi/h+eoi+S4reWPkeeUn+mUmeivr1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5om56YeP5Yig6Zmk6KGo5qC86aG5XG4gICAqIEBwYXJhbSBzZWxlY3RlZFRhYmxlIOmcgOimgeWIoOmZpOeahOihqOagvOmhueaVsOe7hFxuICAgKiBAcmV0dXJucyDljIXlkKvmiJDlip/nirbmgIHlkozlpLHotKXpobnnmoTnu5Pmnpzlr7nosaFcbiAgICovXG4gIGFzeW5jIGJhdGNoRGVsZXRlSXRlbXMoc2VsZWN0ZWRUYWJsZTogYW55W10pIHtcbiAgICAvLyDlrZjlgqjmiYDmnInliKDpmaTor7fmsYLnmoRQcm9taXNlXG4gICAgY29uc3QgZGVsZXRlUHJvbWlzZXMgPSBzZWxlY3RlZFRhYmxlLm1hcChpdGVtID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuX0ZpbGVTZXJ2aWNlLmRlbGV0ZShpdGVtLmlkKS5zdWJzY3JpYmUoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChpdGVtKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyDnrYnlvoXmiYDmnInor7fmsYLlrozmiJBcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGRlbGV0ZVByb21pc2VzKTtcbiAgICAvLyDmlLbpm4blpLHotKXnmoTpoblcbiAgICBjb25zdCBmYWlsZWRJdGVtczogYW55W10gPSBbXTtcbiAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIGZhaWxlZEl0ZW1zLnB1c2gocmVzdWx0LnJlYXNvbik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogZmFpbGVkSXRlbXMubGVuZ3RoID09PSAwLFxuICAgICAgZmFpbGVkSXRlbXMsXG4gICAgICBtZXNzYWdlOlxuICAgICAgICBmYWlsZWRJdGVtcy5sZW5ndGggPT09IDBcbiAgICAgICAgICA/IHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChgRmlsZUV4cGxvcmVyOjpEZWxldGVkU3VjY2Vzc2Z1bGx5YClcbiAgICAgICAgICA6IGAke2ZhaWxlZEl0ZW1zLmxlbmd0aH3kuKrpobnliKDpmaTlpLHotKVgLFxuICAgIH07XG4gIH1cblxuXG4gIC8qKuWFs+mXreaWh+S7tueKtuaAgeW8ueeqlyAqL1xuICBjbG9zZUZpbGVTdGF0dXNNb2RhbCgpIHtcbiAgICB0aGlzLnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0ID0gW107XG4gIH1cblxuICAvKirliJvlu7rlm77niYfnmoTmjqXlj6PvvIzku6PnkIbkuK3nmoRmaWxl57G75Z6L5LiN5Yy56YWN77yM5YiH5o2i5Li6YW5557G75Z6LICovXG4gIGNyZWF0ZUZpbGUgPSAoaW5wdXQ6IGFueSwgY29uZmlnPzogUGFydGlhbDxSZXN0LkNvbmZpZz4pID0+XG4gICAgdGhpcy5yZXN0U2VydmljZS5yZXF1ZXN0PGFueSwgRmlsZURlc2NyaXB0b3JEdG8+KFxuICAgICAge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgdXJsOiAnL2FwaS9maWxlLWV4cGxvcmVyL2ZpbGVzJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgY29udGFpbmVyTmFtZTogaW5wdXQuY29udGFpbmVyTmFtZSxcbiAgICAgICAgICBjZWxsTmFtZTogaW5wdXQuY2VsbE5hbWUsXG4gICAgICAgICAgZGlyZWN0b3J5SWQ6IGlucHV0LmRpcmVjdG9yeUlkLFxuICAgICAgICAgIGVudGl0eUlkOiBpbnB1dC5lbnRpdHlJZCxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogaW5wdXQuZmlsZSxcbiAgICAgIH0sXG4gICAgICB7IGFwaU5hbWU6ICdGaWxlRXhwbG9yZXInLCAuLi5jb25maWcgfSxcbiAgICApO1xuXG4gIC8qKuaWh+S7tuihqOagvC3pgInmi6nnmoTooajmoLzmlbDmja7pobkgKi9cbiAgc2VsZWN0ZWRUYWJsZSA9IFtdO1xuICAvKirlvZPliY3pgInmi6nnmoR0YWJsZemhuSBpZCAqL1xuICBub3dTZWxlY3RJZDogYW55ID0gJyc7XG4gIC8qKuaYr+WQpuWFqOmAiSAqL1xuICBpc0FsbFNlbGVjdGVkID0gZmFsc2U7XG5cbiAgLyoq5bey6YCJ5a6a55qE5paH5Lu2ICovXG4gIEBJbnB1dCgpIHNlbGVjdFBpY2tlckZpbGU6IGFueVtdO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvL0NhbGxlZCBiZWZvcmUgYW55IG90aGVyIGxpZmVjeWNsZSBob29rLiBVc2UgaXQgdG8gaW5qZWN0IGRlcGVuZGVuY2llcywgYnV0IGF2b2lkIGFueSBzZXJpb3VzIHdvcmsgaGVyZS5cbiAgICAvL0FkZCAnJHtpbXBsZW1lbnRzIE9uQ2hhbmdlc30nIHRvIHRoZSBjbGFzcy5cbiAgICB0aGlzLnNlbGVjdGVkVGFibGUgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5zZWxlY3RQaWNrZXJGaWxlKTtcbiAgfVxuICAvKirooajmoLzliIbpobXliIfmjaIgKi9cbiAgb25QYWdlQ2hhbmdlKG5ld0FycmF5KSB7XG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkID0gdGhpcy5pc0FsbFNlbGVjdGVkRm4obmV3QXJyYXksIHRoaXMuc2VsZWN0ZWRUYWJsZSk7XG4gIH1cbiAgLyoq6KGM6YCJ5oup5qGG5pS55Y+YICovXG4gIG9uQ2hlY2tib3hDaGFuZ2VGbihldmVudCwgcm93LCBhcnJheTogYW55W10pIHtcbiAgICBjb25zdCB7IGNoZWNrZWQgfSA9IGV2ZW50LnRhcmdldDtcbiAgICBsZXQgc2VsZWN0ZWRUYWJsZUFycmF5ID0gWy4uLnRoaXMuc2VsZWN0ZWRUYWJsZV07XG4gICAgaWYgKHRoaXMuX211bHRpcGxlKSB7XG4gICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICBzZWxlY3RlZFRhYmxlQXJyYXkucHVzaChyb3cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWRUYWJsZUFycmF5ID0gc2VsZWN0ZWRUYWJsZUFycmF5LmZpbHRlcihlbCA9PiBlbC5pZCAhPSByb3cuaWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5pc0FsbFNlbGVjdGVkID0gdGhpcy5pc0FsbFNlbGVjdGVkRm4oYXJyYXksIHNlbGVjdGVkVGFibGVBcnJheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGVkVGFibGVBcnJheS5sZW5ndGggPSAwO1xuICAgICAgc2VsZWN0ZWRUYWJsZUFycmF5ID0gY2hlY2tlZCA/IFtyb3ddIDogW107XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRUYWJsZSA9IHRoaXMucmVtb3ZlRHVwbGljYXRlc0J5SWQoc2VsZWN0ZWRUYWJsZUFycmF5KTtcbiAgfVxuICAvKirlpoLmnpxzZWxlY3RlZFRhYmxlQXJyYXnkuI3lkKthcnJheeS4reeahOaJgOaciemhue+8jOWImeWwhmlzQWxsU2VsZWN0ZWTorr7kuLp0cnVlLOWQpuWImeiuvuS4umZhbHNlICovXG4gIGlzQWxsU2VsZWN0ZWRGbih0b2xhbEFycmF5OiBhbnlbXSwgc2VsZWN0ZWRBcnJheTogYW55W10gPSBbXSkge1xuICAgIGlmICh0b2xhbEFycmF5Lmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRvbGFsQXJyYXkuZXZlcnkoaXRlbSA9PiBzZWxlY3RlZEFycmF5LnNvbWUoZWwgPT4gZWwuaWQgPT09IGl0ZW0uaWQpKTtcbiAgfVxuICAvKirpgInmi6nlvZPliY3pobXlhajpg6ggKi9cbiAgb25TZWxlY3RBbGxGbihldmVudDogYW55LCBhcnJheTogYW55W10pIHtcbiAgICBsZXQgc2VsZWN0ZWRUYWJsZUFycmF5ID0gdGhpcy5zZWxlY3RlZFRhYmxlO1xuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgc2VsZWN0ZWRUYWJsZUFycmF5ID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVzQnlJZChbLi4uc2VsZWN0ZWRUYWJsZUFycmF5LCAuLi5hcnJheV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3RlZFRhYmxlQXJyYXkgPSBzZWxlY3RlZFRhYmxlQXJyYXkuZmlsdGVyKGVsID0+ICFhcnJheS5zb21lKGl0ZW0gPT4gaXRlbS5pZCA9PT0gZWwuaWQpKTtcbiAgICB9XG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XG4gICAgdGhpcy5zZWxlY3RlZFRhYmxlID0gc2VsZWN0ZWRUYWJsZUFycmF5O1xuICB9XG5cbiAgLyoq5Yik5patcm935piv5ZCm6YCJ5LitICovXG4gIHNlbGVjdGVkY2hlY2tib3ggPSBpZCA9PiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUYWJsZS5zb21lKGVsID0+IGVsLmlkID09PSBpZCk7XG4gIH07XG4gIC8qKuWIoOmZpOaVsOe7hOS4remHjeWkjeeahOmhuSAqL1xuICByZW1vdmVEdXBsaWNhdGVzQnlJZChhcnJheSkge1xuICAgIGNvbnN0IHNlZW5JZHMgPSB7fTtcbiAgICByZXR1cm4gYXJyYXkuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgaWYgKCFzZWVuSWRzW2l0ZW0uaWRdKSB7XG4gICAgICAgIHNlZW5JZHNbaXRlbS5pZF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuICAvKirnlKjkuo7nvJbovpHnmoTooajljZXvvIzlkIzml7blj6rog73mmL7npLrnvJbovpHkuIDkuKogKi9cbiAgRmlsZU5hbWVGb3JtOiBGb3JtR3JvdXAgfCBhbnk7XG4gIC8qKuW9k+WJjee8lui+keeahHJvdyAqL1xuICBuZXdFZGl0Um93OiBhbnkgPSAnJztcbiAgLyoq5piv5ZCm5q2j5Zyo5Yqg6L29ICovXG4gIGlzbG9hZGluZyA9IGZhbHNlO1xuICAvKirmj5DkuqRGaWxlTmFtZee8lui+kSAqL1xuICBvblN1Ym1pdEZpbGVOYW1lKGV2ZW50KSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLkZpbGVOYW1lRm9ybS52YWx1ZTtcbiAgICBpZiAoIXRoaXMuRmlsZU5hbWVGb3JtLnZhbGlkKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNsb2FkaW5nKSByZXR1cm47XG4gICAgdGhpcy5pc2xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuX0ZpbGVTZXJ2aWNlXG4gICAgICAudXBkYXRlKGlucHV0LmlkLCB7XG4gICAgICAgIG5hbWU6IGlucHV0LmZpbGVOYW1lLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc2xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIC8v6YCa6L+H5b2T5YmNbmV3RWRpdFJvd+eahGlkLOS/ruaUuWRhdGEuaXRlbXPkuK3lr7nlupTpobnnmoRuYW1lXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmRhdGEuaXRlbXMpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudC5pZCA9PSB0aGlzLm5ld0VkaXRSb3cuaWQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQubmFtZSA9IGlucHV0LmZpbGVOYW1lO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5GaWxlTmFtZUZvcm0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubmV3RWRpdFJvdyA9ICcnO1xuICAgICAgICB0aGlzLnRvYXN0ZXIuc3VjY2Vzcyh0aGlzLl9Mb2NhbGl6YXRpb25TZXJ2aWNlLmluc3RhbnQoYEZpbGVFeHBsb3Jlcjo6U2F2ZWRTdWNjZXNzZnVsbHlgKSk7XG4gICAgICAgIC8vIHRoaXMubGlzdC5nZXQoKTtcbiAgICAgIH0pO1xuICB9XG4gIC8qKuaJk+W8gOe8lui+kSAqL1xuICBvbkVkaXRGaWxlTmFtZShyb3cpIHtcbiAgICB0aGlzLkZpbGVOYW1lRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgZmlsZU5hbWU6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIGlkOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgfSk7XG4gICAgdGhpcy5GaWxlTmFtZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBmaWxlTmFtZTogcm93Lm5hbWUsXG4gICAgICBpZDogcm93LmlkLFxuICAgIH0pO1xuICAgIHRoaXMubmV3RWRpdFJvdyA9IHJvdztcbiAgfVxuICAvKirlhbPpl63nvJbovpEgKi9cbiAgb25DYW5jZWxGaWxlTmFtZShyb3cpIHtcbiAgICB0aGlzLm5ld0VkaXRSb3cgPSAnJztcbiAgICB0aGlzLkZpbGVOYW1lRm9ybSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiPGFicC1tb2RhbCBbKHZpc2libGUpXT1cIk1vZGFsT3BlblwiICh2aXNpYmxlQ2hhbmdlKT1cIk1vZGFsVmlzaWJsZUNoYW5nZSgkZXZlbnQpXCJcbiAgW29wdGlvbnNdPVwieyBzaXplOiAneGwnLCBzY3JvbGxhYmxlOiBmYWxzZSB9XCI+XG4gIDxuZy10ZW1wbGF0ZSAjYWJwSGVhZGVyPlxuICAgIDxoMz57eydGaWxlRXhwbG9yZXI6OkZpbGVFeHBsb3JlcicgfCBhYnBMb2NhbGl6YXRpb259fTwvaDM+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSAjYWJwQm9keT5cbiAgICA8ZGl2IGNsYXNzPVwicm93IGZpbGUtZXhwbG9yZXItbW9kYWwtYm9keSBmaWxlLW1vZGFsXCIgKm5nSWY9XCJNb2RhbE9wZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiICpuZ0lmPVwiY3JlYXRlRGlyZWN0b3J5UGVybWlzc2lvbk5hbWVcIiBzdHlsZT1cIm92ZXJmbG93OiBhdXRvOyBoZWlnaHQ6IGNhbGMoMTAwdmggLSAyNDBweClcIj5cbiAgICAgICAgPGZlLWZpbGUtbW9kYWwtdHJlZSBbdGhlU2VsZWN0ZWRUcmVlTm9kZV09XCJfdGhlU2VsZWN0ZWRUcmVlTm9kZVwiIChub2RlQ2xpY2spPVwiX25vZGVDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAobG9va0FsbEJ0bik9XCJsb29rQWxsRmlsZSgpXCIgKHRyZWVOb2RlRGF0YSk9XCJ0cmVlTm9kZURhdGEoJGV2ZW50KVwiXG4gICAgICAgICAgW2ZpbGVDb250YWluZXJOYW1lXT1cIl9maWxlQ29udGFpbmVyTmFtZVwiPjwvZmUtZmlsZS1tb2RhbC10cmVlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IFtjbGFzc109XCJjcmVhdGVEaXJlY3RvcnlQZXJtaXNzaW9uTmFtZT8nY29sLTknOidjb2wtMTInXCIgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoMTAwdmggLSAyNDBweClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAyXCI+PHNwYW4gKm5nSWY9XCJzZWxlY3RlZFRhYmxlLmxlbmd0aD4xXCIgY2xhc3M9XCJidG4tbGlua1wiXG4gICAgICAgICAgICAgIChjbGljay5zdG9wKT1cIm9uRGVsZXRlQWxsU2VsZWN0RmlsZSgpXCIgcm9sZT1cImJ1dHRvblwiPnt7J0ZpbGVFeHBsb3Jlcjo6RGVsZXRlJyB8IGFicExvY2FsaXphdGlvbn19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBmb3JtLWZpbGVcIiBzdHlsZT1cImZsZXg6IDJcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgI2ZpbGVFZGl0IFttdWx0aXBsZV09XCJfbXVsdGlwbGVcIiAoY2hhbmdlKT1cImdldEZpbGVDaGFuZ2UoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDwhLS0gW3NlbGVjdGlvblR5cGVdPVwiX211bHRpcGxlP1NlbGVjdGlvblR5cGUuY2hlY2tib3g6U2VsZWN0aW9uVHlwZS5zaW5nbGVcIiAtLT5cbiAgICAgICAgICA8IS0tIFtzZWxlY3RDaGVja109XCJzZWxlY3RDaGVja1wiIC0tPlxuICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlIGNsYXNzPVwibWF0ZXJpYWwgY29udGFpbmVyLWhlaWdodFwiIFtyb3dzXT1cImRhdGEuaXRlbXNcIiBbbGlzdF09XCJsaXN0XCIgY29sdW1uTW9kZT1cImZsZXhcIlxuICAgICAgICAgICAgW2hlYWRlckhlaWdodF09XCI1MFwiIFtmb290ZXJIZWlnaHRdPVwiNTBcIiByb3dIZWlnaHQ9XCJhdXRvXCIgW3Njcm9sbGJhclZdPVwidHJ1ZVwiIFt2aXJ0dWFsaXphdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICBbZXh0ZXJuYWxQYWdpbmddPVwidHJ1ZVwiIFtjb3VudF09XCJkYXRhLnRvdGFsQ291bnRcIj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiBbd2lkdGhdPVwiNTBcIiBwcm9wPVwiaWRcIiBbc29ydGFibGVdPVwiZmFsc2VcIiBbY2FuQXV0b1Jlc2l6ZV09XCJmYWxzZVwiIFtkcmFnZ2FibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbcmVzaXplYWJsZV09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmd4LWRhdGF0YWJsZS1oZWFkZXItdGVtcGxhdGUgbGV0LXZhbHVlPVwidmFsdWVcIiBsZXQtYWxsUm93c1NlbGVjdGVkPVwiYWxsUm93c1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBsZXQtc2VsZWN0Rm49XCJzZWxlY3RGblwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiAqbmdJZj1cIl9tdWx0aXBsZVwiIFtjaGVja2VkXT1cImlzQWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdEFsbEZuKCRldmVudCxkYXRhLml0ZW1zKVwiIC8+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIFtjaGVja2VkXT1cInNlbGVjdGVkY2hlY2tib3godmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGVja2JveENoYW5nZUZuKCRldmVudCxyb3csZGF0YS5pdGVtcylcIiAvPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiBbc29ydGFibGVdPVwiZmFsc2VcIiBbZmxleEdyb3ddPVwiMlwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCIgbmd4LWRhdGF0YWJsZS1jZWxsLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxmZS1maWxlLXByZXZpZXcgW3dpZHRoXT1cIic4MHB4J1wiIFtzcmNdPVwicm93LnVybFwiIFtuYW1lXT1cInJvdy5uYW1lXCIgW3R5cGVdPVwicm93Lm1pbWVUeXBlXCJcbiAgICAgICAgICAgICAgICAgIFtwcmV2aWV3XT1cInRydWVcIj48L2ZlLWZpbGUtcHJldmlldz5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmd4LWRhdGF0YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICA8bmd4LWRhdGF0YWJsZS1jb2x1bW4gW25hbWVdPVwiJ0ZpbGVFeHBsb3Jlcjo6RmlsZU5hbWUnIHwgYWJwTG9jYWxpemF0aW9uXCIgcHJvcD1cIm5hbWVcIiBbc29ydGFibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbZmxleEdyb3ddPVwiNFwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCIgbmd4LWRhdGF0YWJsZS1jZWxsLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQgdGl0bGVob3ZlclwiICpuZ0lmPVwibmV3RWRpdFJvdy5pZCE9PXJvdy5pZFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0yXCI+e3sgdmFsdWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBlbmNpbC1zcXVhcmUtb1wiIHJvbGU9XCJidXR0b25cIiAoY2xpY2suc3RvcCk9XCJvbkVkaXRGaWxlTmFtZShyb3cpXCIgc3R5bGU9XCJsaW5lLWhlaWdodDoyO1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiRmlsZU5hbWVGb3JtJiZuZXdFZGl0Um93LmlkPT09cm93LmlkXCI+XG4gICAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cIkZpbGVOYW1lRm9ybVwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdEZpbGVOYW1lKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgXCIgdHlwZT1cInRleHRcIiAgZm9ybUNvbnRyb2xOYW1lPVwiZmlsZU5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIGJ0biBidG4tc21cIiB0eXBlPVwic3VibWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLXNwaW4gZmEgZmEtc3Bpbm5lclwiICpuZ0lmPVwiaXNsb2FkaW5nXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGVja1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiICpuZ0lmPVwiIWlzbG9hZGluZ1wiPjwvaT48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiIGJ0biBidG4tc21cIiAoY2xpY2suc3RvcCk9XCJvbkNhbmNlbEZpbGVOYW1lKHJvdylcIj48aSBjbGFzcz1cImZhIGZhLXRpbWVzXCIgdHlwZT1cInJlc2V0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmd4LWRhdGF0YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICA8bmd4LWRhdGF0YWJsZS1jb2x1bW4gW25hbWVdPVwiJ0ZpbGVFeHBsb3Jlcjo6RmlsZVNpemUnIHwgYWJwTG9jYWxpemF0aW9uXCIgcHJvcD1cInNpemVcIiBbZmxleEdyb3ddPVwiMS41XCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAge3sodmFsdWV8Zm9ybWF0RmlsZVNpemUpIH19XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25neC1kYXRhdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uIFtuYW1lXT1cIidGaWxlRXhwbG9yZXI6OkRpcmVjdG9yeScgfCBhYnBMb2NhbGl6YXRpb25cIiBwcm9wPVwiZGlyZWN0b3J5SWRcIlxuICAgICAgICAgICAgICBbc29ydGFibGVdPVwiZmFsc2VcIiBbZmxleEdyb3ddPVwiMVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCIgbmd4LWRhdGF0YWJsZS1jZWxsLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIHt7IHZhbHVlfGdldERpcmVjdG9yeU5hbWU6ZmlsZUdyb3VwTGlzdCB9fVxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiBbbmFtZV09XCInRmlsZUV4cGxvcmVyOjpDcmVhdGlvblRpbWUnIHwgYWJwTG9jYWxpemF0aW9uXCIgcHJvcD1cImNyZWF0aW9uVGltZVwiXG4gICAgICAgICAgICAgIFtmbGV4R3Jvd109XCIyXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAge3sgdmFsdWUgfCBkYXRlIDogJ1lZWVkvTU0vZGQgSEg6bW06cycgfX1cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmd4LWRhdGF0YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICA8bmd4LWRhdGF0YWJsZS1jb2x1bW4gW2ZsZXhHcm93XT1cIjFcIiBbc29ydGFibGVdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQgcC0wXCIgKGNsaWNrLnN0b3ApPVwiZGVsZXRlRmlsZShyb3cpXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaCB0ZXh0LXByaW1hcnkgcC0yXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICA8L25neC1kYXRhdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwidXBsb2FkUGljdHVyZVN0YXR1c0xpc3QubGVuZ3RoID4gMFwiXG4gICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1maXhlZCBib3R0b20tMCBlbmQtMCBzaGFkb3ctbGcgZmlsZS1zdGF0dXMtbW9kYWwgICBtLTVcIiBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDEwcHhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHAtMCBweS0xIGJvcmRlci1ib3R0b21cIj5cbiAgICAgICAgICAgICAgPGRpdj57eydGaWxlRXhwbG9yZXI6OlVwbG9hZEZpbGVzJyB8IGFicExvY2FsaXphdGlvbn19PC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrLnN0b3ApPVwiY2xvc2VGaWxlU3RhdHVzTW9kYWwoKVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydGaWxlRXhwbG9yZXI6OkZpbGVOYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snRmlsZUV4cGxvcmVyOjpGaWxlU2l6ZScgfCBhYnBMb2NhbGl6YXRpb259fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiB1cGxvYWRQaWN0dXJlU3RhdHVzTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGl0ZW0ubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tdGV4dCB0ZXh0LWRhbmdlclwiICpuZ0lmPVwiaXRlbS5zaXplID4gc2l6ZUxpbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0ZpbGVFeHBsb3Jlcjo6RXhjZWVkc01heGltdW1TaXplJyB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbjooc2l6ZUxpbWl0fGZvcm1hdEZpbGVTaXplKX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBpdGVtLnNpemUgfCBmb3JtYXRGaWxlU2l6ZSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PT0gMVwiIGNsYXNzPVwiZmFzIGZhLWNoZWNrIHRleHQtcHJpbWFyeVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiaXRlbS5zdGF0dXMgPT09IDJcIiBjbGFzcz1cImZhcyBmYS10aW1lcy1jaXJjbGUgdGV4dC1kYW5nZXJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlICNhYnBGb290ZXI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGFicENsb3NlPnt7J0FicFVpOjpDbG9zZScgfCBhYnBMb2NhbGl6YXRpb259fTwvYnV0dG9uPlxuICAgIDxhYnAtYnV0dG9uIGljb25DbGFzcz1cImZhIGZhLWNoZWNrXCIgKGNsaWNrKT1cIm1vZGFsU2F2ZSgpXCI+e3snRmlsZUV4cGxvcmVyOjpDb25maXJtJyB8IGFicExvY2FsaXphdGlvbn19XG4gICAgICBAaWYoc2VsZWN0ZWRUYWJsZS5sZW5ndGg+MCl7XG4gICAgICAoe3tzZWxlY3RlZFRhYmxlLmxlbmd0aH19KVxuICAgICAgfVxuICAgIDwvYWJwLWJ1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvYWJwLW1vZGFsPiJdfQ==
|