@dignite-ng/expand.file-explorer 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/config/ng-package.json +7 -0
  2. package/config/{enums/index.d.ts → src/enums/index.ts} +1 -1
  3. package/config/src/enums/route-names.ts +15 -0
  4. package/config/src/file-config.module.ts +12 -0
  5. package/config/{providers/index.d.ts → src/providers/index.ts} +1 -1
  6. package/config/src/providers/route.provider.ts +26 -0
  7. package/config/{public-api.d.ts → src/public-api.ts} +3 -3
  8. package/ng-package.json +7 -0
  9. package/package.json +3 -27
  10. package/src/lib/components/dome/file-dome.component.html +18 -0
  11. package/src/lib/components/dome/file-dome.component.scss +0 -0
  12. package/src/lib/components/dome/file-dome.component.spec.ts +21 -0
  13. package/src/lib/components/dome/file-dome.component.ts +33 -0
  14. package/src/lib/components/file-edit/file-edit.component.html +29 -0
  15. package/src/lib/components/file-edit/file-edit.component.scss +0 -0
  16. package/src/lib/components/file-edit/file-edit.component.spec.ts +21 -0
  17. package/src/lib/components/file-edit/file-edit.component.ts +98 -0
  18. package/src/lib/components/file-modal/file-modal.component.html +112 -0
  19. package/src/lib/components/file-modal/file-modal.component.scss +56 -0
  20. package/src/lib/components/file-modal/file-modal.component.spec.ts +21 -0
  21. package/src/lib/components/file-modal/file-modal.component.ts +284 -0
  22. package/src/lib/components/file-modal-tree/file-modal-tree.component.html +63 -0
  23. package/src/lib/components/file-modal-tree/file-modal-tree.component.scss +0 -0
  24. package/src/lib/components/file-modal-tree/file-modal-tree.component.spec.ts +21 -0
  25. package/src/lib/components/file-modal-tree/file-modal-tree.component.ts +207 -0
  26. package/src/lib/components/file-picker/file-picker.component.html +28 -0
  27. package/src/lib/components/file-picker/file-picker.component.scss +0 -0
  28. package/src/lib/components/file-picker/file-picker.component.spec.ts +21 -0
  29. package/src/lib/components/file-picker/file-picker.component.ts +58 -0
  30. package/src/lib/components/index.ts +5 -0
  31. package/src/lib/file-explorer-routing.module.ts +18 -0
  32. package/src/lib/file-explorer.module.ts +46 -0
  33. package/src/lib/proxy/README.md +17 -0
  34. package/src/lib/proxy/dignite/file-explorer/directories/file-descriptor.service.ts +65 -0
  35. package/{lib/proxy/dignite/file-explorer/directories/models.d.ts → src/lib/proxy/dignite/file-explorer/directories/models.ts} +35 -29
  36. package/src/lib/proxy/dignite/file-explorer/files/file-descriptor.service.ts +86 -0
  37. package/src/lib/proxy/dignite/file-explorer/files/models.ts +58 -0
  38. package/src/lib/proxy/generate-proxy.json +11810 -0
  39. package/{lib/proxy/microsoft/asp-net-core/mvc/models.d.ts → src/lib/proxy/microsoft/asp-net-core/mvc/models.ts} +12 -10
  40. package/src/lib/proxy/microsoft/extensions/primitives/models.ts +9 -0
  41. package/{lib/proxy/microsoft/net/http/headers/models.d.ts → src/lib/proxy/microsoft/net/http/headers/models.ts} +7 -6
  42. package/src/lib/proxy/volo/abp/content/models.ts +6 -0
  43. package/src/lib/services/file-api.service.ts +59 -0
  44. package/src/lib/services/index.ts +1 -0
  45. package/{public-api.d.ts → src/public-api.ts} +5 -0
  46. package/tsconfig.lib.json +14 -0
  47. package/tsconfig.lib.prod.json +10 -0
  48. package/tsconfig.spec.json +14 -0
  49. package/config/enums/route-names.d.ts +0 -3
  50. package/config/file-config.module.d.ts +0 -8
  51. package/config/index.d.ts +0 -5
  52. package/config/providers/route.provider.d.ts +0 -8
  53. package/esm2022/config/dignite-ng-expand.file-explorer-config.mjs +0 -5
  54. package/esm2022/config/enums/index.mjs +0 -2
  55. package/esm2022/config/enums/route-names.mjs +0 -2
  56. package/esm2022/config/file-config.module.mjs +0 -19
  57. package/esm2022/config/providers/index.mjs +0 -2
  58. package/esm2022/config/providers/route.provider.mjs +0 -24
  59. package/esm2022/config/public-api.mjs +0 -4
  60. package/esm2022/dignite-ng-expand.file-explorer.mjs +0 -5
  61. package/esm2022/lib/components/dome/file-dome.component.mjs +0 -32
  62. package/esm2022/lib/components/file-edit/file-edit.component.mjs +0 -102
  63. package/esm2022/lib/components/file-modal/file-modal.component.mjs +0 -271
  64. package/esm2022/lib/components/file-modal-tree/file-modal-tree.component.mjs +0 -195
  65. package/esm2022/lib/components/file-picker/file-picker.component.mjs +0 -57
  66. package/esm2022/lib/components/index.mjs +0 -6
  67. package/esm2022/lib/file-explorer-routing.module.mjs +0 -25
  68. package/esm2022/lib/file-explorer.module.mjs +0 -83
  69. package/esm2022/lib/proxy/dignite/file-explorer/directories/file-descriptor.service.mjs +0 -48
  70. package/esm2022/lib/proxy/dignite/file-explorer/directories/index.mjs +0 -3
  71. package/esm2022/lib/proxy/dignite/file-explorer/directories/models.mjs +0 -2
  72. package/esm2022/lib/proxy/dignite/file-explorer/files/file-descriptor.service.mjs +0 -60
  73. package/esm2022/lib/proxy/dignite/file-explorer/files/index.mjs +0 -3
  74. package/esm2022/lib/proxy/dignite/file-explorer/files/models.mjs +0 -2
  75. package/esm2022/lib/proxy/dignite/file-explorer/index.mjs +0 -4
  76. package/esm2022/lib/proxy/dignite/index.mjs +0 -3
  77. package/esm2022/lib/proxy/index.mjs +0 -5
  78. package/esm2022/lib/proxy/microsoft/asp-net-core/index.mjs +0 -3
  79. package/esm2022/lib/proxy/microsoft/asp-net-core/mvc/index.mjs +0 -2
  80. package/esm2022/lib/proxy/microsoft/asp-net-core/mvc/models.mjs +0 -2
  81. package/esm2022/lib/proxy/microsoft/extensions/index.mjs +0 -3
  82. package/esm2022/lib/proxy/microsoft/extensions/primitives/index.mjs +0 -2
  83. package/esm2022/lib/proxy/microsoft/extensions/primitives/models.mjs +0 -2
  84. package/esm2022/lib/proxy/microsoft/index.mjs +0 -5
  85. package/esm2022/lib/proxy/microsoft/net/http/headers/index.mjs +0 -2
  86. package/esm2022/lib/proxy/microsoft/net/http/headers/models.mjs +0 -2
  87. package/esm2022/lib/proxy/microsoft/net/http/index.mjs +0 -3
  88. package/esm2022/lib/proxy/microsoft/net/index.mjs +0 -3
  89. package/esm2022/lib/proxy/volo/abp/content/index.mjs +0 -2
  90. package/esm2022/lib/proxy/volo/abp/content/models.mjs +0 -2
  91. package/esm2022/lib/proxy/volo/abp/index.mjs +0 -3
  92. package/esm2022/lib/proxy/volo/index.mjs +0 -3
  93. package/esm2022/lib/services/file-api.service.mjs +0 -66
  94. package/esm2022/lib/services/index.mjs +0 -2
  95. package/esm2022/public-api.mjs +0 -8
  96. package/fesm2022/dignite-ng-expand.file-explorer-config.mjs +0 -47
  97. package/fesm2022/dignite-ng-expand.file-explorer-config.mjs.map +0 -1
  98. package/fesm2022/dignite-ng-expand.file-explorer.mjs +0 -972
  99. package/fesm2022/dignite-ng-expand.file-explorer.mjs.map +0 -1
  100. package/index.d.ts +0 -5
  101. package/lib/components/dome/file-dome.component.d.ts +0 -19
  102. package/lib/components/file-edit/file-edit.component.d.ts +0 -38
  103. package/lib/components/file-modal/file-modal.component.d.ts +0 -93
  104. package/lib/components/file-modal-tree/file-modal-tree.component.d.ts +0 -66
  105. package/lib/components/file-picker/file-picker.component.d.ts +0 -23
  106. package/lib/components/index.d.ts +0 -5
  107. package/lib/file-explorer-routing.module.d.ts +0 -7
  108. package/lib/file-explorer.module.d.ts +0 -18
  109. package/lib/proxy/dignite/file-explorer/directories/file-descriptor.service.d.ts +0 -17
  110. package/lib/proxy/dignite/file-explorer/files/file-descriptor.service.d.ts +0 -20
  111. package/lib/proxy/dignite/file-explorer/files/models.d.ts +0 -50
  112. package/lib/proxy/microsoft/extensions/primitives/models.d.ts +0 -8
  113. package/lib/proxy/volo/abp/content/models.d.ts +0 -5
  114. package/lib/services/file-api.service.d.ts +0 -14
  115. package/lib/services/index.d.ts +0 -1
  116. /package/{lib/proxy/dignite/file-explorer/directories/index.d.ts → src/lib/proxy/dignite/file-explorer/directories/index.ts} +0 -0
  117. /package/{lib/proxy/dignite/file-explorer/files/index.d.ts → src/lib/proxy/dignite/file-explorer/files/index.ts} +0 -0
  118. /package/{lib/proxy/dignite/file-explorer/index.d.ts → src/lib/proxy/dignite/file-explorer/index.ts} +0 -0
  119. /package/{lib/proxy/dignite/index.d.ts → src/lib/proxy/dignite/index.ts} +0 -0
  120. /package/{lib/proxy/index.d.ts → src/lib/proxy/index.ts} +0 -0
  121. /package/{lib/proxy/microsoft/asp-net-core/index.d.ts → src/lib/proxy/microsoft/asp-net-core/index.ts} +0 -0
  122. /package/{lib/proxy/microsoft/asp-net-core/mvc/index.d.ts → src/lib/proxy/microsoft/asp-net-core/mvc/index.ts} +0 -0
  123. /package/{lib/proxy/microsoft/extensions/index.d.ts → src/lib/proxy/microsoft/extensions/index.ts} +0 -0
  124. /package/{lib/proxy/microsoft/extensions/primitives/index.d.ts → src/lib/proxy/microsoft/extensions/primitives/index.ts} +0 -0
  125. /package/{lib/proxy/microsoft/index.d.ts → src/lib/proxy/microsoft/index.ts} +0 -0
  126. /package/{lib/proxy/microsoft/net/http/headers/index.d.ts → src/lib/proxy/microsoft/net/http/headers/index.ts} +0 -0
  127. /package/{lib/proxy/microsoft/net/http/index.d.ts → src/lib/proxy/microsoft/net/http/index.ts} +0 -0
  128. /package/{lib/proxy/microsoft/net/index.d.ts → src/lib/proxy/microsoft/net/index.ts} +0 -0
  129. /package/{lib/proxy/volo/abp/content/index.d.ts → src/lib/proxy/volo/abp/content/index.ts} +0 -0
  130. /package/{lib/proxy/volo/abp/index.d.ts → src/lib/proxy/volo/abp/index.ts} +0 -0
  131. /package/{lib/proxy/volo/index.d.ts → src/lib/proxy/volo/index.ts} +0 -0
