@angular-helpers/browser-web-apis 21.0.2 → 21.1.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular-helpers/browser-web-apis",
3
- "version": "21.0.2",
3
+ "version": "21.1.0",
4
4
  "description": "Sistema de servicios Angular para acceso formalizado a Browser Web APIs (cámara, permisos, geolocalización, etc.)",
5
5
  "keywords": [
6
6
  "angular",
@@ -1,7 +1,7 @@
1
- import * as i0 from '@angular/core';
2
- import { DestroyRef } from '@angular/core';
3
1
  import { Observable } from 'rxjs';
4
- import { CanActivate, Router, ActivatedRouteSnapshot } from '@angular/router';
2
+ import * as i0 from '@angular/core';
3
+ import { DestroyRef, EnvironmentProviders } from '@angular/core';
4
+ import { CanActivateFn } from '@angular/router';
5
5
 
6
6
  type PermissionNameExt = PermissionName | 'clipboard-read' | 'clipboard-write';
7
7
  interface PermissionRequest {
@@ -50,13 +50,16 @@ declare abstract class BrowserApiBaseService {
50
50
  * Request a permission
51
51
  */
52
52
  protected requestPermission(permission: PermissionNameExt): Promise<boolean>;
53
+ /**
54
+ * Create an error with proper cause chaining
55
+ */
56
+ protected createError(message: string, cause?: unknown): Error;
53
57
  static ɵfac: i0.ɵɵFactoryDeclaration<BrowserApiBaseService, never>;
54
58
  static ɵprov: i0.ɵɵInjectableDeclaration<BrowserApiBaseService>;
55
59
  }
56
60
 
57
61
  declare class CameraService extends BrowserApiBaseService {
58
62
  private currentStream;
59
- private createError;
60
63
  protected getApiName(): string;
61
64
  private ensureCameraSupport;
62
65
  startCamera(constraints?: MediaStreamConstraints): Promise<MediaStream>;
@@ -87,7 +90,6 @@ interface DisplayMediaConstraints {
87
90
  audio?: boolean | MediaTrackConstraints;
88
91
  }
89
92
  declare class MediaDevicesService extends BrowserApiBaseService {
90
- private createError;
91
93
  protected getApiName(): string;
92
94
  private ensureMediaDevicesSupport;
93
95
  getDevices(): Promise<MediaDeviceInfo[]>;
@@ -106,6 +108,9 @@ declare class MediaDevicesService extends BrowserApiBaseService {
106
108
 
107
109
  declare class NotificationService extends BrowserApiBaseService {
108
110
  protected getApiName(): string;
111
+ get permission(): NotificationPermission;
112
+ isSupported(): boolean;
113
+ requestNotificationPermission(): Promise<NotificationPermission>;
109
114
  showNotification(title: string, options?: NotificationOptions): Promise<Notification>;
110
115
  static ɵfac: i0.ɵɵFactoryDeclaration<NotificationService, never>;
111
116
  static ɵprov: i0.ɵɵInjectableDeclaration<NotificationService>;
@@ -186,6 +191,202 @@ declare class BrowserCapabilityService {
186
191
  static ɵprov: i0.ɵɵInjectableDeclaration<BrowserCapabilityService>;
187
192
  }
188
193
 
194
+ interface BatteryInfo {
195
+ charging: boolean;
196
+ chargingTime: number;
197
+ dischargingTime: number;
198
+ level: number;
199
+ }
200
+ interface BatteryManager extends EventTarget {
201
+ readonly charging: boolean;
202
+ readonly chargingTime: number;
203
+ readonly dischargingTime: number;
204
+ readonly level: number;
205
+ addEventListener(type: 'chargingchange', listener: (this: BatteryManager, ev: Event) => void, options?: boolean | AddEventListenerOptions): void;
206
+ addEventListener(type: 'levelchange', listener: (this: BatteryManager, ev: Event) => void, options?: boolean | AddEventListenerOptions): void;
207
+ addEventListener(type: 'chargingtimechange', listener: (this: BatteryManager, ev: Event) => void, options?: boolean | AddEventListenerOptions): void;
208
+ addEventListener(type: 'dischargingtimechange', listener: (this: BatteryManager, ev: Event) => void, options?: boolean | AddEventListenerOptions): void;
209
+ removeEventListener(type: 'chargingchange', listener: (this: BatteryManager, ev: Event) => void, options?: boolean | EventListenerOptions): void;
210
+ removeEventListener(type: 'levelchange', listener: (this: BatteryManager, ev: Event) => void, options?: boolean | EventListenerOptions): void;
211
+ removeEventListener(type: 'chargingtimechange', listener: (this: BatteryManager, ev: Event) => void, options?: boolean | EventListenerOptions): void;
212
+ removeEventListener(type: 'dischargingtimechange', listener: (this: BatteryManager, ev: Event) => void, options?: boolean | EventListenerOptions): void;
213
+ }
214
+ declare global {
215
+ interface Navigator {
216
+ getBattery?: () => Promise<BatteryManager>;
217
+ }
218
+ }
219
+
220
+ declare class BatteryService extends BrowserApiBaseService {
221
+ private batteryManager;
222
+ protected getApiName(): string;
223
+ private ensureBatterySupport;
224
+ initialize(): Promise<BatteryInfo>;
225
+ getBatteryInfo(): BatteryInfo;
226
+ watchBatteryInfo(): Observable<BatteryInfo>;
227
+ private setupEventListeners;
228
+ getNativeBatteryManager(): BatteryManager;
229
+ isCharging(): boolean;
230
+ getLevel(): number;
231
+ getChargingTime(): number;
232
+ getDischargingTime(): number;
233
+ static ɵfac: i0.ɵɵFactoryDeclaration<BatteryService, never>;
234
+ static ɵprov: i0.ɵɵInjectableDeclaration<BatteryService>;
235
+ }
236
+
237
+ interface ShareResult {
238
+ shared: boolean;
239
+ error?: string;
240
+ }
241
+ declare class WebShareService extends BrowserApiBaseService {
242
+ protected getApiName(): string;
243
+ private ensureWebShareSupport;
244
+ share(data: ShareData): Promise<ShareResult>;
245
+ canShare(): boolean;
246
+ canShareFiles(): boolean;
247
+ getNativeShare(): typeof navigator.share;
248
+ static ɵfac: i0.ɵɵFactoryDeclaration<WebShareService, never>;
249
+ static ɵprov: i0.ɵɵInjectableDeclaration<WebShareService>;
250
+ }
251
+
252
+ type BrowserError = Error & {
253
+ name?: string;
254
+ message?: string;
255
+ };
256
+ type EventHandler<T = Event> = (event: T) => void;
257
+ type StorageValue = string | number | boolean | object | null;
258
+ type ErrorCallback = (error: BrowserError) => void;
259
+
260
+ interface StorageOptions {
261
+ prefix?: string;
262
+ serialize?: (value: StorageValue) => string;
263
+ deserialize?: (value: string) => StorageValue;
264
+ }
265
+ interface StorageEvent {
266
+ key: string;
267
+ newValue: StorageValue | null;
268
+ oldValue: StorageValue | null;
269
+ storageArea: 'localStorage' | 'sessionStorage';
270
+ }
271
+ declare class WebStorageService extends BrowserApiBaseService {
272
+ private storageEvents;
273
+ protected destroyRef: DestroyRef;
274
+ constructor();
275
+ protected getApiName(): string;
276
+ private ensureStorageSupport;
277
+ private setupEventListeners;
278
+ private serializeValue;
279
+ private deserializeValue;
280
+ private getKey;
281
+ setLocalStorage<T extends StorageValue>(key: string, value: T, options?: StorageOptions): boolean;
282
+ getLocalStorage<T extends StorageValue>(key: string, defaultValue?: T | null, options?: StorageOptions): T | null;
283
+ removeLocalStorage(key: string, options?: StorageOptions): boolean;
284
+ clearLocalStorage(options?: StorageOptions): boolean;
285
+ setSessionStorage<T extends StorageValue>(key: string, value: T, options?: StorageOptions): boolean;
286
+ getSessionStorage<T extends StorageValue>(key: string, defaultValue?: T | null, options?: StorageOptions): T | null;
287
+ removeSessionStorage(key: string, options?: StorageOptions): boolean;
288
+ clearSessionStorage(options?: StorageOptions): boolean;
289
+ getLocalStorageSize(options?: StorageOptions): number;
290
+ getSessionStorageSize(options?: StorageOptions): number;
291
+ getStorageEvents(): Observable<StorageEvent>;
292
+ watchLocalStorage<T extends StorageValue>(key: string, options?: StorageOptions): Observable<T | null>;
293
+ watchSessionStorage<T extends StorageValue>(key: string, options?: StorageOptions): Observable<T | null>;
294
+ getNativeLocalStorage(): Storage;
295
+ getNativeSessionStorage(): Storage;
296
+ static ɵfac: i0.ɵɵFactoryDeclaration<WebStorageService, never>;
297
+ static ɵprov: i0.ɵɵInjectableDeclaration<WebStorageService>;
298
+ }
299
+
300
+ interface WebSocketConfig {
301
+ url: string;
302
+ protocols?: string | string[];
303
+ reconnectInterval?: number;
304
+ maxReconnectAttempts?: number;
305
+ heartbeatInterval?: number;
306
+ heartbeatMessage?: unknown;
307
+ }
308
+ interface WebSocketMessage<T = unknown> {
309
+ type: string;
310
+ data: T;
311
+ timestamp?: number;
312
+ }
313
+ interface WebSocketStatus {
314
+ connected: boolean;
315
+ connecting: boolean;
316
+ reconnecting: boolean;
317
+ error?: string;
318
+ reconnectAttempts: number;
319
+ }
320
+ declare class WebSocketService extends BrowserApiBaseService {
321
+ private webSocket;
322
+ private statusSubject;
323
+ private messageSubject;
324
+ private reconnectAttempts;
325
+ private reconnectTimer;
326
+ private heartbeatTimer;
327
+ protected getApiName(): string;
328
+ private ensureWebSocketSupport;
329
+ connect(config: WebSocketConfig): Observable<WebSocketStatus>;
330
+ disconnect(): void;
331
+ send<T>(message: WebSocketMessage<T>): void;
332
+ sendRaw(data: string): void;
333
+ getStatus(): Observable<WebSocketStatus>;
334
+ getMessages<T = unknown>(): Observable<WebSocketMessage<T>>;
335
+ private setupWebSocketHandlers;
336
+ private startHeartbeat;
337
+ private attemptReconnect;
338
+ private updateStatus;
339
+ private getCurrentStatus;
340
+ getNativeWebSocket(): WebSocket | null;
341
+ isConnected(): boolean;
342
+ getReadyState(): number;
343
+ static ɵfac: i0.ɵɵFactoryDeclaration<WebSocketService, never>;
344
+ static ɵprov: i0.ɵɵInjectableDeclaration<WebSocketService>;
345
+ }
346
+
347
+ interface WorkerMessage<T = unknown> {
348
+ id: string;
349
+ type: string;
350
+ data: T;
351
+ timestamp: number;
352
+ }
353
+ interface WorkerStatus {
354
+ initialized: boolean;
355
+ running: boolean;
356
+ error?: string;
357
+ messageCount: number;
358
+ }
359
+ interface WorkerTask<T = unknown> {
360
+ id: string;
361
+ type: string;
362
+ data: T;
363
+ transferable?: Transferable[];
364
+ }
365
+ declare class WebWorkerService extends BrowserApiBaseService {
366
+ protected destroyRef: DestroyRef;
367
+ private workers;
368
+ private workerStatuses;
369
+ private workerMessages;
370
+ private currentWorkerStatuses;
371
+ protected getApiName(): string;
372
+ private ensureWorkerSupport;
373
+ createWorker(name: string, scriptUrl: string): Observable<WorkerStatus>;
374
+ terminateWorker(name: string): void;
375
+ terminateAllWorkers(): void;
376
+ postMessage(workerName: string, task: WorkerTask): void;
377
+ getMessages(workerName: string): Observable<WorkerMessage>;
378
+ getStatus(workerName: string): Observable<WorkerStatus>;
379
+ getCurrentStatus(workerName: string): WorkerStatus | undefined;
380
+ getAllStatuses(): Map<string, WorkerStatus>;
381
+ isWorkerRunning(workerName: string): boolean;
382
+ private setupWorker;
383
+ private updateWorkerStatus;
384
+ getNativeWorker(name: string): Worker | undefined;
385
+ getAllWorkers(): Map<string, Worker>;
386
+ static ɵfac: i0.ɵɵFactoryDeclaration<WebWorkerService, never>;
387
+ static ɵprov: i0.ɵɵInjectableDeclaration<WebWorkerService>;
388
+ }
389
+
189
390
  interface MediaDevice {
190
391
  deviceId: string;
191
392
  groupId: string;
@@ -294,21 +495,43 @@ declare class BrowserSupportUtil {
294
495
  private static getBrowserVersion;
295
496
  }
296
497
 
297
- declare class PermissionGuard implements CanActivate {
298
- private permissionsService;
299
- private router;
300
- constructor(permissionsService: PermissionsService, router: Router);
301
- canActivate(route: ActivatedRouteSnapshot): Promise<boolean>;
302
- private checkPermission;
303
- }
304
- declare function createPermissionGuard(permission: PermissionNameExt): {
305
- canActivate: (typeof PermissionGuard)[];
306
- data: {
307
- permission: PermissionNameExt;
308
- };
309
- };
498
+ /**
499
+ * Functional guard that checks if the user has the required permission.
500
+ * Usage in routes: { canActivate: [permissionGuard('camera')] }
501
+ */
502
+ declare const permissionGuard: (permission: PermissionNameExt) => CanActivateFn;
503
+
504
+ interface BrowserWebApisConfig {
505
+ enableCamera?: boolean;
506
+ enableGeolocation?: boolean;
507
+ enableNotifications?: boolean;
508
+ enableClipboard?: boolean;
509
+ enableMediaDevices?: boolean;
510
+ enableBattery?: boolean;
511
+ enableWebShare?: boolean;
512
+ enableWebStorage?: boolean;
513
+ enableWebSocket?: boolean;
514
+ enableWebWorker?: boolean;
515
+ }
516
+ declare const defaultBrowserWebApisConfig: BrowserWebApisConfig;
517
+ declare function provideBrowserWebApis(config?: BrowserWebApisConfig): EnvironmentProviders;
518
+ declare function provideCamera(): EnvironmentProviders;
519
+ declare function provideGeolocation(): EnvironmentProviders;
520
+ declare function provideNotifications(): EnvironmentProviders;
521
+ declare function provideClipboard(): EnvironmentProviders;
522
+ declare function provideMediaDevices(): EnvironmentProviders;
523
+ declare function provideBattery(): EnvironmentProviders;
524
+ declare function provideWebShare(): EnvironmentProviders;
525
+ declare function provideWebStorage(): EnvironmentProviders;
526
+ declare function provideWebSocket(): EnvironmentProviders;
527
+ declare function provideWebWorker(): EnvironmentProviders;
528
+ declare function providePermissions(): EnvironmentProviders;
529
+ declare function provideMediaApis(): EnvironmentProviders;
530
+ declare function provideLocationApis(): EnvironmentProviders;
531
+ declare function provideStorageApis(): EnvironmentProviders;
532
+ declare function provideCommunicationApis(): EnvironmentProviders;
310
533
 
311
534
  declare const version = "0.1.0";
312
535
 
313
- export { BrowserCapabilityService, BrowserSupportUtil, CameraService, ClipboardService, GeolocationService, MediaDevicesService, NotificationService, PermissionGuard, PermissionsService, createPermissionGuard, version };
314
- export type { BrowserCapabilityId, BrowserPermissions, CameraCapabilities, CameraInfo, GeolocationCoordinates, GeolocationError, GeolocationOptions, GeolocationPosition$1 as GeolocationPosition, GeolocationWatchOptions, MediaDevice, MediaDeviceKind, MediaDevicesInfo, MediaStreamConstraints$1 as MediaStreamConstraints, MediaTrackConstraints$1 as MediaTrackConstraints, PermissionNameExt, PermissionRequest };
536
+ export { BatteryService, BrowserApiBaseService, BrowserCapabilityService, BrowserSupportUtil, CameraService, ClipboardService, GeolocationService, MediaDevicesService, NotificationService, PermissionsService, WebShareService, WebSocketService, WebStorageService, WebWorkerService, permissionGuard as createPermissionGuard, defaultBrowserWebApisConfig, permissionGuard, provideBattery, provideBrowserWebApis, provideCamera, provideClipboard, provideCommunicationApis, provideGeolocation, provideLocationApis, provideMediaApis, provideMediaDevices, provideNotifications, providePermissions, provideStorageApis, provideWebShare, provideWebSocket, provideWebStorage, provideWebWorker, version };
537
+ export type { BatteryInfo, BatteryManager, BrowserCapabilityId, BrowserError, BrowserPermissions, BrowserWebApisConfig, CameraCapabilities, CameraInfo, ErrorCallback, EventHandler, GeolocationCoordinates, GeolocationError, GeolocationOptions, GeolocationPosition$1 as GeolocationPosition, GeolocationWatchOptions, MediaDevice, MediaDeviceKind, MediaDevicesInfo, MediaStreamConstraints$1 as MediaStreamConstraints, MediaTrackConstraints$1 as MediaTrackConstraints, PermissionNameExt, PermissionRequest, StorageEvent, StorageOptions, StorageValue, WebSocketConfig, WebSocketMessage, WebSocketStatus, WorkerMessage, WorkerStatus, WorkerTask };
@@ -1 +0,0 @@
1
- {"version":3,"file":"angular-helpers-browser-web-apis.mjs","sources":["../../../packages/browser-web-apis/src/services/permissions.service.ts","../../../packages/browser-web-apis/src/services/base/browser-api-base.service.ts","../../../packages/browser-web-apis/src/services/camera.service.ts","../../../packages/browser-web-apis/src/services/geolocation.service.ts","../../../packages/browser-web-apis/src/services/media-devices.service.ts","../../../packages/browser-web-apis/src/services/notification.service.ts","../../../packages/browser-web-apis/src/services/clipboard.service.ts","../../../packages/browser-web-apis/src/services/browser-capability.service.ts","../../../packages/browser-web-apis/src/utils/browser-support.util.ts","../../../packages/browser-web-apis/src/guards/permission.guard.ts","../../../packages/browser-web-apis/src/public-api.ts","../../../packages/browser-web-apis/src/angular-helpers-browser-web-apis.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { \n BrowserPermissions \n} from '../interfaces/permissions.interface';\n\n@Injectable()\nexport class PermissionsService implements BrowserPermissions {\n\n async query(descriptor: PermissionDescriptor): Promise<PermissionStatus> {\n if (!this.isSupported()) {\n throw new Error('Permissions API not supported');\n }\n\n try {\n return await navigator.permissions.query(descriptor as PermissionDescriptor);\n } catch (error) {\n console.error('Error querying permission:', error);\n throw error;\n }\n }\n\n isSupported(): boolean {\n return typeof navigator !== 'undefined' && 'permissions' in navigator;\n }\n}\n","import { Injectable, inject, DestroyRef, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser, isPlatformServer } from '@angular/common';\nimport { PermissionsService } from '../permissions.service';\nimport { PermissionNameExt } from '../../public-api';\n\n/**\n * Base class for all Browser Web API services\n * Provides common functionality for:\n * - Support checking\n * - Permission management\n * - Error handling\n * - Lifecycle management with destroyRef\n * - Logging\n */\n@Injectable()\nexport abstract class BrowserApiBaseService {\n protected permissionsService = inject(PermissionsService);\n protected destroyRef = inject(DestroyRef);\n protected platformId = inject(PLATFORM_ID);\n \n /**\n * Abstract method that must be implemented by child services\n * Returns the API name for support checking\n */\n protected abstract getApiName(): string;\n\n /**\n * Check if running in browser environment using Angular's platform detection\n */\n protected isBrowserEnvironment(): boolean {\n return isPlatformBrowser(this.platformId);\n }\n\n /**\n * Check if running in server environment using Angular's platform detection\n */\n protected isServerEnvironment(): boolean {\n return isPlatformServer(this.platformId);\n }\n \n /**\n * Request a permission\n */\n protected async requestPermission(permission: PermissionNameExt): Promise<boolean> {\n if (this.isServerEnvironment()) {\n throw new Error(`${this.getApiName()} API not available in server environment`);\n }\n \n try {\n const status = await this.permissionsService.query({ name: permission as PermissionName });\n return status.state === 'granted';\n } catch (error) {\n console.error(`[${this.getApiName()}] Error requesting permission for ${permission}:`, error);\n return false;\n }\n }\n \n}\n","import { Injectable } from '@angular/core';\nimport { BrowserApiBaseService } from './base/browser-api-base.service';\n\n@Injectable()\nexport class CameraService extends BrowserApiBaseService {\n private currentStream: MediaStream | null = null;\n\n private createError(message: string, cause: unknown): Error {\n const error = new Error(message) as Error & { cause?: unknown };\n error.cause = cause;\n return error;\n }\n\n protected override getApiName(): string {\n return 'camera';\n }\n\n private ensureCameraSupport(): void {\n if (!('mediaDevices' in navigator) || !('getUserMedia' in navigator.mediaDevices)) {\n throw new Error('Camera API not supported in this browser');\n }\n }\n\n async startCamera(constraints?: MediaStreamConstraints): Promise<MediaStream> {\n this.ensureCameraSupport();\n\n if (this.currentStream) {\n this.stopCamera();\n }\n\n const permissionStatus = await this.permissionsService.query({ name: 'camera' });\n if (permissionStatus.state !== 'granted') {\n throw new Error('Camera permission required. Please grant camera access and try again.');\n }\n\n try {\n const streamConstraints: MediaStreamConstraints = constraints || {\n video: {\n width: { ideal: 1280 },\n height: { ideal: 720 },\n facingMode: 'user'\n }\n };\n\n this.currentStream = await navigator.mediaDevices.getUserMedia(streamConstraints);\n return this.currentStream;\n } catch (error: unknown) {\n console.error('[CameraService] Error starting camera:', error);\n \n if (error instanceof Error && error.name === 'NotAllowedError') {\n throw this.createError('Camera permission denied by user. Please allow camera access in your browser settings and refresh the page.', error);\n } else if (error instanceof Error && error.name === 'NotFoundError') {\n throw this.createError('No camera device found. Please connect a camera and try again.', error);\n } else if (error instanceof Error && error.name === 'NotReadableError') {\n throw this.createError('Camera is already in use by another application. Please close other applications using the camera and try again.', error);\n } else if (error instanceof Error && error.name === 'OverconstrainedError') {\n throw this.createError('Camera constraints cannot be satisfied. Try with different camera settings.', error);\n } else {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';\n throw this.createError(`Camera error: ${errorMessage}`, error);\n }\n }\n }\n\n stopCamera(): void {\n if (this.currentStream) {\n this.currentStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n this.currentStream = null;\n }\n }\n\n async switchCamera(deviceId: string, constraints: MediaStreamConstraints = {\n video: {\n width: { ideal: 1280 },\n height: { ideal: 720 }\n }\n }): Promise<MediaStream> {\n this.stopCamera();\n\n const finalConstraints: MediaStreamConstraints = {\n video: constraints.video && typeof constraints.video === 'object' \n ? { ...constraints.video, deviceId: { exact: deviceId } }\n : { deviceId: { exact: deviceId } }\n };\n\n return this.startCamera(finalConstraints);\n }\n\n async getCameraCapabilities(deviceId: string): Promise<MediaTrackCapabilities | null> {\n this.ensureCameraSupport();\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: { deviceId: { exact: deviceId } }\n });\n\n const videoTrack = stream.getVideoTracks()[0];\n const capabilities = videoTrack.getCapabilities();\n\n // Clean up the stream\n stream.getTracks().forEach((track: MediaStreamTrack) => track.stop());\n\n return capabilities || null;\n } catch (error) {\n console.error('[CameraService] Error getting camera capabilities:', error);\n return null;\n }\n }\n\n getCurrentStream(): MediaStream | null {\n return this.currentStream;\n }\n\n isStreaming(): boolean {\n return this.currentStream !== null;\n }\n\n async getVideoInputDevices(): Promise<MediaDeviceInfo[]> {\n this.ensureCameraSupport();\n \n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.filter(device => device.kind === 'videoinput');\n } catch (error) {\n console.error('[CameraService] Error enumerating video devices:', error);\n throw this.createError('Failed to enumerate video devices', error);\n }\n }\n\n // Direct access to native camera API\n getNativeMediaDevices(): MediaDevices {\n this.ensureCameraSupport();\n return navigator.mediaDevices;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { BrowserApiBaseService } from './base/browser-api-base.service';\n\n@Injectable()\nexport class GeolocationService extends BrowserApiBaseService {\n protected override getApiName(): string {\n return 'geolocation';\n }\n\n private ensureGeolocationSupport(): void {\n if (!('geolocation' in navigator)) {\n throw new Error('Geolocation API not supported in this browser');\n }\n }\n\n getCurrentPosition(options?: PositionOptions): Promise<GeolocationPosition> {\n this.ensureGeolocationSupport();\n\n return new Promise((resolve, reject) => {\n navigator.geolocation.getCurrentPosition(\n (position) => resolve(position),\n (error) => {\n console.error('[GeolocationService] Error getting position:', error);\n reject(error);\n },\n options\n );\n });\n }\n\n watchPosition(options?: PositionOptions): Observable<GeolocationPosition> {\n this.ensureGeolocationSupport();\n\n return new Observable<GeolocationPosition>((observer) => {\n const watchId = navigator.geolocation.watchPosition(\n (position) => observer.next(position),\n (error) => {\n console.error('[GeolocationService] Error watching position:', error);\n observer.error(error);\n },\n options\n );\n\n return () => {\n navigator.geolocation.clearWatch(watchId);\n };\n });\n }\n\n clearWatch(watchId: number): void {\n navigator.geolocation.clearWatch(watchId);\n }\n\n // Direct access to native geolocation API\n getNativeGeolocation(): Geolocation {\n this.ensureGeolocationSupport();\n return navigator.geolocation;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { BrowserApiBaseService } from './base/browser-api-base.service';\n\ninterface DisplayMediaConstraints {\n video?: boolean | MediaTrackConstraints;\n audio?: boolean | MediaTrackConstraints;\n}\n\n@Injectable()\nexport class MediaDevicesService extends BrowserApiBaseService {\n private createError(message: string, cause: unknown): Error {\n const error = new Error(message) as Error & { cause?: unknown };\n error.cause = cause;\n return error;\n }\n\n protected override getApiName(): string {\n return 'media-devices';\n }\n\n private ensureMediaDevicesSupport(): void {\n if (!('mediaDevices' in navigator)) {\n throw new Error('MediaDevices API not supported in this browser');\n }\n }\n\n async getDevices(): Promise<MediaDeviceInfo[]> {\n this.ensureMediaDevicesSupport();\n\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices;\n } catch (error) {\n console.error('[MediaDevicesService] Error enumerating devices:', error);\n throw this.createError('Failed to enumerate media devices', error);\n }\n }\n\n async getUserMedia(constraints?: MediaStreamConstraints): Promise<MediaStream> {\n this.ensureMediaDevicesSupport();\n\n try {\n const defaultConstraints: MediaStreamConstraints = {\n video: true,\n audio: true\n };\n\n const finalConstraints = constraints || defaultConstraints;\n return await navigator.mediaDevices.getUserMedia(finalConstraints);\n } catch (error) {\n console.error('[MediaDevicesService] Error getting user media:', error);\n throw this.handleMediaError(error);\n }\n }\n\n async getDisplayMedia(constraints?: DisplayMediaConstraints): Promise<MediaStream> {\n this.ensureMediaDevicesSupport();\n\n if (!('getDisplayMedia' in navigator.mediaDevices)) {\n throw new Error('Display media API not supported in this browser');\n }\n\n try {\n const defaultConstraints: DisplayMediaConstraints = {\n video: true,\n audio: false\n };\n\n const finalConstraints = constraints || defaultConstraints;\n return await navigator.mediaDevices.getDisplayMedia(finalConstraints);\n } catch (error) {\n console.error('[MediaDevicesService] Error getting display media:', error);\n throw this.createError('Failed to get display media', error);\n }\n }\n\n watchDeviceChanges(): Observable<MediaDeviceInfo[]> {\n this.ensureMediaDevicesSupport();\n\n return new Observable<MediaDeviceInfo[]>((observer) => {\n const handleDeviceChange = async () => {\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n observer.next(devices);\n } catch (error) {\n console.error('[MediaDevicesService] Error handling device change:', error);\n }\n };\n\n // Listen for device changes\n navigator.mediaDevices.addEventListener('devicechange', handleDeviceChange);\n\n // Get initial devices\n handleDeviceChange();\n\n return () => {\n navigator.mediaDevices.removeEventListener('devicechange', handleDeviceChange);\n };\n });\n }\n\n getVideoInputDevices(): Promise<MediaDeviceInfo[]> {\n return this.getDevicesByKind('videoinput');\n }\n\n getAudioInputDevices(): Promise<MediaDeviceInfo[]> {\n return this.getDevicesByKind('audioinput');\n }\n\n getAudioOutputDevices(): Promise<MediaDeviceInfo[]> {\n return this.getDevicesByKind('audiooutput');\n }\n\n private async getDevicesByKind(kind: MediaDeviceKind): Promise<MediaDeviceInfo[]> {\n const devices = await this.getDevices();\n return devices.filter(device => device.kind === kind);\n }\n\n private handleMediaError(error: unknown): Error {\n let message: string;\n \n if (error instanceof Error) {\n switch (error.name) {\n case 'NotAllowedError':\n message = 'Permission denied by user';\n break;\n case 'NotFoundError':\n message = 'No media device found';\n break;\n case 'NotReadableError':\n message = 'Media device is already in use';\n break;\n case 'OverconstrainedError':\n message = 'Media constraints cannot be satisfied';\n break;\n case 'TypeError':\n message = 'Invalid media constraints provided';\n break;\n default:\n message = `Media error: ${error.message}`;\n }\n } else {\n message = 'Unknown media error occurred';\n }\n \n return this.createError(message, error);\n }\n\n // Direct access to native media devices API\n getNativeMediaDevices(): MediaDevices {\n this.ensureMediaDevicesSupport();\n return navigator.mediaDevices;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BrowserApiBaseService } from './base/browser-api-base.service';\n\n\n@Injectable()\nexport class NotificationService extends BrowserApiBaseService {\n protected override getApiName(): string {\n return 'notifications';\n }\n\n async showNotification(title: string, options?: NotificationOptions): Promise<Notification> {\n if (!('Notification' in window)) {\n throw new Error('Notification API not supported in this browser');\n }\n\n const permissionStatus = await this.permissionsService.query({ name: 'notifications' });\n if (permissionStatus.state !== 'granted') {\n throw new Error('Notification permission required. Please grant notification access and try again.');\n }\n\n try {\n return new Notification(title, options);\n } catch (error) {\n console.error('[NotificationService] Error showing notification:', error);\n throw error;\n }\n }\n\n // Direct access to native notification API\n}\n","import { Injectable } from '@angular/core';\nimport { BrowserApiBaseService } from './base/browser-api-base.service';\n\n@Injectable()\nexport class ClipboardService extends BrowserApiBaseService {\n protected override getApiName(): string {\n return 'clipboard';\n }\n\n private async ensureClipboardPermission(action: 'read' | 'write'): Promise<void> {\n if (!('clipboard' in navigator)) {\n throw new Error('Clipboard API not supported in this browser');\n }\n\n const permissionStatus = await this.permissionsService.query({ \n name: `clipboard-${action}` as PermissionName \n });\n if (permissionStatus.state !== 'granted') {\n throw new Error(`Clipboard ${action} permission required. Please grant clipboard access and try again.`);\n }\n }\n\n async writeText(text: string): Promise<void> {\n await this.ensureClipboardPermission('write');\n\n try {\n await navigator.clipboard.writeText(text);\n } catch (error) {\n console.error('[ClipboardService] Error writing to clipboard:', error);\n throw error;\n }\n }\n\n async readText(): Promise<string> {\n await this.ensureClipboardPermission('read');\n\n try {\n return await navigator.clipboard.readText();\n } catch (error) {\n console.error('[ClipboardService] Error reading from clipboard:', error);\n throw error;\n }\n }\n\n async writeTextSecure(text: string): Promise<void> {\n await this.ensureClipboardPermission('write');\n\n try {\n await navigator.clipboard.writeText(text);\n } catch (error) {\n console.error('[ClipboardService] Error writing to clipboard:', error);\n throw error;\n }\n }\n\n // Direct access to native clipboard API\n}\n","import { Injectable } from '@angular/core';\n\nexport type BrowserCapabilityId =\n | 'permissions'\n | 'geolocation'\n | 'clipboard'\n | 'notification'\n | 'mediaDevices'\n | 'camera'\n | 'webWorker'\n | 'regexSecurity'\n | 'webStorage'\n | 'webShare'\n | 'battery'\n | 'webSocket';\n\nconst BROWSER_CAPABILITIES = [\n { id: 'permissions', label: 'Permissions API', requiresSecureContext: false },\n { id: 'geolocation', label: 'Geolocation API', requiresSecureContext: true },\n { id: 'clipboard', label: 'Clipboard API', requiresSecureContext: true },\n { id: 'notification', label: 'Notification API', requiresSecureContext: true },\n { id: 'mediaDevices', label: 'MediaDevices API', requiresSecureContext: true },\n { id: 'camera', label: 'Camera API', requiresSecureContext: true },\n { id: 'webWorker', label: 'Web Worker API', requiresSecureContext: false },\n { id: 'regexSecurity', label: 'Regex Security', requiresSecureContext: false },\n { id: 'webStorage', label: 'Web Storage', requiresSecureContext: false },\n { id: 'webShare', label: 'Web Share', requiresSecureContext: true },\n { id: 'battery', label: 'Battery API', requiresSecureContext: false },\n { id: 'webSocket', label: 'WebSocket API', requiresSecureContext: false }\n] as const satisfies ReadonlyArray<{\n id: BrowserCapabilityId;\n label: string;\n requiresSecureContext: boolean;\n}>;\n\n@Injectable({ providedIn: 'root' })\nexport class BrowserCapabilityService {\n getCapabilities() {\n return BROWSER_CAPABILITIES;\n }\n\n isSecureContext(): boolean {\n return typeof window !== 'undefined' && window.isSecureContext;\n }\n\n isSupported(capability: BrowserCapabilityId): boolean {\n switch (capability) {\n case 'permissions':\n return typeof navigator !== 'undefined' && 'permissions' in navigator;\n case 'geolocation':\n return typeof navigator !== 'undefined' && 'geolocation' in navigator;\n case 'clipboard':\n return typeof navigator !== 'undefined' && 'clipboard' in navigator;\n case 'notification':\n return typeof window !== 'undefined' && 'Notification' in window;\n case 'mediaDevices':\n case 'camera':\n return typeof navigator !== 'undefined' && 'mediaDevices' in navigator;\n case 'webWorker':\n case 'regexSecurity':\n return typeof Worker !== 'undefined';\n case 'webStorage':\n return typeof Storage !== 'undefined';\n case 'webShare':\n return typeof navigator !== 'undefined' && 'share' in navigator;\n case 'battery':\n return typeof navigator !== 'undefined' && 'getBattery' in navigator;\n case 'webSocket':\n return typeof WebSocket !== 'undefined';\n default:\n return false;\n }\n }\n\n getAllStatuses() {\n const secureContext = this.isSecureContext();\n\n return this.getCapabilities().map((capability) => ({\n id: capability.id,\n label: capability.label,\n supported: this.isSupported(capability.id),\n secureContext,\n requiresSecureContext: capability.requiresSecureContext\n }));\n }\n\n async getPermissionState(permission: PermissionName): Promise<PermissionState | 'unknown'> {\n if (typeof navigator === 'undefined' || !('permissions' in navigator)) {\n return 'unknown';\n }\n\n try {\n const status = await navigator.permissions.query({ name: permission as PermissionName });\n return status.state;\n } catch {\n return 'unknown';\n }\n }\n}\n","export class BrowserSupportUtil {\n static isSupported(feature: string): boolean {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return false;\n }\n\n switch (feature) {\n case 'permissions':\n return 'permissions' in navigator;\n case 'camera':\n return 'mediaDevices' in navigator && 'getUserMedia' in navigator.mediaDevices;\n case 'microphone':\n return 'mediaDevices' in navigator && 'getUserMedia' in navigator.mediaDevices;\n case 'geolocation':\n return 'geolocation' in navigator;\n case 'notifications':\n return 'Notification' in window;\n case 'clipboard':\n return 'clipboard' in navigator;\n case 'clipboard-read':\n return 'clipboard' in navigator && 'readText' in navigator.clipboard;\n case 'clipboard-write':\n return 'clipboard' in navigator && 'writeText' in navigator.clipboard;\n case 'persistent-storage':\n return 'storage' in navigator && 'persist' in navigator.storage;\n default:\n return false;\n }\n }\n\n static getUnsupportedFeatures(): string[] {\n const features = [\n 'permissions',\n 'camera',\n 'microphone',\n 'geolocation',\n 'notifications',\n 'clipboard',\n 'clipboard-read',\n 'clipboard-write',\n 'persistent-storage'\n ];\n \n return features.filter(feature => !this.isSupported(feature));\n }\n\n static isSecureContext(): boolean {\n return typeof window !== 'undefined' ? window.isSecureContext : false;\n }\n\n static getUserAgent(): string {\n return typeof navigator !== 'undefined' ? navigator.userAgent : '';\n }\n\n static isMobile(): boolean {\n const userAgent = this.getUserAgent().toLowerCase();\n return /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(userAgent);\n }\n\n static isDesktop(): boolean {\n return !this.isMobile();\n }\n\n static getBrowserInfo(): {\n name: string;\n version: string;\n isChrome: boolean;\n isFirefox: boolean;\n isSafari: boolean;\n isEdge: boolean;\n } {\n const userAgent = this.getUserAgent();\n \n return {\n name: this.getBrowserName(userAgent),\n version: this.getBrowserVersion(userAgent),\n isChrome: /chrome/.test(userAgent) && !/edge/.test(userAgent),\n isFirefox: /firefox/.test(userAgent),\n isSafari: /safari/.test(userAgent) && !/chrome/.test(userAgent),\n isEdge: /edge/.test(userAgent) || /edg/.test(userAgent)\n };\n }\n\n private static getBrowserName(userAgent: string): string {\n if (/chrome/.test(userAgent) && !/edge/.test(userAgent)) return 'Chrome';\n if (/firefox/.test(userAgent)) return 'Firefox';\n if (/safari/.test(userAgent) && !/chrome/.test(userAgent)) return 'Safari';\n if (/edge/.test(userAgent) || /edg/.test(userAgent)) return 'Edge';\n return 'Unknown';\n }\n\n private static getBrowserVersion(userAgent: string): string {\n const match = userAgent.match(/(chrome|firefox|safari|edge|edg)\\/(\\d+)/i);\n return match ? match[2] : 'Unknown';\n }\n}\n","import { CanActivate, ActivatedRouteSnapshot, Router } from '@angular/router';\nimport { PermissionsService } from '../services/permissions.service';\nimport { PermissionNameExt } from '../interfaces/permissions.interface';\n\nexport class PermissionGuard implements CanActivate {\n constructor(\n private permissionsService: PermissionsService,\n private router: Router\n ) {}\n\n canActivate(route: ActivatedRouteSnapshot): Promise<boolean> {\n const permission = route.data?.['permission'] as PermissionNameExt;\n \n if (!permission) {\n return Promise.resolve(true);\n }\n\n return this.checkPermission(permission);\n }\n\n private async checkPermission(permission: PermissionNameExt): Promise<boolean> {\n try {\n const status = await this.permissionsService.query({ name: permission as PermissionName });\n\n if (status.state !== 'granted') {\n this.router.navigate(['/permission-denied'], {\n queryParams: { permission }\n });\n return false;\n }\n\n return true;\n } catch (error) {\n console.error('Permission guard error:', error);\n this.router.navigate(['/permission-denied'], {\n queryParams: { permission }\n });\n return false;\n }\n }\n}\n\nexport function createPermissionGuard(permission: PermissionNameExt) {\n return {\n canActivate: [PermissionGuard],\n data: { permission }\n };\n}\n","// Browser Web APIs Services\nexport { PermissionsService } from './services/permissions.service';\nexport { CameraService } from './services/camera.service';\nexport { GeolocationService } from './services/geolocation.service';\nexport { MediaDevicesService } from './services/media-devices.service';\nexport { NotificationService } from './services/notification.service';\nexport { ClipboardService } from './services/clipboard.service';\nexport {\n BrowserCapabilityService,\n type BrowserCapabilityId\n} from './services/browser-capability.service';\n\n// Interfaces and Types\nexport * from './interfaces/permissions.interface';\nexport * from './interfaces/media.interface';\nexport * from './interfaces/geolocation.interface';\n\n// Utils and Guards\nexport * from './utils/browser-support.util';\nexport * from './guards/permission.guard';\n\n// Version\nexport const version = '0.1.0';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;MAMa,kBAAkB,CAAA;IAE7B,MAAM,KAAK,CAAC,UAAgC,EAAA;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;AACvB,YAAA,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC;QAClD;AAEA,QAAA,IAAI;YACF,OAAO,MAAM,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,UAAkC,CAAC;QAC9E;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC;AAClD,YAAA,MAAM,KAAK;QACb;IACF;IAEA,WAAW,GAAA;QACT,OAAO,OAAO,SAAS,KAAK,WAAW,IAAI,aAAa,IAAI,SAAS;IACvE;uGAjBW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAlB,kBAAkB,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;ACAD;;;;;;;;AAQG;MAEmB,qBAAqB,CAAA;AAC/B,IAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC/C,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAQ1C;;AAEG;IACO,oBAAoB,GAAA;AAC5B,QAAA,OAAO,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;IAC3C;AAEA;;AAEG;IACO,mBAAmB,GAAA;AAC3B,QAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC;IAC1C;AAEA;;AAEG;IACO,MAAM,iBAAiB,CAAC,UAA6B,EAAA;AAC7D,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE;YAC9B,MAAM,IAAI,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,UAAU,EAAE,CAAA,wCAAA,CAA0C,CAAC;QACjF;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,UAA4B,EAAE,CAAC;AAC1F,YAAA,OAAO,MAAM,CAAC,KAAK,KAAK,SAAS;QACnC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,UAAU,EAAE,CAAA,kCAAA,EAAqC,UAAU,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC;AAC7F,YAAA,OAAO,KAAK;QACd;IACF;uGAxCoB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAArB,qBAAqB,EAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAD1C;;;ACVK,MAAO,aAAc,SAAQ,qBAAqB,CAAA;IAC9C,aAAa,GAAuB,IAAI;IAExC,WAAW,CAAC,OAAe,EAAE,KAAc,EAAA;AACjD,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAgC;AAC/D,QAAA,KAAK,CAAC,KAAK,GAAG,KAAK;AACnB,QAAA,OAAO,KAAK;IACd;IAEmB,UAAU,GAAA;AAC3B,QAAA,OAAO,QAAQ;IACjB;IAEQ,mBAAmB,GAAA;AACzB,QAAA,IAAI,EAAE,cAAc,IAAI,SAAS,CAAC,IAAI,EAAE,cAAc,IAAI,SAAS,CAAC,YAAY,CAAC,EAAE;AACjF,YAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC;QAC7D;IACF;IAEA,MAAM,WAAW,CAAC,WAAoC,EAAA;QACpD,IAAI,CAAC,mBAAmB,EAAE;AAE1B,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,UAAU,EAAE;QACnB;AAEA,QAAA,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAChF,QAAA,IAAI,gBAAgB,CAAC,KAAK,KAAK,SAAS,EAAE;AACxC,YAAA,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC;QAC1F;AAEA,QAAA,IAAI;YACF,MAAM,iBAAiB,GAA2B,WAAW,IAAI;AAC/D,gBAAA,KAAK,EAAE;AACL,oBAAA,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;AACtB,oBAAA,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;AACtB,oBAAA,UAAU,EAAE;AACb;aACF;AAED,YAAA,IAAI,CAAC,aAAa,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,iBAAiB,CAAC;YACjF,OAAO,IAAI,CAAC,aAAa;QAC3B;QAAE,OAAO,KAAc,EAAE;AACvB,YAAA,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC;YAE9D,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE;gBAC9D,MAAM,IAAI,CAAC,WAAW,CAAC,6GAA6G,EAAE,KAAK,CAAC;YAC9I;iBAAO,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE;gBACnE,MAAM,IAAI,CAAC,WAAW,CAAC,gEAAgE,EAAE,KAAK,CAAC;YACjG;iBAAO,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE;gBACtE,MAAM,IAAI,CAAC,WAAW,CAAC,kHAAkH,EAAE,KAAK,CAAC;YACnJ;iBAAO,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE;gBAC1E,MAAM,IAAI,CAAC,WAAW,CAAC,6EAA6E,EAAE,KAAK,CAAC;YAC9G;iBAAO;AACL,gBAAA,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,wBAAwB;gBACtF,MAAM,IAAI,CAAC,WAAW,CAAC,CAAA,cAAA,EAAiB,YAAY,CAAA,CAAE,EAAE,KAAK,CAAC;YAChE;QACF;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAuB,KAAI;gBACjE,KAAK,CAAC,IAAI,EAAE;AACd,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAC3B;IACF;AAEA,IAAA,MAAM,YAAY,CAAC,QAAgB,EAAE,WAAA,GAAsC;AACvE,QAAA,KAAK,EAAE;AACL,YAAA,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;AACtB,YAAA,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG;AACrB;AACF,KAAA,EAAA;QACD,IAAI,CAAC,UAAU,EAAE;AAEjB,QAAA,MAAM,gBAAgB,GAA2B;YAC/C,KAAK,EAAE,WAAW,CAAC,KAAK,IAAI,OAAO,WAAW,CAAC,KAAK,KAAK;AACvD,kBAAE,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;kBACrD,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;SACpC;AAED,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;IAC3C;IAEA,MAAM,qBAAqB,CAAC,QAAgB,EAAA;QAC1C,IAAI,CAAC,mBAAmB,EAAE;AAE1B,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;gBACvD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;AACvC,aAAA,CAAC;YAEF,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;AAC7C,YAAA,MAAM,YAAY,GAAG,UAAU,CAAC,eAAe,EAAE;;AAGjD,YAAA,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAuB,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YAErE,OAAO,YAAY,IAAI,IAAI;QAC7B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,oDAAoD,EAAE,KAAK,CAAC;AAC1E,YAAA,OAAO,IAAI;QACb;IACF;IAEA,gBAAgB,GAAA;QACd,OAAO,IAAI,CAAC,aAAa;IAC3B;IAEA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,aAAa,KAAK,IAAI;IACpC;AAEA,IAAA,MAAM,oBAAoB,GAAA;QACxB,IAAI,CAAC,mBAAmB,EAAE;AAE1B,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE;AAC/D,YAAA,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC;QAC/D;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC;YACxE,MAAM,IAAI,CAAC,WAAW,CAAC,mCAAmC,EAAE,KAAK,CAAC;QACpE;IACF;;IAGA,qBAAqB,GAAA;QACnB,IAAI,CAAC,mBAAmB,EAAE;QAC1B,OAAO,SAAS,CAAC,YAAY;IAC/B;uGAnIW,aAAa,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAb,aAAa,EAAA,CAAA;;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB;;;ACEK,MAAO,kBAAmB,SAAQ,qBAAqB,CAAA;IACxC,UAAU,GAAA;AAC3B,QAAA,OAAO,aAAa;IACtB;IAEQ,wBAAwB,GAAA;AAC9B,QAAA,IAAI,EAAE,aAAa,IAAI,SAAS,CAAC,EAAE;AACjC,YAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC;QAClE;IACF;AAEA,IAAA,kBAAkB,CAAC,OAAyB,EAAA;QAC1C,IAAI,CAAC,wBAAwB,EAAE;QAE/B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,SAAS,CAAC,WAAW,CAAC,kBAAkB,CACtC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,EAC/B,CAAC,KAAK,KAAI;AACR,gBAAA,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC;gBACpE,MAAM,CAAC,KAAK,CAAC;YACf,CAAC,EACD,OAAO,CACR;AACH,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,aAAa,CAAC,OAAyB,EAAA;QACrC,IAAI,CAAC,wBAAwB,EAAE;AAE/B,QAAA,OAAO,IAAI,UAAU,CAAsB,CAAC,QAAQ,KAAI;YACtD,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,aAAa,CACjD,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EACrC,CAAC,KAAK,KAAI;AACR,gBAAA,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC;AACrE,gBAAA,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;YACvB,CAAC,EACD,OAAO,CACR;AAED,YAAA,OAAO,MAAK;AACV,gBAAA,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC;AAC3C,YAAA,CAAC;AACH,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,UAAU,CAAC,OAAe,EAAA;AACxB,QAAA,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC;IAC3C;;IAGA,oBAAoB,GAAA;QAClB,IAAI,CAAC,wBAAwB,EAAE;QAC/B,OAAO,SAAS,CAAC,WAAW;IAC9B;uGArDW,kBAAkB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAlB,kBAAkB,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;ACMK,MAAO,mBAAoB,SAAQ,qBAAqB,CAAA;IACpD,WAAW,CAAC,OAAe,EAAE,KAAc,EAAA;AACjD,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAgC;AAC/D,QAAA,KAAK,CAAC,KAAK,GAAG,KAAK;AACnB,QAAA,OAAO,KAAK;IACd;IAEmB,UAAU,GAAA;AAC3B,QAAA,OAAO,eAAe;IACxB;IAEQ,yBAAyB,GAAA;AAC/B,QAAA,IAAI,EAAE,cAAc,IAAI,SAAS,CAAC,EAAE;AAClC,YAAA,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC;QACnE;IACF;AAEA,IAAA,MAAM,UAAU,GAAA;QACd,IAAI,CAAC,yBAAyB,EAAE;AAEhC,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE;AAC/D,YAAA,OAAO,OAAO;QAChB;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC;YACxE,MAAM,IAAI,CAAC,WAAW,CAAC,mCAAmC,EAAE,KAAK,CAAC;QACpE;IACF;IAEA,MAAM,YAAY,CAAC,WAAoC,EAAA;QACrD,IAAI,CAAC,yBAAyB,EAAE;AAEhC,QAAA,IAAI;AACF,YAAA,MAAM,kBAAkB,GAA2B;AACjD,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,KAAK,EAAE;aACR;AAED,YAAA,MAAM,gBAAgB,GAAG,WAAW,IAAI,kBAAkB;YAC1D,OAAO,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,gBAAgB,CAAC;QACpE;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,iDAAiD,EAAE,KAAK,CAAC;AACvE,YAAA,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;QACpC;IACF;IAEA,MAAM,eAAe,CAAC,WAAqC,EAAA;QACzD,IAAI,CAAC,yBAAyB,EAAE;QAEhC,IAAI,EAAE,iBAAiB,IAAI,SAAS,CAAC,YAAY,CAAC,EAAE;AAClD,YAAA,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC;QACpE;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,kBAAkB,GAA4B;AAClD,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,KAAK,EAAE;aACR;AAED,YAAA,MAAM,gBAAgB,GAAG,WAAW,IAAI,kBAAkB;YAC1D,OAAO,MAAM,SAAS,CAAC,YAAY,CAAC,eAAe,CAAC,gBAAgB,CAAC;QACvE;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,oDAAoD,EAAE,KAAK,CAAC;YAC1E,MAAM,IAAI,CAAC,WAAW,CAAC,6BAA6B,EAAE,KAAK,CAAC;QAC9D;IACF;IAEA,kBAAkB,GAAA;QAChB,IAAI,CAAC,yBAAyB,EAAE;AAEhC,QAAA,OAAO,IAAI,UAAU,CAAoB,CAAC,QAAQ,KAAI;AACpD,YAAA,MAAM,kBAAkB,GAAG,YAAW;AACpC,gBAAA,IAAI;oBACF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE;AAC/D,oBAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;gBACxB;gBAAE,OAAO,KAAK,EAAE;AACd,oBAAA,OAAO,CAAC,KAAK,CAAC,qDAAqD,EAAE,KAAK,CAAC;gBAC7E;AACF,YAAA,CAAC;;YAGD,SAAS,CAAC,YAAY,CAAC,gBAAgB,CAAC,cAAc,EAAE,kBAAkB,CAAC;;AAG3E,YAAA,kBAAkB,EAAE;AAEpB,YAAA,OAAO,MAAK;gBACV,SAAS,CAAC,YAAY,CAAC,mBAAmB,CAAC,cAAc,EAAE,kBAAkB,CAAC;AAChF,YAAA,CAAC;AACH,QAAA,CAAC,CAAC;IACJ;IAEA,oBAAoB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;IAC5C;IAEA,oBAAoB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;IAC5C;IAEA,qBAAqB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;IAC7C;IAEQ,MAAM,gBAAgB,CAAC,IAAqB,EAAA;AAClD,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE;AACvC,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC;IACvD;AAEQ,IAAA,gBAAgB,CAAC,KAAc,EAAA;AACrC,QAAA,IAAI,OAAe;AAEnB,QAAA,IAAI,KAAK,YAAY,KAAK,EAAE;AAC1B,YAAA,QAAQ,KAAK,CAAC,IAAI;AAChB,gBAAA,KAAK,iBAAiB;oBACpB,OAAO,GAAG,2BAA2B;oBACrC;AACF,gBAAA,KAAK,eAAe;oBAClB,OAAO,GAAG,uBAAuB;oBACjC;AACF,gBAAA,KAAK,kBAAkB;oBACrB,OAAO,GAAG,gCAAgC;oBAC1C;AACF,gBAAA,KAAK,sBAAsB;oBACzB,OAAO,GAAG,uCAAuC;oBACjD;AACF,gBAAA,KAAK,WAAW;oBACd,OAAO,GAAG,oCAAoC;oBAC9C;AACF,gBAAA;AACE,oBAAA,OAAO,GAAG,CAAA,aAAA,EAAgB,KAAK,CAAC,OAAO,EAAE;;QAE/C;aAAO;YACL,OAAO,GAAG,8BAA8B;QAC1C;QAEA,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC;IACzC;;IAGA,qBAAqB,GAAA;QACnB,IAAI,CAAC,yBAAyB,EAAE;QAChC,OAAO,SAAS,CAAC,YAAY;IAC/B;uGA/IW,mBAAmB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAnB,mBAAmB,EAAA,CAAA;;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B;;;ACJK,MAAO,mBAAoB,SAAQ,qBAAqB,CAAA;IACzC,UAAU,GAAA;AAC3B,QAAA,OAAO,eAAe;IACxB;AAEA,IAAA,MAAM,gBAAgB,CAAC,KAAa,EAAE,OAA6B,EAAA;AACjE,QAAA,IAAI,EAAE,cAAc,IAAI,MAAM,CAAC,EAAE;AAC/B,YAAA,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC;QACnE;AAEA,QAAA,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;AACvF,QAAA,IAAI,gBAAgB,CAAC,KAAK,KAAK,SAAS,EAAE;AACxC,YAAA,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC;QACtG;AAEA,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;QACzC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,mDAAmD,EAAE,KAAK,CAAC;AACzE,YAAA,MAAM,KAAK;QACb;IACF;uGArBW,mBAAmB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAnB,mBAAmB,EAAA,CAAA;;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B;;;ACAK,MAAO,gBAAiB,SAAQ,qBAAqB,CAAA;IACtC,UAAU,GAAA;AAC3B,QAAA,OAAO,WAAW;IACpB;IAEQ,MAAM,yBAAyB,CAAC,MAAwB,EAAA;AAC9D,QAAA,IAAI,EAAE,WAAW,IAAI,SAAS,CAAC,EAAE;AAC/B,YAAA,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC;QAChE;QAEA,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;YAC3D,IAAI,EAAE,CAAA,UAAA,EAAa,MAAM,CAAA;AAC1B,SAAA,CAAC;AACF,QAAA,IAAI,gBAAgB,CAAC,KAAK,KAAK,SAAS,EAAE;AACxC,YAAA,MAAM,IAAI,KAAK,CAAC,aAAa,MAAM,CAAA,kEAAA,CAAoE,CAAC;QAC1G;IACF;IAEA,MAAM,SAAS,CAAC,IAAY,EAAA;AAC1B,QAAA,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC;AAE7C,QAAA,IAAI;YACF,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;QAC3C;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,KAAK,CAAC;AACtE,YAAA,MAAM,KAAK;QACb;IACF;AAEA,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,MAAM,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC;AAE5C,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE;QAC7C;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC;AACxE,YAAA,MAAM,KAAK;QACb;IACF;IAEA,MAAM,eAAe,CAAC,IAAY,EAAA;AAChC,QAAA,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC;AAE7C,QAAA,IAAI;YACF,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;QAC3C;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,KAAK,CAAC;AACtE,YAAA,MAAM,KAAK;QACb;IACF;uGAjDW,gBAAgB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAhB,gBAAgB,EAAA,CAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B;;;ACaD,MAAM,oBAAoB,GAAG;IAC3B,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,KAAK,EAAE;IAC7E,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,IAAI,EAAE;IAC5E,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,IAAI,EAAE;IACxE,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,IAAI,EAAE;IAC9E,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,IAAI,EAAE;IAC9E,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,IAAI,EAAE;IAClE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,KAAK,EAAE;IAC1E,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,KAAK,EAAE;IAC9E,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,KAAK,EAAE;IACxE,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,IAAI,EAAE;IACnE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,KAAK,EAAE;IACrE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,KAAK;CAKvE;MAGW,wBAAwB,CAAA;IACnC,eAAe,GAAA;AACb,QAAA,OAAO,oBAAoB;IAC7B;IAEA,eAAe,GAAA;QACb,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,eAAe;IAChE;AAEA,IAAA,WAAW,CAAC,UAA+B,EAAA;QACzC,QAAQ,UAAU;AAChB,YAAA,KAAK,aAAa;gBAChB,OAAO,OAAO,SAAS,KAAK,WAAW,IAAI,aAAa,IAAI,SAAS;AACvE,YAAA,KAAK,aAAa;gBAChB,OAAO,OAAO,SAAS,KAAK,WAAW,IAAI,aAAa,IAAI,SAAS;AACvE,YAAA,KAAK,WAAW;gBACd,OAAO,OAAO,SAAS,KAAK,WAAW,IAAI,WAAW,IAAI,SAAS;AACrE,YAAA,KAAK,cAAc;gBACjB,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,cAAc,IAAI,MAAM;AAClE,YAAA,KAAK,cAAc;AACnB,YAAA,KAAK,QAAQ;gBACX,OAAO,OAAO,SAAS,KAAK,WAAW,IAAI,cAAc,IAAI,SAAS;AACxE,YAAA,KAAK,WAAW;AAChB,YAAA,KAAK,eAAe;AAClB,gBAAA,OAAO,OAAO,MAAM,KAAK,WAAW;AACtC,YAAA,KAAK,YAAY;AACf,gBAAA,OAAO,OAAO,OAAO,KAAK,WAAW;AACvC,YAAA,KAAK,UAAU;gBACb,OAAO,OAAO,SAAS,KAAK,WAAW,IAAI,OAAO,IAAI,SAAS;AACjE,YAAA,KAAK,SAAS;gBACZ,OAAO,OAAO,SAAS,KAAK,WAAW,IAAI,YAAY,IAAI,SAAS;AACtE,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,OAAO,SAAS,KAAK,WAAW;AACzC,YAAA;AACE,gBAAA,OAAO,KAAK;;IAElB;IAEA,cAAc,GAAA;AACZ,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE;AAE5C,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,MAAM;YACjD,EAAE,EAAE,UAAU,CAAC,EAAE;YACjB,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,aAAa;YACb,qBAAqB,EAAE,UAAU,CAAC;AACnC,SAAA,CAAC,CAAC;IACL;IAEA,MAAM,kBAAkB,CAAC,UAA0B,EAAA;AACjD,QAAA,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,EAAE,aAAa,IAAI,SAAS,CAAC,EAAE;AACrE,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,UAA4B,EAAE,CAAC;YACxF,OAAO,MAAM,CAAC,KAAK;QACrB;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,SAAS;QAClB;IACF;uGA7DW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA;;2FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCnCrB,kBAAkB,CAAA;IAC7B,OAAO,WAAW,CAAC,OAAe,EAAA;QAChC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE;AACrE,YAAA,OAAO,KAAK;QACd;QAEA,QAAQ,OAAO;AACb,YAAA,KAAK,aAAa;gBAChB,OAAO,aAAa,IAAI,SAAS;AACnC,YAAA,KAAK,QAAQ;gBACX,OAAO,cAAc,IAAI,SAAS,IAAI,cAAc,IAAI,SAAS,CAAC,YAAY;AAChF,YAAA,KAAK,YAAY;gBACf,OAAO,cAAc,IAAI,SAAS,IAAI,cAAc,IAAI,SAAS,CAAC,YAAY;AAChF,YAAA,KAAK,aAAa;gBAChB,OAAO,aAAa,IAAI,SAAS;AACnC,YAAA,KAAK,eAAe;gBAClB,OAAO,cAAc,IAAI,MAAM;AACjC,YAAA,KAAK,WAAW;gBACd,OAAO,WAAW,IAAI,SAAS;AACjC,YAAA,KAAK,gBAAgB;gBACnB,OAAO,WAAW,IAAI,SAAS,IAAI,UAAU,IAAI,SAAS,CAAC,SAAS;AACtE,YAAA,KAAK,iBAAiB;gBACpB,OAAO,WAAW,IAAI,SAAS,IAAI,WAAW,IAAI,SAAS,CAAC,SAAS;AACvE,YAAA,KAAK,oBAAoB;gBACvB,OAAO,SAAS,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS,CAAC,OAAO;AACjE,YAAA;AACE,gBAAA,OAAO,KAAK;;IAElB;AAEA,IAAA,OAAO,sBAAsB,GAAA;AAC3B,QAAA,MAAM,QAAQ,GAAG;YACf,aAAa;YACb,QAAQ;YACR,YAAY;YACZ,aAAa;YACb,eAAe;YACf,WAAW;YACX,gBAAgB;YAChB,iBAAiB;YACjB;SACD;AAED,QAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/D;AAEA,IAAA,OAAO,eAAe,GAAA;AACpB,QAAA,OAAO,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,CAAC,eAAe,GAAG,KAAK;IACvE;AAEA,IAAA,OAAO,YAAY,GAAA;AACjB,QAAA,OAAO,OAAO,SAAS,KAAK,WAAW,GAAG,SAAS,CAAC,SAAS,GAAG,EAAE;IACpE;AAEA,IAAA,OAAO,QAAQ,GAAA;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE;AACnD,QAAA,OAAO,gEAAgE,CAAC,IAAI,CAAC,SAAS,CAAC;IACzF;AAEA,IAAA,OAAO,SAAS,GAAA;AACd,QAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE;IACzB;AAEA,IAAA,OAAO,cAAc,GAAA;AAQnB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;QAErC,OAAO;AACL,YAAA,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;AACpC,YAAA,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;AAC1C,YAAA,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;AAC7D,YAAA,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;AACpC,YAAA,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;AAC/D,YAAA,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS;SACvD;IACH;IAEQ,OAAO,cAAc,CAAC,SAAiB,EAAA;AAC7C,QAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;AAAE,YAAA,OAAO,QAAQ;AACxE,QAAA,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;AAAE,YAAA,OAAO,SAAS;AAC/C,QAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;AAAE,YAAA,OAAO,QAAQ;AAC1E,QAAA,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;AAAE,YAAA,OAAO,MAAM;AAClE,QAAA,OAAO,SAAS;IAClB;IAEQ,OAAO,iBAAiB,CAAC,SAAiB,EAAA;QAChD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,0CAA0C,CAAC;AACzE,QAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS;IACrC;AACD;;MC3FY,eAAe,CAAA;AAEhB,IAAA,kBAAA;AACA,IAAA,MAAA;IAFV,WAAA,CACU,kBAAsC,EACtC,MAAc,EAAA;QADd,IAAA,CAAA,kBAAkB,GAAlB,kBAAkB;QAClB,IAAA,CAAA,MAAM,GAAN,MAAM;IACb;AAEH,IAAA,WAAW,CAAC,KAA6B,EAAA;QACvC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,GAAG,YAAY,CAAsB;QAElE,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QAC9B;AAEA,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;IACzC;IAEQ,MAAM,eAAe,CAAC,UAA6B,EAAA;AACzD,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,UAA4B,EAAE,CAAC;AAE1F,YAAA,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE;gBAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE;oBAC3C,WAAW,EAAE,EAAE,UAAU;AAC1B,iBAAA,CAAC;AACF,gBAAA,OAAO,KAAK;YACd;AAEA,YAAA,OAAO,IAAI;QACb;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE;gBAC3C,WAAW,EAAE,EAAE,UAAU;AAC1B,aAAA,CAAC;AACF,YAAA,OAAO,KAAK;QACd;IACF;AACD;AAEK,SAAU,qBAAqB,CAAC,UAA6B,EAAA;IACjE,OAAO;QACL,WAAW,EAAE,CAAC,eAAe,CAAC;QAC9B,IAAI,EAAE,EAAE,UAAU;KACnB;AACH;;AC/CA;AAqBA;AACO,MAAM,OAAO,GAAG;;ACtBvB;;AAEG;;;;"}