@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.
Files changed (55) hide show
  1. package/README.md +128 -24
  2. package/esm2022/config/dignite-ng-expand.file-explorer-config.mjs +1 -1
  3. package/esm2022/config/enums/index.mjs +1 -1
  4. package/esm2022/config/enums/route-names.mjs +1 -1
  5. package/esm2022/config/file-config.module.mjs +1 -1
  6. package/esm2022/config/providers/index.mjs +1 -1
  7. package/esm2022/config/providers/route.provider.mjs +1 -1
  8. package/esm2022/config/public-api.mjs +1 -1
  9. package/esm2022/dignite-ng-expand.file-explorer.mjs +1 -1
  10. package/esm2022/lib/components/dome/file-dome.component.mjs +2 -4
  11. package/esm2022/lib/components/dynamic-form/file-explorer/file-explorer-config.component.mjs +3 -2
  12. package/esm2022/lib/components/dynamic-form/file-explorer/file-explorer-config.mjs +1 -1
  13. package/esm2022/lib/components/dynamic-form/file-explorer/file-explorer-control.component.mjs +3 -3
  14. package/esm2022/lib/components/dynamic-form/file-explorer/file-explorer-view.component.mjs +3 -3
  15. package/esm2022/lib/components/dynamic-form/file-explorer/index.mjs +1 -1
  16. package/esm2022/lib/components/dynamic-form/form-control-group.mjs +1 -1
  17. package/esm2022/lib/components/file-edit/file-edit.component.mjs +34 -24
  18. package/esm2022/lib/components/file-modal/file-modal.component.mjs +293 -85
  19. package/esm2022/lib/components/file-modal-tree/file-modal-tree.component.mjs +135 -60
  20. package/esm2022/lib/components/file-picker/file-picker.component.mjs +20 -12
  21. package/esm2022/lib/components/index.mjs +1 -1
  22. package/esm2022/lib/file-explorer-routing.module.mjs +1 -1
  23. package/esm2022/lib/file-explorer.module.mjs +36 -11
  24. package/esm2022/lib/pipe/format-file-size.pipe.mjs +35 -0
  25. package/esm2022/lib/pipe/get-directory-name.pipe.mjs +20 -0
  26. package/esm2022/lib/previews/file-preview.component.mjs +2 -1
  27. package/esm2022/lib/previews/index.mjs +1 -1
  28. package/esm2022/lib/previews/models.mjs +1 -1
  29. package/esm2022/lib/proxy/dignite/file-explorer/directories/file-descriptor.service.mjs +2 -1
  30. package/esm2022/lib/proxy/dignite/file-explorer/directories/index.mjs +1 -1
  31. package/esm2022/lib/proxy/dignite/file-explorer/directories/models.mjs +1 -1
  32. package/esm2022/lib/proxy/dignite/file-explorer/files/file-descriptor.service.mjs +11 -3
  33. package/esm2022/lib/proxy/dignite/file-explorer/files/index.mjs +1 -1
  34. package/esm2022/lib/proxy/dignite/file-explorer/files/models.mjs +1 -1
  35. package/esm2022/lib/proxy/microsoft/asp-net-core/mvc/models.mjs +1 -1
  36. package/esm2022/lib/proxy/microsoft/extensions/primitives/models.mjs +1 -1
  37. package/esm2022/lib/proxy/microsoft/net/http/headers/models.mjs +1 -1
  38. package/esm2022/lib/proxy/volo/abp/content/models.mjs +1 -1
  39. package/esm2022/public-api.mjs +1 -3
  40. package/fesm2022/dignite-ng-expand.file-explorer-config.mjs.map +1 -1
  41. package/fesm2022/dignite-ng-expand.file-explorer.mjs +541 -238
  42. package/fesm2022/dignite-ng-expand.file-explorer.mjs.map +1 -1
  43. package/lib/components/dome/file-dome.component.d.ts +0 -1
  44. package/lib/components/file-edit/file-edit.component.d.ts +6 -4
  45. package/lib/components/file-modal/file-modal.component.d.ts +63 -25
  46. package/lib/components/file-modal-tree/file-modal-tree.component.d.ts +21 -12
  47. package/lib/components/file-picker/file-picker.component.d.ts +2 -3
  48. package/lib/file-explorer.module.d.ts +5 -1
  49. package/lib/pipe/format-file-size.pipe.d.ts +14 -0
  50. package/lib/pipe/get-directory-name.pipe.d.ts +7 -0
  51. package/lib/proxy/dignite/file-explorer/files/file-descriptor.service.d.ts +3 -1
  52. package/lib/proxy/dignite/file-explorer/files/models.d.ts +5 -2
  53. package/package.json +25 -7
  54. package/esm2022/lib/services/file-api.service.mjs +0 -68
  55. package/lib/services/file-api.service.d.ts +0 -14
@@ -1,25 +1,29 @@
1
+ /* eslint-disable @typescript-eslint/no-this-alias */
1
2
  /* eslint-disable @angular-eslint/component-selector */
