@memberjunction/storage 2.39.0 → 2.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/drivers/AWSFileStorage.d.ts +360 -4
  2. package/dist/drivers/AWSFileStorage.d.ts.map +1 -1
  3. package/dist/drivers/AWSFileStorage.js +357 -4
  4. package/dist/drivers/AWSFileStorage.js.map +1 -1
  5. package/dist/drivers/AzureFileStorage.d.ts +362 -2
  6. package/dist/drivers/AzureFileStorage.d.ts.map +1 -1
  7. package/dist/drivers/AzureFileStorage.js +357 -2
  8. package/dist/drivers/AzureFileStorage.js.map +1 -1
  9. package/dist/drivers/BoxFileStorage.d.ts +648 -20
  10. package/dist/drivers/BoxFileStorage.d.ts.map +1 -1
  11. package/dist/drivers/BoxFileStorage.js +951 -126
  12. package/dist/drivers/BoxFileStorage.js.map +1 -1
  13. package/dist/drivers/DropboxFileStorage.d.ts +437 -15
  14. package/dist/drivers/DropboxFileStorage.d.ts.map +1 -1
  15. package/dist/drivers/DropboxFileStorage.js +431 -15
  16. package/dist/drivers/DropboxFileStorage.js.map +1 -1
  17. package/dist/drivers/GoogleDriveFileStorage.d.ts +342 -16
  18. package/dist/drivers/GoogleDriveFileStorage.d.ts.map +1 -1
  19. package/dist/drivers/GoogleDriveFileStorage.js +340 -16
  20. package/dist/drivers/GoogleDriveFileStorage.js.map +1 -1
  21. package/dist/drivers/GoogleFileStorage.d.ts +358 -2
  22. package/dist/drivers/GoogleFileStorage.d.ts.map +1 -1
  23. package/dist/drivers/GoogleFileStorage.js +356 -2
  24. package/dist/drivers/GoogleFileStorage.js.map +1 -1
  25. package/dist/drivers/SharePointFileStorage.d.ts +434 -20
  26. package/dist/drivers/SharePointFileStorage.d.ts.map +1 -1
  27. package/dist/drivers/SharePointFileStorage.js +453 -22
  28. package/dist/drivers/SharePointFileStorage.js.map +1 -1
  29. package/dist/generic/FileStorageBase.d.ts +326 -108
  30. package/dist/generic/FileStorageBase.d.ts.map +1 -1
  31. package/dist/generic/FileStorageBase.js +54 -6
  32. package/dist/generic/FileStorageBase.js.map +1 -1
  33. package/dist/util.d.ts +125 -18
  34. package/dist/util.d.ts.map +1 -1
  35. package/dist/util.js +125 -18
  36. package/dist/util.js.map +1 -1
  37. package/package.json +8 -7
  38. package/readme.md +211 -1
@@ -1,37 +1,393 @@
1
1
  /// <reference types="node" />
2
2
  import { CreatePreAuthUploadUrlPayload, FileStorageBase, StorageListResult, StorageObjectMetadata } from '../generic/FileStorageBase';
