imm-element-ui 2.6.8 → 2.6.9

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.
@@ -0,0 +1,228 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { HttpClient, HttpEventType, HttpRequest } from '@angular/common/http';
3
+ import { ButtonModule } from 'primeng/button';
4
+ import { FileUpload } from 'primeng/fileupload';
5
+ import { filter, forkJoin } from 'rxjs';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "primeng/button";
8
+ export class UploadRenderer {
9
+ constructor() {
10
+ this.http = inject(HttpClient);
11
+ this.uploadParams = {};
12
+ this.fileList = [];
13
+ this.loading = false;
14
+ }
15
+ agInit(params) {
16
+ this.refresh(params);
17
+ }
18
+ refresh(params) {
19
+ this.params = params;
20
+ this.uploadParams = this.resolveUploadParams(params);
21
+ this.fileList = this.toFileList(params.value);
22
+ return true;
23
+ }
24
+ uploadHandler(event, fu) {
25
+ const files = Array.from(event.files || []);
26
+ if (!files.length || this.isDisabled()) {
27
+ return;
28
+ }
29
+ const uploadRequests = files.map((file) => this.uploadFile(file));
30
+ this.loading = true;
31
+ forkJoin(uploadRequests).subscribe({
32
+ next: (responses) => {
33
+ const uploadedFiles = responses.map((response) => response.body?.fileName).filter(Boolean);
34
+ this.fileList = [...this.fileList, ...uploadedFiles];
35
+ this.commitValue();
36
+ fu.clear();
37
+ },
38
+ error: () => {
39
+ this.loading = false;
40
+ fu.clear();
41
+ },
42
+ });
43
+ }
44
+ deleteHandler(file, index) {
45
+ if (this.isDisabled() || this.loading) {
46
+ return;
47
+ }
48
+ this.loading = true;
49
+ this.delFile(file).subscribe({
50
+ next: () => {
51
+ this.fileList = this.fileList.filter((_, fileIndex) => fileIndex !== index);
52
+ this.commitValue();
53
+ },
54
+ error: () => {
55
+ this.loading = false;
56
+ },
57
+ });
58
+ }
59
+ isDisabled() {
60
+ if (typeof this.uploadParams.disabled === 'function') {
61
+ return this.uploadParams.disabled(this.params);
62
+ }
63
+ if (this.uploadParams.disabled !== undefined) {
64
+ return this.uploadParams.disabled;
65
+ }
66
+ return Boolean(this.params.context?.gridDisabled?.());
67
+ }
68
+ getDownloadUrl(file) {
69
+ const baseUrl = this.uploadParams.downloadBaseUrl ?? 'https://file-filer.myfoodiepet.com/';
70
+ return `${baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`}${file}`;
71
+ }
72
+ uploadFile(file) {
73
+ const formData = new FormData();
74
+ formData.append('file', file);
75
+ return this.http
76
+ .request(new HttpRequest('POST', this.uploadParams.url ?? 'filerUpload', formData, {
77
+ reportProgress: true,
78
+ withCredentials: this.uploadParams.withCredentials ?? false,
79
+ }))
80
+ .pipe(filter((response) => response.type == HttpEventType.Response));
81
+ }
82
+ delFile(file) {
83
+ return this.http.post(this.uploadParams.deleteUrl ?? 'filerDelete', { fileName: file });
84
+ }
85
+ commitValue() {
86
+ this.loading = false;
87
+ const field = this.params.colDef?.field;
88
+ if (!field) {
89
+ return;
90
+ }
91
+ const oldValue = this.params.data?.[field];
92
+ const newValue = this.toValue(this.fileList);
93
+ const grid = this.params.context?.grid?.();
94
+ this.params.data[field] = newValue;
95
+ grid?.cellValueChanged({
96
+ colDef: this.params.colDef,
97
+ oldValue,
98
+ newValue,
99
+ rowIndex: this.params.node.rowIndex,
100
+ data: this.params.data,
101
+ });
102
+ setTimeout(() => this.params.api.resetRowHeights());
103
+ }
104
+ resolveUploadParams(params) {
105
+ if (typeof params.colDef?.cellRendererParams === 'function') {
106
+ return params.colDef.cellRendererParams(params) || {};
107
+ }
108
+ return params.colDef?.cellRendererParams || {};
109
+ }
110
+ toFileList(value) {
111
+ if (Array.isArray(value)) {
112
+ return value.filter(Boolean);
113
+ }
114
+ return typeof value === 'string' && value.length > 0 ? value.split(';').filter(Boolean) : [];
115
+ }
116
+ toValue(files) {
117
+ return files.join(';');
118
+ }
119
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploadRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
120
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: UploadRenderer, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
121
+ <div class="upload-renderer">
122
+ <p-fileUpload
123
+ #fu
124
+ auto
125
+ mode="basic"
126
+ [name]="uploadParams.name || 'file'"
127
+ [multiple]="uploadParams.multiple ?? true"
128
+ [accept]="uploadParams.accept"
129
+ [maxFileSize]="uploadParams.maxFileSize"
130
+ [fileLimit]="uploadParams.fileLimit"
131
+ [withCredentials]="uploadParams.withCredentials ?? false"
132
+ [customUpload]="true"
133
+ [disabled]="isDisabled() || loading"
134
+ mode="advanced"
135
+ [styleClass]="'upload-renderer-choose'"
136
+ (uploadHandler)="uploadHandler($event, fu)">
137
+ <ng-template
138
+ #header
139
+ let-chooseCallback="chooseCallback">
140
+ <p-button
141
+ icon="pi pi-cloud-upload"
142
+ [text]="true"
143
+ size="small"
144
+ [disabled]="isDisabled() || loading"
145
+ (onClick)="chooseCallback()" />
146
+ </ng-template>
147
+ </p-fileUpload>
148
+
149
+ <div class="upload-renderer-files">
150
+ @for (file of fileList; track index; let index = $index) {
151
+ <div class="upload-renderer-file">
152
+ <a
153
+ class="upload-renderer-file-name"
154
+ [href]="getDownloadUrl(file)"
155
+ [download]="file"
156
+ target="_blank"
157
+ (click)="$event.stopPropagation()"
158
+ >{{ file }}</a
159
+ >
160
+ <p-button
161
+ icon="pi pi-times"
162
+ severity="danger"
163
+ size="small"
164
+ [text]="true"
165
+ [disabled]="isDisabled() || loading"
166
+ (onClick)="deleteHandler(file, index)" />
167
+ </div>
168
+ }
169
+ </div>
170
+ </div>
171
+ `, isInline: true, styles: [".upload-renderer{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:2px;width:100%;min-width:0;padding:2px 0}:host ::ng-deep .upload-renderer-choose{display:inline-flex;align-items:center;width:28px;height:28px;border:0;background:transparent}:host ::ng-deep .upload-renderer-choose .p-fileupload-header{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;background:transparent}:host ::ng-deep .upload-renderer-choose .p-fileupload-content{display:none;padding:0;border:0}:host ::ng-deep .upload-renderer-choose .p-button,:host ::ng-deep .upload-renderer-choose p-button{width:28px;height:28px;padding:0}:host ::ng-deep .upload-renderer-choose .p-button-label{display:none}.upload-renderer-files{display:flex;flex-direction:column;align-items:stretch;gap:2px;width:100%;min-width:0;overflow:hidden}.upload-renderer-file{display:flex;align-items:center;justify-content:space-between;gap:4px;min-width:0;width:100%}.upload-renderer-file-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--p-primary-color);text-decoration:none}.upload-renderer-file-name:hover{text-decoration:underline}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: FileUpload, selector: "p-fileupload, p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "chooseButtonProps", "uploadButtonProps", "cancelButtonProps", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }] }); }
172
+ }
173
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploadRenderer, decorators: [{
174
+ type: Component,
175
+ args: [{ standalone: true, imports: [ButtonModule, FileUpload], template: `
176
+ <div class="upload-renderer">
177
+ <p-fileUpload
178
+ #fu
179
+ auto
180
+ mode="basic"
181
+ [name]="uploadParams.name || 'file'"
182
+ [multiple]="uploadParams.multiple ?? true"
183
+ [accept]="uploadParams.accept"
184
+ [maxFileSize]="uploadParams.maxFileSize"
185
+ [fileLimit]="uploadParams.fileLimit"
186
+ [withCredentials]="uploadParams.withCredentials ?? false"
187
+ [customUpload]="true"
188
+ [disabled]="isDisabled() || loading"
189
+ mode="advanced"
190
+ [styleClass]="'upload-renderer-choose'"
191
+ (uploadHandler)="uploadHandler($event, fu)">
192
+ <ng-template
193
+ #header
194
+ let-chooseCallback="chooseCallback">
195
+ <p-button
196
+ icon="pi pi-cloud-upload"
197
+ [text]="true"
198
+ size="small"
199
+ [disabled]="isDisabled() || loading"
200
+ (onClick)="chooseCallback()" />
201
+ </ng-template>
202
+ </p-fileUpload>
203
+
204
+ <div class="upload-renderer-files">
205
+ @for (file of fileList; track index; let index = $index) {
206
+ <div class="upload-renderer-file">
207
+ <a
208
+ class="upload-renderer-file-name"
209
+ [href]="getDownloadUrl(file)"
210
+ [download]="file"
211
+ target="_blank"
212
+ (click)="$event.stopPropagation()"
213
+ >{{ file }}</a
214
+ >
215
+ <p-button
216
+ icon="pi pi-times"
217
+ severity="danger"
218
+ size="small"
219
+ [text]="true"
220
+ [disabled]="isDisabled() || loading"
221
+ (onClick)="deleteHandler(file, index)" />
222
+ </div>
223
+ }
224
+ </div>
225
+ </div>
226
+ `, styles: [".upload-renderer{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:2px;width:100%;min-width:0;padding:2px 0}:host ::ng-deep .upload-renderer-choose{display:inline-flex;align-items:center;width:28px;height:28px;border:0;background:transparent}:host ::ng-deep .upload-renderer-choose .p-fileupload-header{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;background:transparent}:host ::ng-deep .upload-renderer-choose .p-fileupload-content{display:none;padding:0;border:0}:host ::ng-deep .upload-renderer-choose .p-button,:host ::ng-deep .upload-renderer-choose p-button{width:28px;height:28px;padding:0}:host ::ng-deep .upload-renderer-choose .p-button-label{display:none}.upload-renderer-files{display:flex;flex-direction:column;align-items:stretch;gap:2px;width:100%;min-width:0;overflow:hidden}.upload-renderer-file{display:flex;align-items:center;justify-content:space-between;gap:4px;min-width:0;width:100%}.upload-renderer-file-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--p-primary-color);text-decoration:none}.upload-renderer-file-name:hover{text-decoration:underline}\n"] }]
227
+ }] });
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLXJlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW1tLWVsZW1lbnQtdWkvc3JjL2xpYi9ncmlkL2NlbGwtcmVuZGVyL3VwbG9hZC1yZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFhLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUl6RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFjLE1BQU0sTUFBTSxDQUFDOzs7QUErSXBELE1BQU0sT0FBTyxjQUFjO0lBaEkzQjtRQWlJUyxTQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWxDLGlCQUFZLEdBQXlCLEVBQUUsQ0FBQztRQUN4QyxhQUFRLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBRyxLQUFLLENBQUM7S0F1SGhCO0lBckhBLE1BQU0sQ0FBQyxNQUEyQjtRQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxPQUFPLENBQUMsTUFBMkI7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFFRCxhQUFhLENBQUMs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QU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUYsQ0FBQztJQUVPLE9BQU8sQ0FBQyxLQUFlO1FBQzlCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDOytHQTNIVyxjQUFjO21HQUFkLGNBQWMsd0VBN0hoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBbURULDB2Q0FwRFMsWUFBWSxrYkFBRSxVQUFVOzs0RkE4SHRCLGNBQWM7a0JBaEkxQixTQUFTO2lDQUNHLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsWUFDekI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW1EVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXZlbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBSZXF1ZXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHR5cGUgeyBJQ2VsbFJlbmRlcmVyQW5ndWxhckNvbXAgfSBmcm9tICdhZy1ncmlkLWFuZ3VsYXInO1xuaW1wb3J0IHR5cGUgeyBJQ2VsbFJlbmRlcmVyUGFyYW1zIH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xuaW1wb3J0IHsgR3JpZENvbXBvbmVudCB9IGZyb20gJy4uL2dyaWQvZ3JpZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHsgRmlsZVVwbG9hZCB9IGZyb20gJ3ByaW1lbmcvZmlsZXVwbG9hZCc7XG5pbXBvcnQgeyBmaWx0ZXIsIGZvcmtKb2luLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkUmVuZGVyZXJQYXJhbXMge1xuXHR1cmw/OiBzdHJpbmc7XG5cdGRlbGV0ZVVybD86IHN0cmluZztcblx0ZG93bmxvYWRCYXNlVXJsPzogc3RyaW5nO1xuXHRtdWx0aXBsZT86IGJvb2xlYW47XG5cdGFjY2VwdD86IHN0cmluZztcblx0bWF4RmlsZVNpemU/OiBudW1iZXI7XG5cdGZpbGVMaW1pdD86IG51bWJlcjtcblx0bmFtZT86IHN0cmluZztcblx0d2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcblx0ZGlzYWJsZWQ/OiBib29sZWFuIHwgKChwYXJhbXM6IElDZWxsUmVuZGVyZXJQYXJhbXMpID0+IGJvb2xlYW4pO1xufVxuXG5AQ29tcG9uZW50KHtcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0aW1wb3J0czogW0J1dHRvbk1vZHVsZSwgRmlsZVVwbG9hZF0sXG5cdHRlbXBsYXRlOiBgXG5cdFx0PGRpdiBjbGFzcz1cInVwbG9hZC1yZW5kZXJlclwiPlxuXHRcdFx0PHAtZmlsZVVwbG9hZFxuXHRcdFx0XHQjZnVcblx0XHRcdFx0YXV0b1xuXHRcdFx0XHRtb2RlPVwiYmFzaWNcIlxuXHRcdFx0XHRbbmFtZV09XCJ1cGxvYWRQYXJhbXMubmFtZSB8fCAnZmlsZSdcIlxuXHRcdFx0XHRbbXVsdGlwbGVdPVwidXBsb2FkUGFyYW1zLm11bHRpcGxlID8/IHRydWVcIlxuXHRcdFx0XHRbYWNjZXB0XT1cInVwbG9hZFBhcmFtcy5hY2NlcHRcIlxuXHRcdFx0XHRbbWF4RmlsZVNpemVdPVwidXBsb2FkUGFyYW1zLm1heEZpbGVTaXplXCJcblx0XHRcdFx0W2ZpbGVMaW1pdF09XCJ1cGxvYWRQYXJhbXMuZmlsZUxpbWl0XCJcblx0XHRcdFx0W3dpdGhDcmVkZW50aWFsc109XCJ1cGxvYWRQYXJhbXMud2l0aENyZWRlbnRpYWxzID8/IGZhbHNlXCJcblx0XHRcdFx0W2N1c3RvbVVwbG9hZF09XCJ0cnVlXCJcblx0XHRcdFx0W2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKSB8fCBsb2FkaW5nXCJcblx0XHRcdFx0bW9kZT1cImFkdmFuY2VkXCJcblx0XHRcdFx0W3N0eWxlQ2xhc3NdPVwiJ3VwbG9hZC1yZW5kZXJlci1jaG9vc2UnXCJcblx0XHRcdFx0KHVwbG9hZEhhbmRsZXIpPVwidXBsb2FkSGFuZGxlcigkZXZlbnQsIGZ1KVwiPlxuXHRcdFx0XHQ8bmctdGVtcGxhdGVcblx0XHRcdFx0XHQjaGVhZGVyXG5cdFx0XHRcdFx0bGV0LWNob29zZUNhbGxiYWNrPVwiY2hvb3NlQ2FsbGJhY2tcIj5cblx0XHRcdFx0XHQ8cC1idXR0b25cblx0XHRcdFx0XHRcdGljb249XCJwaSBwaS1jbG91ZC11cGxvYWRcIlxuXHRcdFx0XHRcdFx0W3RleHRdPVwidHJ1ZVwiXG5cdFx0XHRcdFx0XHRzaXplPVwic21hbGxcIlxuXHRcdFx0XHRcdFx0W2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKSB8fCBsb2FkaW5nXCJcblx0XHRcdFx0XHRcdChvbkNsaWNrKT1cImNob29zZUNhbGxiYWNrKClcIiAvPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9wLWZpbGVVcGxvYWQ+XG5cblx0XHRcdDxkaXYgY2xhc3M9XCJ1cGxvYWQtcmVuZGVyZXItZmlsZXNcIj5cblx0XHRcdFx0QGZvciAoZmlsZSBvZiBmaWxlTGlzdDsgdHJhY2sgaW5kZXg7IGxldCBpbmRleCA9ICRpbmRleCkge1xuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ1cGxvYWQtcmVuZGVyZXItZmlsZVwiPlxuXHRcdFx0XHRcdFx0PGFcblx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJ1cGxvYWQtcmVuZGVyZXItZmlsZS1uYW1lXCJcblx0XHRcdFx0XHRcdFx0W2hyZWZdPVwiZ2V0RG93bmxvYWRVcmwoZmlsZSlcIlxuXHRcdFx0XHRcdFx0XHRbZG93bmxvYWRdPVwiZmlsZVwiXG5cdFx0XHRcdFx0XHRcdHRhcmdldD1cIl9ibGFua1wiXG5cdFx0XHRcdFx0XHRcdChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuXHRcdFx0XHRcdFx0XHQ+e3sgZmlsZSB9fTwvYVxuXHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0PHAtYnV0dG9uXG5cdFx0XHRcdFx0XHRcdGljb249XCJwaSBwaS10aW1lc1wiXG5cdFx0XHRcdFx0XHRcdHNldmVyaXR5PVwiZGFuZ2VyXCJcblx0XHRcdFx0XHRcdFx0c2l6ZT1cInNtYWxsXCJcblx0XHRcdFx0XHRcdFx0W3RleHRdPVwidHJ1ZVwiXG5cdFx0XHRcdFx0XHRcdFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKCkgfHwgbG9hZGluZ1wiXG5cdFx0XHRcdFx0XHRcdChvbkNsaWNrKT1cImRlbGV0ZUhhbmRsZXIoZmlsZSwgaW5kZXgpXCIgLz5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0fVxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdGAsXG5cdHN0eWxlczogYFxuXHRcdC51cGxvYWQtcmVuZGVyZXIge1xuXHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0XHRhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblx0XHRcdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHRcdFx0Z2FwOiAycHg7XG5cdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdG1pbi13aWR0aDogMDtcblx0XHRcdHBhZGRpbmc6IDJweCAwO1xuXHRcdH1cblx0XHQ6aG9zdCA6Om5nLWRlZXAgLnVwbG9hZC1yZW5kZXJlci1jaG9vc2Uge1xuXHRcdFx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdFx0d2lkdGg6IDI4cHg7XG5cdFx0XHRoZWlnaHQ6IDI4cHg7XG5cdFx0XHRib3JkZXI6IDA7XG5cdFx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0XHR9XG5cdFx0Omhvc3QgOjpuZy1kZWVwIC51cGxvYWQtcmVuZGVyZXItY2hvb3NlIC5wLWZpbGV1cGxvYWQtaGVhZGVyIHtcblx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdFx0XHR3aWR0aDogMjhweDtcblx0XHRcdGhlaWdodDogMjhweDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHRib3JkZXI6IDA7XG5cdFx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0XHR9XG5cdFx0Omhvc3QgOjpuZy1kZWVwIC51cGxvYWQtcmVuZGVyZXItY2hvb3NlIC5wLWZpbGV1cGxvYWQtY29udGVudCB7XG5cdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0cGFkZGluZzogMDtcblx0XHRcdGJvcmRlcjogMDtcblx0XHR9XG5cdFx0Omhvc3QgOjpuZy1kZWVwIC51cGxvYWQtcmVuZGVyZXItY2hvb3NlIC5wLWJ1dHRvbixcblx0XHQ6aG9zdCA6Om5nLWRlZXAgLnVwbG9hZC1yZW5kZXJlci1jaG9vc2UgcC1idXR0b24ge1xuXHRcdFx0d2lkdGg6IDI4cHg7XG5cdFx0XHRoZWlnaHQ6IDI4cHg7XG5cdFx0XHRwYWRkaW5nOiAwO1xuXHRcdH1cblx0XHQ6aG9zdCA6Om5nLWRlZXAgLnVwbG9hZC1yZW5kZXJlci1jaG9vc2UgLnAtYnV0dG9uLWxhYmVsIHtcblx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0fVxuXHRcdC51cGxvYWQtcmVuZGVyZXItZmlsZXMge1xuXHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0XHRhbGlnbi1pdGVtczogc3RyZXRjaDtcblx0XHRcdGdhcDogMnB4O1xuXHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRtaW4td2lkdGg6IDA7XG5cdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xuXHRcdH1cblx0XHQudXBsb2FkLXJlbmRlcmVyLWZpbGUge1xuXHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cdFx0XHRnYXA6IDRweDtcblx0XHRcdG1pbi13aWR0aDogMDtcblx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdH1cblx0XHQudXBsb2FkLXJlbmRlcmVyLWZpbGUtbmFtZSB7XG5cdFx0XHRtaW4td2lkdGg6IDA7XG5cdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xuXHRcdFx0dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG5cdFx0XHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXHRcdFx0Y29sb3I6IHZhcigtLXAtcHJpbWFyeS1jb2xvcik7XG5cdFx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cdFx0fVxuXHRcdC51cGxvYWQtcmVuZGVyZXItZmlsZS1uYW1lOmhvdmVyIHtcblx0XHRcdHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuXHRcdH1cblx0YCxcbn0pXG5leHBvcnQgY2xhc3MgVXBsb2FkUmVuZGVyZXIgaW1wbGVtZW50cyBJQ2VsbFJlbmRlcmVyQW5ndWxhckNvbXAge1xuXHRwcml2YXRlIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG5cdHBhcmFtcyE6IElDZWxsUmVuZGVyZXJQYXJhbXM7XG5cdHVwbG9hZFBhcmFtczogVXBsb2FkUmVuZGVyZXJQYXJhbXMgPSB7fTtcblx0ZmlsZUxpc3Q6IHN0cmluZ1tdID0gW107XG5cdGxvYWRpbmcgPSBmYWxzZTtcblxuXHRhZ0luaXQocGFyYW1zOiBJQ2VsbFJlbmRlcmVyUGFyYW1zKTogdm9pZCB7XG5cdFx0dGhpcy5yZWZyZXNoKHBhcmFtcyk7XG5cdH1cblxuXHRyZWZyZXNoKHBhcmFtczogSUNlbGxSZW5kZXJlclBhcmFtcyk6IGJvb2xlYW4ge1xuXHRcdHRoaXMucGFyYW1zID0gcGFyYW1zO1xuXHRcdHRoaXMudXBsb2FkUGFyYW1zID0gdGhpcy5yZXNvbHZlVXBsb2FkUGFyYW1zKHBhcmFtcyk7XG5cdFx0dGhpcy5maWxlTGlzdCA9IHRoaXMudG9GaWxlTGlzdChwYXJhbXMudmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0dXBsb2FkSGFuZGxlcihldmVudDogYW55LCBmdTogYW55KSB7XG5cdFx0Y29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKGV2ZW50LmZpbGVzIHx8IFtdKSBhcyBGaWxlW107XG5cdFx0aWYgKCFmaWxlcy5sZW5ndGggfHwgdGhpcy5pc0Rpc2FibGVkKCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgdXBsb2FkUmVxdWVzdHM6IE9ic2VydmFibGU8YW55PltdID0gZmlsZXMubWFwKChmaWxlKSA9PiB0aGlzLnVwbG9hZEZpbGUoZmlsZSkpO1xuXHRcdHRoaXMubG9hZGluZyA9IHRydWU7XG5cdFx0Zm9ya0pvaW4odXBsb2FkUmVxdWVzdHMpLnN1YnNjcmliZSh7XG5cdFx0XHRuZXh0OiAocmVzcG9uc2VzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHVwbG9hZGVkRmlsZXMgPSByZXNwb25zZXMubWFwKChyZXNwb25zZTogYW55KSA9PiByZXNwb25zZS5ib2R5Py5maWxlTmFtZSkuZmlsdGVyKEJvb2xlYW4pO1xuXHRcdFx0XHR0aGlzLmZpbGVMaXN0ID0gWy4uLnRoaXMuZmlsZUxpc3QsIC4uLnVwbG9hZGVkRmlsZXNdO1xuXHRcdFx0XHR0aGlzLmNvbW1pdFZhbHVlKCk7XG5cdFx0XHRcdGZ1LmNsZWFyKCk7XG5cdFx0XHR9LFxuXHRcdFx0ZXJyb3I6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cdFx0XHRcdGZ1LmNsZWFyKCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG5cblx0ZGVsZXRlSGFuZGxlcihmaWxlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpIHtcblx0XHRpZiAodGhpcy5pc0Rpc2FibGVkKCkgfHwgdGhpcy5sb2FkaW5nKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMubG9hZGluZyA9IHRydWU7XG5cdFx0dGhpcy5kZWxGaWxlKGZpbGUpLnN1YnNjcmliZSh7XG5cdFx0XHRuZXh0OiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZmlsZUxpc3QgPSB0aGlzLmZpbGVMaXN0LmZpbHRlcigoXywgZmlsZUluZGV4KSA9PiBmaWxlSW5kZXggIT09IGluZGV4KTtcblx0XHRcdFx0dGhpcy5jb21taXRWYWx1ZSgpO1xuXHRcdFx0fSxcblx0XHRcdGVycm9yOiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHR5cGVvZiB0aGlzLnVwbG9hZFBhcmFtcy5kaXNhYmxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0cmV0dXJuIHRoaXMudXBsb2FkUGFyYW1zLmRpc2FibGVkKHRoaXMucGFyYW1zKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMudXBsb2FkUGFyYW1zLmRpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnVwbG9hZFBhcmFtcy5kaXNhYmxlZDtcblx0XHR9XG5cdFx0cmV0dXJuIEJvb2xlYW4odGhpcy5wYXJhbXMuY29udGV4dD8uZ3JpZERpc2FibGVkPy4oKSk7XG5cdH1cblxuXHRnZXREb3dubG9hZFVybChmaWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGJhc2VVcmwgPSB0aGlzLnVwbG9hZFBhcmFtcy5kb3dubG9hZEJhc2VVcmwgPz8gJ2h0dHBzOi8vZmlsZS1maWxlci5teWZvb2RpZXBldC5jb20vJztcblx0XHRyZXR1cm4gYCR7YmFzZVVybC5lbmRzV2l0aCgnLycpID8gYmFzZVVybCA6IGAke2Jhc2VVcmx9L2B9JHtmaWxlfWA7XG5cdH1cblxuXHRwcml2YXRlIHVwbG9hZEZpbGUoZmlsZTogRmlsZSk6IE9ic2VydmFibGU8YW55PiB7XG5cdFx0Y29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcblx0XHRmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcblx0XHRyZXR1cm4gdGhpcy5odHRwXG5cdFx0XHQucmVxdWVzdChcblx0XHRcdFx0bmV3IEh0dHBSZXF1ZXN0KCdQT1NUJywgdGhpcy51cGxvYWRQYXJhbXMudXJsID8/ICdmaWxlclVwbG9hZCcsIGZvcm1EYXRhLCB7XG5cdFx0XHRcdFx0cmVwb3J0UHJvZ3Jlc3M6IHRydWUsXG5cdFx0XHRcdFx0d2l0aENyZWRlbnRpYWxzOiB0aGlzLnVwbG9hZFBhcmFtcy53aXRoQ3JlZGVudGlhbHMgPz8gZmFsc2UsXG5cdFx0XHRcdH0pLFxuXHRcdFx0KVxuXHRcdFx0LnBpcGUoZmlsdGVyKChyZXNwb25zZTogSHR0cEV2ZW50PGFueT4pID0+IHJlc3BvbnNlLnR5cGUgPT0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBkZWxGaWxlKGZpbGU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMudXBsb2FkUGFyYW1zLmRlbGV0ZVVybCA/PyAnZmlsZXJEZWxldGUnLCB7IGZpbGVOYW1lOiBmaWxlIH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBjb21taXRWYWx1ZSgpIHtcblx0XHR0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblx0XHRjb25zdCBmaWVsZCA9IHRoaXMucGFyYW1zLmNvbERlZj8uZmllbGQ7XG5cdFx0aWYgKCFmaWVsZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBvbGRWYWx1ZSA9IHRoaXMucGFyYW1zLmRhdGE/LltmaWVsZF07XG5cdFx0Y29uc3QgbmV3VmFsdWUgPSB0aGlzLnRvVmFsdWUodGhpcy5maWxlTGlzdCk7XG5cdFx0Y29uc3QgZ3JpZDogR3JpZENvbXBvbmVudCB8IHVuZGVmaW5lZCA9IHRoaXMucGFyYW1zLmNvbnRleHQ/LmdyaWQ/LigpO1xuXHRcdHRoaXMucGFyYW1zLmRhdGFbZmllbGRdID0gbmV3VmFsdWU7XG5cdFx0Z3JpZD8uY2VsbFZhbHVlQ2hhbmdlZCh7XG5cdFx0XHRjb2xEZWY6IHRoaXMucGFyYW1zLmNvbERlZixcblx0XHRcdG9sZFZhbHVlLFxuXHRcdFx0bmV3VmFsdWUsXG5cdFx0XHRyb3dJbmRleDogdGhpcy5wYXJhbXMubm9kZS5yb3dJbmRleCxcblx0XHRcdGRhdGE6IHRoaXMucGFyYW1zLmRhdGEsXG5cdFx0fSBhcyBhbnkpO1xuXHRcdHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wYXJhbXMuYXBpLnJlc2V0Um93SGVpZ2h0cygpKTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVVwbG9hZFBhcmFtcyhwYXJhbXM6IElDZWxsUmVuZGVyZXJQYXJhbXMpOiBVcGxvYWRSZW5kZXJlclBhcmFtcyB7XG5cdFx0aWYgKHR5cGVvZiBwYXJhbXMuY29sRGVmPy5jZWxsUmVuZGVyZXJQYXJhbXMgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHJldHVybiBwYXJhbXMuY29sRGVmLmNlbGxSZW5kZXJlclBhcmFtcyhwYXJhbXMpIHx8IHt9O1xuXHRcdH1cblx0XHRyZXR1cm4gcGFyYW1zLmNvbERlZj8uY2VsbFJlbmRlcmVyUGFyYW1zIHx8IHt9O1xuXHR9XG5cblx0cHJpdmF0ZSB0b0ZpbGVMaXN0KHZhbHVlOiBhbnkpOiBzdHJpbmdbXSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUuZmlsdGVyKEJvb2xlYW4pO1xuXHRcdH1cblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUuc3BsaXQoJzsnKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcblx0fVxuXG5cdHByaXZhdGUgdG9WYWx1ZShmaWxlczogc3RyaW5nW10pOiBzdHJpbmcge1xuXHRcdHJldHVybiBmaWxlcy5qb2luKCc7Jyk7XG5cdH1cbn1cbiJdfQ==