2
- import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
3
- import { Validators } from '@angular/forms';
4
- import { of } from 'rxjs';
3
+ import { Component, ElementRef, EventEmitter, inject, Input, Output, ViewChild, } from '@angular/core';
4
+ import { FormBuilder, Validators } from '@angular/forms';
5
+ import * as DescriptorService from '../../proxy/dignite/file-explorer/directories';
6
+ import { ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
7
+ import { finalize, map, of, tap } from 'rxjs';
8
+ import { LocalizationService } from '@abp/ng.core';
9
+ import { ValidatorsService } from '@dignite-ng/expand.core';
5
10
  import * as i0 from "@angular/core";
6
11
  import * as i1 from "../../proxy/dignite/file-explorer/directories";
7
12
  import * as i2 from "@angular/forms";
8
13
  import * as i3 from "@abp/ng.theme.shared";
9
- import * as i4 from "../../services/file-api.service";
10
- import * as i5 from "@abp/ng.core";
11
- import * as i6 from "@angular/common";
12
- import * as i7 from "@ngx-validate/core";
13
- import * as i8 from "@ng-bootstrap/ng-bootstrap";
14
- import * as i9 from "ng-zorro-antd/tree";
15
- var that;
14
+ import * as i4 from "@abp/ng.core";
15
+ import * as i5 from "@angular/common";
16
+ import * as i6 from "@ngx-validate/core";
17
+ import * as i7 from "@ng-bootstrap/ng-bootstrap";
18
+ import * as i8 from "@abp/ng.components/tree";
19
+ let that;
16
20
  export class FileModalTreeComponent {
17
- constructor(_DescriptorService, fb, toaster, _FileApiService, _LocalizationService) {
21
+ constructor(_DescriptorService, fb, toaster, _LocalizationService, confirmation) {
18
22
  this._DescriptorService = _DescriptorService;
19
23
  this.fb = fb;
20
24
  this.toaster = toaster;
21
- this._FileApiService = _FileApiService;
22
25
  this._LocalizationService = _LocalizationService;
26
+ this.confirmation = confirmation;
23
27
  /**文件分组列表 */
24
28
  this.fileGroupList = [];
25
29
  /**选择的tree节点 */
@@ -30,25 +34,41 @@ export class FileModalTreeComponent {
30
34
  this.anExpandedNode = [];
31
35
  /**tree节点选择回调 */
32
36
  this.nodeClick = new EventEmitter();
33
- this.handleClick = (event) => event.stopPropagation();
37
+ /**获取数据后回调给file-modal */
38
+ this.treeNodeData = new EventEmitter();
39
+ /**查看所有文件回调函数,在file-modal中处理逻辑 */
40
+ this.lookAllBtn = new EventEmitter();
41
+ this.handleClick = event => event.stopPropagation();
42
+ this.selectedNode = [];
34
43
  /**判断节点是否选中 */
35
- this.isNodeSelected = (el) => el.key === this._theSelectedTreeNode?.key;
44
+ this.isNodeSelected = el => {
45
+ return el.key === this._theSelectedTreeNode?.key;
46
+ };
36
47
  /**分组 */
37
48
  /**模态框-状态-是否打开 */
38
49
  this.ModalDescriptorOpen = false;
39
50
  /**模态框-descriptor-繁忙状态-用于确定模态的繁忙状态是否为真 */
40
51
  this.ModalDescriptorBusy = false;
52
+ this.formValidation = '';
53
+ this._ValidatorsService = inject(ValidatorsService);
41
54
  that = this;
42
55
  }
43
56
  set theSelectedTreeNode(v) {
44
57
  this._theSelectedTreeNode = v;
45
- if (v.length > 0) {
58
+ if (v == '') {
46
59
  this.loadData();
47
60
  }
48
61
  }
49
62
  set fileContainerName(v) {
50
63
  if (v) {
51
64
  this._fileContainerName = v;
65
+ // this.loadData();
66
+ }
67
+ }
68
+ ngAfterContentInit() {
69
+ //Called after ngOnInit when the component's or directive's content has been initialized.
70
+ //Add 'implements AfterContentInit' to the class.
71
+ if (this._fileContainerName) {
52
72
  this.loadData();
53
73
  }
54
74
  }
@@ -59,48 +79,70 @@ export class FileModalTreeComponent {
59
79
  }
60
80
  /**获取文件分组 */
61
81
  getFileGroupList() {
62
- this._DescriptorService.getList({
82
+ this._DescriptorService
83
+ .getList({
63
84
  containerName: this._fileContainerName,
64
- }).subscribe(async (res) => {
85
+ })
86
+ .subscribe(async (res) => {
65
87
  this.fileGroupList = await this.setTheValueOfTheNodeRecursively(res.items);
88
+ this.treeNodeData.emit(this.fileGroupList);
66
89
  });
67
90
  }
68
- /**递归设置节点的值 */
69
- setTheValueOfTheNodeRecursively(array) {
70
- return new Promise((reslove, rejects) => {
71
- array.forEach((el) => {
72
- el.title = el.name;
73
- el.key = el.id;
74
- el.expanded = this.anExpandedNode.includes(el.key);
75
- if (el.children.length > 0) {
76
- this.setTheValueOfTheNodeRecursively(el.children);
77
- }
78
- });
79
- reslove(array);
91
+ /**查看所有文件 */
92
+ onLookAllBtn() {
93
+ this.lookAllBtn.emit();
94
+ }
95
+ /**递归-将列表转化为父子级结构 */
96
+ setTheValueOfTheNodeRecursively(array, parentId = null, root) {
97
+ const rootList = root || array;
98
+ const result = array.filter(item => item.parentId === parentId);
99
+ result.sort((a, b) => a.order - b.order);
100
+ result.map((el) => {
101
+ el.title = el.name;
102
+ el.key = el.id;
103
+ el.entity = el.id; /** 节点值 */
104
+ el.expanded = this.anExpandedNode.includes(el.key);
105
+ el.children.sort((a, b) => a.order - b.order);
106
+ if (el.children.length > 0) {
107
+ this.setTheValueOfTheNodeRecursively(el.children, el.id, rootList);
108
+ }
80
109
  });
110
+ return result;
81
111
  }
82
112
  /**tree-拖拽 */
83
- nzEvent(event) {
84
- }
113
+ nzEvent(event) { }
85
114
  /**tree-拖拽 -验证*/
86
115
  beforeDrop(arg) {
87
- if (arg.pos === 0 || arg.pos === 1) {
88
- that._DescriptorService.move(arg.dragNode.key, {
89
- "parentId": arg.pos === 1 ? (arg.node.parentNode?.key || '') : arg.node.key,
90
- "order": arg.pos === 1 ? arg.node.origin.order + 1 : arg.node.origin.children.length + 1
91
- }).subscribe(res => {
92
- that.getFileGroupList();
93
- });
94
- return of(true);
95
- }
96
- else {
97
- return of(false);
116
+ const { pos, dragNode, node } = arg;
117
+ // 只处理有效的拖拽位置
118
+ if (pos === 0 || pos === 1 || pos === -1) {
119
+ // 根据不同的拖拽位置计算参数
120
+ const parentId = pos === 0 ? node.key : node.parentNode?.key || '';
121
+ let order;
122
+ if (pos === 1) {
123
+ order = node.origin.order + 1;
124
+ }
125
+ else if (pos === 0) {
126
+ order = node.origin.children.length + 1;
127
+ }
128
+ else {
129
+ // pos === -1
130
+ order = Math.max(0, node.origin.order - 1);
131
+ }
132
+ // 统一处理移动逻辑
133
+ return that._DescriptorService.move(dragNode.key, { parentId, order }).pipe(tap(() => that.getFileGroupList()), map(() => true));
98
134
  }
135
+ return of(false);
99
136
  }
100
137
  /**tree--选择节点 */
101
- activeNode(event) {
102
- this._theSelectedTreeNode = event.node;
103
- this.nodeClick.emit(event.node);
138
+ activeNode(node) {
139
+ if (event?.target?.localName == 'i')
140
+ return;
141
+ if (this._theSelectedTreeNode?.key == node.key)
142
+ return;
143
+ this.selectedNode = [node];
144
+ this._theSelectedTreeNode = node;
145
+ this.nodeClick.emit(node);
104
146
  }
105
147
  /**点击展开树节点图标触发 */
106
148
  nzExpandChange(event) {
@@ -119,23 +161,32 @@ export class FileModalTreeComponent {
119
161
  this.ModalDescriptorForm = this.fb.group({
120
162
  containerName: [this._fileContainerName || '', Validators.required],
121
163
  name: ['', Validators.required],
122
- parentId: [items?.key || '', Validators.required],
164
+ parentId: [items?.key || ''],
123
165
  });
124
166
  /**编辑 */
125
167
  if (edit) {
126
168
  this.theNodeBeingEdited = items.origin;
127
169
  this.ModalDescriptorForm.patchValue({
128
- name: items.origin.name
170
+ name: items.origin.name,
129
171
  });
130
172
  }
131
173
  }
132
174
  /**删除分组 */
133
175
  deleteDescriptorBtn(node) {
134
- this._DescriptorService.delete(node.key).subscribe(res => {
135
- this.ModalDescriptorOpen = false;
136
- if (this.theNodeBeingEdited.key == node.key)
137
- this.theNodeBeingEdited = '';
138
- this.getFileGroupList();
176
+ this.confirmation
177
+ .warn('', {
178
+ key: '',
179
+ defaultValue: this._LocalizationService.instant(`FileExplorer::DeletionConfirmationMessage`, node.title),
180
+ })
181
+ .subscribe((status) => {
182
+ if (status == 'confirm') {
183
+ this._DescriptorService.delete(node.key).subscribe(res => {
184
+ this.ModalDescriptorOpen = false;
185
+ if (this.theNodeBeingEdited.key == node.key)
186
+ this.theNodeBeingEdited = '';
187
+ this.getFileGroupList();
188
+ });
189
+ }
139
190
  });
140
191
  }
141
192
  /**模态框-descriptor-状态改变回调 */
@@ -148,33 +199,57 @@ export class FileModalTreeComponent {
148
199
  }
149
200
  /**f分组模态框保存 */
150
201
  createOrEditSave() {
151
- let input = this.ModalDescriptorForm.value;
202
+ const input = this.ModalDescriptorForm.value;
203
+ this.formValidation = this._ValidatorsService.getFormValidationStatus(this.ModalDescriptorForm);
204
+ if (this._ValidatorsService.isCheckForm(this.formValidation, 'FileExplorer'))
205
+ return;
206
+ if (!this.ModalDescriptorForm.valid)
207
+ return;
208
+ if (this.ModalDescriptorBusy)
209
+ return;
210
+ this.ModalDescriptorBusy = true;
152
211
  if (this.theNodeBeingEdited) {
153
- this._DescriptorService.update(this.theNodeBeingEdited.key, input).subscribe(res => {
212
+ this._DescriptorService
213
+ .update(this.theNodeBeingEdited.key, input)
214
+ .pipe(finalize(() => {
215
+ this.ModalDescriptorBusy = false;
216
+ }))
217
+ .subscribe(res => {
154
218
  this.ModalDescriptorOpen = false;
219
+ this.ModalDescriptorVisibleChange(false);
155
220
  this.getFileGroupList();
156
221
  });
157
222
  return;
158
223
  }
159
- this._DescriptorService.create(input).subscribe(res => {
224
+ this._DescriptorService
225
+ .create(input)
226
+ .pipe(finalize(() => {
227
+ this.ModalDescriptorBusy = false;
228
+ }))
229
+ .subscribe(res => {
160
230
  this.ModalDescriptorOpen = false;
231
+ this.ModalDescriptorVisibleChange(false);
161
232
  this.getFileGroupList();
162
233
  });
163
234
  }
164
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FileModalTreeComponent, deps: [{ token: i1.FileDescriptorService }, { token: i2.FormBuilder }, { token: i3.ToasterService }, { token: i4.FileApiService }, { token: i5.LocalizationService }], target: i0.ɵɵFactoryTarget.Component }); }
165
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.5", type: FileModalTreeComponent, selector: "fe-file-modal-tree", inputs: { theSelectedTreeNode: "theSelectedTreeNode", fileContainerName: "fileContainerName" }, outputs: { nodeClick: "nodeClick" }, viewQueries: [{ propertyName: "ModalFormDescriptorSubmit", first: true, predicate: ["ModalFormDescriptorSubmit"], descendants: true }], ngImport: i0, template: "<div class=\"card-header p-0 mb-1 d-flex justify-content-between align-items-center\">\n <h6 class=\"h6 mb-0\">{{'FileExplorer::MyDirectories' | abpLocalization}}</h6>\n <button type=\"button\" class=\"btn btn-light btn-sm ms-2\" (click.stop)=\"addDescriptorBtn()\"><i\n class=\"fas fa-plus-circle\" aria-hidden=\"true\"></i></button>\n</div>\n<nz-tree [nzData]=\"fileGroupList\" class=\"ng-zorro-antd-tree\" nzDraggable nzBlockNode nzShowIcon\n [nzExpandedIcon]=\"multiExpandedIconTpl\" (nzOnDrop)=\"nzEvent($event)\" [nzBeforeDrop]=\"beforeDrop\"\n (nzClick)=\"activeNode($event)\" (nzExpandChange)=\"nzExpandChange($event)\" [nzTreeTemplate]=\"nzTreeTemplate\">\n <ng-template #nzTreeTemplate let-node let-origin=\"origin\">\n <div class=\"custom-node d-inline-block ng-star-inserted dropdown\" [title]=\"node.title\">\n <div #dropdown=\"ngbDropdown\" class=\"d-inline-block\" ngbDropdown placement=\"bottom\" container=\"body\">\n <div class=\"btn-group\" [class.selected]=\"isNodeSelected(node)\">\n <button class=\"btn btn-sm p-0 px-1\">{{ node.title }}</button>\n <button class=\"btn btn-sm p-0\" (click)=\"handleClick($event)\" ngbDropdownToggle\n [class.dropdown-toggle]=\"false\" aria-hidden=\"true\">\n <i class=\"fas fa-caret-down text-muted p-1\"></i>\n </button>\n </div>\n <div ngbDropdownMenu>\n <button ngbDropdownItem\n (click.stop)=\"addDescriptorBtn(node)\">{{'FileExplorer::NewDirectory' | abpLocalization}}</button>\n <button ngbDropdownItem\n (click.stop)=\"addDescriptorBtn(node,true)\">{{'AbpUi::Edit' | abpLocalization}}</button>\n <button ngbDropdownItem\n (click.stop)=\"deleteDescriptorBtn(node)\">{{'AbpUi::Delete' | abpLocalization}}</button>\n </div>\n </div>\n </div>\n </ng-template>\n <ng-template #multiExpandedIconTpl let-node let-origin=\"origin\">\n <ng-container *ngIf=\"node.children.length > 0\">\n <i [class]=\"node.isExpanded ? 'fas fa-caret-down' : 'fas fa-caret-right'\"></i>\n </ng-container>\n </ng-template>\n</nz-tree>\n\n\n<abp-modal [(visible)]=\"ModalDescriptorOpen\" [busy]=\"ModalDescriptorBusy\"\n (visibleChange)=\"ModalDescriptorVisibleChange($event)\">\n <ng-template #abpHeader>\n <h3>{{theNodeBeingEdited?('AbpUi::Edit' | abpLocalization):('FileExplorer::NewDirectory' | abpLocalization)}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <ng-template #loaderRef>\n <div class=\"text-center\"><i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i></div>\n </ng-template>\n <ng-container *ngIf=\"ModalDescriptorForm; else loaderRef\">\n <form class=\"sites-modal-form\" #myForm=\"ngForm\" [formGroup]=\"ModalDescriptorForm\"\n (keydown.enter)=\"$event.preventDefault()\" (submit)=\"createOrEditSave()\">\n <button type=\"submit\" #ModalFormDescriptorSubmit style=\"display: none\"></button>\n <div class=\"mb-3\">\n <label class=\"form-label\">{{'FileExplorer::DirectoryName' | abpLocalization}}</label>\n <input type=\"email\" class=\"form-control\" formControlName=\"name\">\n </div>\n </form>\n </ng-container>\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\"\n (click)=\"ModalFormDescriptorSubmit.nativeElement.click()\">{{'AbpUi::Save' | abpLocalization}}</abp-button>\n </ng-template>\n</abp-modal>", styles: [""], dependencies: [{ kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i5.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "directive", type: i7.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i7.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: i3.ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: i3.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: i3.ModalCloseDirective, selector: "[abpClose]" }, { kind: "directive", type: i8.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i8.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i8.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i8.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["tabindex", "disabled"] }, { kind: "directive", type: i8.NgbDropdownButtonItem, selector: "button[ngbDropdownItem]" }, { kind: "component", type: i9.NzTreeComponent, selector: "nz-tree", inputs: ["nzShowIcon", "nzHideUnMatched", "nzBlockNode", "nzExpandAll", "nzSelectMode", "nzCheckStrictly", "nzShowExpand", "nzShowLine", "nzCheckable", "nzAsyncData", "nzDraggable", "nzMultiple", "nzExpandedIcon", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzTreeTemplate", "nzBeforeDrop", "nzData", "nzExpandedKeys", "nzSelectedKeys", "nzCheckedKeys", "nzSearchValue", "nzSearchFunc"], outputs: ["nzExpandedKeysChange", "nzSelectedKeysChange", "nzCheckedKeysChange", "nzSearchValueChange", "nzClick", "nzDblClick", "nzContextMenu", "nzCheckBoxChange", "nzExpandChange", "nzOnDragStart", "nzOnDragEnter", "nzOnDragOver", "nzOnDragLeave", "nzOnDrop", "nzOnDragEnd"], exportAs: ["nzTree"] }, { kind: "pipe", type: i5.LocalizationPipe, name: "abpLocalization" }] }); }
235
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FileModalTreeComponent, deps: [{ token: i1.FileDescriptorService }, { token: i2.FormBuilder }, { token: i3.ToasterService }, { token: i4.LocalizationService }, { token: i3.ConfirmationService }], target: i0.ɵɵFactoryTarget.Component }); }
236
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.5", type: FileModalTreeComponent, selector: "fe-file-modal-tree", inputs: { theSelectedTreeNode: "theSelectedTreeNode", fileContainerName: "fileContainerName" }, outputs: { nodeClick: "nodeClick", treeNodeData: "treeNodeData", lookAllBtn: "lookAllBtn" }, viewQueries: [{ propertyName: "ModalFormDescriptorSubmit", first: true, predicate: ["ModalFormDescriptorSubmit"], descendants: true }], ngImport: i0, template: "<div class=\"card-header p-0 mb-1 d-flex justify-content-between align-items-center\">\n <h6 class=\"h6 mb-0 btn-link\" role=\"button\" (click.stop)=\"onLookAllBtn()\">{{'FileExplorer::MyDirectories' | abpLocalization}}</h6>\n <button type=\"button\" class=\"btn btn-light btn-sm ms-2\" (click.stop)=\"addDescriptorBtn()\"><i\n class=\"fas fa-plus-circle\" aria-hidden=\"true\"></i></button>\n</div>\n@if(fileGroupList.length>0){\n<abp-tree [nodes]=\"fileGroupList\" (nzExpandChange)=\"nzExpandChange($event)\" [draggable]=\"true\"\n (dropOver)=\"nzEvent($event)\" [beforeDrop]=\"beforeDrop\" (selectedNodeChange)=\"activeNode($event)\" [changeCheckboxWithNode]=\"true\" [isNodeSelected]=\"isNodeSelected\">\n\n <ng-template #menu let-node>\n <button ngbDropdownItem (click.stop)=\"addDescriptorBtn(node)\"><i\n class=\" me-1 fa fa-pencil\"></i>{{'FileExplorer::NewDirectory' | abpLocalization}}</button>\n <button ngbDropdownItem (click.stop)=\"addDescriptorBtn(node,true)\"><i\n class=\" me-1 fa fa-plus\"></i>{{'AbpUi::Edit' | abpLocalization}}</button>\n <button ngbDropdownItem (click.stop)=\"deleteDescriptorBtn(node)\"><i\n class=\" me-1 fa fa-remove\"></i>{{'AbpUi::Delete' | abpLocalization}}</button>\n </ng-template>\n\n <ng-template abpTreeExpandedIconTemplate let-node let-origin=\"origin\">\n <i aria-hidden=\"true\" *ngIf=\"node.children.length>0\">\n <ng-container *ngTemplateOutlet=\"node.isExpanded ? minusIcon : plusIcon\"></ng-container></i>\n </ng-template>\n\n <ng-template #minusIcon>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" fill-rule=\"evenodd\"\n clip-rule=\"evenodd\">\n <path\n d=\"M11.5 0c6.347 0 11.5 5.153 11.5 11.5s-5.153 11.5-11.5 11.5-11.5-5.153-11.5-11.5 5.153-11.5 11.5-11.5zm0 1c5.795 0 10.5 4.705 10.5 10.5s-4.705 10.5-10.5 10.5-10.5-4.705-10.5-10.5 4.705-10.5 10.5-10.5zm-6.5 10h13v1h-13v-1z\" />\n </svg>\n </ng-template>\n\n <ng-template #plusIcon>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" fill-rule=\"evenodd\"\n clip-rule=\"evenodd\">\n <path\n d=\"M11.5 0c6.347 0 11.5 5.153 11.5 11.5s-5.153 11.5-11.5 11.5-11.5-5.153-11.5-11.5 5.153-11.5 11.5-11.5zm0 1c5.795 0 10.5 4.705 10.5 10.5s-4.705 10.5-10.5 10.5-10.5-4.705-10.5-10.5 4.705-10.5 10.5-10.5zm.5 10h6v1h-6v6h-1v-6h-6v-1h6v-6h1v6z\" />\n </svg>\n </ng-template>\n</abp-tree>\n\n}\n<abp-modal [(visible)]=\"ModalDescriptorOpen\" [busy]=\"ModalDescriptorBusy\"\n (visibleChange)=\"ModalDescriptorVisibleChange($event)\">\n <ng-template #abpHeader>\n <h3>{{theNodeBeingEdited?('AbpUi::Edit' | abpLocalization):('FileExplorer::NewDirectory' | abpLocalization)}}\n </h3>\n </ng-template>\n <ng-template #abpBody>\n <ng-template #loaderRef>\n <div class=\"text-center\"><i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i></div>\n </ng-template>\n <ng-container *ngIf=\"ModalDescriptorForm; else loaderRef\">\n <form class=\"sites-modal-form\" #myForm=\"ngForm\" [formGroup]=\"ModalDescriptorForm\"\n (keydown.enter)=\"$event.preventDefault()\" (submit)=\"createOrEditSave()\">\n <button type=\"submit\" #ModalFormDescriptorSubmit style=\"display: none\"></button>\n <div class=\"mb-3\">\n <label class=\"form-label\">{{'FileExplorer::DirectoryName' | abpLocalization}}</label>\n <input type=\"email\" class=\"form-control\" formControlName=\"name\">\n </div>\n </form>\n </ng-container>\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\" [loading]=\"ModalDescriptorBusy\"\n (click)=\"ModalFormDescriptorSubmit.nativeElement.click()\">{{'AbpUi::Save' | abpLocalization}}</abp-button>\n </ng-template>\n</abp-modal>", styles: [""], dependencies: [{ kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i4.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "directive", type: i6.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i6.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: i3.ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: i3.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: i3.ModalCloseDirective, selector: "[abpClose]" }, { kind: "directive", type: i7.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["tabindex", "disabled"] }, { kind: "directive", type: i7.NgbDropdownButtonItem, selector: "button[ngbDropdownItem]" }, { kind: "directive", type: i8.ExpandedIconTemplateDirective, selector: "[abpTreeExpandedIconTemplate],[abp-tree-expanded-icon-template]" }, { kind: "component", type: i8.TreeComponent, selector: "abp-tree", inputs: ["noAnimation", "draggable", "checkable", "checkStrictly", "checkedKeys", "nodes", "expandedKeys", "selectedNode", "changeCheckboxWithNode", "isNodeSelected", "beforeDrop"], outputs: ["checkedKeysChange", "expandedKeysChange", "selectedNodeChange", "dropOver", "nzExpandChange"] }, { kind: "pipe", type: i4.LocalizationPipe, name: "abpLocalization" }] }); }
166
237
  }
167
238
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FileModalTreeComponent, decorators: [{
168
239
  type: Component,
169
- args: [{ selector: 'fe-file-modal-tree', template: "<div class=\"card-header p-0 mb-1 d-flex justify-content-between align-items-center\">\n <h6 class=\"h6 mb-0\">{{'FileExplorer::MyDirectories' | abpLocalization}}</h6>\n <button type=\"button\" class=\"btn btn-light btn-sm ms-2\" (click.stop)=\"addDescriptorBtn()\"><i\n class=\"fas fa-plus-circle\" aria-hidden=\"true\"></i></button>\n</div>\n<nz-tree [nzData]=\"fileGroupList\" class=\"ng-zorro-antd-tree\" nzDraggable nzBlockNode nzShowIcon\n [nzExpandedIcon]=\"multiExpandedIconTpl\" (nzOnDrop)=\"nzEvent($event)\" [nzBeforeDrop]=\"beforeDrop\"\n (nzClick)=\"activeNode($event)\" (nzExpandChange)=\"nzExpandChange($event)\" [nzTreeTemplate]=\"nzTreeTemplate\">\n <ng-template #nzTreeTemplate let-node let-origin=\"origin\">\n <div class=\"custom-node d-inline-block ng-star-inserted dropdown\" [title]=\"node.title\">\n <div #dropdown=\"ngbDropdown\" class=\"d-inline-block\" ngbDropdown placement=\"bottom\" container=\"body\">\n <div class=\"btn-group\" [class.selected]=\"isNodeSelected(node)\">\n <button class=\"btn btn-sm p-0 px-1\">{{ node.title }}</button>\n <button class=\"btn btn-sm p-0\" (click)=\"handleClick($event)\" ngbDropdownToggle\n [class.dropdown-toggle]=\"false\" aria-hidden=\"true\">\n <i class=\"fas fa-caret-down text-muted p-1\"></i>\n </button>\n </div>\n <div ngbDropdownMenu>\n <button ngbDropdownItem\n (click.stop)=\"addDescriptorBtn(node)\">{{'FileExplorer::NewDirectory' | abpLocalization}}</button>\n <button ngbDropdownItem\n (click.stop)=\"addDescriptorBtn(node,true)\">{{'AbpUi::Edit' | abpLocalization}}</button>\n <button ngbDropdownItem\n (click.stop)=\"deleteDescriptorBtn(node)\">{{'AbpUi::Delete' | abpLocalization}}</button>\n </div>\n </div>\n </div>\n </ng-template>\n <ng-template #multiExpandedIconTpl let-node let-origin=\"origin\">\n <ng-container *ngIf=\"node.children.length > 0\">\n <i [class]=\"node.isExpanded ? 'fas fa-caret-down' : 'fas fa-caret-right'\"></i>\n </ng-container>\n </ng-template>\n</nz-tree>\n\n\n<abp-modal [(visible)]=\"ModalDescriptorOpen\" [busy]=\"ModalDescriptorBusy\"\n (visibleChange)=\"ModalDescriptorVisibleChange($event)\">\n <ng-template #abpHeader>\n <h3>{{theNodeBeingEdited?('AbpUi::Edit' | abpLocalization):('FileExplorer::NewDirectory' | abpLocalization)}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <ng-template #loaderRef>\n <div class=\"text-center\"><i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i></div>\n </ng-template>\n <ng-container *ngIf=\"ModalDescriptorForm; else loaderRef\">\n <form class=\"sites-modal-form\" #myForm=\"ngForm\" [formGroup]=\"ModalDescriptorForm\"\n (keydown.enter)=\"$event.preventDefault()\" (submit)=\"createOrEditSave()\">\n <button type=\"submit\" #ModalFormDescriptorSubmit style=\"display: none\"></button>\n <div class=\"mb-3\">\n <label class=\"form-label\">{{'FileExplorer::DirectoryName' | abpLocalization}}</label>\n <input type=\"email\" class=\"form-control\" formControlName=\"name\">\n </div>\n </form>\n </ng-container>\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\"\n (click)=\"ModalFormDescriptorSubmit.nativeElement.click()\">{{'AbpUi::Save' | abpLocalization}}</abp-button>\n </ng-template>\n</abp-modal>" }]
170
- }], ctorParameters: () => [{ type: i1.FileDescriptorService }, { type: i2.FormBuilder }, { type: i3.ToasterService }, { type: i4.FileApiService }, { type: i5.LocalizationService }], propDecorators: { theSelectedTreeNode: [{
240
+ args: [{ selector: 'fe-file-modal-tree', template: "<div class=\"card-header p-0 mb-1 d-flex justify-content-between align-items-center\">\n <h6 class=\"h6 mb-0 btn-link\" role=\"button\" (click.stop)=\"onLookAllBtn()\">{{'FileExplorer::MyDirectories' | abpLocalization}}</h6>\n <button type=\"button\" class=\"btn btn-light btn-sm ms-2\" (click.stop)=\"addDescriptorBtn()\"><i\n class=\"fas fa-plus-circle\" aria-hidden=\"true\"></i></button>\n</div>\n@if(fileGroupList.length>0){\n<abp-tree [nodes]=\"fileGroupList\" (nzExpandChange)=\"nzExpandChange($event)\" [draggable]=\"true\"\n (dropOver)=\"nzEvent($event)\" [beforeDrop]=\"beforeDrop\" (selectedNodeChange)=\"activeNode($event)\" [changeCheckboxWithNode]=\"true\" [isNodeSelected]=\"isNodeSelected\">\n\n <ng-template #menu let-node>\n <button ngbDropdownItem (click.stop)=\"addDescriptorBtn(node)\"><i\n class=\" me-1 fa fa-pencil\"></i>{{'FileExplorer::NewDirectory' | abpLocalization}}</button>\n <button ngbDropdownItem (click.stop)=\"addDescriptorBtn(node,true)\"><i\n class=\" me-1 fa fa-plus\"></i>{{'AbpUi::Edit' | abpLocalization}}</button>\n <button ngbDropdownItem (click.stop)=\"deleteDescriptorBtn(node)\"><i\n class=\" me-1 fa fa-remove\"></i>{{'AbpUi::Delete' | abpLocalization}}</button>\n </ng-template>\n\n <ng-template abpTreeExpandedIconTemplate let-node let-origin=\"origin\">\n <i aria-hidden=\"true\" *ngIf=\"node.children.length>0\">\n <ng-container *ngTemplateOutlet=\"node.isExpanded ? minusIcon : plusIcon\"></ng-container></i>\n </ng-template>\n\n <ng-template #minusIcon>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" fill-rule=\"evenodd\"\n clip-rule=\"evenodd\">\n <path\n d=\"M11.5 0c6.347 0 11.5 5.153 11.5 11.5s-5.153 11.5-11.5 11.5-11.5-5.153-11.5-11.5 5.153-11.5 11.5-11.5zm0 1c5.795 0 10.5 4.705 10.5 10.5s-4.705 10.5-10.5 10.5-10.5-4.705-10.5-10.5 4.705-10.5 10.5-10.5zm-6.5 10h13v1h-13v-1z\" />\n </svg>\n </ng-template>\n\n <ng-template #plusIcon>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" fill-rule=\"evenodd\"\n clip-rule=\"evenodd\">\n <path\n d=\"M11.5 0c6.347 0 11.5 5.153 11.5 11.5s-5.153 11.5-11.5 11.5-11.5-5.153-11.5-11.5 5.153-11.5 11.5-11.5zm0 1c5.795 0 10.5 4.705 10.5 10.5s-4.705 10.5-10.5 10.5-10.5-4.705-10.5-10.5 4.705-10.5 10.5-10.5zm.5 10h6v1h-6v6h-1v-6h-6v-1h6v-6h1v6z\" />\n </svg>\n </ng-template>\n</abp-tree>\n\n}\n<abp-modal [(visible)]=\"ModalDescriptorOpen\" [busy]=\"ModalDescriptorBusy\"\n (visibleChange)=\"ModalDescriptorVisibleChange($event)\">\n <ng-template #abpHeader>\n <h3>{{theNodeBeingEdited?('AbpUi::Edit' | abpLocalization):('FileExplorer::NewDirectory' | abpLocalization)}}\n </h3>\n </ng-template>\n <ng-template #abpBody>\n <ng-template #loaderRef>\n <div class=\"text-center\"><i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i></div>\n </ng-template>\n <ng-container *ngIf=\"ModalDescriptorForm; else loaderRef\">\n <form class=\"sites-modal-form\" #myForm=\"ngForm\" [formGroup]=\"ModalDescriptorForm\"\n (keydown.enter)=\"$event.preventDefault()\" (submit)=\"createOrEditSave()\">\n <button type=\"submit\" #ModalFormDescriptorSubmit style=\"display: none\"></button>\n <div class=\"mb-3\">\n <label class=\"form-label\">{{'FileExplorer::DirectoryName' | abpLocalization}}</label>\n <input type=\"email\" class=\"form-control\" formControlName=\"name\">\n </div>\n </form>\n </ng-container>\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\" [loading]=\"ModalDescriptorBusy\"\n (click)=\"ModalFormDescriptorSubmit.nativeElement.click()\">{{'AbpUi::Save' | abpLocalization}}</abp-button>\n </ng-template>\n</abp-modal>" }]
241
+ }], ctorParameters: () => [{ type: i1.FileDescriptorService }, { type: i2.FormBuilder }, { type: i3.ToasterService }, { type: i4.LocalizationService }, { type: i3.ConfirmationService }], propDecorators: { theSelectedTreeNode: [{
171
242
  type: Input
172
243
  }], nodeClick: [{
173
244
  type: Output
245
+ }], treeNodeData: [{
246
+ type: Output
247
+ }], lookAllBtn: [{
248
+ type: Output
174
249
  }], fileContainerName: [{
175
250
  type: Input
176
251
  }], ModalFormDescriptorSubmit: [{
177
252
  type: ViewChild,
178
253
  args: ['ModalFormDescriptorSubmit', { static: false }]
179
254
  }] } });
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tb2RhbC10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ZpbGUtZXhwbG9yZXIvc3JjL2xpYi9jb21wb25lbnRzL2ZpbGUtbW9kYWwtdHJlZS9maWxlLW1vZGFsLXRyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1tb2RhbC10cmVlL2ZpbGUtbW9kYWwtdHJlZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLcEUsT0FBTyxFQUFHLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7QUFHM0IsSUFBSSxJQUFJLENBQUM7QUFNVCxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFlBQ1Usa0JBQTJELEVBQzNELEVBQWUsRUFDZixPQUF1QixFQUN4QixlQUErQixFQUMvQixvQkFBeUM7UUFKeEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUF5QztRQUMzRCxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDeEIsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQy9CLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBcUI7UUFLbEQsWUFBWTtRQUNaLGtCQUFhLEdBQVUsRUFBRSxDQUFDO1FBRTFCLGVBQWU7UUFDZix5QkFBb0IsR0FBUSxFQUFFLENBQUM7UUFTL0IsYUFBYTtRQUNiLHVCQUFrQixHQUFRLEVBQUUsQ0FBQztRQUU3QixZQUFZO1FBQ1osbUJBQWMsR0FBVSxF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a0JJLFNBQVM7c0JBQWxCLE1BQU07Z0JBSUksaUJBQWlCO3NCQUQzQixLQUFLO2dCQXdIcUQseUJBQXlCO3NCQUFuRixTQUFTO3VCQUFDLDJCQUEyQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3IgKi9cbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOekZvcm1hdEVtaXRFdmVudCB9IGZyb20gJ25nLXpvcnJvLWFudGQvdHJlZSc7XG5pbXBvcnQgKiBhcyBEZXNjcmlwdG9yU2VydmljZSBmcm9tICcuLi8uLi9wcm94eS9kaWduaXRlL2ZpbGUtZXhwbG9yZXIvZGlyZWN0b3JpZXMnO1xuaW1wb3J0IHsgIFRvYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy50aGVtZS5zaGFyZWQnO1xuaW1wb3J0IHsgTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQgfSBmcm9tICduZy16b3Jyby1hbnRkL3RyZWUnO1xuaW1wb3J0IHsgIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGaWxlQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpbGUtYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gJ0BhYnAvbmcuY29yZSc7XG52YXIgdGhhdDtcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZlLWZpbGUtbW9kYWwtdHJlZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxlLW1vZGFsLXRyZWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWxlLW1vZGFsLXRyZWUuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBGaWxlTW9kYWxUcmVlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfRGVzY3JpcHRvclNlcnZpY2U6IERlc2NyaXB0b3JTZXJ2aWNlLkZpbGVEZXNjcmlwdG9yU2VydmljZSxcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHRvYXN0ZXI6IFRvYXN0ZXJTZXJ2aWNlLFxuICAgIHB1YmxpYyBfRmlsZUFwaVNlcnZpY2U6IEZpbGVBcGlTZXJ2aWNlLFxuICAgIHB1YmxpYyBfTG9jYWxpemF0aW9uU2VydmljZTogTG9jYWxpemF0aW9uU2VydmljZSxcbiAgKSB7XG4gICAgdGhhdCA9IHRoaXNcbiAgfVxuXG4gIC8qKuaWh+S7tuWIhue7hOWIl+ihqCAqL1xuICBmaWxlR3JvdXBMaXN0OiBhbnlbXSA9IFtdO1xuXG4gIC8qKumAieaLqeeahHRyZWXoioLngrkgKi9cbiAgX3RoZVNlbGVjdGVkVHJlZU5vZGU6IGFueSA9ICcnO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHRoZVNlbGVjdGVkVHJlZU5vZGUodjogYW55KSB7XG4gICAgdGhpcy5fdGhlU2VsZWN0ZWRUcmVlTm9kZSA9IHY7XG4gICAgaWYgKHYubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb2FkRGF0YSgpXG4gICAgfVxuICB9XG5cbiAgLyoq5q2j5Zyo57yW6L6R55qE6IqC54K5ICovXG4gIHRoZU5vZGVCZWluZ0VkaXRlZDogYW55ID0gJyc7XG5cbiAgLyoq5bey5bGV5byA55qE6IqC54K5ICovXG4gIGFuRXhwYW5kZWROb2RlOiBhbnlbXSA9IFtdO1xuXG4gIC8qKuWbvueJh+WuueWZqCAqL1xuICBfZmlsZUNvbnRhaW5lck5hbWU6IHN0cmluZztcblxuICAvKip0cmVl6IqC54K56YCJ5oup5Zue6LCDICovXG4gIEBPdXRwdXQoKSBub2RlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGZpbGVDb250YWluZXJOYW1lKHY6IHN0cmluZykge1xuICAgIGlmICh2KSB7XG4gICAgICB0aGlzLl9maWxlQ29udGFpbmVyTmFtZSA9IHY7XG4gICAgICB0aGlzLmxvYWREYXRhKClcbiAgICB9XG4gIH1cblxuICBoYW5kbGVDbGljayA9IChldmVudCkgPT4gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgbG9hZERhdGEoKSB7XG4gICAgaWYgKHRoaXMuX2ZpbGVDb250YWluZXJOYW1lKSB7XG4gICAgICB0aGlzLmdldEZpbGVHcm91cExpc3QoKVxuICAgIH1cbiAgfVxuXG5cbiAgLyoq6I635Y+W5paH5Lu25YiG57uEICovXG4gIGdldEZpbGVHcm91cExpc3QoKSB7XG4gICAgdGhpcy5fRGVzY3JpcHRvclNlcnZpY2UuZ2V0TGlzdCh7XG4gICAgICBjb250YWluZXJOYW1lOiB0aGlzLl9maWxlQ29udGFpbmVyTmFtZSxcbiAgICB9KS5zdWJzY3JpYmUoYXN5bmMgKHJlcykgPT4ge1xuICAgICAgdGhpcy5maWxlR3JvdXBMaXN0ID0gYXdhaXQgdGhpcy5zZXRUaGVWYWx1ZU9mVGhlTm9kZVJlY3Vyc2l2ZWx5KHJlcy5pdGVtcylcbiAgICB9KVxuICB9XG4gIFxuICAvKirpgJLlvZLorr7nva7oioLngrnnmoTlgLwgKi9cbiAgc2V0VGhlVmFsdWVPZlRoZU5vZGVSZWN1cnNpdmVseShhcnJheTogYW55W10pOiBhbnkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzbG92ZSwgcmVqZWN0cykgPT4ge1xuICAgICAgYXJyYXkuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgZWwudGl0bGUgPSBlbC5uYW1lXG4gICAgICAgIGVsLmtleSA9IGVsLmlkXG4gICAgICAgIGVsLmV4cGFuZGVkID0gdGhpcy5hbkV4cGFuZGVkTm9kZS5pbmNsdWRlcyhlbC5rZXkpXG4gICAgICAgIGlmIChlbC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZXRUaGVWYWx1ZU9mVGhlTm9kZVJlY3Vyc2l2ZWx5KGVsLmNoaWxkcmVuKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmVzbG92ZShhcnJheSlcbiAgICB9KVxuICB9XG5cbiAgLyoqdHJlZS3mi5bmi70gKi9cbiAgbnpFdmVudChldmVudDogTnpGb3JtYXRFbWl0RXZlbnQpOiB2b2lkIHtcbiAgfVxuXG4gIC8qKnRyZWUt5ouW5ou9IC3pqozor4EqL1xuICBiZWZvcmVEcm9wKGFyZzogTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQpIHtcbiAgICBpZiAoYXJnLnBvcyA9PT0gMCB8fCBhcmcucG9zID09PSAxKSB7XG4gICAgICB0aGF0Ll9EZXNjcmlwdG9yU2VydmljZS5tb3ZlKGFyZy5kcmFnTm9kZS5rZXksIHtcbiAgICAgICAgXCJwYXJlbnRJZFwiOiBhcmcucG9zID09PSAxID8gKGFyZy5ub2RlLnBhcmVudE5vZGU/LmtleXx8JycpIDogYXJnLm5vZGUua2V5LFxuICAgICAgICBcIm9yZGVyXCI6IGFyZy5wb3MgPT09IDEgPyBhcmcubm9kZS5vcmlnaW4ub3JkZXIgKyAxIDogYXJnLm5vZGUub3JpZ2luLmNoaWxkcmVuLmxlbmd0aCArIDFcbiAgICAgIH0pLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICB0aGF0LmdldEZpbGVHcm91cExpc3QoKVxuICAgICAgfSlcbiAgICAgIHJldHVybiBvZih0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKnRyZWUtLemAieaLqeiKgueCuSAqL1xuICBhY3RpdmVOb2RlKGV2ZW50KSB7XG4gICAgdGhpcy5fdGhlU2VsZWN0ZWRUcmVlTm9kZSA9IGV2ZW50Lm5vZGVcbiAgICB0aGlzLm5vZGVDbGljay5lbWl0KGV2ZW50Lm5vZGUpXG4gIH1cblxuICAvKirliKTmlq3oioLngrnmmK/lkKbpgInkuK0gKi9cbiAgaXNOb2RlU2VsZWN0ZWQgPSAoZWwpID0+IGVsLmtleSA9PT0gdGhpcy5fdGhlU2VsZWN0ZWRUcmVlTm9kZT8ua2V5XG5cbiAgLyoq54K55Ye75bGV5byA5qCR6IqC54K55Zu+5qCH6Kem5Y+RICovXG4gIG56RXhwYW5kQ2hhbmdlKGV2ZW50KSB7XG4gICAgbGV0IGFuRXhwYW5kZWROb2RlID0gdGhpcy5hbkV4cGFuZGVkTm9kZVxuICAgIGlmIChhbkV4cGFuZGVkTm9kZS5pbmNsdWRlcyhldmVudC5ub2RlLmtleSkpIHtcbiAgICAgIGFuRXhwYW5kZWROb2RlID0gYW5FeHBhbmRlZE5vZGUuZmlsdGVyKGtleSA9PiBrZXkgIT09IGV2ZW50Lm5vZGUua2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICBhbkV4cGFuZGVkTm9kZS5wdXNoKGV2ZW50Lm5vZGUua2V5KVxuICAgIH1cbiAgICB0aGlzLmFuRXhwYW5kZWROb2RlID0gYW5FeHBhbmRlZE5vZGVcbiAgfVxuXG5cbiAgLyoq5aKe5Yqg5YiG57uEICovXG4gIGFkZERlc2NyaXB0b3JCdG4oaXRlbXM6IGFueSA9ICcnLCBlZGl0ID0gZmFsc2UpIHtcbiAgICB0aGlzLk1vZGFsRGVzY3JpcHRvck9wZW4gPSB0cnVlXG4gICAgdGhpcy5Nb2RhbERlc2NyaXB0b3JGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjb250YWluZXJOYW1lOiBbdGhpcy5fZmlsZUNvbnRhaW5lck5hbWUgfHwgJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgbmFtZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHBhcmVudElkOiBbaXRlbXM/LmtleSB8fCAnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgfSlcbiAgICAvKirnvJbovpEgKi9cbiAgICBpZiAoZWRpdCkge1xuICAgICAgdGhpcy50aGVOb2RlQmVpbmdFZGl0ZWQgPSBpdGVtcy5vcmlnaW5cbiAgICAgIHRoaXMuTW9kYWxEZXNjcmlwdG9yRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgbmFtZTogaXRlbXMub3JpZ2luLm5hbWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoq5Yig6Zmk5YiG57uEICovXG4gIGRlbGV0ZURlc2NyaXB0b3JCdG4obm9kZSkge1xuICAgIHRoaXMuX0Rlc2NyaXB0b3JTZXJ2aWNlLmRlbGV0ZShub2RlLmtleSkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICB0aGlzLk1vZGFsRGVzY3JpcHRvck9wZW4gPSBmYWxzZVxuICAgICAgaWYgKHRoaXMudGhlTm9kZUJlaW5nRWRpdGVkLmtleSA9PSBub2RlLmtleSkgdGhpcy50aGVOb2RlQmVpbmdFZGl0ZWQgPSAnJ1xuICAgICAgdGhpcy5nZXRGaWxlR3JvdXBMaXN0KClcbiAgICB9KVxuICB9XG5cbiAgXG5cbiAgLyoq5YiG57uEICovXG4gIC8qKuaooeaAgeahhi3nirbmgIEt5piv5ZCm5omT5byAICovXG4gIE1vZGFsRGVzY3JpcHRvck9wZW46IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKuaooeaAgeahhi1kZXNjcmlwdG9yLee5geW/meeKtuaAgS3nlKjkuo7noa7lrprmqKHmgIHnmoTnuYHlv5nnirbmgIHmmK/lkKbkuLrnnJ8gKi9cbiAgTW9kYWxEZXNjcmlwdG9yQnVzeTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoq5qih5oCB5qGGLWRlc2NyaXB0b3It6KGo5Y2VICovXG4gIE1vZGFsRGVzY3JpcHRvckZvcm06IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcbiAgXG4gIC8qKuaooeaAgeahhi1kZXNjcmlwdG9yLeihqOWNlS0t5o6n5Lu25qih5p2/LeWKqOaAgei1i+WAvOihqOWNleaOp+S7tiAqL1xuICBAVmlld0NoaWxkKCdNb2RhbEZvcm1EZXNjcmlwdG9yU3VibWl0JywgeyBzdGF0aWM6IGZhbHNlIH0pIE1vZGFsRm9ybURlc2NyaXB0b3JTdWJtaXQ6IEVsZW1lbnRSZWY7XG5cbiAgLyoq5qih5oCB5qGGLWRlc2NyaXB0b3It54q25oCB5pS55Y+Y5Zue6LCDICovXG4gIE1vZGFsRGVzY3JpcHRvclZpc2libGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICB0aGlzLk1vZGFsRGVzY3JpcHRvckZvcm0gPSB1bmRlZmluZWRcbiAgICAgIHRoaXMudGhlTm9kZUJlaW5nRWRpdGVkID0gJydcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIC8qKmbliIbnu4TmqKHmgIHmoYbkv53lrZggKi9cbiAgY3JlYXRlT3JFZGl0U2F2ZSgpIHtcbiAgICBsZXQgaW5wdXQgPSB0aGlzLk1vZGFsRGVzY3JpcHRvckZvcm0udmFsdWVcbiAgICBpZiAodGhpcy50aGVOb2RlQmVpbmdFZGl0ZWQpIHtcbiAgICAgIHRoaXMuX0Rlc2NyaXB0b3JTZXJ2aWNlLnVwZGF0ZSh0aGlzLnRoZU5vZGVCZWluZ0VkaXRlZC5rZXksIGlucHV0KS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgdGhpcy5Nb2RhbERlc2NyaXB0b3JPcGVuID0gZmFsc2VcbiAgICAgICAgdGhpcy5nZXRGaWxlR3JvdXBMaXN0KClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5fRGVzY3JpcHRvclNlcnZpY2UuY3JlYXRlKGlucHV0KS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgIHRoaXMuTW9kYWxEZXNjcmlwdG9yT3BlbiA9IGZhbHNlXG4gICAgICB0aGlzLmdldEZpbGVHcm91cExpc3QoKVxuICAgIH0pXG4gIH1cblxuXG5cblxufVxuIiwiPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyICBwLTAgbWItMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgPGg2IGNsYXNzPVwiaDYgbWItMFwiPnt7J0ZpbGVFeHBsb3Jlcjo6TXlEaXJlY3RvcmllcycgfCBhYnBMb2NhbGl6YXRpb259fTwvaDY+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBtcy0yXCIgKGNsaWNrLnN0b3ApPVwiYWRkRGVzY3JpcHRvckJ0bigpXCI+PGlcbiAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYnV0dG9uPlxuPC9kaXY+XG48bnotdHJlZSBbbnpEYXRhXT1cImZpbGVHcm91cExpc3RcIiBjbGFzcz1cIm5nLXpvcnJvLWFudGQtdHJlZVwiIG56RHJhZ2dhYmxlIG56QmxvY2tOb2RlIG56U2hvd0ljb25cbiAgICBbbnpFeHBhbmRlZEljb25dPVwibXVsdGlFeHBhbmRlZEljb25UcGxcIiAobnpPbkRyb3ApPVwibnpFdmVudCgkZXZlbnQpXCIgW256QmVmb3JlRHJvcF09XCJiZWZvcmVEcm9wXCJcbiAgICAobnpDbGljayk9XCJhY3RpdmVOb2RlKCRldmVudClcIiAobnpFeHBhbmRDaGFuZ2UpPVwibnpFeHBhbmRDaGFuZ2UoJGV2ZW50KVwiIFtuelRyZWVUZW1wbGF0ZV09XCJuelRyZWVUZW1wbGF0ZVwiPlxuICAgIDxuZy10ZW1wbGF0ZSAjbnpUcmVlVGVtcGxhdGUgbGV0LW5vZGUgbGV0LW9yaWdpbj1cIm9yaWdpblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLW5vZGUgZC1pbmxpbmUtYmxvY2sgICBuZy1zdGFyLWluc2VydGVkIGRyb3Bkb3duXCIgW3RpdGxlXT1cIm5vZGUudGl0bGVcIj5cbiAgICAgICAgICAgIDxkaXYgI2Ryb3Bkb3duPVwibmdiRHJvcGRvd25cIiBjbGFzcz1cImQtaW5saW5lLWJsb2NrXCIgbmdiRHJvcGRvd24gcGxhY2VtZW50PVwiYm90dG9tXCIgY29udGFpbmVyPVwiYm9keVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNOb2RlU2VsZWN0ZWQobm9kZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gIHAtMCBweC0xXCI+e3sgbm9kZS50aXRsZSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSAgcC0wXCIgKGNsaWNrKT1cImhhbmRsZUNsaWNrKCRldmVudClcIiBuZ2JEcm9wZG93blRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRyb3Bkb3duLXRvZ2dsZV09XCJmYWxzZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2FyZXQtZG93biB0ZXh0LW11dGVkIHAtMVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93bk1lbnU+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2suc3RvcCk9XCJhZGREZXNjcmlwdG9yQnRuKG5vZGUpXCI+e3snRmlsZUV4cGxvcmVyOjpOZXdEaXJlY3RvcnknIHwgYWJwTG9jYWxpemF0aW9ufX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljay5zdG9wKT1cImFkZERlc2NyaXB0b3JCdG4obm9kZSx0cnVlKVwiPnt7J0FicFVpOjpFZGl0JyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2suc3RvcCk9XCJkZWxldGVEZXNjcmlwdG9yQnRuKG5vZGUpXCI+e3snQWJwVWk6OkRlbGV0ZScgfCBhYnBMb2NhbGl6YXRpb259fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNtdWx0aUV4cGFuZGVkSWNvblRwbCBsZXQtbm9kZSBsZXQtb3JpZ2luPVwib3JpZ2luXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgIDxpIFtjbGFzc109XCJub2RlLmlzRXhwYW5kZWQgPyAnZmFzIGZhLWNhcmV0LWRvd24nIDogJ2ZhcyBmYS1jYXJldC1yaWdodCdcIj48L2k+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG48L256LXRyZWU+XG5cblxuPGFicC1tb2RhbCBbKHZpc2libGUpXT1cIk1vZGFsRGVzY3JpcHRvck9wZW5cIiBbYnVzeV09XCJNb2RhbERlc2NyaXB0b3JCdXN5XCJcbiAgICAodmlzaWJsZUNoYW5nZSk9XCJNb2RhbERlc2NyaXB0b3JWaXNpYmxlQ2hhbmdlKCRldmVudClcIj5cbiAgICA8bmctdGVtcGxhdGUgI2FicEhlYWRlcj5cbiAgICAgICAgPGgzPnt7dGhlTm9kZUJlaW5nRWRpdGVkPygnQWJwVWk6OkVkaXQnIHwgYWJwTG9jYWxpemF0aW9uKTooJ0ZpbGVFeHBsb3Jlcjo6TmV3RGlyZWN0b3J5JyB8IGFicExvY2FsaXphdGlvbil9fTwvaDM+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2FicEJvZHk+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbG9hZGVyUmVmPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyXCI+PGkgY2xhc3M9XCJmYSBmYS1wdWxzZSBmYS1zcGlubmVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiTW9kYWxEZXNjcmlwdG9yRm9ybTsgZWxzZSBsb2FkZXJSZWZcIj5cbiAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwic2l0ZXMtbW9kYWwtZm9ybVwiICNteUZvcm09XCJuZ0Zvcm1cIiBbZm9ybUdyb3VwXT1cIk1vZGFsRGVzY3JpcHRvckZvcm1cIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgKHN1Ym1pdCk9XCJjcmVhdGVPckVkaXRTYXZlKClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiAjTW9kYWxGb3JtRGVzY3JpcHRvclN1Ym1pdCBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snRmlsZUV4cGxvcmVyOjpEaXJlY3RvcnlOYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJlbWFpbFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjYWJwRm9vdGVyPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgYWJwQ2xvc2U+e3snQWJwVWk6OkNsb3NlJyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XG4gICAgICAgIDxhYnAtYnV0dG9uIGljb25DbGFzcz1cImZhIGZhLWNoZWNrXCJcbiAgICAgICAgICAgIChjbGljayk9XCJNb2RhbEZvcm1EZXNjcmlwdG9yU3VibWl0Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKVwiPnt7J0FicFVpOjpTYXZlJyB8IGFicExvY2FsaXphdGlvbn19PC9hYnAtYnV0dG9uPlxuICAgIDwvbmctdGVtcGxhdGU+XG48L2FicC1tb2RhbD4iXX0=
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tb2RhbC10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2ZpbGUtZXhwbG9yZXIvc3JjL2xpYi9jb21wb25lbnRzL2ZpbGUtbW9kYWwtdHJlZS9maWxlLW1vZGFsLXRyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1tb2RhbC10cmVlL2ZpbGUtbW9kYWwtdHJlZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxREFBcUQ7QUFDckQsdURBQXVEO0FBQ3ZELE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEtBQUssaUJBQWlCLE1BQU0sK0NBQStDLENBQUM7QUFDbkYsT0FBTyxFQUFnQixtQkFBbUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RixPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7Ozs7OztBQUM1RCxJQUFJLElBQUksQ0FBQztBQU1ULE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsWUFDVSxrQkFBMkQsRUFDM0QsRUFBZSxFQUNmLE9BQXVCLEVBQ3hCLG9CQUF5QyxFQUN4QyxZQUFpQztRQUpqQyx1QkFBa0IsR0FBbEIsa0JBQWtC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QztnQkFDekMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsQ0FBQyxDQUFDLENBQUM7WUFDTCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxrQkFBa0I7YUFDcEIsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLElBQUksQ0FDSCxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FDSDthQUNBLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNmLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7WUFDakMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs4R0F6UFUsc0JBQXNCO2tHQUF0QixzQkFBc0IsK1hDMUJuQyxzbklBbUVZOzsyRkR6Q0Msc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLG9CQUFvQjtxTkFxQm5CLG1CQUFtQjtzQkFEN0IsS0FBSztnQkFtQkksU0FBUztzQkFBbEIsTUFBTTtnQkFFRyxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0ksaUJBQWlCO3NCQUQzQixLQUFLO2dCQWdLcUQseUJBQXlCO3NCQUFuRixTQUFTO3VCQUFDLDJCQUEyQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yICovXG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE56Rm9ybWF0RW1pdEV2ZW50LCBOelRyZWVOb2RlIH0gZnJvbSAnbmctem9ycm8tYW50ZC90cmVlJztcbmltcG9ydCAqIGFzIERlc2NyaXB0b3JTZXJ2aWNlIGZyb20gJy4uLy4uL3Byb3h5L2RpZ25pdGUvZmlsZS1leHBsb3Jlci9kaXJlY3Rvcmllcyc7XG5pbXBvcnQgeyBDb25maXJtYXRpb24sIENvbmZpcm1hdGlvblNlcnZpY2UsIFRvYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy50aGVtZS5zaGFyZWQnO1xuaW1wb3J0IHsgTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQgfSBmcm9tICduZy16b3Jyby1hbnRkL3RyZWUnO1xuaW1wb3J0IHsgZmluYWxpemUsIG1hcCwgb2YsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gJ0BhYnAvbmcuY29yZSc7XG5pbXBvcnQgeyBWYWxpZGF0b3JzU2VydmljZSB9IGZyb20gJ0BkaWduaXRlLW5nL2V4cGFuZC5jb3JlJztcbmxldCB0aGF0O1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZmUtZmlsZS1tb2RhbC10cmVlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtbW9kYWwtdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtbW9kYWwtdHJlZS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGaWxlTW9kYWxUcmVlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX0Rlc2NyaXB0b3JTZXJ2aWNlOiBEZXNjcmlwdG9yU2VydmljZS5GaWxlRGVzY3JpcHRvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSB0b2FzdGVyOiBUb2FzdGVyU2VydmljZSxcbiAgICBwdWJsaWMgX0xvY2FsaXphdGlvblNlcnZpY2U6IExvY2FsaXphdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maXJtYXRpb246IENvbmZpcm1hdGlvblNlcnZpY2UsXG4gICkge1xuICAgIHRoYXQgPSB0aGlzO1xuICB9XG5cbiAgLyoq5paH5Lu25YiG57uE5YiX6KGoICovXG4gIGZpbGVHcm91cExpc3Q6IGFueVtdID0gW107XG5cbiAgLyoq6YCJ5oup55qEdHJlZeiKgueCuSAqL1xuICBfdGhlU2VsZWN0ZWRUcmVlTm9kZTogYW55ID0gJyc7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgdGhlU2VsZWN0ZWRUcmVlTm9kZSh2OiBhbnkpIHtcbiAgICB0aGlzLl90aGVTZWxlY3RlZFRyZWVOb2RlID0gdjtcblxuICAgIGlmICh2ID09ICcnKSB7XG4gICAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgLyoq5q2j5Zyo57yW6L6R55qE6IqC54K5ICovXG4gIHRoZU5vZGVCZWluZ0VkaXRlZDogYW55ID0gJyc7XG5cbiAgLyoq5bey5bGV5byA55qE6IqC54K5ICovXG4gIGFuRXhwYW5kZWROb2RlOiBhbnlbXSA9IFtdO1xuXG4gIC8qKuWbvueJh+WuueWZqCAqL1xuICBfZmlsZUNvbnRhaW5lck5hbWU6IHN0cmluZztcblxuICAvKip0cmVl6IqC54K56YCJ5oup5Zue6LCDICovXG4gIEBPdXRwdXQoKSBub2RlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKuiOt+WPluaVsOaNruWQjuWbnuiwg+e7mWZpbGUtbW9kYWwgKi9cbiAgQE91dHB1dCgpIHRyZWVOb2RlRGF0YSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoq5p+l55yL5omA5pyJ5paH5Lu25Zue6LCD5Ye95pWw77yM5ZyoZmlsZS1tb2RhbOS4reWkhOeQhumAu+i+kSAqL1xuICBAT3V0cHV0KCkgbG9va0FsbEJ0biA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGZpbGVDb250YWluZXJOYW1lKHY6IHN0cmluZykge1xuICAgIGlmICh2KSB7XG4gICAgICB0aGlzLl9maWxlQ29udGFpbmVyTmFtZSA9IHY7XG4gICAgICAvLyB0aGlzLmxvYWREYXRhKCk7XG4gICAgfVxuICB9XG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAvL0NhbGxlZCBhZnRlciBuZ09uSW5pdCB3aGVuIHRoZSBjb21wb25lbnQncyBvciBkaXJlY3RpdmUncyBjb250ZW50IGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICAgIC8vQWRkICdpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQnIHRvIHRoZSBjbGFzcy5cbiAgICBpZiAodGhpcy5fZmlsZUNvbnRhaW5lck5hbWUpIHtcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVDbGljayA9IGV2ZW50ID0+IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gIGxvYWREYXRhKCkge1xuICAgIGlmICh0aGlzLl9maWxlQ29udGFpbmVyTmFtZSkge1xuICAgICAgdGhpcy5nZXRGaWxlR3JvdXBMaXN0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoq6I635Y+W5paH5Lu25YiG57uEICovXG4gIGdldEZpbGVHcm91cExpc3QoKSB7XG4gICAgdGhpcy5fRGVzY3JpcHRvclNlcnZpY2VcbiAgICAgIC5nZXRMaXN0KHtcbiAgICAgICAgY29udGFpbmVyTmFtZTogdGhpcy5fZmlsZUNvbnRhaW5lck5hbWUsXG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZShhc3luYyByZXMgPT4ge1xuICAgICAgICB0aGlzLmZpbGVHcm91cExpc3QgPSBhd2FpdCB0aGlzLnNldFRoZVZhbHVlT2ZUaGVOb2RlUmVjdXJzaXZlbHkocmVzLml0ZW1zKTtcbiAgICAgICAgdGhpcy50cmVlTm9kZURhdGEuZW1pdCh0aGlzLmZpbGVHcm91cExpc3QpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKirmn6XnnIvmiYDmnInmlofku7YgKi9cbiAgb25Mb29rQWxsQnRuKCkge1xuICAgIHRoaXMubG9va0FsbEJ0bi5lbWl0KCk7XG4gIH1cblxuICAvKirpgJLlvZIt5bCG5YiX6KGo6L2s5YyW5Li654i25a2Q57qn57uT5p6EICovXG4gIHNldFRoZVZhbHVlT2ZUaGVOb2RlUmVjdXJzaXZlbHkoYXJyYXk6IGFueVtdLCBwYXJlbnRJZDogYW55ID0gbnVsbCwgcm9vdD86IGFueVtdKTogYW55IHtcbiAgICBjb25zdCByb290TGlzdCA9IHJvb3QgfHwgYXJyYXk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXJyYXkuZmlsdGVyKGl0ZW0gPT4gaXRlbS5wYXJlbnRJZCA9PT0gcGFyZW50SWQpO1xuICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG4gICAgcmVzdWx0Lm1hcCgoZWw6IGFueSkgPT4ge1xuICAgICAgZWwudGl0bGUgPSBlbC5uYW1lO1xuICAgICAgZWwua2V5ID0gZWwuaWQ7XG4gICAgICBlbC5lbnRpdHkgPSBlbC5pZDsgLyoqIOiKgueCueWAvCAqL1xuICAgICAgZWwuZXhwYW5kZWQgPSB0aGlzLmFuRXhwYW5kZWROb2RlLmluY2x1ZGVzKGVsLmtleSk7XG4gICAgICBlbC5jaGlsZHJlbi5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG4gICAgICBpZiAoZWwuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnNldFRoZVZhbHVlT2ZUaGVOb2RlUmVjdXJzaXZlbHkoZWwuY2hpbGRyZW4sIGVsLmlkLCByb290TGlzdCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKnRyZWUt5ouW5ou9ICovXG4gIG56RXZlbnQoZXZlbnQ6IE56Rm9ybWF0RW1pdEV2ZW50KTogdm9pZCB7fVxuXG4gIC8qKnRyZWUt5ouW5ou9IC3pqozor4EqL1xuICBiZWZvcmVEcm9wKGFyZzogTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQpIHtcbiAgICBjb25zdCB7IHBvcywgZHJhZ05vZGUsIG5vZGUgfSA9IGFyZztcbiAgICAvLyDlj6rlpITnkIbmnInmlYjnmoTmi5bmi73kvY3nva5cbiAgICBpZiAocG9zID09PSAwIHx8IHBvcyA9PT0gMSB8fCBwb3MgPT09IC0xKSB7XG4gICAgICAvLyDmoLnmja7kuI3lkIznmoTmi5bmi73kvY3nva7orqHnrpflj4LmlbBcbiAgICAgIGNvbnN0IHBhcmVudElkID0gcG9zID09PSAwID8gbm9kZS5rZXkgOiBub2RlLnBhcmVudE5vZGU/LmtleSB8fCAnJztcblxuICAgICAgbGV0IG9yZGVyO1xuICAgICAgaWYgKHBvcyA9PT0gMSkge1xuICAgICAgICBvcmRlciA9IG5vZGUub3JpZ2luLm9yZGVyICsgMTtcbiAgICAgIH0gZWxzZSBpZiAocG9zID09PSAwKSB7XG4gICAgICAgIG9yZGVyID0gbm9kZS5vcmlnaW4uY2hpbGRyZW4ubGVuZ3RoICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHBvcyA9PT0gLTFcbiAgICAgICAgb3JkZXIgPSBNYXRoLm1heCgwLCBub2RlLm9yaWdpbi5vcmRlciAtIDEpO1xuICAgICAgfVxuICAgICAgLy8g57uf5LiA5aSE55CG56e75Yqo6YC76L6RXG4gICAgICByZXR1cm4gdGhhdC5fRGVzY3JpcHRvclNlcnZpY2UubW92ZShkcmFnTm9kZS5rZXksIHsgcGFyZW50SWQsIG9yZGVyIH0pLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB0aGF0LmdldEZpbGVHcm91cExpc3QoKSksXG4gICAgICAgIG1hcCgoKSA9PiB0cnVlKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2YoZmFsc2UpO1xuICB9XG5cbiAgc2VsZWN0ZWROb2RlOiBOelRyZWVOb2RlW10gPSBbXTtcbiAgLyoqdHJlZS0t6YCJ5oup6IqC54K5ICovXG4gIGFjdGl2ZU5vZGUobm9kZTogTnpUcmVlTm9kZSkge1xuICAgIGlmICgoZXZlbnQgYXMgYW55KT8udGFyZ2V0Py5sb2NhbE5hbWUgPT0gJ2knKSByZXR1cm47XG4gICAgaWYgKHRoaXMuX3RoZVNlbGVjdGVkVHJlZU5vZGU/LmtleSA9PSBub2RlLmtleSkgcmV0dXJuO1xuICAgIHRoaXMuc2VsZWN0ZWROb2RlID0gW25vZGVdO1xuICAgIHRoaXMuX3RoZVNlbGVjdGVkVHJlZU5vZGUgPSBub2RlO1xuICAgIHRoaXMubm9kZUNsaWNrLmVtaXQobm9kZSk7XG4gIH1cblxuICAvKirliKTmlq3oioLngrnmmK/lkKbpgInkuK0gKi9cbiAgaXNOb2RlU2VsZWN0ZWQgPSBlbCA9PiB7XG4gICAgcmV0dXJuIGVsLmtleSA9PT0gdGhpcy5fdGhlU2VsZWN0ZWRUcmVlTm9kZT8ua2V5O1xuICB9O1xuXG4gIC8qKueCueWHu+WxleW8gOagkeiKgueCueWbvuagh+inpuWPkSAqL1xuICBuekV4cGFuZENoYW5nZShldmVudCkge1xuICAgIGxldCBhbkV4cGFuZGVkTm9kZSA9IHRoaXMuYW5FeHBhbmRlZE5vZGU7XG4gICAgaWYgKGFuRXhwYW5kZWROb2RlLmluY2x1ZGVzKGV2ZW50Lm5vZGUua2V5KSkge1xuICAgICAgYW5FeHBhbmRlZE5vZGUgPSBhbkV4cGFuZGVkTm9kZS5maWx0ZXIoa2V5ID0+IGtleSAhPT0gZXZlbnQubm9kZS5rZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbkV4cGFuZGVkTm9kZS5wdXNoKGV2ZW50Lm5vZGUua2V5KTtcbiAgICB9XG4gICAgdGhpcy5hbkV4cGFuZGVkTm9kZSA9IGFuRXhwYW5kZWROb2RlO1xuICB9XG5cbiAgLyoq5aKe5Yqg5YiG57uEICovXG4gIGFkZERlc2NyaXB0b3JCdG4oaXRlbXM6IGFueSA9ICcnLCBlZGl0ID0gZmFsc2UpIHtcbiAgICB0aGlzLk1vZGFsRGVzY3JpcHRvck9wZW4gPSB0cnVlO1xuICAgIHRoaXMuTW9kYWxEZXNjcmlwdG9yRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgY29udGFpbmVyTmFtZTogW3RoaXMuX2ZpbGVDb250YWluZXJOYW1lIHx8ICcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIG5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBwYXJlbnRJZDogW2l0ZW1zPy5rZXkgfHwgJyddLFxuICAgIH0pO1xuICAgIC8qKue8lui+kSAqL1xuICAgIGlmIChlZGl0KSB7XG4gICAgICB0aGlzLnRoZU5vZGVCZWluZ0VkaXRlZCA9IGl0ZW1zLm9yaWdpbjtcbiAgICAgIHRoaXMuTW9kYWxEZXNjcmlwdG9yRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgbmFtZTogaXRlbXMub3JpZ2luLm5hbWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKirliKDpmaTliIbnu4QgKi9cbiAgZGVsZXRlRGVzY3JpcHRvckJ0bihub2RlKSB7XG4gICAgdGhpcy5jb25maXJtYXRpb25cbiAgICAgIC53YXJuKCcnLCB7XG4gICAgICAgIGtleTogJycsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5fTG9jYWxpemF0aW9uU2VydmljZS5pbnN0YW50KGBGaWxlRXhwbG9yZXI6OkRlbGV0aW9uQ29uZmlybWF0aW9uTWVzc2FnZWAsbm9kZS50aXRsZSksXG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZSgoc3RhdHVzOiBDb25maXJtYXRpb24uU3RhdHVzKSA9PiB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gJ2NvbmZpcm0nKSB7XG4gICAgICAgICAgdGhpcy5fRGVzY3JpcHRvclNlcnZpY2UuZGVsZXRlKG5vZGUua2V5KS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIHRoaXMuTW9kYWxEZXNjcmlwdG9yT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMudGhlTm9kZUJlaW5nRWRpdGVkLmtleSA9PSBub2RlLmtleSkgdGhpcy50aGVOb2RlQmVpbmdFZGl0ZWQgPSAnJztcbiAgICAgICAgICAgIHRoaXMuZ2V0RmlsZUdyb3VwTGlzdCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKuWIhue7hCAqL1xuICAvKirmqKHmgIHmoYYt54q25oCBLeaYr+WQpuaJk+W8gCAqL1xuICBNb2RhbERlc2NyaXB0b3JPcGVuID0gZmFsc2U7XG5cbiAgLyoq5qih5oCB5qGGLWRlc2NyaXB0b3It57mB5b+Z54q25oCBLeeUqOS6juehruWumuaooeaAgeeahOe5geW/meeKtuaAgeaYr+WQpuS4uuecnyAqL1xuICBNb2RhbERlc2NyaXB0b3JCdXN5ID0gZmFsc2U7XG5cbiAgLyoq5qih5oCB5qGGLWRlc2NyaXB0b3It6KGo5Y2VICovXG4gIE1vZGFsRGVzY3JpcHRvckZvcm06IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcblxuICAvKirmqKHmgIHmoYYtZGVzY3JpcHRvci3ooajljZUtLeaOp+S7tuaooeadvy3liqjmgIHotYvlgLzooajljZXmjqfku7YgKi9cbiAgQFZpZXdDaGlsZCgnTW9kYWxGb3JtRGVzY3JpcHRvclN1Ym1pdCcsIHsgc3RhdGljOiBmYWxzZSB9KSBNb2RhbEZvcm1EZXNjcmlwdG9yU3VibWl0OiBFbGVtZW50UmVmO1xuXG4gIC8qKuaooeaAgeahhi1kZXNjcmlwdG9yLeeKtuaAgeaUueWPmOWbnuiwgyAqL1xuICBNb2RhbERlc2NyaXB0b3JWaXNpYmxlQ2hhbmdlKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgdGhpcy5Nb2RhbERlc2NyaXB0b3JGb3JtID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy50aGVOb2RlQmVpbmdFZGl0ZWQgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgZm9ybVZhbGlkYXRpb246IGFueSA9ICcnO1xuICBwcml2YXRlIF9WYWxpZGF0b3JzU2VydmljZSA9IGluamVjdChWYWxpZGF0b3JzU2VydmljZSk7XG4gIC8qKmbliIbnu4TmqKHmgIHmoYbkv53lrZggKi9cbiAgY3JlYXRlT3JFZGl0U2F2ZSgpIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuTW9kYWxEZXNjcmlwdG9yRm9ybS52YWx1ZTtcbiAgICB0aGlzLmZvcm1WYWxpZGF0aW9uID0gdGhpcy5fVmFsaWRhdG9yc1NlcnZpY2UuZ2V0Rm9ybVZhbGlkYXRpb25TdGF0dXModGhpcy5Nb2RhbERlc2NyaXB0b3JGb3JtKTtcbiAgICBpZiAodGhpcy5fVmFsaWRhdG9yc1NlcnZpY2UuaXNDaGVja0Zvcm0odGhpcy5mb3JtVmFsaWRhdGlvbiwgJ0ZpbGVFeHBsb3JlcicpKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLk1vZGFsRGVzY3JpcHRvckZvcm0udmFsaWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5Nb2RhbERlc2NyaXB0b3JCdXN5KSByZXR1cm47XG4gICAgdGhpcy5Nb2RhbERlc2NyaXB0b3JCdXN5ID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnRoZU5vZGVCZWluZ0VkaXRlZCkge1xuICAgICAgdGhpcy5fRGVzY3JpcHRvclNlcnZpY2VcbiAgICAgICAgLnVwZGF0ZSh0aGlzLnRoZU5vZGVCZWluZ0VkaXRlZC5rZXksIGlucHV0KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLk1vZGFsRGVzY3JpcHRvckJ1c3kgPSBmYWxzZTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICB0aGlzLk1vZGFsRGVzY3JpcHRvck9wZW4gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLk1vZGFsRGVzY3JpcHRvclZpc2libGVDaGFuZ2UoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuZ2V0RmlsZUdyb3VwTGlzdCgpO1xuICAgICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fRGVzY3JpcHRvclNlcnZpY2VcbiAgICAgIC5jcmVhdGUoaW5wdXQpXG4gICAgICAucGlwZShcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuTW9kYWxEZXNjcmlwdG9yQnVzeSA9IGZhbHNlO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICB0aGlzLk1vZGFsRGVzY3JpcHRvck9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5Nb2RhbERlc2NyaXB0b3JWaXNpYmxlQ2hhbmdlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5nZXRGaWxlR3JvdXBMaXN0KCk7XG4gICAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyICBwLTAgbWItMSBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgPGg2IGNsYXNzPVwiaDYgbWItMCBidG4tbGlua1wiIHJvbGU9XCJidXR0b25cIiAoY2xpY2suc3RvcCk9XCJvbkxvb2tBbGxCdG4oKVwiPnt7J0ZpbGVFeHBsb3Jlcjo6TXlEaXJlY3RvcmllcycgfCBhYnBMb2NhbGl6YXRpb259fTwvaDY+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBtcy0yXCIgKGNsaWNrLnN0b3ApPVwiYWRkRGVzY3JpcHRvckJ0bigpXCI+PGlcbiAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYnV0dG9uPlxuPC9kaXY+XG5AaWYoZmlsZUdyb3VwTGlzdC5sZW5ndGg+MCl7XG48YWJwLXRyZWUgW25vZGVzXT1cImZpbGVHcm91cExpc3RcIiAobnpFeHBhbmRDaGFuZ2UpPVwibnpFeHBhbmRDaGFuZ2UoJGV2ZW50KVwiIFtkcmFnZ2FibGVdPVwidHJ1ZVwiXG4gICAgKGRyb3BPdmVyKT1cIm56RXZlbnQoJGV2ZW50KVwiIFtiZWZvcmVEcm9wXT1cImJlZm9yZURyb3BcIiAoc2VsZWN0ZWROb2RlQ2hhbmdlKT1cImFjdGl2ZU5vZGUoJGV2ZW50KVwiIFtjaGFuZ2VDaGVja2JveFdpdGhOb2RlXT1cInRydWVcIiAgW2lzTm9kZVNlbGVjdGVkXT1cImlzTm9kZVNlbGVjdGVkXCI+XG5cbiAgICA8bmctdGVtcGxhdGUgI21lbnUgbGV0LW5vZGU+XG4gICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtIChjbGljay5zdG9wKT1cImFkZERlc2NyaXB0b3JCdG4obm9kZSlcIj48aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiIG1lLTEgZmEgZmEtcGVuY2lsXCI+PC9pPnt7J0ZpbGVFeHBsb3Jlcjo6TmV3RGlyZWN0b3J5JyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtIChjbGljay5zdG9wKT1cImFkZERlc2NyaXB0b3JCdG4obm9kZSx0cnVlKVwiPjxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCIgbWUtMSBmYSBmYS1wbHVzXCI+PC9pPnt7J0FicFVpOjpFZGl0JyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtIChjbGljay5zdG9wKT1cImRlbGV0ZURlc2NyaXB0b3JCdG4obm9kZSlcIj48aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiIG1lLTEgZmEgZmEtcmVtb3ZlXCI+PC9pPnt7J0FicFVpOjpEZWxldGUnIHwgYWJwTG9jYWxpemF0aW9ufX08L2J1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlIGFicFRyZWVFeHBhbmRlZEljb25UZW1wbGF0ZSBsZXQtbm9kZSBsZXQtb3JpZ2luPVwib3JpZ2luXCI+XG4gICAgICAgIDxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiICpuZ0lmPVwibm9kZS5jaGlsZHJlbi5sZW5ndGg+MFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vZGUuaXNFeHBhbmRlZCA/IG1pbnVzSWNvbiA6IHBsdXNJY29uXCI+PC9uZy1jb250YWluZXI+PC9pPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI21pbnVzSWNvbj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgY2xpcC1ydWxlPVwiZXZlbm9kZFwiPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTExLjUgMGM2LjM0NyAwIDExLjUgNS4xNTMgMTEuNSAxMS41cy01LjE1MyAxMS41LTExLjUgMTEuNS0xMS41LTUuMTUzLTExLjUtMTEuNSA1LjE1My0xMS41IDExLjUtMTEuNXptMCAxYzUuNzk1IDAgMTAuNSA0LjcwNSAxMC41IDEwLjVzLTQuNzA1IDEwLjUtMTAuNSAxMC41LTEwLjUtNC43MDUtMTAuNS0xMC41IDQuNzA1LTEwLjUgMTAuNS0xMC41em0tNi41IDEwaDEzdjFoLTEzdi0xelwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI3BsdXNJY29uPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICBjbGlwLXJ1bGU9XCJldmVub2RkXCI+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNMTEuNSAwYzYuMzQ3IDAgMTEuNSA1LjE1MyAxMS41IDExLjVzLTUuMTUzIDExLjUtMTEuNSAxMS41LTExLjUtNS4xNTMtMTEuNS0xMS41IDUuMTUzLTExLjUgMTEuNS0xMS41em0wIDFjNS43OTUgMCAxMC41IDQuNzA1IDEwLjUgMTAuNXMtNC43MDUgMTAuNS0xMC41IDEwLjUtMTAuNS00LjcwNS0xMC41LTEwLjUgNC43MDUtMTAuNSAxMC41LTEwLjV6bS41IDEwaDZ2MWgtNnY2aC0xdi02aC02di0xaDZ2LTZoMXY2elwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgIDwvbmctdGVtcGxhdGU+XG48L2FicC10cmVlPlxuXG59XG48YWJwLW1vZGFsIFsodmlzaWJsZSldPVwiTW9kYWxEZXNjcmlwdG9yT3BlblwiIFtidXN5XT1cIk1vZGFsRGVzY3JpcHRvckJ1c3lcIlxuICAgICh2aXNpYmxlQ2hhbmdlKT1cIk1vZGFsRGVzY3JpcHRvclZpc2libGVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgIDxuZy10ZW1wbGF0ZSAjYWJwSGVhZGVyPlxuICAgICAgICA8aDM+e3t0aGVOb2RlQmVpbmdFZGl0ZWQ/KCdBYnBVaTo6RWRpdCcgfCBhYnBMb2NhbGl6YXRpb24pOignRmlsZUV4cGxvcmVyOjpOZXdEaXJlY3RvcnknIHwgYWJwTG9jYWxpemF0aW9uKX19XG4gICAgICAgIDwvaDM+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2FicEJvZHk+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbG9hZGVyUmVmPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyXCI+PGkgY2xhc3M9XCJmYSBmYS1wdWxzZSBmYS1zcGlubmVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiTW9kYWxEZXNjcmlwdG9yRm9ybTsgZWxzZSBsb2FkZXJSZWZcIj5cbiAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwic2l0ZXMtbW9kYWwtZm9ybVwiICNteUZvcm09XCJuZ0Zvcm1cIiBbZm9ybUdyb3VwXT1cIk1vZGFsRGVzY3JpcHRvckZvcm1cIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgKHN1Ym1pdCk9XCJjcmVhdGVPckVkaXRTYXZlKClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiAjTW9kYWxGb3JtRGVzY3JpcHRvclN1Ym1pdCBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snRmlsZUV4cGxvcmVyOjpEaXJlY3RvcnlOYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJlbWFpbFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjYWJwRm9vdGVyPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgYWJwQ2xvc2U+e3snQWJwVWk6OkNsb3NlJyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XG4gICAgICAgIDxhYnAtYnV0dG9uIGljb25DbGFzcz1cImZhIGZhLWNoZWNrXCIgW2xvYWRpbmddPVwiTW9kYWxEZXNjcmlwdG9yQnVzeVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiTW9kYWxGb3JtRGVzY3JpcHRvclN1Ym1pdC5uYXRpdmVFbGVtZW50LmNsaWNrKClcIj57eydBYnBVaTo6U2F2ZScgfCBhYnBMb2NhbGl6YXRpb259fTwvYWJwLWJ1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9hYnAtbW9kYWw+Il19
@@ -1,14 +1,15 @@
1
1
  /* eslint-disable @angular-eslint/component-selector */
2
2
  import { Component, EventEmitter, Input, Output } from '@angular/core';
3
+ import { moveItemInArray } from '@angular/cdk/drag-drop';
3
4
  import * as i0 from "@angular/core";
4
- import * as i1 from "../../services/file-api.service";
5
- import * as i2 from "@angular/common";
6
- import * as i3 from "@abp/ng.core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "@abp/ng.core";
7
+ import * as i3 from "@angular/cdk/drag-drop";
7
8
  import * as i4 from "../file-modal/file-modal.component";
8
9
  import * as i5 from "../../previews/file-preview.component";
10
+ import * as i6 from "../../pipe/format-file-size.pipe";
9
11
  export class FilePickerComponent {
10
- constructor(_FileApiService) {
11
- this._FileApiService = _FileApiService;
12
+ constructor() {
12
13
  /**是否多选 */
13
14
  this._multiple = false;
14
15
  /**图片容器 */
@@ -25,14 +26,14 @@ export class FilePickerComponent {
25
26
  this._fileContainerName = v;
26
27
  }
27
28
  ngOnChanges(changes) {
28
- let selectFormFilengOnChanges = changes.selectFormFile['currentValue'];
29
+ const selectFormFilengOnChanges = changes.selectFormFile['currentValue'];
29
30
  if (selectFormFilengOnChanges.length > 0) {
30
31
  this._fileShowTable = selectFormFilengOnChanges;
31
32
  }
32
33
  }
33
34
  /**表格选择的文件回调 */
34
35
  _selectFilefn(event) {
35
- let _fileShowTable = this._FileApiService.deepClone(event);
36
+ const _fileShowTable = structuredClone(event);
36
37
  this._fileShowTable = _fileShowTable;
37
38
  this.selectFormFile = _fileShowTable;
38
39
  this.selectedFileChange.emit(_fileShowTable);
@@ -44,13 +45,20 @@ export class FilePickerComponent {
44
45
  this.selectedFileChange.emit([]);
45
46
  this.selectedFileChange.emit(this.selectFormFile);
46
47
  }
47
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FilePickerComponent, deps: [{ token: i1.FileApiService }], target: i0.ɵɵFactoryTarget.Component }); }
48
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.5", type: FilePickerComponent, selector: "fe-file-picker", inputs: { multiple: "multiple", fileContainerName: "fileContainerName", selectFormFile: "selectFormFile" }, outputs: { selectedFileChange: "selectedFileChange" }, usesOnChanges: true, ngImport: i0, template: "<button class=\"btn btn-sm btn-primary ms-2 float-end\" type=\"button\" (click.stop)=\"ModalOpen = true\">{{'FileExplorer::SelectFile' | abpLocalization}}</button>\n<fe-file-modal [(visible)]=\"ModalOpen\" [selectPickerFile]=\"selectFormFile\" [multiple]=\"_multiple\" (selectFilefn)=\"_selectFilefn($event)\" [fileContainerName]=\"_fileContainerName\"></fe-file-modal>\n<table class=\"table\" *ngIf=\"_fileShowTable.length>0\">\n <thead>\n <tr>\n <th scope=\"col\"></th>\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 _fileShowTable;let i =index\">\n <tr>\n <td>\n <fe-file-preview [width]=\"'80px'\" [src]=\"item.url||item.Url\" [name]=\"item.name||item.Name\" [type]=\"item.mimeType||item.MimeType\" [preview]=\"true\"></fe-file-preview>\n </td>\n <th scope=\"row\">\n <div>{{item.name||item.Name}}</div>\n </th>\n <td >{{_FileApiService.formatFileSize(item.Size||item.size)}}</td>\n <td>\n <button class=\"btn btn-sm p-0 btn-light \" (click.stop)=\"deleteFileTableItem(i,item)\">\n <i class=\"fas fa-trash p-2\"></i>\n </button>\n </td>\n </tr>\n </ng-container>\n </tbody>\n</table>\n\n\n", styles: [".table{border-collapse:collapse;table-layout:fixed}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "component", type: i4.FileModalComponent, selector: "fe-file-modal", inputs: ["fileContainerName", "multiple", "limit", "visible", "selectPickerFile"], outputs: ["visibleChange", "selectFilefn"] }, { kind: "component", type: i5.FilePreviewComponent, selector: "fe-file-preview", inputs: ["width", "src", "preview", "type", "name", "className"] }, { kind: "pipe", type: i3.LocalizationPipe, name: "abpLocalization" }] }); }
48
+ /**调整表格位置 */
49
+ drop(event) {
50
+ moveItemInArray(this._fileShowTable, event.previousIndex, event.currentIndex);
51
+ this.selectFormFile = this._fileShowTable;
52
+ this.selectedFileChange.emit(this.selectFormFile);
53
+ // this._fileShowTable.updateValueAndValidity()
54
+ }
55
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FilePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
56
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.5", type: FilePickerComponent, selector: "fe-file-picker", inputs: { multiple: "multiple", fileContainerName: "fileContainerName", selectFormFile: "selectFormFile" }, outputs: { selectedFileChange: "selectedFileChange" }, usesOnChanges: true, ngImport: i0, template: "<button class=\"btn btn-sm btn-dark soft ms-2 float-end\" type=\"button\"\n (click.stop)=\"ModalOpen = true\">{{'FileExplorer::SelectFile' | abpLocalization}}</button>\n\n<fe-file-modal [(visible)]=\"ModalOpen\" [selectPickerFile]=\"selectFormFile\" [multiple]=\"_multiple\"\n (selectFilefn)=\"_selectFilefn($event)\" [fileContainerName]=\"_fileContainerName\"></fe-file-modal>\n<table class=\"table\" *ngIf=\"_fileShowTable.length>0\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <thead>\n <tr>\n <th scope=\"col\" style=\"width: 30px;\"></th>\n <th scope=\"col\"></th>\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 _fileShowTable;let i =index\">\n <tr cdkDrag cdkDragLockAxis=\"y\" [cdkDragData]=\"item\">\n <td>\n <div class=\"drag-handle\" cdkDragHandle>\n <span class=\"bi bi-arrows-move fs-5\"></span>\n </div>\n </td>\n <td>\n <fe-file-preview [width]=\"'80px'\" [src]=\"item.url||item.Url\" [name]=\"item.name||item.Name\"\n [type]=\"item.mimeType||item.MimeType\" [preview]=\"true\"></fe-file-preview>\n </td>\n <th scope=\"row\">\n <div>{{item.name||item.Name}}</div>\n </th>\n <td>{{(item.Size||item.size)|formatFileSize}}</td>\n <td>\n <button class=\"btn btn-sm p-0 btn-light \" (click.stop)=\"deleteFileTableItem(i,item)\">\n <i class=\"fas fa-trash p-2\"></i>\n </button>\n </td>\n </tr>\n </ng-container>\n </tbody>\n</table>", styles: [".table{border-collapse:collapse;table-layout:fixed}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "directive", type: i3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i3.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i4.FileModalComponent, selector: "fe-file-modal", inputs: ["fileContainerName", "multiple", "limit", "visible", "selectPickerFile"], outputs: ["visibleChange", "selectFilefn"] }, { kind: "component", type: i5.FilePreviewComponent, selector: "fe-file-preview", inputs: ["width", "src", "preview", "type", "name", "className"] }, { kind: "pipe", type: i2.LocalizationPipe, name: "abpLocalization" }, { kind: "pipe", type: i6.FormatFileSizePipe, name: "formatFileSize" }] }); }
49
57
  }
50
58
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FilePickerComponent, decorators: [{
51
59
  type: Component,
52
- args: [{ selector: 'fe-file-picker', template: "<button class=\"btn btn-sm btn-primary ms-2 float-end\" type=\"button\" (click.stop)=\"ModalOpen = true\">{{'FileExplorer::SelectFile' | abpLocalization}}</button>\n<fe-file-modal [(visible)]=\"ModalOpen\" [selectPickerFile]=\"selectFormFile\" [multiple]=\"_multiple\" (selectFilefn)=\"_selectFilefn($event)\" [fileContainerName]=\"_fileContainerName\"></fe-file-modal>\n<table class=\"table\" *ngIf=\"_fileShowTable.length>0\">\n <thead>\n <tr>\n <th scope=\"col\"></th>\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 _fileShowTable;let i =index\">\n <tr>\n <td>\n <fe-file-preview [width]=\"'80px'\" [src]=\"item.url||item.Url\" [name]=\"item.name||item.Name\" [type]=\"item.mimeType||item.MimeType\" [preview]=\"true\"></fe-file-preview>\n </td>\n <th scope=\"row\">\n <div>{{item.name||item.Name}}</div>\n </th>\n <td >{{_FileApiService.formatFileSize(item.Size||item.size)}}</td>\n <td>\n <button class=\"btn btn-sm p-0 btn-light \" (click.stop)=\"deleteFileTableItem(i,item)\">\n <i class=\"fas fa-trash p-2\"></i>\n </button>\n </td>\n </tr>\n </ng-container>\n </tbody>\n</table>\n\n\n", styles: [".table{border-collapse:collapse;table-layout:fixed}\n"] }]
53
- }], ctorParameters: () => [{ type: i1.FileApiService }], propDecorators: { multiple: [{
60
+ args: [{ selector: 'fe-file-picker', template: "<button class=\"btn btn-sm btn-dark soft ms-2 float-end\" type=\"button\"\n (click.stop)=\"ModalOpen = true\">{{'FileExplorer::SelectFile' | abpLocalization}}</button>\n\n<fe-file-modal [(visible)]=\"ModalOpen\" [selectPickerFile]=\"selectFormFile\" [multiple]=\"_multiple\"\n (selectFilefn)=\"_selectFilefn($event)\" [fileContainerName]=\"_fileContainerName\"></fe-file-modal>\n<table class=\"table\" *ngIf=\"_fileShowTable.length>0\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <thead>\n <tr>\n <th scope=\"col\" style=\"width: 30px;\"></th>\n <th scope=\"col\"></th>\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 _fileShowTable;let i =index\">\n <tr cdkDrag cdkDragLockAxis=\"y\" [cdkDragData]=\"item\">\n <td>\n <div class=\"drag-handle\" cdkDragHandle>\n <span class=\"bi bi-arrows-move fs-5\"></span>\n </div>\n </td>\n <td>\n <fe-file-preview [width]=\"'80px'\" [src]=\"item.url||item.Url\" [name]=\"item.name||item.Name\"\n [type]=\"item.mimeType||item.MimeType\" [preview]=\"true\"></fe-file-preview>\n </td>\n <th scope=\"row\">\n <div>{{item.name||item.Name}}</div>\n </th>\n <td>{{(item.Size||item.size)|formatFileSize}}</td>\n <td>\n <button class=\"btn btn-sm p-0 btn-light \" (click.stop)=\"deleteFileTableItem(i,item)\">\n <i class=\"fas fa-trash p-2\"></i>\n </button>\n </td>\n </tr>\n </ng-container>\n </tbody>\n</table>", styles: [".table{border-collapse:collapse;table-layout:fixed}\n"] }]
61
+ }], propDecorators: { multiple: [{
54
62
  type: Input
55
63
  }], fileContainerName: [{
56
64
  type: Input
@@ -59,4 +67,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
59
67
  }], selectedFileChange: [{
60
68
  type: Output
61
69
  }] } });
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1waWNrZXIvZmlsZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1waWNrZXIvZmlsZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBUWpHLE1BQU0sT0FBTyxtQkFBbUI7SUFJOUIsWUFDVSxlQUErQjtRQUEvQixvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFNekMsVUFBVTtRQUNWLGNBQVMsR0FBWSxLQUFLLENBQUE7UUFNMUIsVUFBVTtRQUNWLHVCQUFrQixHQUFXLFFBQVEsQ0FBQTtRQWdCM0IsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQUVqRCxtQkFBYyxHQUFVLEVBQUUsQ0FBQTtRQVUxQixpQkFBaUI7UUFDakIsY0FBUyxHQUFZLEtBQUssQ0FBQTtJQXhDMUIsQ0FBQztJQUtELElBQ1csUUFBUSxDQUFDLENBQVU7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUlELElBQ1csaUJBQWlCLENBQUMsQ0FBUztRQUNwQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFLRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSx5QkFBeUIsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ3RFLElBQUkseUJBQXlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcseUJBQXlCLENBQUE7UUFDakQsQ0FBQztJQUNILENBQUM7SUFNRCxlQUFlO0lBQ2YsYUFBYSxDQUFDLEtBQVk7UUFDeEIsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDMUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUE7UUFDcEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUE7UUFDcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBS0QsYUFBYTtJQUNiLG1CQUFtQixDQUFDLENBQUMsRUFBRSxJQUFJO1FBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUE7UUFDekMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNoQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUNuRCxDQUFDOzhHQXhEVSxtQkFBbUI7a0dBQW5CLG1CQUFtQiw4T0NUaEMsMmpEQWdDQTs7MkZEdkJhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxnQkFBZ0I7bUZBa0JmLFFBQVE7c0JBRGxCLEtBQUs7Z0JBUUssaUJBQWlCO3NCQUQzQixLQUFLO2dCQU1HLGNBQWM7c0JBQXRCLEtBQUs7Z0JBU0ksa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmlsZUFwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWxlLWFwaS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZmUtZmlsZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWxlLXBpY2tlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuXG5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9GaWxlQXBpU2VydmljZTogRmlsZUFwaVNlcnZpY2UsXG4gICkge1xuXG4gIH1cblxuXG4gIC8qKuaYr+WQpuWkmumAiSAqL1xuICBfbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZVxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG11bHRpcGxlKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9tdWx0aXBsZSA9IHY7XG4gIH1cblxuICAvKirlm77niYflrrnlmaggKi9cbiAgX2ZpbGVDb250YWluZXJOYW1lOiBzdHJpbmcgPSAnSW1hZ2VzJ1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGZpbGVDb250YWluZXJOYW1lKHY6IHN0cmluZykge1xuICAgIHRoaXMuX2ZpbGVDb250YWluZXJOYW1lID0gdjtcbiAgfVxuXG4gIC8qKuW3sumAieWumueahOaWh+S7tiAqL1xuICBASW5wdXQoKSBzZWxlY3RGb3JtRmlsZTogYW55W11cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgbGV0IHNlbGVjdEZvcm1GaWxlbmdPbkNoYW5nZXMgPSBjaGFuZ2VzLnNlbGVjdEZvcm1GaWxlWydjdXJyZW50VmFsdWUnXVxuICAgIGlmIChzZWxlY3RGb3JtRmlsZW5nT25DaGFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ZpbGVTaG93VGFibGUgPSBzZWxlY3RGb3JtRmlsZW5nT25DaGFuZ2VzXG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgpIHNlbGVjdGVkRmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIF9maWxlU2hvd1RhYmxlOiBhbnlbXSA9IFtdXG5cbiAgLyoq6KGo5qC86YCJ5oup55qE5paH5Lu25Zue6LCDICovXG4gIF9zZWxlY3RGaWxlZm4oZXZlbnQ6IGFueVtdKSB7XG4gICAgbGV0IF9maWxlU2hvd1RhYmxlID0gdGhpcy5fRmlsZUFwaVNlcnZpY2UuZGVlcENsb25lKGV2ZW50KVxuICAgIHRoaXMuX2ZpbGVTaG93VGFibGUgPSBfZmlsZVNob3dUYWJsZVxuICAgIHRoaXMuc2VsZWN0Rm9ybUZpbGUgPSBfZmlsZVNob3dUYWJsZVxuICAgIHRoaXMuc2VsZWN0ZWRGaWxlQ2hhbmdlLmVtaXQoX2ZpbGVTaG93VGFibGUpXG4gIH1cblxuICAvKirmqKHmgIHmoYYt54q25oCBLeaYr+WQpuaJk+W8gCAqL1xuICBNb2RhbE9wZW46IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKuWIoOmZpOaWh+S7tuihqOagvOmhuSAqL1xuICBkZWxldGVGaWxlVGFibGVJdGVtKGksIGZpbGUpIHtcbiAgICB0aGlzLl9maWxlU2hvd1RhYmxlLnNwbGljZShpLCAxKVxuICAgIHRoaXMuc2VsZWN0Rm9ybUZpbGUgPSB0aGlzLl9maWxlU2hvd1RhYmxlXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVDaGFuZ2UuZW1pdChbXSlcbiAgICB0aGlzLnNlbGVjdGVkRmlsZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0Rm9ybUZpbGUpXG4gIH1cblxufVxuIiwiPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnkgbXMtMiBmbG9hdC1lbmRcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrLnN0b3ApPVwiTW9kYWxPcGVuID0gdHJ1ZVwiPnt7J0ZpbGVFeHBsb3Jlcjo6U2VsZWN0RmlsZScgfCBhYnBMb2NhbGl6YXRpb259fTwvYnV0dG9uPlxuPGZlLWZpbGUtbW9kYWwgWyh2aXNpYmxlKV09XCJNb2RhbE9wZW5cIiBbc2VsZWN0UGlja2VyRmlsZV09XCJzZWxlY3RGb3JtRmlsZVwiIFttdWx0aXBsZV09XCJfbXVsdGlwbGVcIiAgKHNlbGVjdEZpbGVmbik9XCJfc2VsZWN0RmlsZWZuKCRldmVudClcIiBbZmlsZUNvbnRhaW5lck5hbWVdPVwiX2ZpbGVDb250YWluZXJOYW1lXCI+PC9mZS1maWxlLW1vZGFsPlxuPHRhYmxlIGNsYXNzPVwidGFibGVcIiAqbmdJZj1cIl9maWxlU2hvd1RhYmxlLmxlbmd0aD4wXCI+XG4gICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj48L3RoPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snRmlsZUV4cGxvcmVyOjpGaWxlTmFtZScgfCBhYnBMb2NhbGl6YXRpb259fTwvdGg+XG4gICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydGaWxlRXhwbG9yZXI6OkZpbGVTaXplJyB8IGFicExvY2FsaXphdGlvbn19PC90aD5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPjwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgPC90aGVhZD5cbiAgICA8dGJvZHk+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgX2ZpbGVTaG93VGFibGU7bGV0IGkgPWluZGV4XCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8ZmUtZmlsZS1wcmV2aWV3IFt3aWR0aF09XCInODBweCdcIiBbc3JjXT1cIml0ZW0udXJsfHxpdGVtLlVybFwiIFtuYW1lXT1cIml0ZW0ubmFtZXx8aXRlbS5OYW1lXCIgW3R5cGVdPVwiaXRlbS5taW1lVHlwZXx8aXRlbS5NaW1lVHlwZVwiIFtwcmV2aWV3XT1cInRydWVcIj48L2ZlLWZpbGUtcHJldmlldz5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7aXRlbS5uYW1lfHxpdGVtLk5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkID57e19GaWxlQXBpU2VydmljZS5mb3JtYXRGaWxlU2l6ZShpdGVtLlNpemV8fGl0ZW0uc2l6ZSl9fTwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBwLTAgYnRuLWxpZ2h0IFwiIChjbGljay5zdG9wKT1cImRlbGV0ZUZpbGVUYWJsZUl0ZW0oaSxpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2ggcC0yXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC90Ym9keT5cbjwvdGFibGU+XG5cblxuIl19
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1waWNrZXIvZmlsZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1waWNrZXIvZmlsZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7QUFPekQsTUFBTSxPQUFPLG1CQUFtQjtJQUxoQztRQU9FLFVBQVU7UUFDVixjQUFTLEdBQUcsS0FBSyxDQUFBO1FBTWpCLFVBQVU7UUFDVix1QkFBa0IsR0FBRyxRQUFRLENBQUE7UUFnQm5CLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUE7UUFFakQsbUJBQWMsR0FBVSxFQUFFLENBQUE7UUFVMUIsaUJBQWlCO1FBQ2pCLGNBQVMsR0FBRSxLQUFLLENBQUE7S0FvQmpCO0lBdkRDLElBQ1csUUFBUSxDQUFDLENBQVU7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUlELElBQ1csaUJBQWlCLENBQUMsQ0FBUztRQUNwQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFLRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsTUFBTSx5QkFBeUIsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ3hFLElBQUkseUJBQXlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcseUJBQXlCLENBQUE7UUFDakQsQ0FBQztJQUNILENBQUM7SUFNRCxlQUFlO0lBQ2YsYUFBYSxDQUFDLEtBQVk7UUFDeEIsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzdDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUtELGFBQWE7SUFDYixtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsSUFBSTtRQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFBO1FBQ3pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQUNELFlBQVk7SUFDVixJQUFJLENBQUMsS0FBVTtRQUNiLGVBQWUsQ0FDYixJQUFJLENBQUMsY0FBYyxFQUNuQixLQUFLLENBQUMsYUFBYSxFQUNuQixLQUFLLENBQUMsWUFBWSxDQUNuQixDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFBO1FBQ3pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ2pELCtDQUErQztJQUNqRCxDQUFDOzhHQTFEUSxtQkFBbUI7a0dBQW5CLG1CQUFtQiw4T0NUaEMsODdEQXVDUTs7MkZEOUJLLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxnQkFBZ0I7OEJBU2YsUUFBUTtzQkFEbEIsS0FBSztnQkFRSyxpQkFBaUI7c0JBRDNCLEtBQUs7Z0JBTUcsY0FBYztzQkFBdEIsS0FBSztnQkFTSSxrQkFBa0I7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yICovXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZmUtZmlsZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWxlLXBpY2tlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuXG4gIC8qKuaYr+WQpuWkmumAiSAqL1xuICBfbXVsdGlwbGUgPSBmYWxzZVxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG11bHRpcGxlKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9tdWx0aXBsZSA9IHY7XG4gIH1cblxuICAvKirlm77niYflrrnlmaggKi9cbiAgX2ZpbGVDb250YWluZXJOYW1lID0gJ0ltYWdlcydcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBmaWxlQ29udGFpbmVyTmFtZSh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9maWxlQ29udGFpbmVyTmFtZSA9IHY7XG4gIH1cblxuICAvKirlt7LpgInlrprnmoTmlofku7YgKi9cbiAgQElucHV0KCkgc2VsZWN0Rm9ybUZpbGU6IGFueVtdXG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdEZvcm1GaWxlbmdPbkNoYW5nZXMgPSBjaGFuZ2VzLnNlbGVjdEZvcm1GaWxlWydjdXJyZW50VmFsdWUnXVxuICAgIGlmIChzZWxlY3RGb3JtRmlsZW5nT25DaGFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ZpbGVTaG93VGFibGUgPSBzZWxlY3RGb3JtRmlsZW5nT25DaGFuZ2VzXG4gICAgfVxuICB9XG5cbiAgQE91dHB1dCgpIHNlbGVjdGVkRmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIF9maWxlU2hvd1RhYmxlOiBhbnlbXSA9IFtdXG5cbiAgLyoq6KGo5qC86YCJ5oup55qE5paH5Lu25Zue6LCDICovXG4gIF9zZWxlY3RGaWxlZm4oZXZlbnQ6IGFueVtdKSB7XG4gICAgY29uc3QgX2ZpbGVTaG93VGFibGUgPSBzdHJ1Y3R1cmVkQ2xvbmUoZXZlbnQpXG4gICAgdGhpcy5fZmlsZVNob3dUYWJsZSA9IF9maWxlU2hvd1RhYmxlXG4gICAgdGhpcy5zZWxlY3RGb3JtRmlsZSA9IF9maWxlU2hvd1RhYmxlXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVDaGFuZ2UuZW1pdChfZmlsZVNob3dUYWJsZSlcbiAgfVxuXG4gIC8qKuaooeaAgeahhi3nirbmgIEt5piv5ZCm5omT5byAICovXG4gIE1vZGFsT3Blbj0gZmFsc2VcblxuICAvKirliKDpmaTmlofku7booajmoLzpobkgKi9cbiAgZGVsZXRlRmlsZVRhYmxlSXRlbShpLCBmaWxlKSB7XG4gICAgdGhpcy5fZmlsZVNob3dUYWJsZS5zcGxpY2UoaSwgMSlcbiAgICB0aGlzLnNlbGVjdEZvcm1GaWxlID0gdGhpcy5fZmlsZVNob3dUYWJsZVxuICAgIHRoaXMuc2VsZWN0ZWRGaWxlQ2hhbmdlLmVtaXQoW10pXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdEZvcm1GaWxlKVxuICB9XG4gIC8qKuiwg+aVtOihqOagvOS9jee9riAqL1xuICAgIGRyb3AoZXZlbnQ6IGFueSkge1xuICAgICAgbW92ZUl0ZW1JbkFycmF5KFxuICAgICAgICB0aGlzLl9maWxlU2hvd1RhYmxlLFxuICAgICAgICBldmVudC5wcmV2aW91c0luZGV4LFxuICAgICAgICBldmVudC5jdXJyZW50SW5kZXhcbiAgICAgICk7XG4gICAgICB0aGlzLnNlbGVjdEZvcm1GaWxlID0gdGhpcy5fZmlsZVNob3dUYWJsZVxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdEZvcm1GaWxlKVxuICAgICAgLy8gdGhpcy5fZmlsZVNob3dUYWJsZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcbiAgICB9XG59XG4iLCI8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tZGFyayBzb2Z0IG1zLTIgZmxvYXQtZW5kXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgKGNsaWNrLnN0b3ApPVwiTW9kYWxPcGVuID0gdHJ1ZVwiPnt7J0ZpbGVFeHBsb3Jlcjo6U2VsZWN0RmlsZScgfCBhYnBMb2NhbGl6YXRpb259fTwvYnV0dG9uPlxuXG48ZmUtZmlsZS1tb2RhbCBbKHZpc2libGUpXT1cIk1vZGFsT3BlblwiIFtzZWxlY3RQaWNrZXJGaWxlXT1cInNlbGVjdEZvcm1GaWxlXCIgW211bHRpcGxlXT1cIl9tdWx0aXBsZVwiXG4gICAgKHNlbGVjdEZpbGVmbik9XCJfc2VsZWN0RmlsZWZuKCRldmVudClcIiBbZmlsZUNvbnRhaW5lck5hbWVdPVwiX2ZpbGVDb250YWluZXJOYW1lXCI+PC9mZS1maWxlLW1vZGFsPlxuPHRhYmxlIGNsYXNzPVwidGFibGVcIiAqbmdJZj1cIl9maWxlU2hvd1RhYmxlLmxlbmd0aD4wXCIgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIj5cbiAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIHN0eWxlPVwid2lkdGg6IDMwcHg7XCI+PC90aD5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPjwvdGg+XG4gICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydGaWxlRXhwbG9yZXI6OkZpbGVOYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC90aD5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPnt7J0ZpbGVFeHBsb3Jlcjo6RmlsZVNpemUnIHwgYWJwTG9jYWxpemF0aW9ufX08L3RoPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+PC90aD5cbiAgICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuICAgIDx0Ym9keT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBfZmlsZVNob3dUYWJsZTtsZXQgaSA9aW5kZXhcIj5cbiAgICAgICAgICAgIDx0ciBjZGtEcmFnIGNka0RyYWdMb2NrQXhpcz1cInlcIiBbY2RrRHJhZ0RhdGFdPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyYWctaGFuZGxlXCIgY2RrRHJhZ0hhbmRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmkgYmktYXJyb3dzLW1vdmUgZnMtNVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxmZS1maWxlLXByZXZpZXcgW3dpZHRoXT1cIic4MHB4J1wiIFtzcmNdPVwiaXRlbS51cmx8fGl0ZW0uVXJsXCIgW25hbWVdPVwiaXRlbS5uYW1lfHxpdGVtLk5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiaXRlbS5taW1lVHlwZXx8aXRlbS5NaW1lVHlwZVwiIFtwcmV2aWV3XT1cInRydWVcIj48L2ZlLWZpbGUtcHJldmlldz5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7aXRlbS5uYW1lfHxpdGVtLk5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPHRkPnt7KGl0ZW0uU2l6ZXx8aXRlbS5zaXplKXxmb3JtYXRGaWxlU2l6ZX19PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIHAtMCBidG4tbGlnaHQgXCIgKGNsaWNrLnN0b3ApPVwiZGVsZXRlRmlsZVRhYmxlSXRlbShpLGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaCBwLTJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L3Rib2R5PlxuPC90YWJsZT4iXX0=
@@ -4,4 +4,4 @@ export * from './file-modal/file-modal.component';
4
4
  export * from './file-modal-tree/file-modal-tree.component';
5
5
  export * from './file-picker/file-picker.component';
6
6
  export * from './dynamic-form/form-control-group';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9maWxlLWV4cGxvcmVyL3NyYy9saWIvY29tcG9uZW50cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDRCQUE0QixDQUFBO0FBQzFDLGNBQWMsaUNBQWlDLENBQUE7QUFDL0MsY0FBYyxtQ0FBbUMsQ0FBQTtBQUNqRCxjQUFjLDZDQUE2QyxDQUFBO0FBQzNELGNBQWMscUNBQXFDLENBQUE7QUFDbkQsY0FBYyxtQ0FBbUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZG9tZS9maWxlLWRvbWUuY29tcG9uZW50J1xyXG5leHBvcnQgKiBmcm9tICcuL2ZpbGUtZWRpdC9maWxlLWVkaXQuY29tcG9uZW50J1xyXG5leHBvcnQgKiBmcm9tICcuL2ZpbGUtbW9kYWwvZmlsZS1tb2RhbC5jb21wb25lbnQnXHJcbmV4cG9ydCAqIGZyb20gJy4vZmlsZS1tb2RhbC10cmVlL2ZpbGUtbW9kYWwtdHJlZS5jb21wb25lbnQnXHJcbmV4cG9ydCAqIGZyb20gJy4vZmlsZS1waWNrZXIvZmlsZS1waWNrZXIuY29tcG9uZW50J1xyXG5leHBvcnQgKiBmcm9tICcuL2R5bmFtaWMtZm9ybS9mb3JtLWNvbnRyb2wtZ3JvdXAnIl19
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9maWxlLWV4cGxvcmVyL3NyYy9saWIvY29tcG9uZW50cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDRCQUE0QixDQUFBO0FBQzFDLGNBQWMsaUNBQWlDLENBQUE7QUFDL0MsY0FBYyxtQ0FBbUMsQ0FBQTtBQUNqRCxjQUFjLDZDQUE2QyxDQUFBO0FBQzNELGNBQWMscUNBQXFDLENBQUE7QUFDbkQsY0FBYyxtQ0FBbUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZG9tZS9maWxlLWRvbWUuY29tcG9uZW50J1xyXG5leHBvcnQgKiBmcm9tICcuL2ZpbGUtZWRpdC9maWxlLWVkaXQuY29tcG9uZW50J1xyXG5leHBvcnQgKiBmcm9tICcuL2ZpbGUtbW9kYWwvZmlsZS1tb2RhbC5jb21wb25lbnQnXHJcbmV4cG9ydCAqIGZyb20gJy4vZmlsZS1tb2RhbC10cmVlL2ZpbGUtbW9kYWwtdHJlZS5jb21wb25lbnQnXHJcbmV4cG9ydCAqIGZyb20gJy4vZmlsZS1waWNrZXIvZmlsZS1waWNrZXIuY29tcG9uZW50J1xyXG5leHBvcnQgKiBmcm9tICcuL2R5bmFtaWMtZm9ybS9mb3JtLWNvbnRyb2wtZ3JvdXAnIl19