3
+ /**
4
+ * AWS S3 implementation of the FileStorageBase interface.
5
+ *
6
+ * This class provides methods for interacting with Amazon S3 as a file storage provider.
7
+ * It implements all the abstract methods defined in FileStorageBase and handles AWS-specific
8
+ * authentication, authorization, and file operations.
9
+ *
10
+ * It requires the following environment variables to be set:
11
+ * - STORAGE_AWS_REGION: The AWS region (e.g., 'us-east-1')
12
+ * - STORAGE_AWS_BUCKET_NAME: The S3 bucket name
13
+ * - STORAGE_AWS_ACCESS_KEY_ID: The AWS access key ID
14
+ * - STORAGE_AWS_SECRET_ACCESS_KEY: The AWS secret access key
15
+ * - STORAGE_AWS_KEY_PREFIX: (Optional) Prefix for all object keys, defaults to '/'
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * // Create an instance of AWSFileStorage
20
+ * const s3Storage = new AWSFileStorage();
21
+ *
22
+ * // Generate a pre-authenticated upload URL
23
+ * const { UploadUrl } = await s3Storage.CreatePreAuthUploadUrl('documents/report.pdf');
24
+ *
25
+ * // Generate a pre-authenticated download URL
26
+ * const downloadUrl = await s3Storage.CreatePreAuthDownloadUrl('documents/report.pdf');
27
+ *
28
+ * // List files in a directory
29
+ * const files = await s3Storage.ListObjects('documents/');
30
+ * ```
31
+ */
3
32
  export declare class AWSFileStorage extends FileStorageBase {
33
+ /** The name of this storage provider, used in error messages */
4
34
  protected readonly providerName = "AWS S3";
35
+ /** The S3 bucket name */
5
36
  private _bucket;
37
+ /** The key prefix to prepend to all object keys */
6
38
  private _keyPrefix;
39
+ /** The S3 client instance */
7
40
  private _client;
41
+ /**
42
+ * Creates a new instance of AWSFileStorage.
43
+ *
44
+ * Initializes the connection to AWS S3 using environment variables.
45
+ * Throws an error if any required environment variables are missing.
46
+ */
8
47
  constructor();
9
48
  /**
10
- * Normalizes the object name by ensuring it has the proper key prefix
49
+ * Normalizes the object name by ensuring it has the proper key prefix.
11
50
  *
12
- * @param objectName The object name to normalize
51
+ * This is a helper method used internally to ensure all object keys have
52
+ * the configured prefix. It handles cases where the object name already
53
+ * includes the prefix or has leading slashes.
54
+ *
55
+ * @param objectName - The object name to normalize
13
56
  * @returns The normalized object name with the proper prefix
57
+ * @private
14
58
  */
15
59
  private _normalizeKey;
16
60
  /**
17
- * Removes the prefix from a key to get the relative object name
61
+ * Removes the prefix from a key to get the relative object name.
62
+ *
63
+ * This is a helper method used internally to convert a full S3 key
64
+ * (including the prefix) back to the relative object name that
65
+ * clients will recognize.
18
66
  *
19
- * @param key The full key including the prefix
67
+ * @param key - The full key including the prefix
20
68
  * @returns The object name without the prefix
69
+ * @private
21
70
  */
22
71
  private _removePrefix;
72
+ /**
73
+ * Creates a pre-authenticated upload URL for an object in S3.
74
+ *
75
+ * This method generates a pre-signed URL that allows for uploading
76
+ * an object to S3 without needing AWS credentials. The URL is valid
77
+ * for 10 minutes and includes the content type based on the file extension.
78
+ *
79
+ * @param objectName - The name of the object to upload (including any path/directory)
80
+ * @returns A Promise resolving to an object with the upload URL
81
+ *
82
+ * @example
83
+ * ```typescript
84
+ * // Generate a pre-authenticated upload URL for a PDF file
85
+ * const { UploadUrl } = await s3Storage.CreatePreAuthUploadUrl('documents/report.pdf');
86
+ *
87
+ * // The URL can be used with fetch or other HTTP clients to upload the file
88
+ * console.log(UploadUrl);
89
+ * ```
90
+ */
23
91
  CreatePreAuthUploadUrl(objectName: string): Promise<CreatePreAuthUploadUrlPayload>;
92
+ /**
93
+ * Creates a pre-authenticated download URL for an object in S3.
94
+ *
95
+ * This method generates a pre-signed URL that allows for downloading
96
+ * an object from S3 without needing AWS credentials. The URL is valid
97
+ * for 10 minutes and can be shared with clients.
98
+ *
99
+ * @param objectName - The name of the object to download (including any path/directory)
100
+ * @returns A Promise resolving to the download URL
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * // Generate a pre-authenticated download URL for a PDF file
105
+ * const downloadUrl = await s3Storage.CreatePreAuthDownloadUrl('documents/report.pdf');
106
+ *
107
+ * // The URL can be shared with users or used in applications for direct download
108
+ * console.log(downloadUrl);
109
+ * ```
110
+ */
24
111
  CreatePreAuthDownloadUrl(objectName: string): Promise<string>;
112
+ /**
113
+ * Moves an object from one location to another within S3.
114
+ *
115
+ * Since S3 doesn't provide a native move operation, this method
116
+ * implements move as a copy followed by a delete operation.
117
+ * It first copies the object to the new location, and if successful,
118
+ * deletes the object from the original location.
119
+ *
120
+ * @param oldObjectName - The current name/path of the object
121
+ * @param newObjectName - The new name/path for the object
122
+ * @returns A Promise resolving to a boolean indicating success
123
+ *
124
+ * @example
125
+ * ```typescript
126
+ * // Move a file from drafts to published folder
127
+ * const success = await s3Storage.MoveObject(
128
+ * 'drafts/report.docx',
129
+ * 'published/final-report.docx'
130
+ * );
131
+ *
132
+ * if (success) {
133
+ * console.log('File successfully moved');
134
+ * } else {
135
+ * console.log('Failed to move file');
136
+ * }
137
+ * ```
138
+ */
25
139
  MoveObject(oldObjectName: string, newObjectName: string): Promise<boolean>;
140
+ /**
141
+ * Deletes an object from S3.
142
+ *
143
+ * This method attempts to delete the specified object. It returns true
144
+ * if the operation was successful, false otherwise.
145
+ *
146
+ * @param objectName - The name of the object to delete (including any path/directory)
147
+ * @returns A Promise resolving to a boolean indicating success
148
+ *
149
+ * @example
150
+ * ```typescript
151
+ * // Delete a temporary file
152
+ * const deleted = await s3Storage.DeleteObject('temp/report-draft.pdf');
153
+ *
154
+ * if (deleted) {
155
+ * console.log('File successfully deleted');
156
+ * } else {
157
+ * console.log('Failed to delete file');
158
+ * }
159
+ * ```
160
+ */
26
161
  DeleteObject(objectName: string): Promise<boolean>;
162
+ /**
163
+ * Lists objects with the specified prefix in S3.
164
+ *
165
+ * This method returns a list of objects (files) and common prefixes (directories)
166
+ * under the specified path prefix. It uses the S3 ListObjectsV2 API which supports
167
+ * delimiter-based hierarchy simulation.
168
+ *
169
+ * @param prefix - The path prefix to list objects from (e.g., 'documents/')
170
+ * @param delimiter - The character used to simulate directory structure, defaults to '/'
171
+ * @returns A Promise resolving to a StorageListResult containing objects and prefixes
172
+ *
173
+ * @example
174
+ * ```typescript
175
+ * // List all files and directories in the documents folder
176
+ * const result = await s3Storage.ListObjects('documents/');
177
+ *
178
+ * // Process files
179
+ * for (const file of result.objects) {
180
+ * console.log(`File: ${file.name}, Size: ${file.size}, Type: ${file.contentType}`);
181
+ * }
182
+ *
183
+ * // Process subdirectories
184
+ * for (const dir of result.prefixes) {
185
+ * console.log(`Directory: ${dir}`);
186
+ * }
187
+ * ```
188
+ */
27
189
  ListObjects(prefix: string, delimiter?: string): Promise<StorageListResult>;
190
+ /**
191
+ * Creates a directory (virtual) in S3.
192
+ *
193
+ * Since S3 doesn't have a native directory concept, this method creates
194
+ * a zero-byte object with a trailing slash to simulate a directory.
195
+ * The object has a special content type to indicate it's a directory.
196
+ *
197
+ * @param directoryPath - The path of the directory to create
198
+ * @returns A Promise resolving to a boolean indicating success
199
+ *
200
+ * @example
201
+ * ```typescript
202
+ * // Create a new directory structure
203
+ * const created = await s3Storage.CreateDirectory('documents/reports/annual/');
204
+ *
205
+ * if (created) {
206
+ * console.log('Directory created successfully');
207
+ * } else {
208
+ * console.log('Failed to create directory');
209
+ * }
210
+ * ```
211
+ */
28
212
  CreateDirectory(directoryPath: string): Promise<boolean>;
213
+ /**
214
+ * Deletes a directory (virtual) and optionally its contents from S3.
215
+ *
216
+ * For non-recursive deletion, this method simply deletes the directory
217
+ * placeholder object. For recursive deletion, it lists all objects with
218
+ * the directory path as prefix and deletes them using the DeleteObjects API,
219
+ * which allows for deleting up to 1000 objects in a single request.
220
+ *
221
+ * Note: This implementation doesn't handle pagination for directories with
222
+ * more than 1000 objects. In a production environment, you might want to
223
+ * enhance this to handle such cases.
224
+ *
225
+ * @param directoryPath - The path of the directory to delete
226
+ * @param recursive - If true, deletes all contents recursively (default: false)
227
+ * @returns A Promise resolving to a boolean indicating success
228
+ *
229
+ * @example
230
+ * ```typescript
231
+ * // Delete an empty directory
232
+ * const deleted = await s3Storage.DeleteDirectory('documents/temp/');
233
+ *
234
+ * // Delete a directory and all its contents
235
+ * const recursivelyDeleted = await s3Storage.DeleteDirectory('documents/old_projects/', true);
236
+ * ```
237
+ */
29
238
  DeleteDirectory(directoryPath: string, recursive?: boolean): Promise<boolean>;
239
+ /**
240
+ * Retrieves metadata for a specific object in S3.
241
+ *
242
+ * This method fetches the properties of an object using the HeadObject API,
243
+ * which doesn't download the object content. This is more efficient for
244
+ * checking file attributes like size, content type, and last modified date.
245
+ *
246
+ * @param objectName - The name of the object to get metadata for
247
+ * @returns A Promise resolving to a StorageObjectMetadata object
248
+ * @throws Error if the object doesn't exist or cannot be accessed
249
+ *
250
+ * @example
251
+ * ```typescript
252
+ * try {
253
+ * const metadata = await s3Storage.GetObjectMetadata('documents/report.pdf');
254
+ * console.log(`File: ${metadata.name}`);
255
+ * console.log(`Size: ${metadata.size} bytes`);
256
+ * console.log(`Last modified: ${metadata.lastModified}`);
257
+ * } catch (error) {
258
+ * console.error('File does not exist or cannot be accessed');
259
+ * }
260
+ * ```
261
+ */
30
262
  GetObjectMetadata(objectName: string): Promise<StorageObjectMetadata>;
263
+ /**
264
+ * Downloads an object's content from S3.
265
+ *
266
+ * This method retrieves the full content of an object using the GetObject API
267
+ * and returns it as a Buffer for processing in memory.
268
+ *
269
+ * @param objectName - The name of the object to download
270
+ * @returns A Promise resolving to a Buffer containing the object's data
271
+ * @throws Error if the object doesn't exist or cannot be downloaded
272
+ *
273
+ * @example
274
+ * ```typescript
275
+ * try {
276
+ * const content = await s3Storage.GetObject('documents/config.json');
277
+ * // Parse the JSON content
278
+ * const config = JSON.parse(content.toString('utf8'));
279
+ * console.log('Configuration loaded:', config);
280
+ * } catch (error) {
281
+ * console.error('Failed to download file:', error.message);
282
+ * }
283
+ * ```
284
+ */
31
285
  GetObject(objectName: string): Promise<Buffer>;
286
+ /**
287
+ * Uploads data to an object in S3.
288
+ *
289
+ * This method directly uploads a Buffer of data to an object with the specified name.
290
+ * It's useful for server-side operations where you already have the data in memory.
291
+ *
292
+ * @param objectName - The name to assign to the uploaded object
293
+ * @param data - The Buffer containing the data to upload
294
+ * @param contentType - Optional MIME type for the object (inferred from name if not provided)
295
+ * @param metadata - Optional key-value pairs of custom metadata to associate with the object
296
+ * @returns A Promise resolving to a boolean indicating success
297
+ *
298
+ * @example
299
+ * ```typescript
300
+ * // Upload a text file
301
+ * const content = Buffer.from('Hello, World!', 'utf8');
302
+ * const uploaded = await s3Storage.PutObject(
303
+ * 'documents/hello.txt',
304
+ * content,
305
+ * 'text/plain',
306
+ * { author: 'John Doe', department: 'Engineering' }
307
+ * );
308
+ *
309
+ * if (uploaded) {
310
+ * console.log('File uploaded successfully');
311
+ * } else {
312
+ * console.log('Failed to upload file');
313
+ * }
314
+ * ```
315
+ */
32
316
  PutObject(objectName: string, data: Buffer, contentType?: string, metadata?: Record<string, string>): Promise<boolean>;
317
+ /**
318
+ * Copies an object within S3.
319
+ *
320
+ * This method creates a copy of an object at a new location without removing the original.
321
+ * It uses the CopyObject API, which allows for copying objects within the same bucket.
322
+ *
323
+ * @param sourceObjectName - The name of the object to copy
324
+ * @param destinationObjectName - The name to assign to the copied object
325
+ * @returns A Promise resolving to a boolean indicating success
326
+ *
327
+ * @example
328
+ * ```typescript
329
+ * // Create a backup copy of an important file
330
+ * const copied = await s3Storage.CopyObject(
331
+ * 'documents/contract.pdf',
332
+ * 'backups/contract_2024-05-16.pdf'
333
+ * );
334
+ *
335
+ * if (copied) {
336
+ * console.log('File copied successfully');
337
+ * } else {
338
+ * console.log('Failed to copy file');
339
+ * }
340
+ * ```
341
+ */
33
342
  CopyObject(sourceObjectName: string, destinationObjectName: string): Promise<boolean>;
343
+ /**
344
+ * Checks if an object exists in S3.
345
+ *
346
+ * This method verifies the existence of an object using the HeadObject API,
347
+ * which doesn't download the object content. This is efficient for validation purposes.
348
+ *
349
+ * @param objectName - The name of the object to check
350
+ * @returns A Promise resolving to a boolean indicating if the object exists
351
+ *
352
+ * @example
353
+ * ```typescript
354
+ * // Check if a file exists before attempting to use it
355
+ * const exists = await s3Storage.ObjectExists('documents/report.pdf');
356
+ *
357
+ * if (exists) {
358
+ * console.log('File exists, proceeding with download');
359
+ * const content = await s3Storage.GetObject('documents/report.pdf');
360
+ * // Process the content...
361
+ * } else {
362
+ * console.log('File does not exist');
363
+ * }
364
+ * ```
365
+ */
34
366
  ObjectExists(objectName: string): Promise<boolean>;
367
+ /**
368
+ * Checks if a directory (virtual) exists in S3.
369
+ *
370
+ * Since S3 doesn't have a native directory concept, this method checks for either:
371
+ * 1. The existence of a directory placeholder object (zero-byte object with trailing slash)
372
+ * 2. The existence of any objects with the directory path as a prefix
373
+ *
374
+ * @param directoryPath - The path of the directory to check
375
+ * @returns A Promise resolving to a boolean indicating if the directory exists
376
+ *
377
+ * @example
378
+ * ```typescript
379
+ * // Check if a directory exists before trying to save files to it
380
+ * const exists = await s3Storage.DirectoryExists('documents/reports/');
381
+ *
382
+ * if (!exists) {
383
+ * console.log('Directory does not exist, creating it first');
384
+ * await s3Storage.CreateDirectory('documents/reports/');
385
+ * }
386
+ *
387
+ * // Now safe to use the directory
388
+ * await s3Storage.PutObject('documents/reports/new-report.pdf', fileData);
389
+ * ```
390
+ */
35
391
  DirectoryExists(directoryPath: string): Promise<boolean>;
36
392
  }
