@libs-ui/components-inputs-upload 0.2.356-42 → 0.2.356-43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,130 +1,443 @@
1
- # Upload Component
1
+ # @libs-ui/components-inputs-upload
2
2
 
3
- `@libs-ui/components-inputs-upload` một thành phần mạnh mẽ dùng để xử lý việc tải lên tệp tin. Nó hỗ trợ nhiều loại tệp (hình ảnh, video, âm thanh, tài liệu), tải lên nhiều tệp cùng lúc, kéo thả, chỉnh sửa hình ảnh trực tiếp xem trước tệp.
3
+ > Component upload file toàn diện hỗ trợ kéo thả, xem trước, chỉnh sửa ảnh quản nhiều loại tệp khác nhau.
4
4
 
5
- ## Tính năng nổi bật
5
+ ## Giới thiệu
6
6
 
7
- - 📁 **Multi-format Support**: Hỗ trợ `image`, `video`, `audio`, `document`các tổ hợp của chúng.
8
- - 🖱️ **Drag & Drop**: Hỗ trợ kéo thả tệp tin trực tiếp vào vùng tải lên.
9
- - 🖼️ **Image Editor**: Tích hợp trình chỉnh sửa ảnh (cắt, xoay) trước khi lưu.
10
- - 🔍 **File Preview**: Xem trước hình ảnh qua Gallery Viewer và các tài liệu khác qua Preview File component.
11
- - 👤 **Avatar Mode**: Hỗ trợ chế độ chọn một hình ảnh làm ảnh đại diện (isAvatar).
12
- - 📏 **Size & Limit Control**: Kiểm soát kích thước tệp tối đa (theo từng loại), tổng kích thước và số lượng tệp tối đa.
13
- - 🎨 **Display Modes**: Hỗ trợ hai chế độ hiển thị danh sách tệp: `full` (chi tiết) và `short` (gọn nhẹ).
14
- - 🔗 **Sample Download**: Hỗ trợ nút tải tệp mẫu đi kèm.
15
- - 🛡️ **Signal Based**: Sử dụng Angular Signals để quản lý trạng thái tệp và cấu hình mượt mà.
7
+ `@libs-ui/components-inputs-upload` cung cấp giao diện tải tệp mạnh mẽ cho Angular, tích hợp sẵn kéo thả (drag & drop), xem trước hình ảnh/tài liệu qua Gallery Viewer và Preview File, chỉnh sửa ảnh (cắt/xoay) bằng Image Editor động. Component sử dụng Angular Signals để quản lý trạng thái tệp theo thời gian thực, hỗ trợ kiểm soát kích thước, số lượng, định dạng tích hợp luồng upload có tiến trình phần trăm.
16
8
 
17
- ## Cài đặt
9
+ ## Tính năng
10
+
11
+ - ✅ Hỗ trợ đa định dạng: `image`, `video`, `audio`, `document` và các tổ hợp
12
+ - ✅ Kéo thả tệp trực tiếp vào vùng upload (Drag & Drop)
13
+ - ✅ Tích hợp Image Editor (cắt, xoay) với tỉ lệ khung hình tùy chỉnh
14
+ - ✅ Xem trước hình ảnh qua Gallery Viewer và tài liệu qua Preview File
15
+ - ✅ Chế độ Avatar — tự động gán ảnh đầu tiên làm ảnh đại diện
16
+ - ✅ Kiểm soát kích thước tối đa theo từng loại file (image / video / audio / document)
17
+ - ✅ Kiểm soát tổng dung lượng và số lượng tệp tối đa
18
+ - ✅ Hai chế độ hiển thị: `full` (chi tiết) và `short` (gọn nhẹ)
19
+ - ✅ Nút tải tệp mẫu đi kèm (download sample file)
20
+ - ✅ Hiển thị tiến trình upload phần trăm qua `IUploadFunctionControlEvent`
21
+ - ✅ Validate bắt buộc tích hợp (`validRequired`)
22
+ - ✅ Chế độ readonly và disable riêng biệt
23
+
24
+ ## Khi nào sử dụng
18
25
 
19
- Sử dụng npm hoặc yarn để cài đặt:
26
+ - Tải lên ảnh đại diện người dùng với crop tỉ lệ cố định
27
+ - Đính kèm tài liệu (PDF, Excel, Word) trong biểu mẫu
28
+ - Quản lý thư viện hình ảnh hoặc video với tính năng xem trước
29
+ - Cần giới hạn nghiêm ngặt kích thước và định dạng tệp được phép
30
+ - Form có yêu cầu upload bắt buộc với validate tích hợp
31
+ - Cần kiểm soát tiến trình upload qua API bên ngoài
32
+
33
+ ## Cài đặt
20
34
 
21
35
  ```bash
22
36
  npm install @libs-ui/components-inputs-upload
23
37
  ```
24
38
 
25
- ## Cách sử dụng
26
-
27
- ### Import Module
39
+ ## Import
28
40
 
29
41
  ```typescript
30
42
  import { LibsUiComponentsInputsUploadComponent } from '@libs-ui/components-inputs-upload';
31
43
 
44
+ // Các directives độc lập (nếu cần dùng riêng)
45
+ import { LibsUiComponentsInputsUploadDirective } from '@libs-ui/components-inputs-upload';
46
+ import { LibsUiComponentsInputsUploadDropFileDirective } from '@libs-ui/components-inputs-upload';
47
+
48
+ // Sub-component Avatar
49
+ import { LibsUiComponentsInputsUploadAvatarComponent } from '@libs-ui/components-inputs-upload';
50
+
51
+ // Types & Interfaces
52
+ import {
53
+ TYPE_FILE_UPLOAD,
54
+ TYPE_MODE_FILE_DISPLAY,
55
+ IUploadFunctionControlEvent,
56
+ IUploadConfigDownloadSampleFile,
57
+ IUploadDescriptionFormatAndSizeFile,
58
+ } from '@libs-ui/components-inputs-upload';
59
+ ```
60
+
61
+ Đăng ký vào component standalone:
62
+
63
+ ```typescript
32
64
  @Component({
33
65
  standalone: true,
34
66
  imports: [LibsUiComponentsInputsUploadComponent],
35
- // ...
36
67
  })
37
- export class YourComponent {}
68
+ export class MyComponent {}
38
69
  ```
39
70
 
40
- ### Ví dụ bản (Tải lên hình ảnh)
71
+ ## Ví dụ sử dụng
72
+
73
+ ### Ví dụ 1 — Upload nhiều ảnh cơ bản
41
74
 
42
75
  ```html
43
76
  <libs_ui-components-inputs-upload
44
77
  [fileType]="'image'"
45
78
  [multiple]="true"
46
79
  [limitFile]="5"
47
- (outFileChanged)="handleFileChanged($event)"></libs_ui-components-inputs-upload>
80
+ [maxImageSize]="5 * 1024 * 1024"
81
+ (outFileChanged)="handlerFileChanged($event)"
82
+ />
48
83
  ```
49
84
 
50
- ### Chế độ Avatar và Chỉnh sửa ảnh
85
+ ```typescript
86
+ import { Component, signal, WritableSignal } from '@angular/core';
87
+ import { LibsUiComponentsInputsUploadComponent } from '@libs-ui/components-inputs-upload';
88
+ import { IFile } from '@libs-ui/interfaces-types';
89
+
90
+ @Component({
91
+ standalone: true,
92
+ imports: [LibsUiComponentsInputsUploadComponent],
93
+ templateUrl: './my.component.html',
94
+ })
95
+ export class MyComponent {
96
+ protected files = signal<Array<WritableSignal<IFile>>>([]);
97
+
98
+ protected handlerFileChanged(files: Array<WritableSignal<IFile>>): void {
99
+ this.files.set(files);
100
+ }
101
+ }
102
+ ```
103
+
104
+ ### Ví dụ 2 — Chế độ Avatar với cắt ảnh tỉ lệ 1:1
51
105
 