@@ -1,271 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { ListService, LIST_QUERY_DEBOUNCE_TIME } from '@abp/ng.core';
3
- import { SelectionType } from '@swimlane/ngx-datatable';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../../proxy/dignite/file-explorer/files";
6
- import * as i2 from "@abp/ng.theme.shared";
7
- import * as i3 from "@abp/ng.core";
8
- import * as i4 from "../../services/file-api.service";
9
- import * as i5 from "@angular/common";
10
- import * as i6 from "@swimlane/ngx-datatable";
11
- import * as i7 from "../file-modal-tree/file-modal-tree.component";
12
- var that;
13
- class FileModalComponent {
14
- _FileService;
15
- toaster;
16
- list;
17
- _FileApiService;
18
- restService;
19
- confirmation;
20
- _LocalizationService;
21
- constructor(_FileService, toaster, list, _FileApiService, restService, confirmation, _LocalizationService) {
22
- this._FileService = _FileService;
23
- this.toaster = toaster;
24
- this.list = list;
25
- this._FileApiService = _FileApiService;
26
- this.restService = restService;
27
- this.confirmation = confirmation;
28
- this._LocalizationService = _LocalizationService;
29
- that = this;
30
- }
31
- /**图片容器 */
32
- _fileContainerName;
33
- set fileContainerName(v) {
34
- if (v) {
35
- this._fileContainerName = v;
36
- this.loadData();
37
- }
38
- }
39
- /**是否多选 */
40
- _multiple = true;
41
- set multiple(v) {
42
- this._multiple = v;
43
- if (v) { }
44
- }
45
- /**文件大小限制
46
- * @param 1mb
47
- */
48
- sizeLimit = 1048576;
49
- set limit(v) {
50
- this.sizeLimit = v;
51
- }
52
- /**父组件传递的模态框状态 */
53
- set visible(v) {
54
- this.ModalOpen = v;
55
- if (v) {
56
- this.loadData();
57
- }
58
- }
59
- /**模态框状态回调 */
60
- visibleChange = new EventEmitter();
61
- /**模态框-状态-是否打开 */
62
- ModalOpen = false;
63
- /**模态框-繁忙状态-用于确定模态的繁忙状态是否为真 */
64
- ModalBusy = false;
65
- /**模态框-状态改变回调 */
66
- ModalVisibleChange(event) {
67
- if (!event) {
68
- this.visibleChange.emit(event);
69
- return;
70
- }
71
- }
72
- /**模态框保存 */
73
- modalSave() {
74
- let selectedTablearr = this._FileApiService.deepClone(this.selectedTable);
75
- this.selectFilefn.emit(selectedTablearr);
76
- this.ModalVisibleChange(false);
77
- }
78
- /**dignite-file-modal-tree */
79
- /**选择的tree节点 */
80
- _theSelectedTreeNode = '';
81
- /**初始化数据 */
82
- loadData() {
83
- if (this.ModalOpen && this._fileContainerName) {
84
- this.hookToQuery();
85
- }
86
- }
87
- /**tree-节点选择 */
88
- _nodeClick(event) {
89
- this._theSelectedTreeNode = event;
90
- this.list.get();
91
- }
92
- /**图片上传-要上传图片的状态文件列表 */
93
- uploadPictureStatusList = [];
94
- /**图片上传-获取文件信息改变 */
95
- async getFileChange(event) {
96
- let files = new Array(...event.target.files);
97
- this.uploadPictureStatusList = files;
98
- for (const file of files) {
99
- if (file.size > this.sizeLimit) {
100
- this.setuploadPictureStatus(file, 2);
101
- continue;
102
- }
103
- await this.uploadingFile(file).then(() => {
104
- this.setuploadPictureStatus(file, 1);
105
- this.list.get();
106
- }).catch(() => {
107
- this.setuploadPictureStatus(file, 2);
108
- }); // 等待每个文件上传完成
109
- }
110
- this.list.get();
111
- let isSubmit = !this.uploadPictureStatusList.some(el => el.status == 2);
112
- if (isSubmit) {
113
- // this.toaster.success("上传完成");
114
- setTimeout(() => {
115
- this.uploadPictureStatusList = [];
116
- }, 6000);
117
- }
118
- }
119
- /**图片上传-设置uploadPictureStatusList的状态 */
120
- setuploadPictureStatus(file, type) {
121
- this.uploadPictureStatusList.map(el => {
122
- if (el == file)
123
- el.status = type;
124
- });
125
- }
126
- /**图片上传-递归按顺序上传 */
127
- uploadingFile(file) {
128
- return new Promise((resolve, rejects) => {
129
- let formData = new FormData();
130
- formData.append('file', file, file.name);
131
- this.createFile({
132
- file: formData,
133
- containerName: this._fileContainerName,
134
- directoryId: this._theSelectedTreeNode?.key || '',
135
- entityId: ''
136
- }).subscribe(res => {
137
- resolve(true);
138
- }, (err) => {
139
- rejects(false);
140
- });
141
- });
142
- }
143
- /**文件表格-数据*/
144
- data = {
145
- items: [],
146
- totalCount: 0,
147
- };
148
- /**文件表格-条件*/
149
- filters = {};
150
- /**文件表格-表格自带选择类型 */
151
- SelectionType = SelectionType;
152
- /**文件表格-选择的表格数据项 */
153
- selectedTable = [];
154
- /**已选定的文件 */
155
- selectPickerFile;
156
- ngOnChanges(changes) {
157
- //Called before any other lifecycle hook. Use it to inject dependencies, but avoid any serious work here.
158
- //Add '${implements OnChanges}' to the class.
159
- this.selectedTable = this._FileApiService.deepClone(this.selectPickerFile);
160
- }
161
- /**当前选择的table项 id */
162
- nowSelectId = '';
163
- /**选择文件回调 */
164
- // @Output() selectedFileChange = new EventEmitter<any[]>()
165
- selectFilefn = new EventEmitter();
166
- /**文件表格-获取表格数据 */
167
- hookToQuery() {
168
- const getData = (query) => this._FileService.getList({
169
- ...query,
170
- ...this.filters,
171
- containerName: this._fileContainerName,
172
- directoryId: this._theSelectedTreeNode.key
173
- });
174
- const setData = (list) => (this.data = list);
175
- this.list.hookToQuery(getData).subscribe(setData);
176
- }
177
- /**文件表格-查看所有分组的文件数据 */
178
- lookAllFile() {
179
- this._theSelectedTreeNode = '';
180
- this.list.get();
181
- }
182
- /**选择表格项 */
183
- onSelectTableItem({ selected }) {
184
- this.selectedTable = this._FileApiService.deepClone(selected);
185
- let selectedTablearr = this.removeDuplicatesById(this.selectedTable);
186
- if (selected.length > selectedTablearr.length) {
187
- selectedTablearr = selectedTablearr.filter(el => el.id !== this.nowSelectId);
188
- }
189
- this.selectedTable = selectedTablearr;
190
- }
191
- /**删除数组中重复的项 */
192
- removeDuplicatesById(array) {
193
- const seenIds = {};
194
- return array.filter(item => {
195
- if (!seenIds[item.id]) {
196
- seenIds[item.id] = true;
197
- return true;
198
- }
199
- return false;
200
- });
201
- }
202
- /**一个布尔or函数,可用于检查是否要根据条件选择特定行。 */
203
- selectCheck = (row, column, value) => {
204
- this.nowSelectId = row.id;
205
- return true;
206
- };
207
- /**判断row是否选中 */
208
- selectedcheckbox = (id) => {
209
- return this.selectedTable.some(el => el.id == id);
210
- };
211
- /**删除图片 */
212
- deleteFile(file) {
213
- this.confirmation
214
- .warn('', { key: '', defaultValue: this._LocalizationService.instant(`AbpUi::ItemWillBeDeletedMessage`) })
215
- .subscribe((status) => {
216
- if (status == 'confirm') {
217
- this._FileService.delete(file.id).subscribe(res => {
218
- this.toaster.success(this._LocalizationService.instant(`AbpUi::SuccessfullyDeleted`));
219
- this.list.get();
220
- });
221
- }
222
- });
223
- }
224
- /**关闭文件状态弹窗 */
225
- closeFileStatusModal() {
226
- this.uploadPictureStatusList = [];
227
- }
228
- /**创建图片的接口,代理中的file类型不匹配,切换为any类型 */
229
- createFile = (input, config) => this.restService.request({
230
- method: 'POST',
231
- url: '/api/file-explorer/files',
232
- params: { containerName: input.containerName, cellName: input.cellName, directoryId: input.directoryId, entityId: input.entityId },
233
- body: input.file,
234
- }, { apiName: 'FileExplorer', ...config });
235
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileModalComponent, deps: [{ token: i1.FileDescriptorService }, { token: i2.ToasterService }, { token: i3.ListService }, { token: i4.FileApiService }, { token: i3.RestService }, { token: i2.ConfirmationService }, { token: i3.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
236
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FileModalComponent, selector: "fe-file-modal", inputs: { fileContainerName: "fileContainerName", multiple: "multiple", limit: "limit", visible: "visible", selectPickerFile: "selectPickerFile" }, outputs: { visibleChange: "visibleChange", selectFilefn: "selectFilefn" }, providers: [
237
- // [Required]
238
- ListService,
239
- // [Optional]
240
- // Provide this token if you want a different debounce time.
241
- // Default is 300. Cannot be 0. Any value below 100 is not recommended.
242
- { 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\" 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=\"col-9\" style=\"height: calc(100vh - 240px)\">\n <div class=\"mb-2 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\" accept=\".jpg,.jpeg,.png,.gif,.webp\"\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]=\"SelectionType.multiClick\" (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 [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:m: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 border bg-white p-1 m-5\"\n style=\"border-radius: 10px\">\n <div class=\"card\">\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: "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.NgxDatatableListDirective, selector: "ngx-datatable[list]", inputs: ["list"], exportAs: ["ngxDatatableList"] }, { kind: "directive", type: i2.ModalCloseDirective, selector: "[abpClose]" }, { kind: "component", type: i7.FileModalTreeComponent, selector: "fe-file-modal-tree", inputs: ["theSelectedTreeNode", "fileContainerName"], outputs: ["nodeClick"] }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i3.LocalizationPipe, name: "abpLocalization" }] });
244
- }
245
- export { FileModalComponent };
246
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileModalComponent, decorators: [{
247
- type: Component,
248
- args: [{ selector: 'fe-file-modal', providers: [
249
- // [Required]
250
- ListService,
251
- // [Optional]
252
- // Provide this token if you want a different debounce time.
253
- // Default is 300. Cannot be 0. Any value below 100 is not recommended.
254
- { provide: LIST_QUERY_DEBOUNCE_TIME, useValue: 500 },
255
- ], 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\" 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=\"col-9\" style=\"height: calc(100vh - 240px)\">\n <div class=\"mb-2 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\" accept=\".jpg,.jpeg,.png,.gif,.webp\"\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]=\"SelectionType.multiClick\" (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 [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:m: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 border bg-white p-1 m-5\"\n style=\"border-radius: 10px\">\n <div class=\"card\">\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"] }]
256
- }], ctorParameters: function () { return [{ type: i1.FileDescriptorService }, { type: i2.ToasterService }, { type: i3.ListService }, { type: i4.FileApiService }, { type: i3.RestService }, { type: i2.ConfirmationService }, { type: i3.LocalizationService }]; }, propDecorators: { fileContainerName: [{
257
- type: Input
258
- }], multiple: [{
259
- type: Input
260
- }], limit: [{
261
- type: Input
262
- }], visible: [{
263
- type: Input
264
- }], visibleChange: [{
265
- type: Output
266
- }], selectPickerFile: [{
267
- type: Input
268
- }], selectFilefn: [{
269
- type: Output
270
- }] } });
271
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9maWxlLWV4cGxvcmVyL3NyYy9saWIvY29tcG9uZW50cy9maWxlLW1vZGFsL2ZpbGUtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1tb2RhbC9maWxlLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBR3RGLE9BQU8sRUFBdUIsV0FBVyxFQUEwQyx3QkFBd0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUdsSSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7OztBQUN4RCxJQUFJLElBQUksQ0FBQTtBQUNSLE1BYWEsa0JBQWtCO0lBR25CO0lBQ0E7SUFDUTtJQUNUO0lBQ0M7SUFDQTtJQUNBO0lBUFYsWUFDVSxZQUErQyxFQUMvQyxPQUF1QixFQUNmLElBQWlCLEVBQzFCLGVBQStCLEVBQzlCLFdBQXdCLEVBQ3hCLFlBQWlDLEVBQ2pDLG9CQUF5QztRQU56QyxpQkFBWSxHQUFaLFlBQVksQ0FBbUM7UUFDL0MsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDZixTQUFJLEdBQUosSUFBSSxDQUFhO1FBQzFCLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQUM5QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDakMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFxQjtRQUVqRCxJQUFJLEdBQUcsSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELFVBQVU7SUFDVixrQkFBa0IsQ0FBUTtJQUMxQixJQUNX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SSxhQUFhO3NCQUF0QixNQUFNO2dCQW9IRSxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBWUksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBGaWxlU2VydmljZSBmcm9tICcuLi8uLi9wcm94eS9kaWduaXRlL2ZpbGUtZXhwbG9yZXIvZmlsZXMnO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uLCBDb25maXJtYXRpb25TZXJ2aWNlLCBUb2FzdGVyU2VydmljZSB9IGZyb20gJ0BhYnAvbmcudGhlbWUuc2hhcmVkJztcbmltcG9ydCB7IFBhZ2VkUmVzdWx0RHRvLCBBQlAsIExpc3RTZXJ2aWNlLCBSZXN0LCBSZXN0U2VydmljZSwgTG9jYWxpemF0aW9uU2VydmljZSwgTElTVF9RVUVSWV9ERUJPVU5DRV9USU1FIH0gZnJvbSAnQGFicC9uZy5jb3JlJztcbmltcG9ydCB7IEZpbGVEZXNjcmlwdG9yRHRvLCBHZXRGaWxlc0lucHV0IH0gZnJvbSAnLi4vLi4vcHJveHkvZGlnbml0ZS9maWxlLWV4cGxvcmVyL2ZpbGVzJztcbmltcG9ydCB7IEZpbGVBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmlsZS1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25UeXBlIH0gZnJvbSAnQHN3aW1sYW5lL25neC1kYXRhdGFibGUnO1xudmFyIHRoYXRcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZlLWZpbGUtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgLy8gW1JlcXVpcmVkXVxuICAgIExpc3RTZXJ2aWNlLFxuICAgIC8vIFtPcHRpb25hbF1cbiAgICAvLyBQcm92aWRlIHRoaXMgdG9rZW4gaWYgeW91IHdhbnQgYSBkaWZmZXJlbnQgZGVib3VuY2UgdGltZS5cbiAgICAvLyBEZWZhdWx0IGlzIDMwMC4gQ2Fubm90IGJlIDAuIEFueSB2YWx1ZSBiZWxvdyAxMDAgaXMgbm90IHJlY29tbWVuZGVkLlxuICAgIHsgcHJvdmlkZTogTElTVF9RVUVSWV9ERUJPVU5DRV9USU1FLCB1c2VWYWx1ZTogNTAwIH0sXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRmlsZU1vZGFsQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9GaWxlU2VydmljZTogRmlsZVNlcnZpY2UuRmlsZURlc2NyaXB0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RlcjogVG9hc3RlclNlcnZpY2UsXG4gICAgcHVibGljIHJlYWRvbmx5IGxpc3Q6IExpc3RTZXJ2aWNlLFxuICAgIHB1YmxpYyBfRmlsZUFwaVNlcnZpY2U6IEZpbGVBcGlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlybWF0aW9uOiBDb25maXJtYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgX0xvY2FsaXphdGlvblNlcnZpY2U6IExvY2FsaXphdGlvblNlcnZpY2UsXG4gICkge1xuICAgIHRoYXQgPSB0aGlzXG4gIH1cblxuICAvKirlm77niYflrrnlmaggKi9cbiAgX2ZpbGVDb250YWluZXJOYW1lOiBzdHJpbmdcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBmaWxlQ29udGFpbmVyTmFtZSh2OiBzdHJpbmcpIHtcbiAgICBpZiAodikge1xuICAgICAgdGhpcy5fZmlsZUNvbnRhaW5lck5hbWUgPSB2O1xuICAgICAgdGhpcy5sb2FkRGF0YSgpXG4gICAgfVxuICB9XG5cbiAgLyoq5piv5ZCm5aSa6YCJICovXG4gIF9tdWx0aXBsZTogYm9vbGVhbiA9IHRydWVcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBtdWx0aXBsZSh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5fbXVsdGlwbGUgPSB2O1xuICAgIGlmICh2KSB7IH1cbiAgfVxuXG4gIC8qKuaWh+S7tuWkp+Wwj+mZkOWItiBcbiogQHBhcmFtIDFtYlxuKi9cbiAgc2l6ZUxpbWl0OiBudW1iZXIgPSAxMDQ4NTc2XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbGltaXQodjogbnVtYmVyKSB7XG4gICAgdGhpcy5zaXplTGltaXQgPSB2O1xuICB9XG4gIC8qKueItue7hOS7tuS8oOmAkueahOaooeaAgeahhueKtuaAgSAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHZpc2libGUodjogYm9vbGVhbikge1xuICAgIHRoaXMuTW9kYWxPcGVuID0gdjtcbiAgICBpZiAodikge1xuICAgICAgdGhpcy5sb2FkRGF0YSgpXG4gICAgfVxuICB9XG5cbiAgLyoq5qih5oCB5qGG54q25oCB5Zue6LCDICovXG4gIEBPdXRwdXQoKSB2aXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cblxuXG4gIC8qKuaooeaAgeahhi3nirbmgIEt5piv5ZCm5omT5byAICovXG4gIE1vZGFsT3BlbjogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoq5qih5oCB5qGGLee5geW/meeKtuaAgS3nlKjkuo7noa7lrprmqKHmgIHnmoTnuYHlv5nnirbmgIHmmK/lkKbkuLrnnJ8gKi9cbiAgTW9kYWxCdXN5OiBib29sZWFuID0gZmFsc2VcblxuXG5cbiAgLyoq5qih5oCB5qGGLeeKtuaAgeaUueWPmOWbnuiwgyAqL1xuICBNb2RhbFZpc2libGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdChldmVudClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIC8qKuaooeaAgeahhuS/neWtmCAqL1xuICBtb2RhbFNhdmUoKSB7XG4gICAgbGV0IHNlbGVjdGVkVGFibGVhcnIgPSB0aGlzLl9GaWxlQXBpU2VydmljZS5kZWVwQ2xvbmUodGhpcy5zZWxlY3RlZFRhYmxlKVxuICAgIHRoaXMuc2VsZWN0RmlsZWZuLmVtaXQoc2VsZWN0ZWRUYWJsZWFycilcblxuICAgIHRoaXMuTW9kYWxWaXNpYmxlQ2hhbmdlKGZhbHNlKVxuICB9XG4gIC8qKmRpZ25pdGUtZmlsZS1tb2RhbC10cmVlICovXG4gIC8qKumAieaLqeeahHRyZWXoioLngrkgKi9cbiAgX3RoZVNlbGVjdGVkVHJlZU5vZGU6IGFueSA9ICcnXG5cbiAgLyoq5Yid5aeL5YyW5pWw5o2uICovXG4gIGxvYWREYXRhKCkge1xuICAgIGlmICh0aGlzLk1vZGFsT3BlbiAmJiB0aGlzLl9maWxlQ29udGFpbmVyTmFtZSkge1xuICAgICAgdGhpcy5ob29rVG9RdWVyeSgpXG4gICAgfVxuICB9XG5cbiAgLyoqdHJlZS3oioLngrnpgInmi6kgKi9cbiAgX25vZGVDbGljayhldmVudCkge1xuICAgIHRoaXMuX3RoZVNlbGVjdGVkVHJlZU5vZGUgPSBldmVudFxuICAgIHRoaXMubGlzdC5nZXQoKVxuICB9XG5cbiAgLyoq5Zu+54mH5LiK5LygLeimgeS4iuS8oOWbvueJh+eahOeKtuaAgeaWh+S7tuWIl+ihqCAqL1xuICB1cGxvYWRQaWN0dXJlU3RhdHVzTGlzdDogYW55W10gPSBbXVxuXG4gIC8qKuWbvueJh+S4iuS8oC3ojrflj5bmlofku7bkv6Hmga/mlLnlj5ggKi9cbiAgYXN5bmMgZ2V0RmlsZUNoYW5nZShldmVudCkge1xuICAgIGxldCBmaWxlcyA9IG5ldyBBcnJheSguLi5ldmVudC50YXJnZXQuZmlsZXMpXG4gICAgdGhpcy51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdCA9IGZpbGVzXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBpZiAoZmlsZS5zaXplID4gdGhpcy5zaXplTGltaXQpIHtcbiAgICAgICAgdGhpcy5zZXR1cGxvYWRQaWN0dXJlU3RhdHVzKGZpbGUsIDIpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy51cGxvYWRpbmdGaWxlKGZpbGUpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNldHVwbG9hZFBpY3R1cmVTdGF0dXMoZmlsZSwgMSlcbiAgICAgICAgdGhpcy5saXN0LmdldCgpXG4gICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0dXBsb2FkUGljdHVyZVN0YXR1cyhmaWxlLCAyKVxuICAgICAgfSk7IC8vIOetieW+heavj+S4quaWh+S7tuS4iuS8oOWujOaIkCAgXG4gICAgfVxuICAgIHRoaXMubGlzdC5nZXQoKVxuICAgIGxldCBpc1N1Ym1pdCA9ICF0aGlzLnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0LnNvbWUoZWwgPT4gZWwuc3RhdHVzID09IDIpO1xuICAgIGlmIChpc1N1Ym1pdCkge1xuICAgICAgLy8gdGhpcy50b2FzdGVyLnN1Y2Nlc3MoXCLkuIrkvKDlrozmiJBcIik7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdCA9IFtdXG4gICAgICB9LCA2MDAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKuWbvueJh+S4iuS8oC3orr7nva51cGxvYWRQaWN0dXJlU3RhdHVzTGlzdOeahOeKtuaAgSAqL1xuICBzZXR1cGxvYWRQaWN0dXJlU3RhdHVzKGZpbGUsIHR5cGUpIHtcbiAgICB0aGlzLnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0Lm1hcChlbCA9PiB7XG4gICAgICBpZiAoZWwgPT0gZmlsZSkgZWwuc3RhdHVzID0gdHlwZVxuICAgIH0pXG4gIH1cblxuXG4gIC8qKuWbvueJh+S4iuS8oC3pgJLlvZLmjInpobrluo/kuIrkvKAgKi9cbiAgdXBsb2FkaW5nRmlsZShmaWxlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3RzKSA9PiB7XG4gICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSk7XG4gICAgICB0aGlzLmNyZWF0ZUZpbGUoe1xuICAgICAgICBmaWxlOiBmb3JtRGF0YSxcbiAgICAgICAgY29udGFpbmVyTmFtZTogdGhpcy5fZmlsZUNvbnRhaW5lck5hbWUsXG4gICAgICAgIGRpcmVjdG9yeUlkOiB0aGlzLl90aGVTZWxlY3RlZFRyZWVOb2RlPy5rZXkgfHwgJycsXG4gICAgICAgIGVudGl0eUlkOiAnJ1xuICAgICAgfSkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgcmVqZWN0cyhmYWxzZSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG5cbiAgLyoq5paH5Lu26KGo5qC8LeaVsOaNriovXG4gIGRhdGE6IFBhZ2VkUmVzdWx0RHRvPEZpbGVEZXNjcmlwdG9yRHRvPiA9IHtcbiAgICBpdGVtczogW10sXG4gICAgdG90YWxDb3VudDogMCxcbiAgfTtcblxuICAvKirmlofku7booajmoLwt5p2h5Lu2Ki9cbiAgZmlsdGVycyA9IHt9IGFzIEdldEZpbGVzSW5wdXQ7XG5cbiAgLyoq5paH5Lu26KGo5qC8LeihqOagvOiHquW4pumAieaLqeexu+WeiyAqL1xuICBTZWxlY3Rpb25UeXBlID0gU2VsZWN0aW9uVHlwZTtcblxuICAvKirmlofku7booajmoLwt6YCJ5oup55qE6KGo5qC85pWw5o2u6aG5ICovXG4gIHNlbGVjdGVkVGFibGUgPSBbXVxuXG4gIC8qKuW3sumAieWumueahOaWh+S7tiAqL1xuICBASW5wdXQoKSBzZWxlY3RQaWNrZXJGaWxlOiBhbnlbXVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvL0NhbGxlZCBiZWZvcmUgYW55IG90aGVyIGxpZmVjeWNsZSBob29rLiBVc2UgaXQgdG8gaW5qZWN0IGRlcGVuZGVuY2llcywgYnV0IGF2b2lkIGFueSBzZXJpb3VzIHdvcmsgaGVyZS5cbiAgICAvL0FkZCAnJHtpbXBsZW1lbnRzIE9uQ2hhbmdlc30nIHRvIHRoZSBjbGFzcy5cbiAgICB0aGlzLnNlbGVjdGVkVGFibGUgPSB0aGlzLl9GaWxlQXBpU2VydmljZS5kZWVwQ2xvbmUodGhpcy5zZWxlY3RQaWNrZXJGaWxlKVxuICB9XG4gIC8qKuW9k+WJjemAieaLqeeahHRhYmxl6aG5IGlkICovXG4gIG5vd1NlbGVjdElkOiBhbnkgPSAnJ1xuXG4gIC8qKumAieaLqeaWh+S7tuWbnuiwgyAqL1xuICAvLyBAT3V0cHV0KCkgc2VsZWN0ZWRGaWxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKVxuICBAT3V0cHV0KCkgc2VsZWN0RmlsZWZuID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKVxuXG4gIC8qKuaWh+S7tuihqOagvC3ojrflj5booajmoLzmlbDmja4gKi9cbiAgaG9va1RvUXVlcnkoKSB7XG4gICAgY29uc3QgZ2V0RGF0YSA9IChxdWVyeTogQUJQLlBhZ2VRdWVyeVBhcmFtcykgPT4gdGhpcy5fRmlsZVNlcnZpY2UuZ2V0TGlzdCh7XG4gICAgICAuLi5xdWVyeSxcbiAgICAgIC4uLnRoaXMuZmlsdGVycyxcbiAgICAgIGNvbnRhaW5lck5hbWU6IHRoaXMuX2ZpbGVDb250YWluZXJOYW1lLFxuICAgICAgZGlyZWN0b3J5SWQ6IHRoaXMuX3RoZVNlbGVjdGVkVHJlZU5vZGUua2V5XG4gICAgfSk7XG4gICAgY29uc3Qgc2V0RGF0YSA9IChsaXN0OiBQYWdlZFJlc3VsdER0bzxGaWxlRGVzY3JpcHRvckR0bz4pID0+ICh0aGlzLmRhdGEgPSBsaXN0KTtcbiAgICB0aGlzLmxpc3QuaG9va1RvUXVlcnkoZ2V0RGF0YSkuc3Vic2NyaWJlKHNldERhdGEpO1xuICB9XG5cbiAgLyoq5paH5Lu26KGo5qC8Leafpeeci+aJgOacieWIhue7hOeahOaWh+S7tuaVsOaNriAqL1xuICBsb29rQWxsRmlsZSgpIHtcbiAgICB0aGlzLl90aGVTZWxlY3RlZFRyZWVOb2RlID0gJydcbiAgICB0aGlzLmxpc3QuZ2V0KClcbiAgfVxuXG4gIC8qKumAieaLqeihqOagvOmhuSAqL1xuICBvblNlbGVjdFRhYmxlSXRlbSh7IHNlbGVjdGVkIH0pIHtcbiAgICB0aGlzLnNlbGVjdGVkVGFibGUgPSB0aGlzLl9GaWxlQXBpU2VydmljZS5kZWVwQ2xvbmUoc2VsZWN0ZWQpXG4gICAgbGV0IHNlbGVjdGVkVGFibGVhcnIgPSB0aGlzLnJlbW92ZUR1cGxpY2F0ZXNCeUlkKHRoaXMuc2VsZWN0ZWRUYWJsZSlcbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gc2VsZWN0ZWRUYWJsZWFyci5sZW5ndGgpIHtcbiAgICAgIHNlbGVjdGVkVGFibGVhcnIgPSBzZWxlY3RlZFRhYmxlYXJyLmZpbHRlcihlbCA9PiBlbC5pZCAhPT0gdGhpcy5ub3dTZWxlY3RJZClcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFRhYmxlID0gc2VsZWN0ZWRUYWJsZWFyclxuICB9XG5cbiAgLyoq5Yig6Zmk5pWw57uE5Lit6YeN5aSN55qE6aG5ICovXG4gIHJlbW92ZUR1cGxpY2F0ZXNCeUlkKGFycmF5KSB7XG4gICAgY29uc3Qgc2VlbklkcyA9IHt9O1xuICAgIHJldHVybiBhcnJheS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBpZiAoIXNlZW5JZHNbaXRlbS5pZF0pIHtcbiAgICAgICAgc2Vlbklkc1tpdGVtLmlkXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoq5LiA5Liq5biD5bCUb3Llh73mlbDvvIzlj6/nlKjkuo7mo4Dmn6XmmK/lkKbopoHmoLnmja7mnaHku7bpgInmi6nnibnlrprooYzjgIIgKi9cbiAgc2VsZWN0Q2hlY2sgPSAocm93LCBjb2x1bW4sIHZhbHVlKSA9PiB7XG4gICAgdGhpcy5ub3dTZWxlY3RJZCA9IHJvdy5pZFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoq5Yik5patcm935piv5ZCm6YCJ5LitICovXG4gIHNlbGVjdGVkY2hlY2tib3ggPSAoaWQpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRhYmxlLnNvbWUoZWwgPT4gZWwuaWQgPT0gaWQpXG4gIH1cblxuXG5cbiAgLyoq5Yig6Zmk5Zu+54mHICovXG4gIGRlbGV0ZUZpbGUoZmlsZSkge1xuXG4gICAgdGhpcy5jb25maXJtYXRpb25cbiAgICAgIC53YXJuKCcnLCB7IGtleTogJycsIGRlZmF1bHRWYWx1ZTogdGhpcy5fTG9jYWxpemF0aW9uU2VydmljZS5pbnN0YW50KGBBYnBVaTo6SXRlbVdpbGxCZURlbGV0ZWRNZXNzYWdlYCkgfSlcbiAgICAgIC5zdWJzY3JpYmUoKHN0YXR1czogQ29uZmlybWF0aW9uLlN0YXR1cykgPT4ge1xuICAgICAgICBpZiAoc3RhdHVzID09ICdjb25maXJtJykge1xuICAgICAgICAgIHRoaXMuX0ZpbGVTZXJ2aWNlLmRlbGV0ZShmaWxlLmlkKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3Rlci5zdWNjZXNzKHRoaXMuX0xvY2FsaXphdGlvblNlcnZpY2UuaW5zdGFudChgQWJwVWk6OlN1Y2Nlc3NmdWxseURlbGV0ZWRgKSk7XG4gICAgICAgICAgICB0aGlzLmxpc3QuZ2V0KClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKuWFs+mXreaWh+S7tueKtuaAgeW8ueeqlyAqL1xuICBjbG9zZUZpbGVTdGF0dXNNb2RhbCgpIHtcbiAgICB0aGlzLnVwbG9hZFBpY3R1cmVTdGF0dXNMaXN0ID0gW11cbiAgfVxuXG4gIC8qKuWIm+W7uuWbvueJh+eahOaOpeWPo++8jOS7o+eQhuS4reeahGZpbGXnsbvlnovkuI3ljLnphY3vvIzliIfmjaLkuLphbnnnsbvlnosgKi9cbiAgY3JlYXRlRmlsZSA9IChpbnB1dDogYW55LCBjb25maWc/OiBQYXJ0aWFsPFJlc3QuQ29uZmlnPikgPT5cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLnJlcXVlc3Q8YW55LCBGaWxlRGVzY3JpcHRvckR0bz4oe1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICB1cmw6ICcvYXBpL2ZpbGUtZXhwbG9yZXIvZmlsZXMnLFxuICAgICAgcGFyYW1zOiB7IGNvbnRhaW5lck5hbWU6IGlucHV0LmNvbnRhaW5lck5hbWUsIGNlbGxOYW1lOiBpbnB1dC5jZWxsTmFtZSwgZGlyZWN0b3J5SWQ6IGlucHV0LmRpcmVjdG9yeUlkLCBlbnRpdHlJZDogaW5wdXQuZW50aXR5SWQgfSxcbiAgICAgIGJvZHk6IGlucHV0LmZpbGUsXG4gICAgfSxcbiAgICAgIHsgYXBpTmFtZTogJ0ZpbGVFeHBsb3JlcicsIC4uLmNvbmZpZyB9KTtcbn1cbiIsIjxhYnAtbW9kYWwgWyh2aXNpYmxlKV09XCJNb2RhbE9wZW5cIiAodmlzaWJsZUNoYW5nZSk9XCJNb2RhbFZpc2libGVDaGFuZ2UoJGV2ZW50KVwiXG4gIFtvcHRpb25zXT1cInsgc2l6ZTogJ3hsJywgc2Nyb2xsYWJsZTogZmFsc2UgfVwiPlxuICA8bmctdGVtcGxhdGUgI2FicEhlYWRlcj5cbiAgICA8aDM+e3snRmlsZUV4cGxvcmVyOjpGaWxlRXhwbG9yZXInIHwgYWJwTG9jYWxpemF0aW9ufX08L2gzPlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgI2FicEJvZHk+XG4gICAgPGRpdiBjbGFzcz1cInJvdyBmaWxlLWV4cGxvcmVyLW1vZGFsLWJvZHkgZmlsZS1tb2RhbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCIgc3R5bGU9XCJvdmVyZmxvdzogYXV0bzsgaGVpZ2h0OiBjYWxjKDEwMHZoIC0gMjQwcHgpXCI+XG4gICAgICAgIDxmZS1maWxlLW1vZGFsLXRyZWUgW3RoZVNlbGVjdGVkVHJlZU5vZGVdPVwiX3RoZVNlbGVjdGVkVHJlZU5vZGVcIiAobm9kZUNsaWNrKT1cIl9ub2RlQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgW2ZpbGVDb250YWluZXJOYW1lXT1cIl9maWxlQ29udGFpbmVyTmFtZVwiPjwvZmUtZmlsZS1tb2RhbC10cmVlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTlcIiBzdHlsZT1cImhlaWdodDogY2FsYygxMDB2aCAtIDI0MHB4KVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1saW5rXCIgcm9sZT1idXR0b24gc3R5bGU9XCJmbGV4OiAyXCIgKGNsaWNrKT1cImxvb2tBbGxGaWxlKClcIj57eydGaWxlRXhwbG9yZXI6OkFsbEZpbGVzJyB8IGFicExvY2FsaXphdGlvbn19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGZvcm0tZmlsZVwiIHN0eWxlPVwiZmxleDogMlwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAjZmlsZUVkaXQgW211bHRpcGxlXT1cIl9tdWx0aXBsZVwiIGFjY2VwdD1cIi5qcGcsLmpwZWcsLnBuZywuZ2lmLC53ZWJwXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJnZXRGaWxlQ2hhbmdlKCRldmVudClcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bmd4LWRhdGF0YWJsZSBjbGFzcz1cIm1hdGVyaWFsIGNvbnRhaW5lci1oZWlnaHRcIiBbcm93c109XCJkYXRhLml0ZW1zXCIgW2xpc3RdPVwibGlzdFwiIGNvbHVtbk1vZGU9XCJmbGV4XCJcbiAgICAgICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIiBbaGVhZGVySGVpZ2h0XT1cIjUwXCIgW2Zvb3RlckhlaWdodF09XCI1MFwiIHJvd0hlaWdodD1cImF1dG9cIiBbc2Nyb2xsYmFyVl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2aXJ0dWFsaXphdGlvbl09XCJmYWxzZVwiIFtleHRlcm5hbFBhZ2luZ109XCJ0cnVlXCIgW2NvdW50XT1cImRhdGEudG90YWxDb3VudFwiIFtzZWxlY3RlZF09XCJzZWxlY3RlZFRhYmxlXCJcbiAgICAgICAgICAgIFtzZWxlY3RDaGVja109XCJzZWxlY3RDaGVja1wiIFtzZWxlY3Rpb25UeXBlXT1cIlNlbGVjdGlvblR5cGUubXVsdGlDbGlja1wiIChzZWxlY3QpPVwib25TZWxlY3RUYWJsZUl0ZW0oJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uIFt3aWR0aF09XCI1MFwiIHByb3A9XCJpZFwiIFtzb3J0YWJsZV09XCJmYWxzZVwiIFtjYW5BdXRvUmVzaXplXT1cImZhbHNlXCIgW2RyYWdnYWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtyZXNpemVhYmxlXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ3gtZGF0YXRhYmxlLWhlYWRlci10ZW1wbGF0ZSBsZXQtdmFsdWU9XCJ2YWx1ZVwiIGxldC1hbGxSb3dzU2VsZWN0ZWQ9XCJhbGxSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIGxldC1zZWxlY3RGbj1cInNlbGVjdEZuXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIFtjaGVja2VkXT1cImFsbFJvd3NTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNlbGVjdEZuKCFhbGxSb3dzU2VsZWN0ZWQpXCIgLz5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBsZXQtaXNTZWxlY3RlZD1cImlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIGxldC1vbkNoZWNrYm94Q2hhbmdlRm49XCJvbkNoZWNrYm94Q2hhbmdlRm5cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgW2NoZWNrZWRdPVwic2VsZWN0ZWRjaGVja2JveCh2YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlRm4oJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25neC1kYXRhdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgPG5neC1kYXRhdGFibGUtY29sdW1uIFtuYW1lXT1cIidGaWxlRXhwbG9yZXI6OkZpbGVOYW1lJyB8IGFicExvY2FsaXphdGlvblwiIHByb3A9XCJuYW1lXCIgW2ZsZXhHcm93XT1cIjRcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICB7eyB2YWx1ZSB9fVxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiAgW25hbWVdPVwiJ0ZpbGVFeHBsb3Jlcjo6RmlsZVNpemUnIHwgYWJwTG9jYWxpemF0aW9uXCIgcHJvcD1cInNpemVcIiBbZmxleEdyb3ddPVwiMS41XCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAge3sgX0ZpbGVBcGlTZXJ2aWNlLmZvcm1hdEZpbGVTaXplKHZhbHVlKSB9fVxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxuZ3gtZGF0YXRhYmxlLWNvbHVtbiAgW25hbWVdPVwiJ0ZpbGVFeHBsb3Jlcjo6RGlyZWN0b3J5JyB8IGFicExvY2FsaXphdGlvblwiIHByb3A9XCJjZWxsTmFtZVwiIFtmbGV4R3Jvd109XCIxXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIiBuZ3gtZGF0YXRhYmxlLWNlbGwtdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAge3sgdmFsdWUgfX1cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmd4LWRhdGF0YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICA8bmd4LWRhdGF0YWJsZS1jb2x1bW4gW25hbWVdPVwiJ0ZpbGVFeHBsb3Jlcjo6Q3JlYXRpb25UaW1lJyB8IGFicExvY2FsaXphdGlvblwiIHByb3A9XCJjcmVhdGlvblRpbWVcIiBbZmxleEdyb3ddPVwiMlwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCIgbmd4LWRhdGF0YWJsZS1jZWxsLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIHt7IHZhbHVlIHwgZGF0ZSA6ICdZWVlZL01NL2RkIEhIOm06cycgfX1cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmd4LWRhdGF0YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICA8bmd4LWRhdGF0YWJsZS1jb2x1bW4gW2ZsZXhHcm93XT1cIjFcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiIG5neC1kYXRhdGFibGUtY2VsbC10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQgcC0wXCIgKGNsaWNrLnN0b3ApPVwiZGVsZXRlRmlsZShyb3cpXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaCB0ZXh0LXByaW1hcnkgcC0yXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZ3gtZGF0YXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICA8L25neC1kYXRhdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwidXBsb2FkUGljdHVyZVN0YXR1c0xpc3QubGVuZ3RoID4gMFwiXG4gICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1maXhlZCBib3R0b20tMCBlbmQtMCBzaGFkb3ctbGcgZmlsZS1zdGF0dXMtbW9kYWwgYm9yZGVyIGJnLXdoaXRlIHAtMSBtLTVcIlxuICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLXJhZGl1czogMTBweFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBwLTAgcHktMSBib3JkZXItYm90dG9tXCI+XG4gICAgICAgICAgICAgIDxkaXY+e3snRmlsZUV4cGxvcmVyOjpVcGxvYWRGaWxlcycgfCBhYnBMb2NhbGl6YXRpb259fTwvZGl2PlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljay5zdG9wKT1cImNsb3NlRmlsZVN0YXR1c01vZGFsKClcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZVwiPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snRmlsZUV4cGxvcmVyOjpGaWxlTmFtZScgfCBhYnBMb2NhbGl6YXRpb259fTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPnt7J0ZpbGVFeHBsb3Jlcjo6RmlsZVNpemUnIHwgYWJwTG9jYWxpemF0aW9ufX08L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdXBsb2FkUGljdHVyZVN0YXR1c0xpc3Q7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eyBpdGVtLm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHQgdGV4dC1kYW5nZXJcIiAqbmdJZj1cIml0ZW0uc2l6ZSA+IHNpemVMaW1pdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eydGaWxlRXhwbG9yZXI6OkV4Y2VlZHNNYXhpbXVtU2l6ZScgfCBhYnBMb2NhbGl6YXRpb246X0ZpbGVBcGlTZXJ2aWNlLmZvcm1hdEZpbGVTaXplKHNpemVMaW1pdCl9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgaXRlbS5maWxlU2l6ZSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PSAxXCIgY2xhc3M9XCJmYXMgZmEtY2hlY2sgdGV4dC1wcmltYXJ5XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PSAyXCIgY2xhc3M9XCJmYXMgZmEtdGltZXMtY2lyY2xlIHRleHQtZGFuZ2VyXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSAjYWJwRm9vdGVyPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBhYnBDbG9zZT57eydBYnBVaTo6Q2xvc2UnIHwgYWJwTG9jYWxpemF0aW9ufX08L2J1dHRvbj5cbiAgICA8YWJwLWJ1dHRvbiBpY29uQ2xhc3M9XCJmYSBmYS1jaGVja1wiIChjbGljayk9XCJtb2RhbFNhdmUoKVwiPnt7J0FicFVpOjpTYXZlJyB8IGFicExvY2FsaXphdGlvbn19PC9hYnAtYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9hYnAtbW9kYWw+Il19