37
393
  //# sourceMappingURL=AWSFileStorage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AWSFileStorage.d.ts","sourceRoot":"","sources":["../../src/drivers/AWSFileStorage.ts"],"names":[],"mappings":";AAcA,OAAO,EACL,6BAA6B,EAC7B,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,4BAA4B,CAAC;AAEpC,qBACa,cAAe,SAAQ,eAAe;IACjD,SAAS,CAAC,QAAQ,CAAC,YAAY,YAAY;IAC3C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAW;;IAmB1B;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAUrB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAOR,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAgBxF,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOvD,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1E,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAalD,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA2DxE,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBxD,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAiD3E,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAkCrE,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB9C,SAAS,CACpB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,OAAO,CAAC;IAwBN,UAAU,CAAC,gBAAgB,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBrF,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBlD,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CA6BtE"}
1
+ {"version":3,"file":"AWSFileStorage.d.ts","sourceRoot":"","sources":["../../src/drivers/AWSFileStorage.ts"],"names":[],"mappings":";AAcA,OAAO,EACL,6BAA6B,EAC7B,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,4BAA4B,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBACa,cAAe,SAAQ,eAAe;IACjD,gEAAgE;IAChE,SAAS,CAAC,QAAQ,CAAC,YAAY,YAAY;IAE3C,yBAAyB;IACzB,OAAO,CAAC,OAAO,CAAS;IAExB,mDAAmD;IACnD,OAAO,CAAC,UAAU,CAAS;IAE3B,6BAA6B;IAC7B,OAAO,CAAC,OAAO,CAAW;IAE1B;;;;;OAKG;;IAkBH;;;;;;;;;;OAUG;IACH,OAAO,CAAC,aAAa;IAUrB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,aAAa;IAOrB;;;;;;;;;;;;;;;;;;OAkBG;IACU,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAgB/F;;;;;;;;;;;;;;;;;;OAkBG;IACI,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOpE;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACU,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUvF;;;;;;;;;;;;;;;;;;;;OAoBG;IACU,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa/D;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACU,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA2DrF;;;;;;;;;;;;;;;;;;;;;OAqBG;IACU,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBrE;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACU,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAiDxF;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACU,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAkClF;;;;;;;;;;;;;;;;;;;;;OAqBG;IACU,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACU,SAAS,CACpB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,OAAO,CAAC;IAwBnB;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACU,UAAU,CAAC,gBAAgB,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBlG;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACU,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB/D;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACU,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CA6BtE"}