52
106
  ```html
53
107
  <libs_ui-components-inputs-upload
54
108
  [fileType]="'image'"
109
+ [multiple]="false"
55
110
  [canSetAvatar]="true"
56
111
  [aspectRatio]="{ width: 1, height: 1 }"
57
- [multiple]="false"
58
- (outFileChanged)="onAvatarChanged($event)"></libs_ui-components-inputs-upload>
59
- ```
60
-
61
- ## API Reference
62
-
63
- ### Inputs
64
-
65
- | Thuộc tính | Kiểu dữ liệu | Mặc định | Mô tả |
66
- | :---------------------------------------- | :-------------------------------- | :----------------------- | :------------------------------------------------------------ |
67
- | `allowShowPushMessageMaxSizeError` | `boolean` | `false` | Hiển thị thông báo lỗi khi file vượt quá kích thước cho phép. |
68
- | `aspectRatio` | `IAspectRatio` | `undefined` | Tỉ lệ khung hình cố định khi chỉnh sửa ảnh. |
69
- | `audioExtList` | `string[]` | `AudioExtList` | Danh sách đuôi file âm thanh được phép. |
70
- | `canSetAvatar` | `boolean` | `false` | Hiển thị nút chọn ảnh đại diện cho các file ảnh. |
71
- | `canUploadIfHasExistFile` | `boolean` | `false` | Cho phép tải lên tiếp khi đã có file (với single mode). |
72
- | `classIncludeAvatar` | `string` | `''` | Class CSS cho vùng ảnh đại diện. |
73
- | `classIncludeFileContent` | `string` | `''` | Class CSS cho vùng nội dung file. |
74
- | `classIncludeListItem` | `string` | `undefined` | Class CSS cho từng item file. |
75
- | `configDescriptionInputUpload` | `IMessageTranslate` | `{message: ...}` | Cấu hình mô tả văn bản trong vùng upload. |
76
- | `configDownloadSampleFile` | `IUploadConfigDownloadSampleFile` | `undefined` | Cấu hình nút tải tệp mẫu. |
77
- | `descriptionFormatAndSizeFile` | `Array<IUploadDescription>` | `undefined` | Mô tả định dạng và kích thước file cho phép. |
78
- | `disable` | `boolean` | `false` | Vô hiệu hóa upload. |
79
- | `documentExtList` | `string[]` | `DocumentExtList` | Danh sách đuôi file tài liệu được phép. |
80
- | `fileType` | `TYPE_FILE_UPLOAD` | `'image_video_document'` | Các loại tệp được phép tải lên. |
81
- | `ignoreIconEdit` | `boolean` | `false` | Ẩn nút chỉnh sửa. |
82
- | `ignoreIconPreview` | `boolean` | `true` | Ẩn nút xem trước (mặc định ẩn). |
83
- | `ignoreIconRemove` | `boolean` | `false` | Ẩn nút xóa. |
84
- | `ignoreShowSizeFile` | `boolean` | `false` | Ẩn thông tin kích thước file. |
85
- | `imageExtList` | `string[]` | `ImageExtList` | Danh sách đuôi file ảnh được phép. |
86
- | `labelConfig` | `ILabel` | `undefined` | Cấu hình nhãn phía trên vùng upload. |
87
- | `limitFile` | `number` | `10` | Số lượng tệp tối đa được phép. |
88
- | `maxAudioSize` | `number` | `10MB` | Dung lượng tối đa cho 1 file âm thanh. |
89
- | `maxDocumentSize` | `number` | `10MB` | Dung lượng tối đa cho 1 file tài liệu. |
90
- | `maxImageSize` | `number` | `5MB` | Dung lượng tối đa cho 1 file ảnh. |
91
- | `maxTotalSize` | `number` | `10MB` | Tổng dung lượng tối đa của tất cả các tệp (bytes). |
92
- | `maxVideoSize` | `number` | `10MB` | Dung lượng tối đa cho 1 file video. |
93
- | `messageFileUploadError` | `string` | `...` | Thông báo lỗi khi file upload không hợp lệ. |
94
- | `messageMaxSizeError` | `string` | `...` | Thông báo lỗi khi file quá lớn. |
95
- | `messageTotalFileExceedsError` | `string` | `...` | Thông báo lỗi khi số lượng file vượt quá giới hạn. |
96
- | `messageTypeFileError` | `string` | `...` | Thông báo lỗi khi định dạng file không đúng. |
97
- | `modeDisplayFile` | `'full' \| 'short'` | `'full'` | Chế độ hiển thị danh sách tệp đã chọn. |
98
- | `multiple` | `boolean` | `false` | Cho phép chọn nhiều tệp. |
99
- | `originFiles` | `Array<WritableSignal<IFile>>` | `[]` | Danh sách file khởi tạo ban đầu. |
100
- | `readonly` | `boolean` | `false` | Chế độ chỉ đọc. |
101
- | `showBorderErrorAllItemWhenError` | `boolean` | `false` | Hiển thị border đỏ cho tất cả item khi có lỗi. |
102
- | `showPopupUploadWhenHasFileAndModeSingle` | `boolean` | `false` | Hiển thị popup upload khi click vào file ở chế độ single. |
103
- | `showVideoDuration` | `boolean` | `false` | Hiển thị thời lượng video. |
104
- | `validRequired` | `IIsValidRequired` | `undefined` | Cấu hình validate bắt buộc. |
105
- | `videoExtList` | `string[]` | `VideoExtList` | Danh sách đuôi file video được phép. |
106
- | `zIndex` | `number` | `1200` | Z-index của các popup (gallery, editor). |
107
-
108
- ### Outputs
109
-
110
- | Sự kiện | Kiểu dữ liệu | Mô tả |
111
- | :-------------------- | :----------------------------- | :------------------------------------------------------------------------------- |
112
- | `outFileChanged` | `Array<WritableSignal<IFile>>` | Phát ra danh sách tệp mỗi khi có sự thay đổi (thêm, xóa, sửa). |
113
- | `outFileRemoved` | `WritableSignal<IFile>` | Phát ra tệp bị xóa khỏi danh sách. |
114
- | `outFunctionsControl` | `IUploadFunctionControlEvent` | Cung cấp các phương thức điều khiển (validate, removeAll, handlerUploadFile...). |
115
- | `outClose` | `boolean` | Phát ra khi đóng popup. |
116
-
117
- ### Methods (via outFunctionsControl)
118
-
119
- - `checkIsValid()`: Kiểm tra tính hợp lệ của danh sách tệp hiện tại.
120
- - `removeAll()`: Xóa sạch danh sách tệp.
121
- - `handlerUploadFile()`: Kích hoạt cửa sổ chọn tệp của trình duyệt.
112
+ [modeDisplayFile]="'short'"
113
+ (outFileChanged)="handlerAvatarChanged($event)"
114
+ />
115
+ ```
116
+
117
+ ```typescript
118
+ import { Component, signal, WritableSignal } from '@angular/core';
119
+ import { LibsUiComponentsInputsUploadComponent } from '@libs-ui/components-inputs-upload';
120
+ import { IAspectRatio, IFile } from '@libs-ui/interfaces-types';
121
+
122
+ @Component({
123
+ standalone: true,
124
+ imports: [LibsUiComponentsInputsUploadComponent],
125
+ templateUrl: './my.component.html',
126
+ })
127
+ export class MyComponent {
128
+ protected avatar = signal<WritableSignal<IFile> | undefined>(undefined);
129
+
130
+ protected handlerAvatarChanged(files: Array<WritableSignal<IFile>>): void {
131
+ const avatarFile = files.find((file) => file().isAvatar);
132
+ this.avatar.set(avatarFile);
133
+ }
134
+ }
135
+ ```
136
+
137
+ ### dụ 3 Đa định dạng với validate bắt buộc và tải tệp mẫu
138
+
139
+ ```html
140
+ <libs_ui-components-inputs-upload
141
+ [fileType]="'image_video_document'"
142
+ [multiple]="true"
143
+ [limitFile]="10"
144
+ [maxTotalSize]="50 * 1024 * 1024"
145
+ [validRequired]="{ isRequired: true, message: 'Vui lòng tải lên ít nhất 1 tệp' }"
146
+ [configDownloadSampleFile]="{
147
+ title: 'Tải file mẫu',
148
+ url: 'assets/sample-template.xlsx',
149
+ position: 'top'
150
+ }"
151
+ (outFunctionsControl)="handlerFunctionsControl($event)"
152
+ (outFileChanged)="handlerFileChanged($event)"
153
+ (outFileRemoved)="handlerFileRemoved($event)"
154
+ />
155
+ ```
156
+
157
+ ```typescript
158
+ import { Component, signal, WritableSignal } from '@angular/core';
159
+ import { LibsUiComponentsInputsUploadComponent, IUploadFunctionControlEvent } from '@libs-ui/components-inputs-upload';
160
+ import { IFile } from '@libs-ui/interfaces-types';
161
+
162
+ @Component({
163
+ standalone: true,
164
+ imports: [LibsUiComponentsInputsUploadComponent],
165
+ templateUrl: './my.component.html',
166
+ })
167
+ export class MyComponent {
168
+ private uploadControl: IUploadFunctionControlEvent | undefined;
169
+ protected files = signal<Array<WritableSignal<IFile>>>([]);
170
+
171
+ protected handlerFunctionsControl(control: IUploadFunctionControlEvent): void {
172
+ this.uploadControl = control;
173
+ }
174
+
175
+ protected handlerFileChanged(files: Array<WritableSignal<IFile>>): void {
176
+ this.files.set(files);
177
+ }
178
+
179
+ protected handlerFileRemoved(file: WritableSignal<IFile>): void {
180
+ console.log('File removed:', file().name);
181
+ }
182
+
183
+ protected async handlerSubmit(): Promise<void> {
184
+ const isValid = await this.uploadControl?.checkIsValid();
185
+ if (!isValid) {
186
+ return;
187
+ }
188
+ // tiến hành submit
189
+ }
190
+
191
+ protected async handlerClear(): Promise<void> {
192
+ await this.uploadControl?.removeAll();
193
+ }
194
+ }
195
+ ```
196
+
197
+ ### Ví dụ 4 — Upload file với hiển thị tiến trình
198
+
199
+ ```html
200
+ <libs_ui-components-inputs-upload
201
+ [fileType]="'image_document'"
202
+ [multiple]="true"
203
+ [originFiles]="existingFiles()"
204
+ (outFunctionsControl)="handlerFunctionsControl($event)"
205
+ (outFileChanged)="handlerFileChanged($event)"
206
+ />
207
+ ```
208
+
209
+ ```typescript
210
+ import { Component, signal, WritableSignal } from '@angular/core';
211
+ import { LibsUiComponentsInputsUploadComponent, IUploadFunctionControlEvent } from '@libs-ui/components-inputs-upload';
212
+ import { IFile } from '@libs-ui/interfaces-types';
213
+
214
+ @Component({
215
+ standalone: true,
216
+ imports: [LibsUiComponentsInputsUploadComponent],
217
+ templateUrl: './my.component.html',
218
+ })
219
+ export class MyComponent {
220
+ private uploadControl: IUploadFunctionControlEvent | undefined;
221
+ protected files = signal<Array<WritableSignal<IFile>>>([]);
222
+ protected existingFiles = signal<Array<WritableSignal<IFile>>>([]);
223
+
224
+ protected handlerFunctionsControl(control: IUploadFunctionControlEvent): void {
225
+ this.uploadControl = control;
226
+ }
227
+
228
+ protected handlerFileChanged(files: Array<WritableSignal<IFile>>): void {
229
+ this.files.set(files);
230
+ // Giả lập tiến trình upload
231
+ files.forEach((file) => {
232
+ const id = file().id;
233
+ if (!id) {
234
+ return;
235
+ }
236
+ this.uploadControl?.uploading({ percent: 50 }, id);
237
+ setTimeout(() => {
238
+ this.uploadControl?.uploading({ percent: 100 }, id);
239
+ }, 2000);
240
+ });
241
+ }
242
+ }
243
+ ```
244
+
245
+ ## @Input()
246
+
247
+ | Input | Type | Default | Mô tả | Ví dụ |
248
+ |---|---|---|---|---|
249
+ | `allowShowPushMessageMaxSizeError` | `boolean` | `false` | Hiển thị notification toast khi file vượt quá kích thước — chỉ áp dụng chế độ single | `[allowShowPushMessageMaxSizeError]="true"` |
250
+ | `aspectRatio` | `IAspectRatio` | `undefined` | Tỉ lệ khung hình cố định khi mở Image Editor để crop ảnh | `[aspectRatio]="{ width: 16, height: 9 }"` |
251
+ | `audioExtList` | `string[]` | `AudioExtList` | Danh sách đuôi file âm thanh được phép tải lên | `[audioExtList]="['mp3', 'wav']"` |
252
+ | `canSetAvatar` | `boolean` | `false` | Bật chế độ chọn ảnh đại diện — file ảnh đầu tiên tự động được đặt làm avatar | `[canSetAvatar]="true"` |
253
+ | `canUploadIfHasExistFile` | `boolean` | `false` | Cho phép tải lên tiếp khi đã có file (áp dụng chế độ single — thay thế file cũ) | `[canUploadIfHasExistFile]="true"` |
254
+ | `classIncludeAvatar` | `string` | `''` | Class CSS bổ sung cho vùng hiển thị avatar | `[classIncludeAvatar]="'w-[80px] h-[80px]'"` |
255
+ | `classIncludeFileContent` | `string` | `''` | Class CSS bổ sung cho vùng nội dung danh sách file | `[classIncludeFileContent]="'mt-2'"` |
256
+ | `classIncludeListItem` | `string` | `undefined` | Class CSS bổ sung cho từng item file trong danh sách | `[classIncludeListItem]="'border-dashed'"` |
257
+ | `configDescriptionInputUpload` | `IMessageTranslate` | `{ message: 'i18n_drag_file_here_to_upload_or_select_file' }` | Cấu hình văn bản mô tả hiển thị trong vùng kéo thả | `[configDescriptionInputUpload]="{ message: 'i18n_drop_files_here' }"` |
258
+ | `configDownloadSampleFile` | `IUploadConfigDownloadSampleFile` | `undefined` | Cấu hình nút tải file mẫu — hỗ trợ URL hoặc callback tùy chỉnh | `[configDownloadSampleFile]="{ title: 'Tải mẫu', url: '/assets/sample.xlsx' }"` |
259
+ | `descriptionFormatAndSizeFile` | `Array<IUploadDescriptionFormatAndSizeFile>` | `undefined` | Ghi đè mô tả định dạng và kích thước file — mặc định tự sinh từ fileType + maxSize | `[descriptionFormatAndSizeFile]="customDesc"` |
260
+ | `disable` | `boolean` | `false` | Vô hiệu hóa toàn bộ vùng upload | `[disable]="isDisabled()"` |
261
+ | `documentExtList` | `string[]` | `DocumentExtList` | Danh sách đuôi file tài liệu được phép | `[documentExtList]="['pdf', 'docx', 'xlsx']"` |
262
+ | `fileType` | `TYPE_FILE_UPLOAD` | `'image_video_document'` | Nhóm định dạng file được phép tải lên — ảnh hưởng đến accept filter | `[fileType]="'image'"` |
263
+ | `ignoreIconEdit` | `boolean` | `false` | Ẩn nút chỉnh sửa ảnh (Image Editor) | `[ignoreIconEdit]="true"` |
264
+ | `ignoreIconPreview` | `boolean` | `true` | Ẩn nút xem trước file — mặc định đã ẩn | `[ignoreIconPreview]="false"` |
265
+ | `ignoreIconRemove` | `boolean` | `false` | Ẩn nút xóa file | `[ignoreIconRemove]="true"` |
266
+ | `ignoreShowSizeFile` | `boolean` | `false` | Ẩn thông tin kích thước file trong danh sách | `[ignoreShowSizeFile]="true"` |
267
+ | `imageExtList` | `string[]` | `ImageExtList` | Danh sách đuôi file ảnh được phép | `[imageExtList]="['jpg', 'png', 'webp']"` |
268
+ | `labelConfig` | `ILabel` | `undefined` | Cấu hình label hiển thị phía trên vùng upload | `[labelConfig]="{ label: 'Tệp đính kèm', required: true }"` |
269
+ | `limitFile` | `number` | `10` | Số lượng file tối đa được phép tải lên | `[limitFile]="3"` |
270
+ | `maxAudioSize` | `number` | `10485760` (10MB) | Kích thước tối đa (bytes) cho mỗi file âm thanh | `[maxAudioSize]="20 * 1024 * 1024"` |
271
+ | `maxDocumentSize` | `number` | `10485760` (10MB) | Kích thước tối đa (bytes) cho mỗi file tài liệu | `[maxDocumentSize]="5 * 1024 * 1024"` |
272
+ | `maxImageSize` | `number` | `5242880` (5MB) | Kích thước tối đa (bytes) cho mỗi file ảnh | `[maxImageSize]="2 * 1024 * 1024"` |
273
+ | `maxTotalSize` | `number` | `10485760` (10MB) | Tổng dung lượng tối đa (bytes) của toàn bộ tệp được upload | `[maxTotalSize]="50 * 1024 * 1024"` |
274
+ | `maxVideoSize` | `number` | `10485760` (10MB) | Kích thước tối đa (bytes) cho mỗi file video | `[maxVideoSize]="100 * 1024 * 1024"` |
275
+ | `messageFileUploadError` | `string` | `'i18n_invalid_file_upload'` | Key i18n thông báo lỗi khi file không hợp lệ (chế độ multiple) | `[messageFileUploadError]="'i18n_custom_error'"` |
276
+ | `messageMaxSizeError` | `string` | `'i18n_file_size_exceeds_the_allowed_limit'` | Key i18n thông báo lỗi khi file vượt kích thước giới hạn | `[messageMaxSizeError]="'i18n_file_too_large'"` |
277
+ | `messageTotalFileExceedsError` | `string` | `'i18n_file_number_exceeds_the_allowed_limit_please_delete_the_file'` | Key i18n thông báo lỗi khi số lượng file vượt limitFile | `[messageTotalFileExceedsError]="'i18n_too_many_files'"` |
278
+ | `messageTypeFileError` | `string` | `'i18n_the_file_support_format_is_not_correct'` | Key i18n thông báo lỗi khi định dạng file không được hỗ trợ | `[messageTypeFileError]="'i18n_format_not_supported'"` |
279
+ | `modeDisplayFile` | `'full' \| 'short'` | `'full'` | Chế độ hiển thị danh sách file: `full` (tên, kích thước, actions) hoặc `short` (ảnh thumbnail nhỏ) | `[modeDisplayFile]="'short'"` |
280
+ | `multiple` | `boolean` | `undefined` | Cho phép chọn nhiều file cùng lúc | `[multiple]="true"` |
281
+ | `originFiles` | `Array<WritableSignal<IFile>>` | `[]` | Danh sách file khởi tạo ban đầu (từ API hoặc edit form) | `[originFiles]="existingFiles()"` |
282
+ | `readonly` | `boolean` | `false` | Chế độ chỉ đọc — hiển thị file nhưng không cho phép thao tác | `[readonly]="isReadonly()"` |
283
+ | `showBorderErrorAllItemWhenError` | `boolean` | `false` | Hiển thị viền đỏ toàn bộ item khi có bất kỳ lỗi nào | `[showBorderErrorAllItemWhenError]="true"` |
284
+ | `showPopupUploadWhenHasFileAndModeSingle` | `boolean` | `false` | Tự động mở dialog chọn file khi click vào file đã có (chế độ single) | `[showPopupUploadWhenHasFileAndModeSingle]="true"` |
285
+ | `showVideoDuration` | `boolean` | `false` | Hiển thị thời lượng video trong thumbnail | `[showVideoDuration]="true"` |
286
+ | `validRequired` | `IIsValidRequired` | `undefined` | Cấu hình validate bắt buộc — hiển thị lỗi khi chưa có file | `[validRequired]="{ isRequired: true, message: 'Vui lòng tải lên ít nhất 1 tệp' }"` |
287
+ | `videoExtList` | `string[]` | `VideoExtList` | Danh sách đuôi file video được phép | `[videoExtList]="['mp4', 'mov', 'avi']"` |
288
+ | `zIndex` | `number` | `1200` | Z-index cho các popup động (Gallery Viewer, Image Editor, Preview File) | `[zIndex]="1500"` |
289
+
290
+ ## @Output()
291
+
292
+ | Output | Type | Mô tả | Handler TS | Binding HTML |
293
+ |---|---|---|---|---|
294
+ | `(outClose)` | `boolean` | Phát ra khi đóng popup upload | `handlerClose(val: boolean): void { event.stopPropagation(); ... }` | `(outClose)="handlerClose($event)"` |
295
+ | `(outFileChanged)` | `Array<WritableSignal<IFile>>` | Phát ra danh sách file hiện tại mỗi khi có thay đổi (thêm, xóa, chỉnh sửa) | `handlerFileChanged(files: Array<WritableSignal<IFile>>): void { this.files.set(files); }` | `(outFileChanged)="handlerFileChanged($event)"` |
296
+ | `(outFileRemoved)` | `WritableSignal<IFile>` | Phát ra file vừa bị xóa — chỉ phát ra khi xóa file có trong `originFiles` | `handlerFileRemoved(file: WritableSignal<IFile>): void { console.log(file().name); }` | `(outFileRemoved)="handlerFileRemoved($event)"` |
297
+ | `(outFunctionsControl)` | `IUploadFunctionControlEvent` | Phát ra object chứa các hàm điều khiển component từ bên ngoài — phát ngay khi `ngOnInit` | `handlerFunctionsControl(ctrl: IUploadFunctionControlEvent): void { this.uploadControl = ctrl; }` | `(outFunctionsControl)="handlerFunctionsControl($event)"` |
298
+
299
+ ## FunctionsControl — Điều khiển từ bên ngoài
300
+
301
+ `outFunctionsControl` cung cấp `IUploadFunctionControlEvent` ngay khi component khởi tạo. Lưu tham chiếu để gọi các hàm điều khiển:
302
+
303
+ ```typescript
304
+ private uploadControl: IUploadFunctionControlEvent | undefined;
305
+
306
+ protected handlerFunctionsControl(ctrl: IUploadFunctionControlEvent): void {
307
+ this.uploadControl = ctrl;
308
+ }
309
+
310
+ // Validate — dùng trước khi submit form
311
+ protected async handlerSubmit(): Promise<void> {
312
+ const isValid = await this.uploadControl?.checkIsValid();
313
+ if (!isValid) {
314
+ return;
315
+ }
316
+ // proceed with form submit
317
+ }
318
+
319
+ // Xóa tất cả file
320
+ protected async handlerReset(): Promise<void> {
321
+ await this.uploadControl?.removeAll();
322
+ }
323
+
324
+ // Cập nhật tiến trình upload file theo id
325
+ protected updateProgress(fileId: string, percent: number): void {
326
+ this.uploadControl?.uploading({ percent }, fileId);
327
+ }
328
+
329
+ // Set thông báo lỗi — toàn component hoặc file cụ thể theo id
330
+ protected setError(message: string, fileId?: string): void {
331
+ this.uploadControl?.setMessageError(message, fileId);
332
+ }
333
+
334
+ // Kích hoạt dialog chọn file (tương đương click vào nút upload)
335
+ protected handlerTriggerUpload(): void {
336
+ this.uploadControl?.handlerUploadFile();
337
+ }
338
+ ```
339
+
340
+ ## Sub-components
341
+
342
+ ### LibsUiComponentsInputsUploadAvatarComponent
343
+
344
+ Component con hiển thị thumbnail cho từng file trong danh sách. Dùng độc lập khi cần custom UI danh sách file.
345
+
346
+ ```typescript
347
+ import { LibsUiComponentsInputsUploadAvatarComponent } from '@libs-ui/components-inputs-upload';
348
+ ```
349
+
350
+ Selector: `libs_ui-components-inputs-upload-avatar`
351
+
352
+ | Input | Type | Default | Mô tả | Ví dụ |
353
+ |---|---|---|---|---|
354
+ | `item` | `IFile` (model) | bắt buộc | File cần hiển thị thumbnail — là `model()` hai chiều | `[(item)]="fileSignal()"` |
355
+ | `classInclude` | `string` | `''` | Class CSS bổ sung cho container | `[classInclude]="'w-[60px] h-[60px]'"` |
356
+ | `disable` | `boolean` | `undefined` | Vô hiệu hóa tương tác | `[disable]="true"` |
357
+ | `showVideoDuration` | `boolean` | `undefined` | Hiển thị thời lượng video | `[showVideoDuration]="true"` |
358
+ | `size` | `number` | `undefined` | Kích thước ảnh thumbnail (px) | `[size]="80"` |
359
+
360
+ | Output | Type | Mô tả | Handler TS | Binding HTML |
361
+ |---|---|---|---|---|
362
+ | `(outOpenPreview)` | `IFile` | Phát ra khi click vào thumbnail để xem trước | `handlerOpenPreview(file: IFile): void { event.stopPropagation(); ... }` | `(outOpenPreview)="handlerOpenPreview($event)"` |
363
+
364
+ ### LibsUiComponentsInputsUploadDirective
365
+
366
+ Directive gắn vào element bất kỳ để biến nó thành trigger mở dialog chọn file.
367
+
368
+ ```typescript
369
+ import { LibsUiComponentsInputsUploadDirective } from '@libs-ui/components-inputs-upload';
370
+ ```
371
+
372
+ Selector: `[LibsUiComponentsInputsUploadDirective]`
373
+
374
+ ```html
375
+ <button LibsUiComponentsInputsUploadDirective
376
+ [accessFiles]="'.jpg,.png,.pdf'"
377
+ [multiple]="true"
378
+ (outUploadFiles)="handlerUploadFiles($event)"
379
+ (outUploadFile)="handlerUploadFile($event)">
380
+ Chọn file
381
+ </button>
382
+ ```
383
+
384
+ | Input | Type | Default | Mô tả | Ví dụ |
385
+ |---|---|---|---|---|
386
+ | `accessFiles` | `string` | `'image/x-png,image/jpg,image/jpeg,...'` | Chuỗi MIME types hoặc extensions được chấp nhận | `[accessFiles]="'.jpg,.png,.pdf'"` |
387
+ | `multiple` | `boolean` | `true` | Cho phép chọn nhiều file | `[multiple]="false"` |
388
+
389
+ | Output | Type | Mô tả | Handler TS | Binding HTML |
390
+ |---|---|---|---|---|
391
+ | `(outUploadFiles)` | `File[]` | Phát ra khi chọn nhiều file (multiple = true) | `handlerUploadFiles(files: File[]): void { ... }` | `(outUploadFiles)="handlerUploadFiles($event)"` |
392
+ | `(outUploadFile)` | `File` | Phát ra khi chọn một file (multiple = false) | `handlerUploadFile(file: File): void { ... }` | `(outUploadFile)="handlerUploadFile($event)"` |
393
+
394
+ ### LibsUiComponentsInputsUploadDropFileDirective
395
+
396
+ Directive gắn vào container để nhận file kéo thả vào.
397
+
398
+ ```typescript
399
+ import { LibsUiComponentsInputsUploadDropFileDirective } from '@libs-ui/components-inputs-upload';
400
+ ```
401
+
402
+ Selector: `[LibsUiComponentsInputsUploadDropFileDirective]`
403
+
404
+ ```html
405
+ <div LibsUiComponentsInputsUploadDropFileDirective
406
+ [multiple]="true"
407
+ (outDragOver)="handlerDragOver($event)"
408
+ (outDragLeave)="handlerDragLeave($event)"
409
+ (outDropFiles)="handlerDropFiles($event)">
410
+ Kéo thả file vào đây
411
+ </div>
412
+ ```
413
+
414
+ | Input | Type | Default | Mô tả | Ví dụ |
415
+ |---|---|---|---|---|
416
+ | `multiple` | `boolean` | `true` | Cho phép thả nhiều file | `[multiple]="false"` |
417
+
418
+ | Output | Type | Mô tả | Handler TS | Binding HTML |
419
+ |---|---|---|---|---|
420
+ | `(outDragOver)` | `IEvent` | Phát ra khi file được kéo vào vùng drop | `handlerDragOver(e: IEvent): void { ... }` | `(outDragOver)="handlerDragOver($event)"` |
421
+ | `(outDragLeave)` | `IEvent` | Phát ra khi file rời khỏi vùng drop | `handlerDragLeave(e: IEvent): void { ... }` | `(outDragLeave)="handlerDragLeave($event)"` |
422
+ | `(outDrop)` | `IEvent` | Phát ra khi thả file (raw event) | `handlerDrop(e: IEvent): void { ... }` | `(outDrop)="handlerDrop($event)"` |
423
+ | `(outDropFiles)` | `File[]` | Phát ra danh sách file khi thả nhiều (multiple = true) | `handlerDropFiles(files: File[]): void { ... }` | `(outDropFiles)="handlerDropFiles($event)"` |
424
+ | `(outDropFile)` | `File` | Phát ra file đầu tiên khi thả (multiple = false) | `handlerDropFile(file: File): void { ... }` | `(outDropFile)="handlerDropFile($event)"` |
122
425
 
123
426
  ## Types & Interfaces
124
427
 
428
+ ```typescript
429
+ import {
430
+ TYPE_FILE_UPLOAD,
431
+ TYPE_MODE_FILE_DISPLAY,
432
+ IUploadFunctionControlEvent,
433
+ IUploadConfigDownloadSampleFile,
434
+ IUploadDescriptionFormatAndSizeFile,
435
+ } from '@libs-ui/components-inputs-upload';
436
+ ```
437
+
125
438
  ### TYPE_FILE_UPLOAD
126
439
 
127
- Định nghĩa các tập hợp định dạng tệp được phép.
440
+ Kiểu string xác định nhóm định dạng file được phép — ghép bằng dấu `_`:
128
441
 
129
442
  ```typescript
130
443
  export type TYPE_FILE_UPLOAD =
@@ -144,41 +457,124 @@ export type TYPE_FILE_UPLOAD =
144
457
  | 'image_audio_video_document';
145
458
  ```
146
459
 
460
+ ### TYPE_MODE_FILE_DISPLAY
461
+
462
+ ```typescript
463
+ export type TYPE_MODE_FILE_DISPLAY = 'full' | 'short';
464
+ ```
465
+
466
+ ### IUploadFunctionControlEvent
467
+
468
+ Object chứa các hàm điều khiển component từ bên ngoài, nhận qua `(outFunctionsControl)`:
469
+
470
+ ```typescript
471
+ export interface IUploadFunctionControlEvent {
472
+ // Validate danh sách file hiện tại — trả true nếu hợp lệ
473
+ checkIsValid: () => Promise<boolean>;
474
+ // Xóa toàn bộ file trong danh sách
475
+ removeAll: () => Promise<void>;
476
+ // Cập nhật tiến trình upload cho file theo id
477
+ uploading: (process: IHttpProcessUpload, id: string) => Promise<void>;
478
+ // Set thông báo lỗi — toàn component hoặc file cụ thể
479
+ setMessageError: (message: string, id?: string) => Promise<void>;
480
+ // Kích hoạt dialog chọn file
481
+ handlerUploadFile: () => Promise<void>;
482
+ }
483
+ ```
484
+
147
485
  ### IUploadConfigDownloadSampleFile
148
486
 
149
- Cấu hình cho nút tải xuống tệp mẫu.
487
+ Cấu hình nút tải file mẫu:
150
488
 
151
489
  ```typescript
152
490
  export interface IUploadConfigDownloadSampleFile {
491
+ // Vị trí hiển thị nút — trên hoặc dưới vùng upload
153
492
  position?: 'top' | 'bottom';
493
+ // Tiêu đề hiển thị trên nút
154
494
  title: string;
495
+ // URL file mẫu để download trực tiếp
155
496
  url?: string;
497
+ // Class CSS cho label
156
498
  classLabel?: string;
499
+ // Class CSS bổ sung cho nút
157
500
  classInclude?: string;
501
+ // Class CSS cho icon bên trái
158
502
  classIconLeftInclude?: string;
503
+ // Callback tùy chỉnh — ưu tiên hơn url nếu có
159
504
  callBack?: () => void;
160
505
  }
161
506
  ```
162
507
 
163
- ### IUploadFunctionControlEvent
508
+ ### IUploadDescriptionFormatAndSizeFile
164
509
 
165
- Giao diện điều khiển component bên ngoài.
510
+ Cấu hình tả định dạng và kích thước file (hiển thị dưới vùng upload):
166
511
 
167
512
  ```typescript
168
- export interface IUploadFunctionControlEvent {
169
- checkIsValid: () => Promise<boolean>;
170
- removeAll: () => Promise<void>;
171
- uploading: (process: IHttpProcessUpload, id: string) => Promise<void>;
172
- setMessageError: (message: string, id?: string) => Promise<void>;
173
- handlerUploadFile: () => Promise<void>;
513
+ export interface IUploadDescriptionFormatAndSizeFile {
514
+ // Key i18n
515
+ message: string;
516
+ // Tham số interpolation cho i18n
517
+ interpolateParams?: TYPE_OBJECT;
518
+ }
519
+ ```
520
+
521
+ ### Interfaces từ @libs-ui/interfaces-types (dùng chung)
522
+
523
+ ```typescript
524
+ import { IFile, IAspectRatio, IIsValidRequired, IMessageTranslate, IHttpProcessUpload } from '@libs-ui/interfaces-types';
525
+
526
+ // IFile — cấu trúc file trong danh sách
527
+ interface IFile {
528
+ id?: string;
529
+ name: string;
530
+ url?: string; // Base64 hoặc Object URL sau khi chọn
531
+ origin_url?: string; // URL gốc từ server
532
+ file?: File; // File object gốc
533
+ size?: string; // Kích thước định dạng text ("1.2 MB")
534
+ type?: 'image' | 'video' | 'audio' | 'document';
535
+ isAvatar?: boolean; // Được chọn làm avatar
536
+ error?: string; // Thông báo lỗi nếu file không hợp lệ
537
+ percentUploading?: number; // Tiến trình upload (0-100)
538
+ isUploading?: boolean;
539
+ isUpdate?: boolean; // File đã được chỉnh sửa qua Image Editor
540
+ }
541
+
542
+ // IAspectRatio — tỉ lệ khung hình cho Image Editor
543
+ interface IAspectRatio {
544
+ width: number;
545
+ height: number;
546
+ }
547
+
548
+ // IIsValidRequired — cấu hình validate bắt buộc
549
+ interface IIsValidRequired {
550
+ isRequired: boolean;
551
+ message?: string;
552
+ }
553
+
554
+ // IHttpProcessUpload — tiến trình upload
555
+ interface IHttpProcessUpload {
556
+ percent: number; // 0-100
174
557
  }
175
558
  ```
176
559
 
177
- ## Tech Stack
560
+ ## Lưu ý quan trọng
561
+
562
+ ⚠️ **Dynamic Component Dependencies**: Component này dùng `LibsUiDynamicComponentService` để khởi tạo Image Editor, Gallery Viewer và Preview File động. Đảm bảo `LibsUiDynamicComponentService` được cung cấp trong provider tree của app.
563
+
564
+ ⚠️ **outFunctionsControl phát ngay ngOnInit**: Nhận `IUploadFunctionControlEvent` qua `(outFunctionsControl)` và lưu tham chiếu vào biến class (không phải local variable) để tránh mất tham chiếu. Gọi `checkIsValid()` trước khi submit form.
565
+
566
+ ⚠️ **originFiles là signal array**: Input `originFiles` nhận `Array<WritableSignal<IFile>>`. Mỗi phần tử là `WritableSignal<IFile>` — khi chỉnh sửa ảnh qua editor, signal đó được `update()` trực tiếp, không tạo phần tử mới.
178
567
 
179
- - **Core**: Angular 18+, Signals, RxJS
180
- - **Dependencies**: `@libs-ui/components-buttons-button`, `@libs-ui/components-gallery`, `@libs-ui/components-image-editor`, `@libs-ui/components-label`, `@libs-ui/components-preview-file`, `@libs-ui/services-dynamic-component`.
568
+ ⚠️ **maxTotalSize tính bằng bytes**: Tất cả input `maxXxxSize` và `maxTotalSize` nhận giá trị bytes. Ví dụ 5MB = `5 * 1024 * 1024`. Nếu truyền `5` sẽ bị giới hạn ở 5 bytes.
181
569
 
182
- ## License
570
+ ⚠️ **fileType quyết định danh sách extension**: `fileType` xác định nhóm định dạng và tự động sinh chuỗi `accept` cho input file. Các input `imageExtList`, `videoExtList`, `documentExtList`, `audioExtList` cho phép override danh sách extension mặc định trong từng nhóm.
571
+
572
+ ⚠️ **multiple vs canUploadIfHasExistFile**: Khi `multiple = false` và đã có file, upload file mới sẽ không thay thế file cũ trừ khi bật `canUploadIfHasExistFile = true`.
573
+
574
+ ## Demo
575
+
576
+ ```bash
577
+ npx nx serve core-ui
578
+ ```
183
579
 
184
- MIT
580
+ Truy cập: http://localhost:4500/components/inputs/upload
@@ -1,6 +1,6 @@
1
1
  import { NgComponentOutlet, AsyncPipe } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { Pipe, model, input, output, Optional, Inject, ChangeDetectionStrategy, Component, inject, ElementRef, Directive, signal, computed, viewChild, effect, untracked } from '@angular/core';
3
+ import { Pipe, model, input, output, Component, ChangeDetectionStrategy, Optional, Inject, inject, ElementRef, Directive, signal, computed, viewChild, effect, untracked } from '@angular/core';
4
4
  import { LibsUiComponentsSpinnerComponent } from '@libs-ui/components-spinner';
5
5
  import { LibsUiIconsGetIconComponentPipe } from '@libs-ui/icons';
6
6
  import { LibsUiPipesCheckFileExtensionPipe } from '@libs-ui/pipes-check-file-extension';
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-components-inputs-upload.mjs","sources":["../../../../../../libs-ui/components/inputs/upload/src/pipes/calc-duration-video.pipe.ts","../../../../../../libs-ui/components/inputs/upload/src/avatar/avatar.component.ts","../../../../../../libs-ui/components/inputs/upload/src/avatar/avatar.component.html","../../../../../../libs-ui/components/inputs/upload/src/upload-drop-file.directive.ts","../../../../../../libs-ui/components/inputs/upload/src/upload-file.directive.ts","../../../../../../libs-ui/components/inputs/upload/src/defines/helper.define.ts","../../../../../../libs-ui/components/inputs/upload/src/upload.component.ts","../../../../../../libs-ui/components/inputs/upload/src/upload.component.html","../../../../../../libs-ui/components/inputs/upload/src/libs-ui-components-inputs-upload.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'LibsUiPipesInputsUploadCalcDurationVideoPipe',\n standalone: true,\n})\nexport class LibsUiPipesInputsUploadCalcDurationVideoPipe implements PipeTransform {\n transform(duration: number) {\n if (!duration) {\n return '0:0';\n }\n duration = Math.round(duration);\n if (duration >= 3600) {\n const hour = Math.floor(duration / 3600);\n const minute = Math.floor((duration - hour * 3600) / 60);\n const second = duration - (hour * 3600 + minute * 60);\n\n const minuteStr = String(minute).padStart(2, '0');\n const secondStr = String(second).padStart(2, '0');\n return `${hour}:${minuteStr}:${secondStr}`;\n }\n if (duration >= 60) {\n const minute = Math.floor(duration / 60);\n const second = duration - minute * 60;\n\n const secondStr2 = String(second).padStart(2, '0');\n return `${minute}:${secondStr2}`;\n }\n\n return `0:${duration}`;\n }\n}\n","import { AsyncPipe, NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Inject, input, model, Optional, output } from '@angular/core';\nimport { LibsUiComponentsSpinnerComponent } from '@libs-ui/components-spinner';\nimport { LibsUiIconsGetIconComponentPipe } from '@libs-ui/icons';\nimport { IEvent, IFile } from '@libs-ui/interfaces-types';\nimport { LibsUiPipesCheckFileExtensionPipe } from '@libs-ui/pipes-check-file-extension';\nimport { LibsUiPipesSecurityTrustPipe } from '@libs-ui/pipes-security-trust';\nimport { LINK_IMAGE_ERROR_TOKEN_INJECT } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { LibsUiPipesInputsUploadCalcDurationVideoPipe } from '../pipes/calc-duration-video.pipe';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-upload-avatar',\n templateUrl: './avatar.component.html',\n standalone: true,\n imports: [NgComponentOutlet, AsyncPipe, TranslateModule, LibsUiComponentsSpinnerComponent, LibsUiPipesSecurityTrustPipe, LibsUiPipesInputsUploadCalcDurationVideoPipe, LibsUiPipesCheckFileExtensionPipe, LibsUiIconsGetIconComponentPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsInputsUploadAvatarComponent {\n readonly item = model.required<IFile>();\n readonly showVideoDuration = input<boolean>();\n readonly disable = input<boolean>();\n readonly size = input<number>();\n readonly classInclude = input<string, string | undefined>('', { transform: (value) => value ?? '' });\n\n readonly outOpenPreview = output<IFile>();\n\n constructor(@Optional() @Inject(LINK_IMAGE_ERROR_TOKEN_INJECT) private readonly linkImageError: string) {}\n\n protected async handlerImageError(event: Event) {\n if (!this.linkImageError) {\n return;\n }\n (event as IEvent).target.src = this.linkImageError;\n }\n\n protected handlerImageClick(event: Event) {\n event.stopPropagation();\n this.outOpenPreview.emit(this.item());\n }\n}\n","<div\n class=\"flex mr-[12px] bg-[#ffffff] rounded-[4px] {{ classInclude() }}\"\n [class.libs-ui-disable]=\"disable() || item().isUploading || item().error\">\n @if (item() | LibsUiPipesCheckFileExtensionPipe: 'image') {\n <div\n [style.width.px]=\"size() || 32\"\n [style.height.px]=\"size() || 32\"\n class=\"relative\">\n @if (item().url || item().origin_url; as url) {\n <img\n [src]=\"url\"\n [style.width.px]=\"size() || 32\"\n [style.height.px]=\"size() || 32\"\n class=\"rounded-[4px] cursor-pointer\"\n alt\n (error)=\"handlerImageError($event)\"\n (click)=\"handlerImageClick($event)\"\n (keydown.enter)=\"handlerImageClick($event)\" />\n } @else {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n } @else if (item() | LibsUiPipesCheckFileExtensionPipe: 'video') {\n <div\n class=\"relative\"\n [style.width.px]=\"size() || 32\"\n [style.height.px]=\"size() || 32\">\n @if (item().url || item().origin_url) {\n @let constHtmlSrc = item().url || item().origin_url || '';\n <video\n #videoRef\n [style.width.px]=\"size || 32\"\n [style.height.px]=\"size || 32\"\n class=\"rounded-[4px]\"\n preload=\"metadata\"\n [src]=\"constHtmlSrc | LibsUiPipesSecurityTrustPipe: 'resourceUrl' | async\">\n <track kind=\"captions\" />\n </video>\n <div class=\"absolute w-full h-full top-0 bg-[#001433] opacity-40 rounded-[4px]\"></div>\n <div class=\"absolute w-full h-full flex items-center justify-center top-0\">\n <i class=\"text-[#ffffff] libs-ui-icon-play-solid before:!text-[10px]\"></i>\n </div>\n @if (showVideoDuration()) {\n <div class=\"flex text-[5px] absolute bottom-0 right-0 py-[2px] px-[4px] rounded-[4px] bg-[#000000] text-[#ffffff]\">\n {{ videoRef.duration | LibsUiPipesInputsUploadCalcDurationVideoPipe }}\n </div>\n }\n } @else {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n } @else if (item() | LibsUiPipesCheckFileExtensionPipe: 'pdf') {\n <ng-container *ngComponentOutlet=\"'pdf' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: size() || 32 }\" />\n } @else if (item() | LibsUiPipesCheckFileExtensionPipe: 'word') {\n <ng-container *ngComponentOutlet=\"'word' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: size() || 32 }\" />\n } @else if (item() | LibsUiPipesCheckFileExtensionPipe: 'pptx') {\n <ng-container *ngComponentOutlet=\"'pptx' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: size() || 32 }\" />\n } @else if (item() | LibsUiPipesCheckFileExtensionPipe: 'xlsx') {\n <ng-container *ngComponentOutlet=\"'xlsx' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: size() || 32 }\" />\n } @else {\n <div\n [style.width.px]=\"size() || 32\"\n [style.height.px]=\"size() || 32\"\n class=\"flex items-center justify-center\">\n <i\n class=\"libs-ui-icon-file before:!text-[19px]\"\n [class.text-[#6a7383]]=\"!item().isUploading && !item().error\"\n [class.text-[#071631]]=\"disable() || item().isUploading || item().error\"></i>\n </div>\n }\n</div>\n","import { AfterViewInit, Directive, ElementRef, inject, input, OnDestroy, output } from '@angular/core';\nimport { IEvent } from '@libs-ui/interfaces-types';\nimport { checkMouseOverInContainer, isTypeFile } from '@libs-ui/utils';\nimport { fromEvent, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[LibsUiComponentsInputsUploadDropFileDirective]',\n standalone: true,\n})\nexport class LibsUiComponentsInputsUploadDropFileDirective implements AfterViewInit, OnDestroy {\n private readonly onDestroy = new Subject<void>();\n\n readonly multiple = input<boolean, boolean | undefined>(true, { transform: (value) => value ?? true });\n\n readonly outDragOver = output<IEvent>();\n readonly outDragLeave = output<IEvent>();\n readonly outDrop = output<IEvent>();\n readonly outDropFiles = output<File[]>();\n readonly outDropFile = output<File>();\n\n private readonly elementRef = inject(ElementRef);\n\n ngAfterViewInit() {\n fromEvent<IEvent>(this.elementRef.nativeElement, 'dragover')\n .pipe(takeUntil(this.onDestroy))\n .subscribe((e: IEvent) => {\n e.stopPropagation();\n e.preventDefault();\n this.outDragOver.emit(e);\n });\n fromEvent<IEvent>(this.elementRef.nativeElement, 'dragleave')\n .pipe(takeUntil(this.onDestroy))\n .subscribe((e: IEvent) => {\n e.stopPropagation();\n e.preventDefault();\n if (checkMouseOverInContainer(e, this.elementRef.nativeElement)) {\n return;\n }\n this.outDragLeave.emit(e);\n });\n\n fromEvent<IEvent>(this.elementRef.nativeElement, 'drop')\n .pipe(takeUntil(this.onDestroy))\n .subscribe((e: IEvent) => {\n e.stopPropagation();\n e.preventDefault();\n this.outDrop.emit(e);\n\n const fileList = Array.from<File>(e.dataTransfer?.files || e.clipboardData?.files || []).filter(isTypeFile);\n\n if (!fileList?.length) {\n return;\n }\n\n if (this.multiple()) {\n this.outDropFiles.emit(fileList);\n\n return;\n }\n this.outDropFile.emit(fileList[0]);\n });\n }\n\n ngOnDestroy() {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","import { AfterViewInit, Directive, ElementRef, inject, input, OnDestroy, output } from '@angular/core';\nimport { IEvent } from '@libs-ui/interfaces-types';\nimport { fromEvent, Subject, takeUntil } from 'rxjs';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[LibsUiComponentsInputsUploadDirective]',\n standalone: true,\n})\nexport class LibsUiComponentsInputsUploadDirective implements AfterViewInit, OnDestroy {\n private readonly onDestroy = new Subject<void>();\n\n readonly multiple = input<boolean, boolean | undefined>(true, { transform: (val) => val ?? true });\n readonly accessFiles = input<string, string | undefined>('image/x-png,image/jpg,image/jpeg,image/PNG,image/x-PNG,image/JPG,image/JPEG', { transform: (val) => val ?? 'image/x-png,image/jpg,image/jpeg,image/PNG,image/x-PNG,image/JPG,image/JPEG' });\n\n readonly outUploadFiles = output<File[]>();\n readonly outUploadFile = output<File>();\n\n private readonly elementRef = inject(ElementRef);\n\n ngAfterViewInit() {\n fromEvent<IEvent>(this.elementRef.nativeElement, 'click')\n .pipe(takeUntil(this.onDestroy))\n .subscribe((e: IEvent) => {\n e.stopPropagation();\n e.preventDefault();\n\n const inputElementUpload = document.createElement('input');\n inputElementUpload.type = 'file';\n inputElementUpload.accept = this.accessFiles();\n inputElementUpload.multiple = this.multiple();\n inputElementUpload.style.display = 'none';\n inputElementUpload.click();\n fromEvent<IEvent>(inputElementUpload, 'change')\n .pipe(takeUntil(this.onDestroy))\n .subscribe((event: IEvent) => {\n const files = Array.from<File>(event.dataTransfer?.files || event.target?.files || []);\n inputElementUpload.remove();\n if (!files?.length) {\n return;\n }\n if (this.multiple()) {\n this.outUploadFiles.emit(files);\n\n return;\n }\n this.outUploadFile.emit(files[0]);\n });\n });\n }\n\n ngOnDestroy() {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","import { getLabelBySizeFile } from '@libs-ui/utils';\nimport { IUploadDescriptionFormatAndSizeFile, TYPE_FILE_UPLOAD } from '../interfaces/upload.interface';\n\nexport const getDescriptionFormatAndSizeFileDefault = (type: TYPE_FILE_UPLOAD, maxImageSize: number, maxVideoSize: number, maxDocumentSize: number, maxAudioSize: number): IUploadDescriptionFormatAndSizeFile[] => {\n const image = {\n message: 'i18n_note_upload_image_volume',\n interpolateParams: { value: getLabelBySizeFile(maxImageSize, 0) },\n };\n const video = {\n message: 'i18n_note_upload_video_volume',\n interpolateParams: { value: getLabelBySizeFile(maxVideoSize, 0) },\n };\n const document = {\n message: 'i18n_note_upload_file_volume',\n interpolateParams: { value: getLabelBySizeFile(maxDocumentSize, 0) },\n };\n const audio = {\n message: 'i18n_note_upload_audio_volume',\n interpolateParams: { value: getLabelBySizeFile(maxAudioSize, 0) },\n };\n\n const typeSplit = type.split('_');\n const description = [];\n\n if (typeSplit.includes('image')) {\n description.push(image);\n }\n if (typeSplit.includes('audio')) {\n description.push(audio);\n }\n if (typeSplit.includes('video')) {\n description.push(video);\n }\n if (typeSplit.includes('document')) {\n description.push(document);\n }\n\n return description;\n};\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ComponentRef, computed, effect, ElementRef, inject, input, OnDestroy, OnInit, output, signal, untracked, viewChild, WritableSignal } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsGalleryViewerComponent } from '@libs-ui/components-gallery';\nimport { ISaveFile, LibsUiComponentsImageEditorComponent } from '@libs-ui/components-image-editor';\nimport { ILabel, LibsUiComponentsLabelComponent } from '@libs-ui/components-label';\nimport { LibsUiComponentsPreviewFileComponent } from '@libs-ui/components-preview-file';\nimport { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';\nimport { IAspectRatio, IFile, IIsValidRequired, IMessageTranslate } from '@libs-ui/interfaces-types';\nimport { LibsUiDynamicComponentService, setInputs } from '@libs-ui/services-dynamic-component';\nimport { LibsUiNotificationService } from '@libs-ui/services-notification';\nimport {\n AudioExtList,\n convertBlobToFile,\n convertFileToBase64_ObjectUrl,\n DocumentExtList,\n downloadFileByUrl,\n ERROR_MESSAGE_EMPTY_VALID,\n getFileExtension,\n getLabelBySizeFile,\n ImageExtList,\n isIncludeAudioExtList,\n isIncludeDocumentExtList,\n isIncludeImageExtList,\n isIncludeVideoExtList,\n isTypeAudio,\n isTypeImage,\n isTypeVideo,\n uuid,\n VideoExtList,\n} from '@libs-ui/utils';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { Subject } from 'rxjs';\nimport { LibsUiComponentsInputsUploadAvatarComponent } from './avatar/avatar.component';\nimport { getDescriptionFormatAndSizeFileDefault } from './defines/helper.define';\nimport { IUploadConfigDownloadSampleFile, IUploadDescriptionFormatAndSizeFile, IUploadFunctionControlEvent, TYPE_FILE_UPLOAD, TYPE_MODE_FILE_DISPLAY } from './interfaces/upload.interface';\nimport { LibsUiComponentsInputsUploadDropFileDirective } from './upload-drop-file.directive';\nimport { LibsUiComponentsInputsUploadDirective } from './upload-file.directive';\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-upload',\n templateUrl: './upload.component.html',\n styleUrls: ['./upload.component.scss'],\n standalone: true,\n imports: [\n TranslateModule,\n LibsUiComponentsButtonsButtonComponent,\n LibsUiComponentsLabelComponent,\n LibsUiComponentsInputsUploadAvatarComponent,\n LibsUiComponentsScrollOverlayDirective,\n LibsUiComponentsInputsUploadDirective,\n LibsUiComponentsInputsUploadDropFileDirective,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsInputsUploadComponent implements OnInit, AfterViewInit, OnDestroy {\n // #region PROPERTIES\n private imageEditorComponentRef?: ComponentRef<LibsUiComponentsImageEditorComponent>;\n private previewFileComponentRef?: ComponentRef<LibsUiComponentsPreviewFileComponent>;\n private previewFileImageComponentRef?: ComponentRef<LibsUiComponentsGalleryViewerComponent>;\n protected isDragOver = signal(false);\n protected fileList = signal<Array<WritableSignal<IFile>>>([]);\n protected accessFiles = signal<string>('');\n protected messageError = signal<string | undefined>(undefined);\n protected descriptionFormatAndSizeFileComputed = computed<Array<IUploadDescriptionFormatAndSizeFile>>(() => {\n if (this.descriptionFormatAndSizeFile()?.length) {\n return this.descriptionFormatAndSizeFile() as unknown as Array<IUploadDescriptionFormatAndSizeFile>;\n }\n return getDescriptionFormatAndSizeFileDefault(this.fileType(), this.maxImageSize(), this.maxVideoSize(), this.maxDocumentSize(), this.maxAudioSize());\n });\n\n private readonly onDestroy = new Subject<void>();\n // #endregion\n\n // #region INPUTS\n readonly originFiles = input<Array<WritableSignal<IFile>>, Array<WritableSignal<IFile>> | undefined>([], { transform: (val) => val ?? [] });\n readonly fileType = input<TYPE_FILE_UPLOAD, TYPE_FILE_UPLOAD | undefined>('image_video_document', { transform: (val) => val ?? 'image_video_document' });\n readonly multiple = input<boolean>();\n readonly canUploadIfHasExistFile = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly canSetAvatar = input<boolean | undefined>(false);\n readonly limitFile = input<number, number | undefined>(10, { transform: (val) => val ?? 10 });\n readonly maxTotalSize = input<number, number | undefined>(10 * 1024 * 1024, { transform: (val) => val ?? 10 * 1024 * 1024 });\n readonly maxImageSize = input<number, number | undefined>(5 * 1024 * 1024, { transform: (val) => val ?? 5 * 1024 * 1024 });\n readonly maxVideoSize = input<number, number | undefined>(10 * 1024 * 1024, { transform: (val) => val ?? 10 * 1024 * 1024 });\n readonly maxDocumentSize = input<number, number | undefined>(10 * 1024 * 1024, { transform: (val) => val ?? 10 * 1024 * 1024 });\n readonly maxAudioSize = input<number, number | undefined>(10 * 1024 * 1024, { transform: (val) => val ?? 10 * 1024 * 1024 });\n readonly imageExtList = input<string[], string[] | undefined>(ImageExtList, { transform: (val) => val ?? ImageExtList });\n readonly videoExtList = input<string[], string[] | undefined>(VideoExtList, { transform: (val) => val ?? VideoExtList });\n readonly documentExtList = input<string[], string[] | undefined>(DocumentExtList, { transform: (val) => val ?? DocumentExtList });\n readonly audioExtList = input<string[], string[] | undefined>(AudioExtList, { transform: (val) => val ?? AudioExtList });\n readonly classIncludeListItem = input<string>();\n readonly validRequired = input<IIsValidRequired>();\n readonly disable = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly readonly = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly aspectRatio = input<IAspectRatio>();\n readonly zIndex = input<number, number | undefined>(1200, { transform: (val) => val ?? 1200 });\n readonly ignoreShowSizeFile = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly allowShowPushMessageMaxSizeError = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly messageTypeFileError = input<string, string | undefined>('i18n_the_file_support_format_is_not_correct', { transform: (val) => val || 'i18n_the_file_support_format_is_not_correct' });\n readonly messageMaxSizeError = input<string, string | undefined>('i18n_file_size_exceeds_the_allowed_limit', { transform: (val) => val || 'i18n_file_size_exceeds_the_allowed_limit' });\n readonly messageFileUploadError = input<string, string | undefined>('i18n_invalid_file_upload', { transform: (val) => val || 'i18n_invalid_file_upload' });\n readonly messageTotalFileExceedsError = input<string, string | undefined>('i18n_file_number_exceeds_the_allowed_limit_please_delete_the_file', { transform: (val) => val || 'i18n_file_number_exceeds_the_allowed_limit_please_delete_the_file' });\n readonly configDescriptionInputUpload = input<IMessageTranslate, IMessageTranslate | undefined>(\n { message: 'i18n_drag_file_here_to_upload_or_select_file' },\n {\n transform: (val) => val ?? { message: 'i18n_drag_file_here_to_upload_or_select_file' },\n }\n );\n\n readonly modeDisplayFile = input<TYPE_MODE_FILE_DISPLAY, TYPE_MODE_FILE_DISPLAY | undefined>('full', { transform: (val) => val || 'full' });\n readonly descriptionFormatAndSizeFile = input<Array<IUploadDescriptionFormatAndSizeFile>>();\n readonly showVideoDuration = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly labelConfig = input<ILabel>();\n readonly showPopupUploadWhenHasFileAndModeSingle = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly ignoreIconRemove = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly ignoreIconEdit = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly ignoreIconPreview = input<boolean, boolean | undefined>(true, { transform: (val) => val ?? true });\n readonly classIncludeFileContent = input<string, string | undefined>('', { transform: (value) => value ?? '' });\n readonly classIncludeAvatar = input<string, string | undefined>('', { transform: (value) => value ?? '' });\n readonly showBorderErrorAllItemWhenError = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly configDownloadSampleFile = input<IUploadConfigDownloadSampleFile>();\n // #endregion\n\n // #region OUTPUTS\n readonly outClose = output<boolean>();\n readonly outFileChanged = output<Array<WritableSignal<IFile>>>();\n readonly outFileRemoved = output<WritableSignal<IFile>>();\n readonly outFunctionsControl = output<IUploadFunctionControlEvent>();\n // #endregion\n\n // #region VIEW CHILDREN\n readonly uploadRef = viewChild<ElementRef>('upload');\n readonly uploadInputRef = viewChild<ElementRef>('uploadInput');\n // #endregion\n\n // #region INJECTIONS\n private readonly dynamicComponentService = inject(LibsUiDynamicComponentService);\n private readonly translateService = inject(TranslateService);\n private readonly notificationService = inject(LibsUiNotificationService);\n // #endregion\n\n constructor() {\n effect(() => {\n if (this.originFiles()) {\n untracked(() => {\n this.fileList.set([...this.originFiles()]);\n });\n }\n });\n }\n\n // #region LIFECYCLE HOOKS\n ngOnInit() {\n this.outFunctionsControl.emit(this.FunctionsControl);\n }\n\n ngAfterViewInit() {\n setTimeout(() => {\n this.initAccessFiles();\n }, 0);\n }\n // #endregion\n\n // #region INITIALIZATION\n protected async initAccessFiles() {\n const accessExts: string[] = [];\n const typeSplit = this.fileType().split('_');\n\n if (typeSplit.includes('image')) {\n accessExts.push(...this.imageExtList());\n }\n if (typeSplit.includes('document')) {\n accessExts.push(...this.documentExtList());\n }\n if (typeSplit.includes('video')) {\n accessExts.push(...this.videoExtList());\n }\n if (typeSplit.includes('audio')) {\n accessExts.push(...this.audioExtList());\n }\n this.accessFiles.set(accessExts.map((ext) => `.${ext}`).join(','));\n }\n // #endregion\n\n // #region FILE OPERATIONS\n protected async handlerSetClassDrag(toogle: boolean) {\n this.uploadRef()?.nativeElement.classList.toggle('libs-ui-components-inputs-upload-drag-over', toogle);\n }\n\n protected async handleUploadFiles(files: Array<File>) {\n if (this.maxTotalSize()) {\n let total = 0;\n\n for (const file of files) {\n total += file.size;\n }\n\n if (this.maxTotalSize() < total) {\n this.notificationService.showCompTypeTextError(this.translateService.instant('i18n_size_not_number_mb', { number: this.maxTotalSize() / 1024 / 1024 }), { timeRemove: 3000 });\n\n return;\n }\n }\n\n let errorExceedsMaxFile = false;\n if (!files?.length) {\n return;\n }\n if (!this.multiple() && this.fileList().length && !this.canUploadIfHasExistFile()) {\n return;\n }\n\n const remainFileTotal = this.limitFile() - this.fileList().length;\n if (files.length > remainFileTotal) {\n errorExceedsMaxFile = true;\n this.messageError.set(this.messageTotalFileExceedsError());\n }\n for (const file of files) {\n const isImage = isTypeImage(file);\n const isVideo = isTypeVideo(file);\n const isAudio = isTypeAudio(file);\n let fileType: IFile['type'] = 'document';\n if (isImage) fileType = 'image';\n if (!isImage && isVideo) fileType = 'video';\n if (!isImage && !isVideo && isAudio) fileType = 'audio';\n const newFile: IFile = {\n name: file.name,\n file: file,\n size: getLabelBySizeFile(file.size),\n type: fileType,\n id: uuid(),\n };\n if (!(await this.checkValidFileExtension(file))) {\n if (!errorExceedsMaxFile) {\n this.messageError.set(this.multiple() ? this.messageFileUploadError() : this.messageTypeFileError());\n }\n newFile.error = this.messageTypeFileError();\n await this.pushFileInList(file, newFile);\n continue;\n }\n if (!(await this.checkValidFileSize(file))) {\n if (!errorExceedsMaxFile) {\n this.messageError.set(this.multiple() ? this.messageFileUploadError() : this.messageMaxSizeError());\n }\n newFile.error = this.messageMaxSizeError();\n if (!this.multiple() && this.allowShowPushMessageMaxSizeError()) {\n this.notificationService.showCompTypeTextError(this.messageMaxSizeError());\n\n return;\n }\n await this.pushFileInList(file, newFile);\n continue;\n }\n await this.pushFileInList(file, newFile);\n }\n if (this.canSetAvatar() && this.fileList().length && !this.fileList().find((file) => file().isAvatar)) {\n this.fileList.update((fileList) => {\n const itemImage = fileList.find((file) => file().type === 'image');\n if (itemImage) {\n itemImage.update((file) => ({ ...file, isAvatar: true }));\n }\n return [...fileList];\n });\n }\n this.outFileChanged.emit(this.fileList());\n this.validate();\n }\n\n private async pushFileInList(file: File, newFile: IFile) {\n newFile.url = (await convertFileToBase64_ObjectUrl(file)) as string;\n\n this.fileList.update((fileList) => {\n fileList.splice(0, this.canUploadIfHasExistFile() ? 1 : 0, signal(newFile));\n return [...fileList];\n });\n }\n\n protected async handlerOpenPreviewFile(item: IFile) {\n if (item.type === 'document') {\n this.previewFileDocument(item);\n return;\n }\n this.previewFileImage(item);\n }\n\n private async previewFileDocument(item: IFile) {\n if (this.previewFileComponentRef) {\n return;\n }\n this.previewFileComponentRef = this.dynamicComponentService.resolveComponentFactory(LibsUiComponentsPreviewFileComponent);\n setInputs(this.previewFileComponentRef, { index: 0, data: [item], zIndex: this.zIndex() + 1 });\n this.previewFileComponentRef.instance.outClose.subscribe(() => {\n this.dynamicComponentService.remove(this.previewFileComponentRef);\n this.previewFileComponentRef = undefined;\n });\n this.dynamicComponentService.addToBody(this.previewFileComponentRef);\n }\n\n private async previewFileImage(item: IFile) {\n if (this.previewFileImageComponentRef) {\n return;\n }\n this.previewFileImageComponentRef = this.dynamicComponentService.resolveComponentFactory(LibsUiComponentsGalleryViewerComponent);\n const url = item.url || item.origin_url;\n this.previewFileImageComponentRef.setInput('images', [{ url }]);\n this.previewFileImageComponentRef.setInput('imageSelected', { url });\n this.previewFileImageComponentRef.setInput('fieldDisplaySrcImage', 'url');\n this.previewFileImageComponentRef.setInput('singleImage', true);\n this.previewFileImageComponentRef.setInput('zIndex', this.zIndex() + 1);\n this.previewFileImageComponentRef.instance.outClose.subscribe(() => {\n this.dynamicComponentService.remove(this.previewFileImageComponentRef);\n this.previewFileImageComponentRef = undefined;\n });\n this.dynamicComponentService.addToBody(this.previewFileImageComponentRef);\n }\n\n protected async handlerEditImage(event: Event, item: WritableSignal<IFile>) {\n event.stopPropagation();\n this.showEditModal(item);\n }\n\n protected async handlerRemoveFile(event: Event, item: WritableSignal<IFile>) {\n event.stopPropagation();\n this.removeFile(item);\n if (this.originFiles().find((file) => file().url === item().url)) {\n this.outFileRemoved.emit(item);\n }\n this.validate();\n if (!this.multiple() && this.showPopupUploadWhenHasFileAndModeSingle()) {\n setTimeout(() => {\n this.showUploadPopup();\n }, 0);\n }\n }\n\n protected async removeFile(fileItem: WritableSignal<IFile>) {\n this.fileList.update((fileList) => fileList.filter((item) => item().id !== fileItem().id));\n if (this.canSetAvatar() && fileItem().isAvatar && this.fileList().length) {\n this.fileList.update((fileList) => {\n fileList[0].update((file) => ({ ...file, isAvatar: true }));\n\n return [...fileList];\n });\n }\n this.outFileChanged.emit(this.fileList());\n }\n\n protected async showEditModal(fileItem: WritableSignal<IFile>) {\n if (this.imageEditorComponentRef) {\n return;\n }\n const fileDataUrl = fileItem().url || fileItem().origin_url || '';\n this.imageEditorComponentRef = this.dynamicComponentService.resolveComponentFactory(LibsUiComponentsImageEditorComponent);\n\n this.imageEditorComponentRef.setInput('imgSrc', fileDataUrl);\n this.imageEditorComponentRef.setInput('zIndex', this.zIndex() + 1);\n this.imageEditorComponentRef.setInput('nameFile', fileItem().name);\n this.imageEditorComponentRef.setInput('aspectRatio', this.aspectRatio());\n this.imageEditorComponentRef.instance.outClose.subscribe(() => {\n this.dynamicComponentService.remove(this.imageEditorComponentRef);\n this.imageEditorComponentRef = undefined;\n });\n\n this.imageEditorComponentRef.instance.outSaveFile.subscribe(async (result: ISaveFile) => {\n const messageError = !(await this.checkValidFileSize(result.file)) ? this.messageMaxSizeError() : undefined;\n const nameFile = fileItem().file?.name || fileItem().name;\n fileItem.update((data) => ({ ...data, file: convertBlobToFile(result.file, nameFile), name: nameFile, origin_url: undefined, size: getLabelBySizeFile(result.file.size), error: messageError, url: result.url, isUpdate: true }));\n this.outFileChanged.emit(this.fileList());\n this.imageEditorComponentRef?.instance.outClose.emit({ isClickButtonClose: true });\n });\n this.dynamicComponentService.addToBody(this.imageEditorComponentRef);\n }\n\n protected async checkValidFileExtension(file: File) {\n const extension = getFileExtension(file);\n\n if (!extension) {\n return false;\n }\n const isImage = isTypeImage(file);\n const isVideo = isTypeVideo(file);\n const isAudio = isTypeAudio(file);\n const validImage = isIncludeImageExtList(extension, this.imageExtList());\n const validVideo = isIncludeVideoExtList(extension, this.videoExtList());\n const validAudio = isIncludeAudioExtList(extension, this.audioExtList());\n const validDocument = isIncludeDocumentExtList(extension, this.documentExtList());\n\n const typeSplit = this.fileType().split('_');\n\n if (isImage && typeSplit.includes('image')) {\n return validImage;\n }\n if (isVideo && typeSplit.includes('video')) {\n return validVideo;\n }\n if (isAudio && typeSplit.includes('audio')) {\n return validAudio;\n }\n if (typeSplit.includes('document')) {\n return validDocument;\n }\n\n return false;\n }\n\n protected async checkValidFileSize(file: File | Blob) {\n const isImage = isTypeImage(file);\n const isVideo = isTypeVideo(file);\n const isAudio = isTypeAudio(file);\n const validImage = file.size <= this.maxImageSize();\n const validVideo = file.size <= this.maxVideoSize();\n const validAudio = file.size <= this.maxAudioSize();\n const validDocument = file.size <= this.maxDocumentSize();\n\n const typeSplit = this.fileType().split('_');\n\n if (isImage && typeSplit.includes('image')) {\n return validImage;\n }\n if (isVideo && typeSplit.includes('video')) {\n return validVideo;\n }\n if (isAudio && typeSplit.includes('audio')) {\n return validAudio;\n }\n if (typeSplit.includes('document')) {\n return validDocument;\n }\n\n return false;\n }\n\n protected async validate() {\n if (this.validRequired()?.isRequired && !this.fileList().length) {\n this.messageError.set(this.validRequired()?.message || ERROR_MESSAGE_EMPTY_VALID);\n\n return false;\n }\n if (this.multiple() && this.fileList().length > this.limitFile()) {\n this.messageError.set(this.messageTotalFileExceedsError());\n\n return false;\n }\n const fileError = this.fileList().find((item) => item().error);\n\n if (fileError) {\n this.messageError.set(this.multiple() ? this.messageFileUploadError() : fileError().error);\n\n return false;\n }\n this.messageError.set(undefined);\n\n return true;\n }\n\n protected async handlerSetAvatar(event: Event, file: WritableSignal<IFile>) {\n event.stopPropagation();\n\n this.fileList().forEach((item) => {\n if (item().id === file().id) {\n item.update((file) => ({ ...file, isAvatar: true }));\n return;\n }\n item.update((file) => ({ ...file, isAvatar: false }));\n });\n this.outFileChanged.emit(this.fileList());\n }\n\n private async removeAllFile() {\n this.fileList.set([]);\n this.messageError.set(undefined);\n }\n\n protected async handlerDownloadSampleFile(event: Event) {\n event.stopPropagation();\n const config = this.configDownloadSampleFile();\n if (!config) {\n return;\n }\n if (config?.callBack) {\n config.callBack();\n\n return;\n }\n if (config?.url) {\n downloadFileByUrl(config.url, config.title);\n }\n }\n\n private async showUploadPopup() {\n this.uploadInputRef()?.nativeElement.click();\n this.uploadInputRef()?.nativeElement.setAttribute('accept', this.accessFiles());\n }\n\n // #endregion\n\n // #region FUNCTIONS\n public get FunctionsControl(): IUploadFunctionControlEvent {\n return {\n checkIsValid: this.validate.bind(this),\n removeAll: this.removeAllFile.bind(this),\n uploading: async (process, id) => {\n const fileUploading = this.fileList().find((file) => file().id === id);\n\n if (fileUploading) {\n fileUploading.update((file) => ({ ...file, percentUploading: process.percent, isUploading: process.percent !== 100 }));\n }\n },\n setMessageError: async (message, id) => {\n this.messageError.set(message);\n if (id) {\n const fileError = this.fileList().find((file) => file().id === id);\n\n if (fileError) {\n fileError.update((file) => ({ ...file, error: message }));\n }\n }\n },\n handlerUploadFile: this.showUploadPopup.bind(this),\n };\n }\n // #endregion\n\n ngOnDestroy() {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","<div class=\"flex flex-col w-full h-full\">\n <div>\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable() || readonly()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable() || readonly()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || disable() || readonly()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable() || readonly()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n @if ((!configDownloadSampleFile()?.position || configDownloadSampleFile()?.position === 'top') && configDownloadSampleFile(); as configDownloadSampleFile) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mb-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile?.title || ' '\"\n (outClick)=\"handlerDownloadSampleFile($event)\" />\n }\n @if (multiple() || !showPopupUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple())) {\n <div\n #upload\n LibsUiComponentsInputsUploadDirective\n LibsUiComponentsInputsUploadDropFileDirective\n class=\"libs-ui-components-inputs-upload\"\n [class.libs-ui-components-inputs-upload-disable]=\"disable() || readonly() || (!multiple() && fileList().length && !canUploadIfHasExistFile())\"\n [class.libs-ui-components-inputs-upload-readonly]=\"readonly()\"\n [class.libs-ui-components-inputs-upload-error]=\"messageError()\"\n [multiple]=\"multiple()\"\n [accessFiles]=\"accessFiles()\"\n (outUploadFiles)=\"handleUploadFiles($event)\"\n (outUploadFile)=\"handleUploadFiles([$event])\"\n (outDragOver)=\"handlerSetClassDrag(true)\"\n (outDragLeave)=\"handlerSetClassDrag(false)\"\n (outDrop)=\"handlerSetClassDrag(false)\"\n (outDropFiles)=\"handleUploadFiles($event)\"\n (outDropFile)=\"handleUploadFiles([$event])\">\n <div class=\"flex items-center\">\n <div class=\"mr-[16px]\">\n <i class=\"libs-ui-components-inputs-upload-icon libs-ui-icon-file-upload before:!text-[32px]\"></i>\n </div>\n <div class=\"libs-ui-components-inputs-upload-description\">\n @let constHtmlMessage = configDescriptionInputUpload().message || ' ';\n <div\n class=\"mb-[4px] libs-ui-font-h6m\"\n [innerHTML]=\"constHtmlMessage | translate: configDescriptionInputUpload().interpolateParams\"></div>\n @for (item of descriptionFormatAndSizeFileComputed(); track item; let last = $last) {\n <div\n class=\"libs-ui-font-h7r\"\n [class.mb-[4px]]=\"!last\"\n [innerHTML]=\"item.message | translate: item.interpolateParams\"></div>\n }\n </div>\n </div>\n @if (multiple()) {\n <input\n #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n multiple\n [accept]=\"accessFiles()\" />\n } @else {\n <input\n #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n [accept]=\"accessFiles()\" />\n }\n </div>\n }\n @if (messageError() && (multiple() || !showPopupUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple()))) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">\n @let constHtmlMessage = messageError() || ' ';\n {{ constHtmlMessage | translate: { value: limitFile() } }}\n </div>\n }\n @if (configDownloadSampleFile()?.position === 'bottom' && configDownloadSampleFile(); as configDownloadSampleFile) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mt-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile.title || ' '\"\n (moClick)=\"handlerDownloadSampleFile($event)\" />\n }\n </div>\n @if (fileList().length) {\n <div\n LibsUiComponentsScrollOverlayDirective\n class=\"relative w-full h-full px-[10px] libs-ui-components-inputs-upload-view-list {{ classIncludeFileContent() || '' }}\"\n [class.mt-[12px]]=\"multiple() || !showPopupUploadWhenHasFileAndModeSingle()\">\n <ng-content select=\"[label-file]\"></ng-content>\n @for (item of fileList(); track item(); let first = $first) {\n <div\n class=\"libs-ui-components-inputs-upload-view-list-item {{ classIncludeListItem() || '' }}\"\n [class.libs-ui-components-inputs-upload-file-full]=\"modeDisplayFile() === 'full'\"\n [class.libs-ui-components-inputs-upload-file-short]=\"modeDisplayFile() === 'short'\"\n [class.libs-ui-border-error-general]=\"item().error || (messageError() && showBorderErrorAllItemWhenError())\"\n [class.mt-0]=\"first && !multiple() && !showPopupUploadWhenHasFileAndModeSingle()\">\n <div class=\"flex w-full\">\n <div class=\"flex items-center\">\n @if (canSetAvatar() && item().type === 'image') {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"\n '!mr-0' + (item().isAvatar ? ' libs-ui-icon-check-circle-solid before:!text-[#00bc62]' : ' libs-ui-icon-check-circle-outline') + (disable() || readonly() || item().isUploading || !!item().error ? ' libs-ui-disable' : '')\n \"\n [popover]=\"{ config: { content: item().isAvatar ? 'i18n_avatar' : 'i18n_choose_as_your_avatar', zIndex: zIndex() } }\"\n [classInclude]=\"'!mr-[12px] !p-0'\"\n [disable]=\"disable() || readonly() || item().isUploading || !!item().error\"\n (outClick)=\"handlerSetAvatar($event, item)\" />\n }\n </div>\n <div\n class=\"flex\"\n [class.w-[calc(100%-28px)]]=\"canSetAvatar()\"\n [class.w-full]=\"!canSetAvatar()\">\n @if (modeDisplayFile() === 'full') {\n <libs_ui-components-inputs-upload-avatar\n [classInclude]=\"classIncludeAvatar()\"\n [disable]=\"disable() || readonly()\"\n [(item)]=\"item\"\n [showVideoDuration]=\"showVideoDuration()\"\n (outOpenPreview)=\"handlerOpenPreviewFile($event)\" />\n }\n <div class=\"relative w-full\">\n <div\n class=\"flex absolute w-full h-full flex-col\"\n [class.flex-col]=\"modeDisplayFile() === 'full'\"\n [class.justify-center]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\">\n <libs_ui-components-label\n class=\"flex w-full\"\n [labelLeft]=\"item().name\"\n [zIndexPopover]=\"zIndex() + 1\"\n [labelLeftClass]=\"'libs-ui-font-h6m ' + (disable() || readonly() || item().isUploading || item().error ? 'text-[#6a7383]' : 'text-[#071631]')\"\n [classInclude]=\"modeDisplayFile() === 'short' ? '!mb-0' : ''\" />\n\n @if (!ignoreShowSizeFile()) {\n <div\n class=\"text-[#9ca2ad] libs-ui-font-h7r shrink-0\"\n [class.flex]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\"\n [class.ml-[12px]]=\"modeDisplayFile() === 'short'\">\n {{ item().size }}\n </div>\n }\n </div>\n </div>\n @if (item().isUploading && item().percentUploading) {\n <div\n class=\"flex items-center ml-[16px]\"\n [class.mr-[26px]]=\"modeDisplayFile() === 'full'\">\n <div class=\"w-[120px] h-[4px] rounded-[4px] bg-[#f8f9fa] relative\">\n <div\n class=\"absolute top-0 left-0 h-[4px] rounded-[4px] bg-[#00bc62]\"\n [style.width.px]=\"(item().percentUploading ?? 0) * 1.2\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex ml-[16px]\">\n @if (!ignoreIconPreview()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-eye-outline !mr-0'\"\n [popover]=\"{ config: { content: 'i18n_preview', zIndex: zIndex() + 1 } }\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() && !ignoreIconEdit() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable() || readonly()\"\n (outClick)=\"handlerOpenPreviewFile(item())\" />\n }\n @if (item().type === 'image' && !item().error && !ignoreIconEdit()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-edit-line !mr-0'\"\n [popover]=\"{ config: { content: 'i18n_edit', zIndex: zIndex() + 1 } }\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable() || readonly()\"\n (outClick)=\"handlerEditImage($event, item)\" />\n }\n @if (!ignoreIconRemove()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-close !mr-0'\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: zIndex() + 1 } }\"\n [classInclude]=\"'!p-0'\"\n [disable]=\"item().isUploading || disable() || readonly()\"\n (outClick)=\"handlerRemoveFile($event, item)\" />\n }\n </div>\n </div>\n @if (item().error && (multiple() || showPopupUploadWhenHasFileAndModeSingle())) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">\n @let constHtmlMessage = item().error || ' ';\n {{ constHtmlMessage | translate }}\n </div>\n }\n }\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["takeUntil"],"mappings":"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"}
1
+ {"version":3,"file":"libs-ui-components-inputs-upload.mjs","sources":["../../../../../../libs-ui/components/inputs/upload/src/pipes/calc-duration-video.pipe.ts","../../../../../../libs-ui/components/inputs/upload/src/avatar/avatar.component.ts","../../../../../../libs-ui/components/inputs/upload/src/avatar/avatar.component.html","../../../../../../libs-ui/components/inputs/upload/src/upload-drop-file.directive.ts","../../../../../../libs-ui/components/inputs/upload/src/upload-file.directive.ts","../../../../../../libs-ui/components/inputs/upload/src/defines/helper.define.ts","../../../../../../libs-ui/components/inputs/upload/src/upload.component.ts","../../../../../../libs-ui/components/inputs/upload/src/upload.component.html","../../../../../../libs-ui/components/inputs/upload/src/libs-ui-components-inputs-upload.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'LibsUiPipesInputsUploadCalcDurationVideoPipe',\n standalone: true,\n})\nexport class LibsUiPipesInputsUploadCalcDurationVideoPipe implements PipeTransform {\n transform(duration: number) {\n if (!duration) {\n return '0:0';\n }\n duration = Math.round(duration);\n if (duration >= 3600) {\n const hour = Math.floor(duration / 3600);\n const minute = Math.floor((duration - hour * 3600) / 60);\n const second = duration - (hour * 3600 + minute * 60);\n\n const minuteStr = String(minute).padStart(2, '0');\n const secondStr = String(second).padStart(2, '0');\n return `${hour}:${minuteStr}:${secondStr}`;\n }\n if (duration >= 60) {\n const minute = Math.floor(duration / 60);\n const second = duration - minute * 60;\n\n const secondStr2 = String(second).padStart(2, '0');\n return `${minute}:${secondStr2}`;\n }\n\n return `0:${duration}`;\n }\n}\n","import { AsyncPipe, NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Inject, input, model, Optional, output } from '@angular/core';\nimport { LibsUiComponentsSpinnerComponent } from '@libs-ui/components-spinner';\nimport { LibsUiIconsGetIconComponentPipe } from '@libs-ui/icons';\nimport { IEvent, IFile } from '@libs-ui/interfaces-types';\nimport { LibsUiPipesCheckFileExtensionPipe } from '@libs-ui/pipes-check-file-extension';\nimport { LibsUiPipesSecurityTrustPipe } from '@libs-ui/pipes-security-trust';\nimport { LINK_IMAGE_ERROR_TOKEN_INJECT } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { LibsUiPipesInputsUploadCalcDurationVideoPipe } from '../pipes/calc-duration-video.pipe';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-upload-avatar',\n templateUrl: './avatar.component.html',\n standalone: true,\n imports: [NgComponentOutlet, AsyncPipe, TranslateModule, LibsUiComponentsSpinnerComponent, LibsUiPipesSecurityTrustPipe, LibsUiPipesInputsUploadCalcDurationVideoPipe, LibsUiPipesCheckFileExtensionPipe, LibsUiIconsGetIconComponentPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsInputsUploadAvatarComponent {\n readonly item = model.required<IFile>();\n readonly showVideoDuration = input<boolean>();\n readonly disable = input<boolean>();\n readonly size = input<number>();\n readonly classInclude = input<string, string | undefined>('', { transform: (value) => value ?? '' });\n\n readonly outOpenPreview = output<IFile>();\n\n constructor(@Optional() @Inject(LINK_IMAGE_ERROR_TOKEN_INJECT) private readonly linkImageError: string) {}\n\n protected async handlerImageError(event: Event) {\n if (!this.linkImageError) {\n return;\n }\n (event as IEvent).target.src = this.linkImageError;\n }\n\n protected handlerImageClick(event: Event) {\n event.stopPropagation();\n this.outOpenPreview.emit(this.item());\n }\n}\n","<div\n class=\"flex mr-[12px] bg-[#ffffff] rounded-[4px] {{ classInclude() }}\"\n [class.libs-ui-disable]=\"disable() || item().isUploading || item().error\">\n @if (item() | LibsUiPipesCheckFileExtensionPipe: 'image') {\n <div\n [style.width.px]=\"size() || 32\"\n [style.height.px]=\"size() || 32\"\n class=\"relative\">\n @if (item().url || item().origin_url; as url) {\n <img\n [src]=\"url\"\n [style.width.px]=\"size() || 32\"\n [style.height.px]=\"size() || 32\"\n class=\"rounded-[4px] cursor-pointer\"\n alt\n (error)=\"handlerImageError($event)\"\n (click)=\"handlerImageClick($event)\"\n (keydown.enter)=\"handlerImageClick($event)\" />\n } @else {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n } @else if (item() | LibsUiPipesCheckFileExtensionPipe: 'video') {\n <div\n class=\"relative\"\n [style.width.px]=\"size() || 32\"\n [style.height.px]=\"size() || 32\">\n @if (item().url || item().origin_url) {\n @let constHtmlSrc = item().url || item().origin_url || '';\n <video\n #videoRef\n [style.width.px]=\"size || 32\"\n [style.height.px]=\"size || 32\"\n class=\"rounded-[4px]\"\n preload=\"metadata\"\n [src]=\"constHtmlSrc | LibsUiPipesSecurityTrustPipe: 'resourceUrl' | async\">\n <track kind=\"captions\" />\n </video>\n <div class=\"absolute w-full h-full top-0 bg-[#001433] opacity-40 rounded-[4px]\"></div>\n <div class=\"absolute w-full h-full flex items-center justify-center top-0\">\n <i class=\"text-[#ffffff] libs-ui-icon-play-solid before:!text-[10px]\"></i>\n </div>\n @if (showVideoDuration()) {\n <div class=\"flex text-[5px] absolute bottom-0 right-0 py-[2px] px-[4px] rounded-[4px] bg-[#000000] text-[#ffffff]\">\n {{ videoRef.duration | LibsUiPipesInputsUploadCalcDurationVideoPipe }}\n </div>\n }\n } @else {\n <libs_ui-components-spinner [size]=\"'medium'\" />\n }\n </div>\n } @else if (item() | LibsUiPipesCheckFileExtensionPipe: 'pdf') {\n <ng-container *ngComponentOutlet=\"'pdf' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: size() || 32 }\" />\n } @else if (item() | LibsUiPipesCheckFileExtensionPipe: 'word') {\n <ng-container *ngComponentOutlet=\"'word' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: size() || 32 }\" />\n } @else if (item() | LibsUiPipesCheckFileExtensionPipe: 'pptx') {\n <ng-container *ngComponentOutlet=\"'pptx' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: size() || 32 }\" />\n } @else if (item() | LibsUiPipesCheckFileExtensionPipe: 'xlsx') {\n <ng-container *ngComponentOutlet=\"'xlsx' | LibsUiIconsGetIconComponentPipe | async; inputs: { size: size() || 32 }\" />\n } @else {\n <div\n [style.width.px]=\"size() || 32\"\n [style.height.px]=\"size() || 32\"\n class=\"flex items-center justify-center\">\n <i\n class=\"libs-ui-icon-file before:!text-[19px]\"\n [class.text-[#6a7383]]=\"!item().isUploading && !item().error\"\n [class.text-[#071631]]=\"disable() || item().isUploading || item().error\"></i>\n </div>\n }\n</div>\n","import { AfterViewInit, Directive, ElementRef, inject, input, OnDestroy, output } from '@angular/core';\nimport { IEvent } from '@libs-ui/interfaces-types';\nimport { checkMouseOverInContainer, isTypeFile } from '@libs-ui/utils';\nimport { fromEvent, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[LibsUiComponentsInputsUploadDropFileDirective]',\n standalone: true,\n})\nexport class LibsUiComponentsInputsUploadDropFileDirective implements AfterViewInit, OnDestroy {\n private readonly onDestroy = new Subject<void>();\n\n readonly multiple = input<boolean, boolean | undefined>(true, { transform: (value) => value ?? true });\n\n readonly outDragOver = output<IEvent>();\n readonly outDragLeave = output<IEvent>();\n readonly outDrop = output<IEvent>();\n readonly outDropFiles = output<File[]>();\n readonly outDropFile = output<File>();\n\n private readonly elementRef = inject(ElementRef);\n\n ngAfterViewInit() {\n fromEvent<IEvent>(this.elementRef.nativeElement, 'dragover')\n .pipe(takeUntil(this.onDestroy))\n .subscribe((e: IEvent) => {\n e.stopPropagation();\n e.preventDefault();\n this.outDragOver.emit(e);\n });\n fromEvent<IEvent>(this.elementRef.nativeElement, 'dragleave')\n .pipe(takeUntil(this.onDestroy))\n .subscribe((e: IEvent) => {\n e.stopPropagation();\n e.preventDefault();\n if (checkMouseOverInContainer(e, this.elementRef.nativeElement)) {\n return;\n }\n this.outDragLeave.emit(e);\n });\n\n fromEvent<IEvent>(this.elementRef.nativeElement, 'drop')\n .pipe(takeUntil(this.onDestroy))\n .subscribe((e: IEvent) => {\n e.stopPropagation();\n e.preventDefault();\n this.outDrop.emit(e);\n\n const fileList = Array.from<File>(e.dataTransfer?.files || e.clipboardData?.files || []).filter(isTypeFile);\n\n if (!fileList?.length) {\n return;\n }\n\n if (this.multiple()) {\n this.outDropFiles.emit(fileList);\n\n return;\n }\n this.outDropFile.emit(fileList[0]);\n });\n }\n\n ngOnDestroy() {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","import { AfterViewInit, Directive, ElementRef, inject, input, OnDestroy, output } from '@angular/core';\nimport { IEvent } from '@libs-ui/interfaces-types';\nimport { fromEvent, Subject, takeUntil } from 'rxjs';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[LibsUiComponentsInputsUploadDirective]',\n standalone: true,\n})\nexport class LibsUiComponentsInputsUploadDirective implements AfterViewInit, OnDestroy {\n private readonly onDestroy = new Subject<void>();\n\n readonly multiple = input<boolean, boolean | undefined>(true, { transform: (val) => val ?? true });\n readonly accessFiles = input<string, string | undefined>('image/x-png,image/jpg,image/jpeg,image/PNG,image/x-PNG,image/JPG,image/JPEG', { transform: (val) => val ?? 'image/x-png,image/jpg,image/jpeg,image/PNG,image/x-PNG,image/JPG,image/JPEG' });\n\n readonly outUploadFiles = output<File[]>();\n readonly outUploadFile = output<File>();\n\n private readonly elementRef = inject(ElementRef);\n\n ngAfterViewInit() {\n fromEvent<IEvent>(this.elementRef.nativeElement, 'click')\n .pipe(takeUntil(this.onDestroy))\n .subscribe((e: IEvent) => {\n e.stopPropagation();\n e.preventDefault();\n\n const inputElementUpload = document.createElement('input');\n inputElementUpload.type = 'file';\n inputElementUpload.accept = this.accessFiles();\n inputElementUpload.multiple = this.multiple();\n inputElementUpload.style.display = 'none';\n inputElementUpload.click();\n fromEvent<IEvent>(inputElementUpload, 'change')\n .pipe(takeUntil(this.onDestroy))\n .subscribe((event: IEvent) => {\n const files = Array.from<File>(event.dataTransfer?.files || event.target?.files || []);\n inputElementUpload.remove();\n if (!files?.length) {\n return;\n }\n if (this.multiple()) {\n this.outUploadFiles.emit(files);\n\n return;\n }\n this.outUploadFile.emit(files[0]);\n });\n });\n }\n\n ngOnDestroy() {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","import { getLabelBySizeFile } from '@libs-ui/utils';\nimport { IUploadDescriptionFormatAndSizeFile, TYPE_FILE_UPLOAD } from '../interfaces/upload.interface';\n\nexport const getDescriptionFormatAndSizeFileDefault = (type: TYPE_FILE_UPLOAD, maxImageSize: number, maxVideoSize: number, maxDocumentSize: number, maxAudioSize: number): IUploadDescriptionFormatAndSizeFile[] => {\n const image = {\n message: 'i18n_note_upload_image_volume',\n interpolateParams: { value: getLabelBySizeFile(maxImageSize, 0) },\n };\n const video = {\n message: 'i18n_note_upload_video_volume',\n interpolateParams: { value: getLabelBySizeFile(maxVideoSize, 0) },\n };\n const document = {\n message: 'i18n_note_upload_file_volume',\n interpolateParams: { value: getLabelBySizeFile(maxDocumentSize, 0) },\n };\n const audio = {\n message: 'i18n_note_upload_audio_volume',\n interpolateParams: { value: getLabelBySizeFile(maxAudioSize, 0) },\n };\n\n const typeSplit = type.split('_');\n const description = [];\n\n if (typeSplit.includes('image')) {\n description.push(image);\n }\n if (typeSplit.includes('audio')) {\n description.push(audio);\n }\n if (typeSplit.includes('video')) {\n description.push(video);\n }\n if (typeSplit.includes('document')) {\n description.push(document);\n }\n\n return description;\n};\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ComponentRef, computed, effect, ElementRef, inject, input, OnDestroy, OnInit, output, signal, untracked, viewChild, WritableSignal } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsGalleryViewerComponent } from '@libs-ui/components-gallery';\nimport { ISaveFile, LibsUiComponentsImageEditorComponent } from '@libs-ui/components-image-editor';\nimport { ILabel, LibsUiComponentsLabelComponent } from '@libs-ui/components-label';\nimport { LibsUiComponentsPreviewFileComponent } from '@libs-ui/components-preview-file';\nimport { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';\nimport { IAspectRatio, IFile, IIsValidRequired, IMessageTranslate } from '@libs-ui/interfaces-types';\nimport { LibsUiDynamicComponentService, setInputs } from '@libs-ui/services-dynamic-component';\nimport { LibsUiNotificationService } from '@libs-ui/services-notification';\nimport {\n AudioExtList,\n convertBlobToFile,\n convertFileToBase64_ObjectUrl,\n DocumentExtList,\n downloadFileByUrl,\n ERROR_MESSAGE_EMPTY_VALID,\n getFileExtension,\n getLabelBySizeFile,\n ImageExtList,\n isIncludeAudioExtList,\n isIncludeDocumentExtList,\n isIncludeImageExtList,\n isIncludeVideoExtList,\n isTypeAudio,\n isTypeImage,\n isTypeVideo,\n uuid,\n VideoExtList,\n} from '@libs-ui/utils';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { Subject } from 'rxjs';\nimport { LibsUiComponentsInputsUploadAvatarComponent } from './avatar/avatar.component';\nimport { getDescriptionFormatAndSizeFileDefault } from './defines/helper.define';\nimport { IUploadConfigDownloadSampleFile, IUploadDescriptionFormatAndSizeFile, IUploadFunctionControlEvent, TYPE_FILE_UPLOAD, TYPE_MODE_FILE_DISPLAY } from './interfaces/upload.interface';\nimport { LibsUiComponentsInputsUploadDropFileDirective } from './upload-drop-file.directive';\nimport { LibsUiComponentsInputsUploadDirective } from './upload-file.directive';\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-upload',\n templateUrl: './upload.component.html',\n styleUrls: ['./upload.component.scss'],\n standalone: true,\n imports: [\n TranslateModule,\n LibsUiComponentsButtonsButtonComponent,\n LibsUiComponentsLabelComponent,\n LibsUiComponentsInputsUploadAvatarComponent,\n LibsUiComponentsScrollOverlayDirective,\n LibsUiComponentsInputsUploadDirective,\n LibsUiComponentsInputsUploadDropFileDirective,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsInputsUploadComponent implements OnInit, AfterViewInit, OnDestroy {\n // #region PROPERTIES\n private imageEditorComponentRef?: ComponentRef<LibsUiComponentsImageEditorComponent>;\n private previewFileComponentRef?: ComponentRef<LibsUiComponentsPreviewFileComponent>;\n private previewFileImageComponentRef?: ComponentRef<LibsUiComponentsGalleryViewerComponent>;\n protected isDragOver = signal(false);\n protected fileList = signal<Array<WritableSignal<IFile>>>([]);\n protected accessFiles = signal<string>('');\n protected messageError = signal<string | undefined>(undefined);\n protected descriptionFormatAndSizeFileComputed = computed<Array<IUploadDescriptionFormatAndSizeFile>>(() => {\n if (this.descriptionFormatAndSizeFile()?.length) {\n return this.descriptionFormatAndSizeFile() as unknown as Array<IUploadDescriptionFormatAndSizeFile>;\n }\n return getDescriptionFormatAndSizeFileDefault(this.fileType(), this.maxImageSize(), this.maxVideoSize(), this.maxDocumentSize(), this.maxAudioSize());\n });\n\n private readonly onDestroy = new Subject<void>();\n // #endregion\n\n // #region INPUTS\n readonly originFiles = input<Array<WritableSignal<IFile>>, Array<WritableSignal<IFile>> | undefined>([], { transform: (val) => val ?? [] });\n readonly fileType = input<TYPE_FILE_UPLOAD, TYPE_FILE_UPLOAD | undefined>('image_video_document', { transform: (val) => val ?? 'image_video_document' });\n readonly multiple = input<boolean>();\n readonly canUploadIfHasExistFile = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly canSetAvatar = input<boolean | undefined>(false);\n readonly limitFile = input<number, number | undefined>(10, { transform: (val) => val ?? 10 });\n readonly maxTotalSize = input<number, number | undefined>(10 * 1024 * 1024, { transform: (val) => val ?? 10 * 1024 * 1024 });\n readonly maxImageSize = input<number, number | undefined>(5 * 1024 * 1024, { transform: (val) => val ?? 5 * 1024 * 1024 });\n readonly maxVideoSize = input<number, number | undefined>(10 * 1024 * 1024, { transform: (val) => val ?? 10 * 1024 * 1024 });\n readonly maxDocumentSize = input<number, number | undefined>(10 * 1024 * 1024, { transform: (val) => val ?? 10 * 1024 * 1024 });\n readonly maxAudioSize = input<number, number | undefined>(10 * 1024 * 1024, { transform: (val) => val ?? 10 * 1024 * 1024 });\n readonly imageExtList = input<string[], string[] | undefined>(ImageExtList, { transform: (val) => val ?? ImageExtList });\n readonly videoExtList = input<string[], string[] | undefined>(VideoExtList, { transform: (val) => val ?? VideoExtList });\n readonly documentExtList = input<string[], string[] | undefined>(DocumentExtList, { transform: (val) => val ?? DocumentExtList });\n readonly audioExtList = input<string[], string[] | undefined>(AudioExtList, { transform: (val) => val ?? AudioExtList });\n readonly classIncludeListItem = input<string>();\n readonly validRequired = input<IIsValidRequired>();\n readonly disable = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly readonly = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly aspectRatio = input<IAspectRatio>();\n readonly zIndex = input<number, number | undefined>(1200, { transform: (val) => val ?? 1200 });\n readonly ignoreShowSizeFile = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly allowShowPushMessageMaxSizeError = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly messageTypeFileError = input<string, string | undefined>('i18n_the_file_support_format_is_not_correct', { transform: (val) => val || 'i18n_the_file_support_format_is_not_correct' });\n readonly messageMaxSizeError = input<string, string | undefined>('i18n_file_size_exceeds_the_allowed_limit', { transform: (val) => val || 'i18n_file_size_exceeds_the_allowed_limit' });\n readonly messageFileUploadError = input<string, string | undefined>('i18n_invalid_file_upload', { transform: (val) => val || 'i18n_invalid_file_upload' });\n readonly messageTotalFileExceedsError = input<string, string | undefined>('i18n_file_number_exceeds_the_allowed_limit_please_delete_the_file', { transform: (val) => val || 'i18n_file_number_exceeds_the_allowed_limit_please_delete_the_file' });\n readonly configDescriptionInputUpload = input<IMessageTranslate, IMessageTranslate | undefined>(\n { message: 'i18n_drag_file_here_to_upload_or_select_file' },\n {\n transform: (val) => val ?? { message: 'i18n_drag_file_here_to_upload_or_select_file' },\n }\n );\n\n readonly modeDisplayFile = input<TYPE_MODE_FILE_DISPLAY, TYPE_MODE_FILE_DISPLAY | undefined>('full', { transform: (val) => val || 'full' });\n readonly descriptionFormatAndSizeFile = input<Array<IUploadDescriptionFormatAndSizeFile>>();\n readonly showVideoDuration = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly labelConfig = input<ILabel>();\n readonly showPopupUploadWhenHasFileAndModeSingle = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly ignoreIconRemove = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly ignoreIconEdit = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly ignoreIconPreview = input<boolean, boolean | undefined>(true, { transform: (val) => val ?? true });\n readonly classIncludeFileContent = input<string, string | undefined>('', { transform: (value) => value ?? '' });\n readonly classIncludeAvatar = input<string, string | undefined>('', { transform: (value) => value ?? '' });\n readonly showBorderErrorAllItemWhenError = input<boolean, boolean | undefined>(false, { transform: (val) => val ?? false });\n readonly configDownloadSampleFile = input<IUploadConfigDownloadSampleFile>();\n // #endregion\n\n // #region OUTPUTS\n readonly outClose = output<boolean>();\n readonly outFileChanged = output<Array<WritableSignal<IFile>>>();\n readonly outFileRemoved = output<WritableSignal<IFile>>();\n readonly outFunctionsControl = output<IUploadFunctionControlEvent>();\n // #endregion\n\n // #region VIEW CHILDREN\n readonly uploadRef = viewChild<ElementRef>('upload');\n readonly uploadInputRef = viewChild<ElementRef>('uploadInput');\n // #endregion\n\n // #region INJECTIONS\n private readonly dynamicComponentService = inject(LibsUiDynamicComponentService);\n private readonly translateService = inject(TranslateService);\n private readonly notificationService = inject(LibsUiNotificationService);\n // #endregion\n\n constructor() {\n effect(() => {\n if (this.originFiles()) {\n untracked(() => {\n this.fileList.set([...this.originFiles()]);\n });\n }\n });\n }\n\n // #region LIFECYCLE HOOKS\n ngOnInit() {\n this.outFunctionsControl.emit(this.FunctionsControl);\n }\n\n ngAfterViewInit() {\n setTimeout(() => {\n this.initAccessFiles();\n }, 0);\n }\n // #endregion\n\n // #region INITIALIZATION\n protected async initAccessFiles() {\n const accessExts: string[] = [];\n const typeSplit = this.fileType().split('_');\n\n if (typeSplit.includes('image')) {\n accessExts.push(...this.imageExtList());\n }\n if (typeSplit.includes('document')) {\n accessExts.push(...this.documentExtList());\n }\n if (typeSplit.includes('video')) {\n accessExts.push(...this.videoExtList());\n }\n if (typeSplit.includes('audio')) {\n accessExts.push(...this.audioExtList());\n }\n this.accessFiles.set(accessExts.map((ext) => `.${ext}`).join(','));\n }\n // #endregion\n\n // #region FILE OPERATIONS\n protected async handlerSetClassDrag(toogle: boolean) {\n this.uploadRef()?.nativeElement.classList.toggle('libs-ui-components-inputs-upload-drag-over', toogle);\n }\n\n protected async handleUploadFiles(files: Array<File>) {\n if (this.maxTotalSize()) {\n let total = 0;\n\n for (const file of files) {\n total += file.size;\n }\n\n if (this.maxTotalSize() < total) {\n this.notificationService.showCompTypeTextError(this.translateService.instant('i18n_size_not_number_mb', { number: this.maxTotalSize() / 1024 / 1024 }), { timeRemove: 3000 });\n\n return;\n }\n }\n\n let errorExceedsMaxFile = false;\n if (!files?.length) {\n return;\n }\n if (!this.multiple() && this.fileList().length && !this.canUploadIfHasExistFile()) {\n return;\n }\n\n const remainFileTotal = this.limitFile() - this.fileList().length;\n if (files.length > remainFileTotal) {\n errorExceedsMaxFile = true;\n this.messageError.set(this.messageTotalFileExceedsError());\n }\n for (const file of files) {\n const isImage = isTypeImage(file);\n const isVideo = isTypeVideo(file);\n const isAudio = isTypeAudio(file);\n let fileType: IFile['type'] = 'document';\n if (isImage) fileType = 'image';\n if (!isImage && isVideo) fileType = 'video';\n if (!isImage && !isVideo && isAudio) fileType = 'audio';\n const newFile: IFile = {\n name: file.name,\n file: file,\n size: getLabelBySizeFile(file.size),\n type: fileType,\n id: uuid(),\n };\n if (!(await this.checkValidFileExtension(file))) {\n if (!errorExceedsMaxFile) {\n this.messageError.set(this.multiple() ? this.messageFileUploadError() : this.messageTypeFileError());\n }\n newFile.error = this.messageTypeFileError();\n await this.pushFileInList(file, newFile);\n continue;\n }\n if (!(await this.checkValidFileSize(file))) {\n if (!errorExceedsMaxFile) {\n this.messageError.set(this.multiple() ? this.messageFileUploadError() : this.messageMaxSizeError());\n }\n newFile.error = this.messageMaxSizeError();\n if (!this.multiple() && this.allowShowPushMessageMaxSizeError()) {\n this.notificationService.showCompTypeTextError(this.messageMaxSizeError());\n\n return;\n }\n await this.pushFileInList(file, newFile);\n continue;\n }\n await this.pushFileInList(file, newFile);\n }\n if (this.canSetAvatar() && this.fileList().length && !this.fileList().find((file) => file().isAvatar)) {\n this.fileList.update((fileList) => {\n const itemImage = fileList.find((file) => file().type === 'image');\n if (itemImage) {\n itemImage.update((file) => ({ ...file, isAvatar: true }));\n }\n return [...fileList];\n });\n }\n this.outFileChanged.emit(this.fileList());\n this.validate();\n }\n\n private async pushFileInList(file: File, newFile: IFile) {\n newFile.url = (await convertFileToBase64_ObjectUrl(file)) as string;\n\n this.fileList.update((fileList) => {\n fileList.splice(0, this.canUploadIfHasExistFile() ? 1 : 0, signal(newFile));\n return [...fileList];\n });\n }\n\n protected async handlerOpenPreviewFile(item: IFile) {\n if (item.type === 'document') {\n this.previewFileDocument(item);\n return;\n }\n this.previewFileImage(item);\n }\n\n private async previewFileDocument(item: IFile) {\n if (this.previewFileComponentRef) {\n return;\n }\n this.previewFileComponentRef = this.dynamicComponentService.resolveComponentFactory(LibsUiComponentsPreviewFileComponent);\n setInputs(this.previewFileComponentRef, { index: 0, data: [item], zIndex: this.zIndex() + 1 });\n this.previewFileComponentRef.instance.outClose.subscribe(() => {\n this.dynamicComponentService.remove(this.previewFileComponentRef);\n this.previewFileComponentRef = undefined;\n });\n this.dynamicComponentService.addToBody(this.previewFileComponentRef);\n }\n\n private async previewFileImage(item: IFile) {\n if (this.previewFileImageComponentRef) {\n return;\n }\n this.previewFileImageComponentRef = this.dynamicComponentService.resolveComponentFactory(LibsUiComponentsGalleryViewerComponent);\n const url = item.url || item.origin_url;\n this.previewFileImageComponentRef.setInput('images', [{ url }]);\n this.previewFileImageComponentRef.setInput('imageSelected', { url });\n this.previewFileImageComponentRef.setInput('fieldDisplaySrcImage', 'url');\n this.previewFileImageComponentRef.setInput('singleImage', true);\n this.previewFileImageComponentRef.setInput('zIndex', this.zIndex() + 1);\n this.previewFileImageComponentRef.instance.outClose.subscribe(() => {\n this.dynamicComponentService.remove(this.previewFileImageComponentRef);\n this.previewFileImageComponentRef = undefined;\n });\n this.dynamicComponentService.addToBody(this.previewFileImageComponentRef);\n }\n\n protected async handlerEditImage(event: Event, item: WritableSignal<IFile>) {\n event.stopPropagation();\n this.showEditModal(item);\n }\n\n protected async handlerRemoveFile(event: Event, item: WritableSignal<IFile>) {\n event.stopPropagation();\n this.removeFile(item);\n if (this.originFiles().find((file) => file().url === item().url)) {\n this.outFileRemoved.emit(item);\n }\n this.validate();\n if (!this.multiple() && this.showPopupUploadWhenHasFileAndModeSingle()) {\n setTimeout(() => {\n this.showUploadPopup();\n }, 0);\n }\n }\n\n protected async removeFile(fileItem: WritableSignal<IFile>) {\n this.fileList.update((fileList) => fileList.filter((item) => item().id !== fileItem().id));\n if (this.canSetAvatar() && fileItem().isAvatar && this.fileList().length) {\n this.fileList.update((fileList) => {\n fileList[0].update((file) => ({ ...file, isAvatar: true }));\n\n return [...fileList];\n });\n }\n this.outFileChanged.emit(this.fileList());\n }\n\n protected async showEditModal(fileItem: WritableSignal<IFile>) {\n if (this.imageEditorComponentRef) {\n return;\n }\n const fileDataUrl = fileItem().url || fileItem().origin_url || '';\n this.imageEditorComponentRef = this.dynamicComponentService.resolveComponentFactory(LibsUiComponentsImageEditorComponent);\n\n this.imageEditorComponentRef.setInput('imgSrc', fileDataUrl);\n this.imageEditorComponentRef.setInput('zIndex', this.zIndex() + 1);\n this.imageEditorComponentRef.setInput('nameFile', fileItem().name);\n this.imageEditorComponentRef.setInput('aspectRatio', this.aspectRatio());\n this.imageEditorComponentRef.instance.outClose.subscribe(() => {\n this.dynamicComponentService.remove(this.imageEditorComponentRef);\n this.imageEditorComponentRef = undefined;\n });\n\n this.imageEditorComponentRef.instance.outSaveFile.subscribe(async (result: ISaveFile) => {\n const messageError = !(await this.checkValidFileSize(result.file)) ? this.messageMaxSizeError() : undefined;\n const nameFile = fileItem().file?.name || fileItem().name;\n fileItem.update((data) => ({ ...data, file: convertBlobToFile(result.file, nameFile), name: nameFile, origin_url: undefined, size: getLabelBySizeFile(result.file.size), error: messageError, url: result.url, isUpdate: true }));\n this.outFileChanged.emit(this.fileList());\n this.imageEditorComponentRef?.instance.outClose.emit({ isClickButtonClose: true });\n });\n this.dynamicComponentService.addToBody(this.imageEditorComponentRef);\n }\n\n protected async checkValidFileExtension(file: File) {\n const extension = getFileExtension(file);\n\n if (!extension) {\n return false;\n }\n const isImage = isTypeImage(file);\n const isVideo = isTypeVideo(file);\n const isAudio = isTypeAudio(file);\n const validImage = isIncludeImageExtList(extension, this.imageExtList());\n const validVideo = isIncludeVideoExtList(extension, this.videoExtList());\n const validAudio = isIncludeAudioExtList(extension, this.audioExtList());\n const validDocument = isIncludeDocumentExtList(extension, this.documentExtList());\n\n const typeSplit = this.fileType().split('_');\n\n if (isImage && typeSplit.includes('image')) {\n return validImage;\n }\n if (isVideo && typeSplit.includes('video')) {\n return validVideo;\n }\n if (isAudio && typeSplit.includes('audio')) {\n return validAudio;\n }\n if (typeSplit.includes('document')) {\n return validDocument;\n }\n\n return false;\n }\n\n protected async checkValidFileSize(file: File | Blob) {\n const isImage = isTypeImage(file);\n const isVideo = isTypeVideo(file);\n const isAudio = isTypeAudio(file);\n const validImage = file.size <= this.maxImageSize();\n const validVideo = file.size <= this.maxVideoSize();\n const validAudio = file.size <= this.maxAudioSize();\n const validDocument = file.size <= this.maxDocumentSize();\n\n const typeSplit = this.fileType().split('_');\n\n if (isImage && typeSplit.includes('image')) {\n return validImage;\n }\n if (isVideo && typeSplit.includes('video')) {\n return validVideo;\n }\n if (isAudio && typeSplit.includes('audio')) {\n return validAudio;\n }\n if (typeSplit.includes('document')) {\n return validDocument;\n }\n\n return false;\n }\n\n protected async validate() {\n if (this.validRequired()?.isRequired && !this.fileList().length) {\n this.messageError.set(this.validRequired()?.message || ERROR_MESSAGE_EMPTY_VALID);\n\n return false;\n }\n if (this.multiple() && this.fileList().length > this.limitFile()) {\n this.messageError.set(this.messageTotalFileExceedsError());\n\n return false;\n }\n const fileError = this.fileList().find((item) => item().error);\n\n if (fileError) {\n this.messageError.set(this.multiple() ? this.messageFileUploadError() : fileError().error);\n\n return false;\n }\n this.messageError.set(undefined);\n\n return true;\n }\n\n protected async handlerSetAvatar(event: Event, file: WritableSignal<IFile>) {\n event.stopPropagation();\n\n this.fileList().forEach((item) => {\n if (item().id === file().id) {\n item.update((file) => ({ ...file, isAvatar: true }));\n return;\n }\n item.update((file) => ({ ...file, isAvatar: false }));\n });\n this.outFileChanged.emit(this.fileList());\n }\n\n private async removeAllFile() {\n this.fileList.set([]);\n this.messageError.set(undefined);\n }\n\n protected async handlerDownloadSampleFile(event: Event) {\n event.stopPropagation();\n const config = this.configDownloadSampleFile();\n if (!config) {\n return;\n }\n if (config?.callBack) {\n config.callBack();\n\n return;\n }\n if (config?.url) {\n downloadFileByUrl(config.url, config.title);\n }\n }\n\n private async showUploadPopup() {\n this.uploadInputRef()?.nativeElement.click();\n this.uploadInputRef()?.nativeElement.setAttribute('accept', this.accessFiles());\n }\n\n // #endregion\n\n // #region FUNCTIONS\n public get FunctionsControl(): IUploadFunctionControlEvent {\n return {\n checkIsValid: this.validate.bind(this),\n removeAll: this.removeAllFile.bind(this),\n uploading: async (process, id) => {\n const fileUploading = this.fileList().find((file) => file().id === id);\n\n if (fileUploading) {\n fileUploading.update((file) => ({ ...file, percentUploading: process.percent, isUploading: process.percent !== 100 }));\n }\n },\n setMessageError: async (message, id) => {\n this.messageError.set(message);\n if (id) {\n const fileError = this.fileList().find((file) => file().id === id);\n\n if (fileError) {\n fileError.update((file) => ({ ...file, error: message }));\n }\n }\n },\n handlerUploadFile: this.showUploadPopup.bind(this),\n };\n }\n // #endregion\n\n ngOnDestroy() {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","<div class=\"flex flex-col w-full h-full\">\n <div>\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [buttonsRight]=\"labelConfig.buttonsRight\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable() || readonly()\"\n [disableButtonsRight]=\"labelConfig.disableButtonsRight || disable() || readonly()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || disable() || readonly()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable() || readonly()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n @if ((!configDownloadSampleFile()?.position || configDownloadSampleFile()?.position === 'top') && configDownloadSampleFile(); as configDownloadSampleFile) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mb-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile?.title || ' '\"\n (outClick)=\"handlerDownloadSampleFile($event)\" />\n }\n @if (multiple() || !showPopupUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple())) {\n <div\n #upload\n LibsUiComponentsInputsUploadDirective\n LibsUiComponentsInputsUploadDropFileDirective\n class=\"libs-ui-components-inputs-upload\"\n [class.libs-ui-components-inputs-upload-disable]=\"disable() || readonly() || (!multiple() && fileList().length && !canUploadIfHasExistFile())\"\n [class.libs-ui-components-inputs-upload-readonly]=\"readonly()\"\n [class.libs-ui-components-inputs-upload-error]=\"messageError()\"\n [multiple]=\"multiple()\"\n [accessFiles]=\"accessFiles()\"\n (outUploadFiles)=\"handleUploadFiles($event)\"\n (outUploadFile)=\"handleUploadFiles([$event])\"\n (outDragOver)=\"handlerSetClassDrag(true)\"\n (outDragLeave)=\"handlerSetClassDrag(false)\"\n (outDrop)=\"handlerSetClassDrag(false)\"\n (outDropFiles)=\"handleUploadFiles($event)\"\n (outDropFile)=\"handleUploadFiles([$event])\">\n <div class=\"flex items-center\">\n <div class=\"mr-[16px]\">\n <i class=\"libs-ui-components-inputs-upload-icon libs-ui-icon-file-upload before:!text-[32px]\"></i>\n </div>\n <div class=\"libs-ui-components-inputs-upload-description\">\n @let constHtmlMessage = configDescriptionInputUpload().message || ' ';\n <div\n class=\"mb-[4px] libs-ui-font-h6m\"\n [innerHTML]=\"constHtmlMessage | translate: configDescriptionInputUpload().interpolateParams\"></div>\n @for (item of descriptionFormatAndSizeFileComputed(); track item; let last = $last) {\n <div\n class=\"libs-ui-font-h7r\"\n [class.mb-[4px]]=\"!last\"\n [innerHTML]=\"item.message | translate: item.interpolateParams\"></div>\n }\n </div>\n </div>\n @if (multiple()) {\n <input\n #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n multiple\n [accept]=\"accessFiles()\" />\n } @else {\n <input\n #uploadInput\n class=\"upload-input hidden\"\n type=\"file\"\n name=\"files[]\"\n [accept]=\"accessFiles()\" />\n }\n </div>\n }\n @if (messageError() && (multiple() || !showPopupUploadWhenHasFileAndModeSingle() || (!fileList().length && !multiple()))) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">\n @let constHtmlMessage = messageError() || ' ';\n {{ constHtmlMessage | translate: { value: limitFile() } }}\n </div>\n }\n @if (configDownloadSampleFile()?.position === 'bottom' && configDownloadSampleFile(); as configDownloadSampleFile) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classLabel]=\"'libs-ui-font-h7m'\"\n [classInclude]=\"'!mt-[8px] !p-0'\"\n [classIconLeft]=\"'libs-ui-icon-attachment before:!text-[12px]'\"\n [label]=\"configDownloadSampleFile.title || ' '\"\n (moClick)=\"handlerDownloadSampleFile($event)\" />\n }\n </div>\n @if (fileList().length) {\n <div\n LibsUiComponentsScrollOverlayDirective\n class=\"relative w-full h-full px-[10px] libs-ui-components-inputs-upload-view-list {{ classIncludeFileContent() || '' }}\"\n [class.mt-[12px]]=\"multiple() || !showPopupUploadWhenHasFileAndModeSingle()\">\n <ng-content select=\"[label-file]\"></ng-content>\n @for (item of fileList(); track item(); let first = $first) {\n <div\n class=\"libs-ui-components-inputs-upload-view-list-item {{ classIncludeListItem() || '' }}\"\n [class.libs-ui-components-inputs-upload-file-full]=\"modeDisplayFile() === 'full'\"\n [class.libs-ui-components-inputs-upload-file-short]=\"modeDisplayFile() === 'short'\"\n [class.libs-ui-border-error-general]=\"item().error || (messageError() && showBorderErrorAllItemWhenError())\"\n [class.mt-0]=\"first && !multiple() && !showPopupUploadWhenHasFileAndModeSingle()\">\n <div class=\"flex w-full\">\n <div class=\"flex items-center\">\n @if (canSetAvatar() && item().type === 'image') {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"\n '!mr-0' + (item().isAvatar ? ' libs-ui-icon-check-circle-solid before:!text-[#00bc62]' : ' libs-ui-icon-check-circle-outline') + (disable() || readonly() || item().isUploading || !!item().error ? ' libs-ui-disable' : '')\n \"\n [popover]=\"{ config: { content: item().isAvatar ? 'i18n_avatar' : 'i18n_choose_as_your_avatar', zIndex: zIndex() } }\"\n [classInclude]=\"'!mr-[12px] !p-0'\"\n [disable]=\"disable() || readonly() || item().isUploading || !!item().error\"\n (outClick)=\"handlerSetAvatar($event, item)\" />\n }\n </div>\n <div\n class=\"flex\"\n [class.w-[calc(100%-28px)]]=\"canSetAvatar()\"\n [class.w-full]=\"!canSetAvatar()\">\n @if (modeDisplayFile() === 'full') {\n <libs_ui-components-inputs-upload-avatar\n [classInclude]=\"classIncludeAvatar()\"\n [disable]=\"disable() || readonly()\"\n [(item)]=\"item\"\n [showVideoDuration]=\"showVideoDuration()\"\n (outOpenPreview)=\"handlerOpenPreviewFile($event)\" />\n }\n <div class=\"relative w-full\">\n <div\n class=\"flex absolute w-full h-full flex-col\"\n [class.flex-col]=\"modeDisplayFile() === 'full'\"\n [class.justify-center]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\">\n <libs_ui-components-label\n class=\"flex w-full\"\n [labelLeft]=\"item().name\"\n [zIndexPopover]=\"zIndex() + 1\"\n [labelLeftClass]=\"'libs-ui-font-h6m ' + (disable() || readonly() || item().isUploading || item().error ? 'text-[#6a7383]' : 'text-[#071631]')\"\n [classInclude]=\"modeDisplayFile() === 'short' ? '!mb-0' : ''\" />\n\n @if (!ignoreShowSizeFile()) {\n <div\n class=\"text-[#9ca2ad] libs-ui-font-h7r shrink-0\"\n [class.flex]=\"modeDisplayFile() === 'full'\"\n [class.items-center]=\"modeDisplayFile() === 'short'\"\n [class.ml-[12px]]=\"modeDisplayFile() === 'short'\">\n {{ item().size }}\n </div>\n }\n </div>\n </div>\n @if (item().isUploading && item().percentUploading) {\n <div\n class=\"flex items-center ml-[16px]\"\n [class.mr-[26px]]=\"modeDisplayFile() === 'full'\">\n <div class=\"w-[120px] h-[4px] rounded-[4px] bg-[#f8f9fa] relative\">\n <div\n class=\"absolute top-0 left-0 h-[4px] rounded-[4px] bg-[#00bc62]\"\n [style.width.px]=\"(item().percentUploading ?? 0) * 1.2\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex ml-[16px]\">\n @if (!ignoreIconPreview()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-eye-outline !mr-0'\"\n [popover]=\"{ config: { content: 'i18n_preview', zIndex: zIndex() + 1 } }\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() && !ignoreIconEdit() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable() || readonly()\"\n (outClick)=\"handlerOpenPreviewFile(item())\" />\n }\n @if (item().type === 'image' && !item().error && !ignoreIconEdit()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-edit-line !mr-0'\"\n [popover]=\"{ config: { content: 'i18n_edit', zIndex: zIndex() + 1 } }\"\n [classInclude]=\"'!p-0' + (ignoreIconRemove() ? '' : ' !mr-[12px]')\"\n [disable]=\"item().isUploading || disable() || readonly()\"\n (outClick)=\"handlerEditImage($event, item)\" />\n }\n @if (!ignoreIconRemove()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classIconLeft]=\"'libs-ui-icon-close !mr-0'\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: zIndex() + 1 } }\"\n [classInclude]=\"'!p-0'\"\n [disable]=\"item().isUploading || disable() || readonly()\"\n (outClick)=\"handlerRemoveFile($event, item)\" />\n }\n </div>\n </div>\n @if (item().error && (multiple() || showPopupUploadWhenHasFileAndModeSingle())) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\">\n @let constHtmlMessage = item().error || ' ';\n {{ constHtmlMessage | translate }}\n </div>\n }\n }\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["takeUntil"],"mappings":";;;;;;;;;;;;;;;;;;;;;MAMa,4CAA4C,CAAA;AACvD,IAAA,SAAS,CAAC,QAAgB,EAAA;QACxB,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,OAAO,KAAK,CAAC;SACd;AACD,QAAA,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAChC,QAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;YACpB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;AACzC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;AACzD,YAAA,MAAM,MAAM,GAAG,QAAQ,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC;AAEtD,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAClD,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAClD,YAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,SAAS,CAAI,CAAA,EAAA,SAAS,EAAE,CAAC;SAC5C;AACD,QAAA,IAAI,QAAQ,IAAI,EAAE,EAAE;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;AACzC,YAAA,MAAM,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,EAAE,CAAC;AAEtC,YAAA,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACnD,YAAA,OAAO,CAAG,EAAA,MAAM,CAAI,CAAA,EAAA,UAAU,EAAE,CAAC;SAClC;QAED,OAAO,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAE,CAAC;KACxB;wGAxBU,4CAA4C,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;sGAA5C,4CAA4C,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,8CAAA,EAAA,CAAA,CAAA;;4FAA5C,4CAA4C,EAAA,UAAA,EAAA,CAAA;kBAJxD,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,8CAA8C;AACpD,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAA;;;MCcY,2CAA2C,CAAA;AAS0B,IAAA,cAAA,CAAA;AARvE,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAS,CAAC;IAC/B,iBAAiB,GAAG,KAAK,EAAW,CAAC;IACrC,OAAO,GAAG,KAAK,EAAW,CAAC;IAC3B,IAAI,GAAG,KAAK,EAAU,CAAC;AACvB,IAAA,YAAY,GAAG,KAAK,CAA6B,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;IAE5F,cAAc,GAAG,MAAM,EAAS,CAAC;AAE1C,IAAA,WAAA,CAAgF,cAAsB,EAAA;QAAtB,IAAc,CAAA,cAAA,GAAd,cAAc,CAAQ;KAAI;IAEhG,MAAM,iBAAiB,CAAC,KAAY,EAAA;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB,OAAO;SACR;QACA,KAAgB,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;KACpD;AAES,IAAA,iBAAiB,CAAC,KAAY,EAAA;QACtC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;KACvC;AArBU,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2CAA2C,kBAStB,6BAA6B,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AATlD,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2CAA2C,k0BCnBxD,sxGAuEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDvDY,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,kCAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,SAAS,EAAE,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,gCAAgC,4FAAE,4BAA4B,EAAA,IAAA,EAAA,8BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,4CAA4C,EAAE,IAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,iCAAiC,qEAAE,+BAA+B,EAAA,IAAA,EAAA,iCAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAG9N,2CAA2C,EAAA,UAAA,EAAA,CAAA;kBARvD,SAAS;+BAEE,yCAAyC,EAAA,UAAA,EAEvC,IAAI,EACP,OAAA,EAAA,CAAC,iBAAiB,EAAE,SAAS,EAAE,eAAe,EAAE,gCAAgC,EAAE,4BAA4B,EAAE,4CAA4C,EAAE,iCAAiC,EAAE,+BAA+B,CAAC,EAAA,eAAA,EACzN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,sxGAAA,EAAA,CAAA;;0BAWlC,QAAQ;;0BAAI,MAAM;2BAAC,6BAA6B,CAAA;;;MElBlD,6CAA6C,CAAA;AACvC,IAAA,SAAS,GAAG,IAAI,OAAO,EAAQ,CAAC;AAExC,IAAA,QAAQ,GAAG,KAAK,CAA+B,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;IAE9F,WAAW,GAAG,MAAM,EAAU,CAAC;IAC/B,YAAY,GAAG,MAAM,EAAU,CAAC;IAChC,OAAO,GAAG,MAAM,EAAU,CAAC;IAC3B,YAAY,GAAG,MAAM,EAAU,CAAC;IAChC,WAAW,GAAG,MAAM,EAAQ,CAAC;AAErB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAEjD,eAAe,GAAA;QACb,SAAS,CAAS,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC;AACzD,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/B,aAAA,SAAS,CAAC,CAAC,CAAS,KAAI;YACvB,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,CAAC,CAAC,cAAc,EAAE,CAAC;AACnB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC3B,SAAC,CAAC,CAAC;QACL,SAAS,CAAS,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,WAAW,CAAC;AAC1D,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/B,aAAA,SAAS,CAAC,CAAC,CAAS,KAAI;YACvB,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,IAAI,yBAAyB,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;gBAC/D,OAAO;aACR;AACD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5B,SAAC,CAAC,CAAC;QAEL,SAAS,CAAS,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,MAAM,CAAC;AACrD,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/B,aAAA,SAAS,CAAC,CAAC,CAAS,KAAI;YACvB,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,CAAC,CAAC,cAAc,EAAE,CAAC;AACnB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAErB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAO,CAAC,CAAC,YAAY,EAAE,KAAK,IAAI,CAAC,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAE5G,YAAA,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;gBACrB,OAAO;aACR;AAED,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAEjC,OAAO;aACR;YACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,SAAC,CAAC,CAAC;KACN;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;KAC3B;wGAzDU,6CAA6C,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;4FAA7C,6CAA6C,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iDAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAA7C,6CAA6C,EAAA,UAAA,EAAA,CAAA;kBALzD,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;;AAET,oBAAA,QAAQ,EAAE,iDAAiD;AAC3D,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAA;;;MCAY,qCAAqC,CAAA;AAC/B,IAAA,SAAS,GAAG,IAAI,OAAO,EAAQ,CAAC;AAExC,IAAA,QAAQ,GAAG,KAAK,CAA+B,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;AAC1F,IAAA,WAAW,GAAG,KAAK,CAA6B,6EAA6E,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,6EAA6E,EAAE,CAAC,CAAC;IAE7O,cAAc,GAAG,MAAM,EAAU,CAAC;IAClC,aAAa,GAAG,MAAM,EAAQ,CAAC;AAEvB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAEjD,eAAe,GAAA;QACb,SAAS,CAAS,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC;AACtD,aAAA,IAAI,CAACA,WAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/B,aAAA,SAAS,CAAC,CAAC,CAAS,KAAI;YACvB,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,CAAC,CAAC,cAAc,EAAE,CAAC;YAEnB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC3D,YAAA,kBAAkB,CAAC,IAAI,GAAG,MAAM,CAAC;AACjC,YAAA,kBAAkB,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAC/C,YAAA,kBAAkB,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC9C,YAAA,kBAAkB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAC1C,kBAAkB,CAAC,KAAK,EAAE,CAAC;AAC3B,YAAA,SAAS,CAAS,kBAAkB,EAAE,QAAQ,CAAC;AAC5C,iBAAA,IAAI,CAACA,WAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/B,iBAAA,SAAS,CAAC,CAAC,KAAa,KAAI;gBAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAO,KAAK,CAAC,YAAY,EAAE,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACvF,kBAAkB,CAAC,MAAM,EAAE,CAAC;AAC5B,gBAAA,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;oBAClB,OAAO;iBACR;AACD,gBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,oBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAEhC,OAAO;iBACR;gBACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,aAAC,CAAC,CAAC;AACP,SAAC,CAAC,CAAC;KACN;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;KAC3B;wGA7CU,qCAAqC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;4FAArC,qCAAqC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAArC,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBALjD,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;;AAET,oBAAA,QAAQ,EAAE,yCAAyC;AACnD,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAA;;;ACLM,MAAM,sCAAsC,GAAG,CAAC,IAAsB,EAAE,YAAoB,EAAE,YAAoB,EAAE,eAAuB,EAAE,YAAoB,KAA2C;AACjN,IAAA,MAAM,KAAK,GAAG;AACZ,QAAA,OAAO,EAAE,+BAA+B;QACxC,iBAAiB,EAAE,EAAE,KAAK,EAAE,kBAAkB,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE;KAClE,CAAC;AACF,IAAA,MAAM,KAAK,GAAG;AACZ,QAAA,OAAO,EAAE,+BAA+B;QACxC,iBAAiB,EAAE,EAAE,KAAK,EAAE,kBAAkB,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE;KAClE,CAAC;AACF,IAAA,MAAM,QAAQ,GAAG;AACf,QAAA,OAAO,EAAE,8BAA8B;QACvC,iBAAiB,EAAE,EAAE,KAAK,EAAE,kBAAkB,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE;KACrE,CAAC;AACF,IAAA,MAAM,KAAK,GAAG;AACZ,QAAA,OAAO,EAAE,+BAA+B;QACxC,iBAAiB,EAAE,EAAE,KAAK,EAAE,kBAAkB,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE;KAClE,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,IAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC/B,QAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACzB;AACD,IAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC/B,QAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACzB;AACD,IAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC/B,QAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACzB;AACD,IAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AAClC,QAAA,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC5B;AAED,IAAA,OAAO,WAAW,CAAC;AACrB,CAAC;;MCgBY,qCAAqC,CAAA;;AAExC,IAAA,uBAAuB,CAAsD;AAC7E,IAAA,uBAAuB,CAAsD;AAC7E,IAAA,4BAA4B,CAAwD;AAClF,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3B,IAAA,QAAQ,GAAG,MAAM,CAA+B,EAAE,CAAC,CAAC;AACpD,IAAA,WAAW,GAAG,MAAM,CAAS,EAAE,CAAC,CAAC;AACjC,IAAA,YAAY,GAAG,MAAM,CAAqB,SAAS,CAAC,CAAC;AACrD,IAAA,oCAAoC,GAAG,QAAQ,CAA6C,MAAK;AACzG,QAAA,IAAI,IAAI,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE;AAC/C,YAAA,OAAO,IAAI,CAAC,4BAA4B,EAA2D,CAAC;SACrG;QACD,OAAO,sCAAsC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;AACxJ,KAAC,CAAC,CAAC;AAEc,IAAA,SAAS,GAAG,IAAI,OAAO,EAAQ,CAAC;;;AAIxC,IAAA,WAAW,GAAG,KAAK,CAAyE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;AACnI,IAAA,QAAQ,GAAG,KAAK,CAAiD,sBAAsB,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,sBAAsB,EAAE,CAAC,CAAC;IAChJ,QAAQ,GAAG,KAAK,EAAW,CAAC;AAC5B,IAAA,uBAAuB,GAAG,KAAK,CAA+B,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;AAC3G,IAAA,YAAY,GAAG,KAAK,CAAsB,KAAK,CAAC,CAAC;AACjD,IAAA,SAAS,GAAG,KAAK,CAA6B,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;IACrF,YAAY,GAAG,KAAK,CAA6B,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;IACpH,YAAY,GAAG,KAAK,CAA6B,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;IAClH,YAAY,GAAG,KAAK,CAA6B,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;IACpH,eAAe,GAAG,KAAK,CAA6B,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;IACvH,YAAY,GAAG,KAAK,CAA6B,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;AACpH,IAAA,YAAY,GAAG,KAAK,CAAiC,YAAY,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC,CAAC;AAChH,IAAA,YAAY,GAAG,KAAK,CAAiC,YAAY,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC,CAAC;AAChH,IAAA,eAAe,GAAG,KAAK,CAAiC,eAAe,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC,CAAC;AACzH,IAAA,YAAY,GAAG,KAAK,CAAiC,YAAY,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC,CAAC;IAChH,oBAAoB,GAAG,KAAK,EAAU,CAAC;IACvC,aAAa,GAAG,KAAK,EAAoB,CAAC;AAC1C,IAAA,OAAO,GAAG,KAAK,CAA+B,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;AAC3F,IAAA,QAAQ,GAAG,KAAK,CAA+B,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;IAC5F,WAAW,GAAG,KAAK,EAAgB,CAAC;AACpC,IAAA,MAAM,GAAG,KAAK,CAA6B,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;AACtF,IAAA,kBAAkB,GAAG,KAAK,CAA+B,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;AACtG,IAAA,gCAAgC,GAAG,KAAK,CAA+B,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;AACpH,IAAA,oBAAoB,GAAG,KAAK,CAA6B,6CAA6C,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,6CAA6C,EAAE,CAAC,CAAC;AACtL,IAAA,mBAAmB,GAAG,KAAK,CAA6B,0CAA0C,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,0CAA0C,EAAE,CAAC,CAAC;AAC/K,IAAA,sBAAsB,GAAG,KAAK,CAA6B,0BAA0B,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,0BAA0B,EAAE,CAAC,CAAC;AAClJ,IAAA,4BAA4B,GAAG,KAAK,CAA6B,mEAAmE,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,mEAAmE,EAAE,CAAC,CAAC;IAC1O,4BAA4B,GAAG,KAAK,CAC3C,EAAE,OAAO,EAAE,8CAA8C,EAAE,EAC3D;AACE,QAAA,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,8CAA8C,EAAE;AACvF,KAAA,CACF,CAAC;AAEO,IAAA,eAAe,GAAG,KAAK,CAA6D,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,MAAM,EAAE,CAAC,CAAC;IACnI,4BAA4B,GAAG,KAAK,EAA8C,CAAC;AACnF,IAAA,iBAAiB,GAAG,KAAK,CAA+B,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;IACrG,WAAW,GAAG,KAAK,EAAU,CAAC;AAC9B,IAAA,uCAAuC,GAAG,KAAK,CAA+B,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;AAC3H,IAAA,gBAAgB,GAAG,KAAK,CAA+B,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;AACpG,IAAA,cAAc,GAAG,KAAK,CAA+B,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;AAClG,IAAA,iBAAiB,GAAG,KAAK,CAA+B,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;AACnG,IAAA,uBAAuB,GAAG,KAAK,CAA6B,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;AACvG,IAAA,kBAAkB,GAAG,KAAK,CAA6B,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;AAClG,IAAA,+BAA+B,GAAG,KAAK,CAA+B,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;IACnH,wBAAwB,GAAG,KAAK,EAAmC,CAAC;;;IAIpE,QAAQ,GAAG,MAAM,EAAW,CAAC;IAC7B,cAAc,GAAG,MAAM,EAAgC,CAAC;IACxD,cAAc,GAAG,MAAM,EAAyB,CAAC;IACjD,mBAAmB,GAAG,MAAM,EAA+B,CAAC;;;AAI5D,IAAA,SAAS,GAAG,SAAS,CAAa,QAAQ,CAAC,CAAC;AAC5C,IAAA,cAAc,GAAG,SAAS,CAAa,aAAa,CAAC,CAAC;;;AAI9C,IAAA,uBAAuB,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC;AAChE,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAC5C,IAAA,mBAAmB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;;AAGzE,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;gBACtB,SAAS,CAAC,MAAK;AACb,oBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC7C,iBAAC,CAAC,CAAC;aACJ;AACH,SAAC,CAAC,CAAC;KACJ;;IAGD,QAAQ,GAAA;QACN,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KACtD;IAED,eAAe,GAAA;QACb,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,eAAe,EAAE,CAAC;SACxB,EAAE,CAAC,CAAC,CAAC;KACP;;;AAIS,IAAA,MAAM,eAAe,GAAA;QAC7B,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAE7C,QAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YAC/B,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;SACzC;AACD,QAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YAClC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;SAC5C;AACD,QAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YAC/B,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;SACzC;AACD,QAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YAC/B,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;SACzC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;KACpE;;;IAIS,MAAM,mBAAmB,CAAC,MAAe,EAAA;AACjD,QAAA,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,4CAA4C,EAAE,MAAM,CAAC,CAAC;KACxG;IAES,MAAM,iBAAiB,CAAC,KAAkB,EAAA;AAClD,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACvB,IAAI,KAAK,GAAG,CAAC,CAAC;AAEd,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,gBAAA,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC;aACpB;AAED,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE,GAAG,KAAK,EAAE;AAC/B,gBAAA,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE9K,OAAO;aACR;SACF;QAED,IAAI,mBAAmB,GAAG,KAAK,CAAC;AAChC,QAAA,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;YAClB,OAAO;SACR;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE;YACjF,OAAO;SACR;AAED,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC;AAClE,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,eAAe,EAAE;YAClC,mBAAmB,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC,CAAC;SAC5D;AACD,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AAClC,YAAA,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AAClC,YAAA,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,QAAQ,GAAkB,UAAU,CAAC;AACzC,YAAA,IAAI,OAAO;gBAAE,QAAQ,GAAG,OAAO,CAAC;YAChC,IAAI,CAAC,OAAO,IAAI,OAAO;gBAAE,QAAQ,GAAG,OAAO,CAAC;AAC5C,YAAA,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,IAAI,OAAO;gBAAE,QAAQ,GAAG,OAAO,CAAC;AACxD,YAAA,MAAM,OAAO,GAAU;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,IAAI,EAAE,IAAI;AACV,gBAAA,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;AACnC,gBAAA,IAAI,EAAE,QAAQ;gBACd,EAAE,EAAE,IAAI,EAAE;aACX,CAAC;YACF,IAAI,EAAE,MAAM,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,EAAE;gBAC/C,IAAI,CAAC,mBAAmB,EAAE;oBACxB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,sBAAsB,EAAE,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;iBACtG;AACD,gBAAA,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC5C,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACzC,SAAS;aACV;YACD,IAAI,EAAE,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE;gBAC1C,IAAI,CAAC,mBAAmB,EAAE;oBACxB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,sBAAsB,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;iBACrG;AACD,gBAAA,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,gCAAgC,EAAE,EAAE;oBAC/D,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;oBAE3E,OAAO;iBACR;gBACD,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACzC,SAAS;aACV;YACD,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SAC1C;AACD,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE;YACrG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAI;AAChC,gBAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;gBACnE,IAAI,SAAS,EAAE;AACb,oBAAA,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;iBAC3D;AACD,gBAAA,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,aAAC,CAAC,CAAC;SACJ;QACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;KACjB;AAEO,IAAA,MAAM,cAAc,CAAC,IAAU,EAAE,OAAc,EAAA;QACrD,OAAO,CAAC,GAAG,IAAI,MAAM,6BAA6B,CAAC,IAAI,CAAC,CAAW,CAAC;QAEpE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAI;YAChC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,uBAAuB,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5E,YAAA,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,SAAC,CAAC,CAAC;KACJ;IAES,MAAM,sBAAsB,CAAC,IAAW,EAAA;AAChD,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE;AAC5B,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO;SACR;AACD,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;KAC7B;IAEO,MAAM,mBAAmB,CAAC,IAAW,EAAA;AAC3C,QAAA,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAChC,OAAO;SACR;QACD,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,uBAAuB,CAAC,oCAAoC,CAAC,CAAC;QAC1H,SAAS,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/F,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAK;YAC5D,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;AAClE,YAAA,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;AAC3C,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;KACtE;IAEO,MAAM,gBAAgB,CAAC,IAAW,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC,4BAA4B,EAAE;YACrC,OAAO;SACR;QACD,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,uBAAuB,CAAC,uBAAuB,CAAC,sCAAsC,CAAC,CAAC;QACjI,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC;AACxC,QAAA,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAC1E,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAChE,QAAA,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAK;YACjE,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;AACvE,YAAA,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC;AAChD,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;KAC3E;AAES,IAAA,MAAM,gBAAgB,CAAC,KAAY,EAAE,IAA2B,EAAA;QACxE,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;KAC1B;AAES,IAAA,MAAM,iBAAiB,CAAC,KAAY,EAAE,IAA2B,EAAA;QACzE,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE;AAChE,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAChC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,uCAAuC,EAAE,EAAE;YACtE,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,eAAe,EAAE,CAAC;aACxB,EAAE,CAAC,CAAC,CAAC;SACP;KACF;IAES,MAAM,UAAU,CAAC,QAA+B,EAAA;AACxD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3F,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,QAAQ,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE;YACxE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAI;gBAChC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAE5D,gBAAA,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,aAAC,CAAC,CAAC;SACJ;QACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;KAC3C;IAES,MAAM,aAAa,CAAC,QAA+B,EAAA;AAC3D,QAAA,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAChC,OAAO;SACR;AACD,QAAA,MAAM,WAAW,GAAG,QAAQ,EAAE,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC;QAClE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,uBAAuB,CAAC,oCAAoC,CAAC,CAAC;QAE1H,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAK;YAC5D,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;AAClE,YAAA,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;AAC3C,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,MAAiB,KAAI;YACtF,MAAM,YAAY,GAAG,EAAE,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,mBAAmB,EAAE,GAAG,SAAS,CAAC;AAC5G,YAAA,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,IAAI,QAAQ,EAAE,CAAC,IAAI,CAAC;YAC1D,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAClO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC1C,YAAA,IAAI,CAAC,uBAAuB,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;AACrF,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;KACtE;IAES,MAAM,uBAAuB,CAAC,IAAU,EAAA;AAChD,QAAA,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAEzC,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,OAAO,KAAK,CAAC;SACd;AACD,QAAA,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AAClC,QAAA,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AAClC,QAAA,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACzE,MAAM,UAAU,GAAG,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACzE,MAAM,UAAU,GAAG,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACzE,MAAM,aAAa,GAAG,wBAAwB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QAElF,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE7C,IAAI,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC1C,YAAA,OAAO,UAAU,CAAC;SACnB;QACD,IAAI,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC1C,YAAA,OAAO,UAAU,CAAC;SACnB;QACD,IAAI,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC1C,YAAA,OAAO,UAAU,CAAC;SACnB;AACD,QAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AAClC,YAAA,OAAO,aAAa,CAAC;SACtB;AAED,QAAA,OAAO,KAAK,CAAC;KACd;IAES,MAAM,kBAAkB,CAAC,IAAiB,EAAA;AAClD,QAAA,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AAClC,QAAA,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AAClC,QAAA,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACpD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QAE1D,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE7C,IAAI,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC1C,YAAA,OAAO,UAAU,CAAC;SACnB;QACD,IAAI,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC1C,YAAA,OAAO,UAAU,CAAC;SACnB;QACD,IAAI,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC1C,YAAA,OAAO,UAAU,CAAC;SACnB;AACD,QAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AAClC,YAAA,OAAO,aAAa,CAAC;SACtB;AAED,QAAA,OAAO,KAAK,CAAC;KACd;AAES,IAAA,MAAM,QAAQ,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE;AAC/D,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,IAAI,yBAAyB,CAAC,CAAC;AAElF,YAAA,OAAO,KAAK,CAAC;SACd;AACD,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE;YAChE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC,CAAC;AAE3D,YAAA,OAAO,KAAK,CAAC;SACd;AACD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;QAE/D,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,sBAAsB,EAAE,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;AAE3F,YAAA,OAAO,KAAK,CAAC;SACd;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAEjC,QAAA,OAAO,IAAI,CAAC;KACb;AAES,IAAA,MAAM,gBAAgB,CAAC,KAAY,EAAE,IAA2B,EAAA;QACxE,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;YAC/B,IAAI,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE;AAC3B,gBAAA,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACrD,OAAO;aACR;AACD,YAAA,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACxD,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;KAC3C;AAEO,IAAA,MAAM,aAAa,GAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACtB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;KAClC;IAES,MAAM,yBAAyB,CAAC,KAAY,EAAA;QACpD,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC/C,IAAI,CAAC,MAAM,EAAE;YACX,OAAO;SACR;AACD,QAAA,IAAI,MAAM,EAAE,QAAQ,EAAE;YACpB,MAAM,CAAC,QAAQ,EAAE,CAAC;YAElB,OAAO;SACR;AACD,QAAA,IAAI,MAAM,EAAE,GAAG,EAAE;YACf,iBAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;SAC7C;KACF;AAEO,IAAA,MAAM,eAAe,GAAA;QAC3B,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;AAC7C,QAAA,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;KACjF;;;AAKD,IAAA,IAAW,gBAAgB,GAAA;QACzB,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YACtC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AACxC,YAAA,SAAS,EAAE,OAAO,OAAO,EAAE,EAAE,KAAI;gBAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBAEvE,IAAI,aAAa,EAAE;AACjB,oBAAA,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;iBACxH;aACF;AACD,YAAA,eAAe,EAAE,OAAO,OAAO,EAAE,EAAE,KAAI;AACrC,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC/B,IAAI,EAAE,EAAE;oBACN,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;oBAEnE,IAAI,SAAS,EAAE;AACb,wBAAA,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;qBAC3D;iBACF;aACF;YACD,iBAAiB,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;SACnD,CAAC;KACH;;IAGD,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;KAC3B;wGAvdU,qCAAqC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qCAAqC,ECtDlD,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gCAAA,EAAA,EAAA,iBAAA,EAAA,kCAAA,EAAA,UAAA,EAAA,kCAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,4BAAA,EAAA,EAAA,iBAAA,EAAA,8BAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,4BAAA,EAAA,EAAA,iBAAA,EAAA,8BAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,4BAAA,EAAA,EAAA,iBAAA,EAAA,8BAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uCAAA,EAAA,EAAA,iBAAA,EAAA,yCAAA,EAAA,UAAA,EAAA,yCAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,+BAAA,EAAA,EAAA,iBAAA,EAAA,iCAAA,EAAA,UAAA,EAAA,iCAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,wBAAA,EAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,UAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,8iXA+NA,EDnLI,MAAA,EAAA,CAAA,m8HAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,4FACf,sCAAsC,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,MAAA,EAAA,cAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,yBAAA,EAAA,+BAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,mCAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,iBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtC,8BAA8B,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,6BAAA,EAAA,SAAA,EAAA,UAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,2BAAA,EAAA,kCAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC9B,2CAA2C,EAC3C,QAAA,EAAA,yCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,sCAAsC,EACtC,QAAA,EAAA,0CAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,qCAAqC,uKACrC,6CAA6C,EAAA,QAAA,EAAA,iDAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,cAAA,EAAA,SAAA,EAAA,cAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAIpC,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBAjBjD,SAAS;+BAEE,kCAAkC,EAAA,UAAA,EAGhC,IAAI,EACP,OAAA,EAAA;wBACP,eAAe;wBACf,sCAAsC;wBACtC,8BAA8B;wBAC9B,2CAA2C;wBAC3C,sCAAsC;wBACtC,qCAAqC;wBACrC,6CAA6C;qBAC9C,EACgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,8iXAAA,EAAA,MAAA,EAAA,CAAA,m8HAAA,CAAA,EAAA,CAAA;;;AEpDjD;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,25 +1,25 @@
1
1
  {
2
2
  "name": "@libs-ui/components-inputs-upload",
3
- "version": "0.2.356-42",
3
+ "version": "0.2.356-43",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=18.0.0",
6
6
  "@angular/core": ">=18.0.0",
7
- "@libs-ui/components-spinner": "0.2.356-42",
8
- "@libs-ui/icons": "0.2.356-42",
9
- "@libs-ui/interfaces-types": "0.2.356-42",
10
- "@libs-ui/pipes-security-trust": "0.2.356-42",
11
- "@libs-ui/utils": "0.2.356-42",
7
+ "@libs-ui/components-spinner": "0.2.356-43",
8
+ "@libs-ui/icons": "0.2.356-43",
9
+ "@libs-ui/interfaces-types": "0.2.356-43",
10
+ "@libs-ui/pipes-security-trust": "0.2.356-43",
11
+ "@libs-ui/utils": "0.2.356-43",
12
12
  "@ngx-translate/core": "^15.0.0",
13
- "@libs-ui/components-buttons-button": "0.2.356-42",
14
- "@libs-ui/components-gallery": "0.2.356-42",
15
- "@libs-ui/components-image-editor": "0.2.356-42",
16
- "@libs-ui/components-label": "0.2.356-42",
17
- "@libs-ui/components-preview-file": "0.2.356-42",
18
- "@libs-ui/components-scroll-overlay": "0.2.356-42",
19
- "@libs-ui/services-dynamic-component": "0.2.356-42",
20
- "@libs-ui/services-notification": "0.2.356-42",
13
+ "@libs-ui/components-buttons-button": "0.2.356-43",
14
+ "@libs-ui/components-gallery": "0.2.356-43",
15
+ "@libs-ui/components-image-editor": "0.2.356-43",
16
+ "@libs-ui/components-label": "0.2.356-43",
17
+ "@libs-ui/components-preview-file": "0.2.356-43",
18
+ "@libs-ui/components-scroll-overlay": "0.2.356-43",
19
+ "@libs-ui/services-dynamic-component": "0.2.356-43",
20
+ "@libs-ui/services-notification": "0.2.356-43",
21
21
  "rxjs": "~7.8.0",
22
- "@libs-ui/pipes-check-file-extension": "0.2.356-42"
22
+ "@libs-ui/pipes-check-file-extension": "0.2.356-43"
23
23
  },
24
24
  "sideEffects": false,
25
25
  "module": "fesm2022/libs-ui-components-inputs-upload.mjs",