{"version":3,"file":"memoryManager.mjs","sources":["../../../src/lib/utils/memoryManager.ts"],"sourcesContent":["/**\n * @file Memory Manager\n * @description Enterprise-grade memory management utilities with resource pooling,\n * WeakMap caching, garbage collection hints, and automatic cleanup\n */\n\n/**\n * Resource pool entry with metadata\n */\ninterface PoolEntry<T> {\n  resource: T;\n  createdAt: number;\n  lastUsed: number;\n  useCount: number;\n  isAcquired: boolean;\n}\n\n/**\n * Resource pool configuration\n */\nexport interface ResourcePoolConfig<T> {\n  /** Factory function to create new resources */\n  factory: () => T;\n  /** Maximum pool size */\n  maxSize?: number;\n  /** Minimum pool size (pre-allocated) */\n  minSize?: number;\n  /** Time-to-live for idle resources (ms) */\n  idleTTL?: number;\n  /** Validation function before reuse */\n  validate?: (resource: T) => boolean;\n  /** Cleanup function when resource is disposed */\n  dispose?: (resource: T) => void;\n  /** Reset function before reuse */\n  reset?: (resource: T) => void;\n}\n\n/**\n * Generic resource pool for expensive objects\n * Implements object pooling pattern to reduce GC pressure\n */\nexport class ResourcePool<T> {\n  private pool: Map<symbol, PoolEntry<T>> = new Map();\n  private config: Required<ResourcePoolConfig<T>>;\n  private cleanupInterval: ReturnType<typeof setInterval> | null = null;\n\n  constructor(config: ResourcePoolConfig<T>) {\n    this.config = {\n      factory: config.factory,\n      maxSize: config.maxSize ?? 20,\n      minSize: config.minSize ?? 2,\n      idleTTL: config.idleTTL ?? 5 * 60 * 1000, // 5 minutes\n      validate: config.validate ?? (() => true),\n      dispose: config.dispose ?? (() => {}),\n      reset: config.reset ?? (() => {}),\n    };\n\n    // Pre-allocate minimum resources\n    this.preallocate();\n\n    // Start cleanup interval\n    this.startCleanup();\n  }\n\n  /**\n   * Acquire a resource from the pool\n   */\n  acquire(): { resource: T; release: () => void } {\n    // Find available resource\n    for (const [id, entry] of this.pool.entries()) {\n      if (!entry.isAcquired && this.config.validate(entry.resource)) {\n        entry.isAcquired = true;\n        entry.lastUsed = Date.now();\n        entry.useCount++;\n        this.config.reset(entry.resource);\n\n        return {\n          resource: entry.resource,\n          release: () => this.release(id),\n        };\n      }\n    }\n\n    // Create new resource if pool not at max\n    if (this.pool.size < this.config.maxSize) {\n      const id = this.createEntry();\n      const entry = this.pool.get(id);\n      if (entry === undefined) {\n        throw new Error('Failed to create pool entry');\n      }\n      entry.isAcquired = true;\n      entry.useCount++;\n\n      return {\n        resource: entry.resource,\n        release: () => this.release(id),\n      };\n    }\n\n    // Pool exhausted - create temporary resource\n    const tempResource = this.config.factory();\n    return {\n      resource: tempResource,\n      release: () => this.config.dispose(tempResource),\n    };\n  }\n\n  /**\n   * Cleanup idle resources beyond minimum\n   */\n  cleanup(): void {\n    const now = Date.now();\n    const toRemove: symbol[] = [];\n\n    for (const [id, entry] of this.pool.entries()) {\n      if (\n        !entry.isAcquired &&\n        this.pool.size > this.config.minSize &&\n        now - entry.lastUsed > this.config.idleTTL\n      ) {\n        toRemove.push(id);\n      }\n    }\n\n    for (const id of toRemove) {\n      const entry = this.pool.get(id);\n      if (entry) {\n        this.config.dispose(entry.resource);\n        this.pool.delete(id);\n      }\n    }\n  }\n\n  /**\n   * Get pool statistics\n   */\n  getStats(): {\n    total: number;\n    acquired: number;\n    available: number;\n    maxSize: number;\n  } {\n    let acquired = 0;\n    for (const entry of this.pool.values()) {\n      if (entry.isAcquired) acquired++;\n    }\n\n    return {\n      total: this.pool.size,\n      acquired,\n      available: this.pool.size - acquired,\n      maxSize: this.config.maxSize,\n    };\n  }\n\n  /**\n   * Dispose all resources and stop cleanup\n   */\n  dispose(): void {\n    if (this.cleanupInterval) {\n      clearInterval(this.cleanupInterval);\n      this.cleanupInterval = null;\n    }\n\n    for (const entry of this.pool.values()) {\n      this.config.dispose(entry.resource);\n    }\n\n    this.pool.clear();\n  }\n\n  /**\n   * Pre-allocate minimum pool resources\n   */\n  private preallocate(): void {\n    for (let i = 0; i < this.config.minSize; i++) {\n      this.createEntry();\n    }\n  }\n\n  /**\n   * Create a new pool entry\n   */\n  private createEntry(): symbol {\n    const id = Symbol('pool-entry');\n    const now = Date.now();\n\n    this.pool.set(id, {\n      resource: this.config.factory(),\n      createdAt: now,\n      lastUsed: now,\n      useCount: 0,\n      isAcquired: false,\n    });\n\n    return id;\n  }\n\n  /**\n   * Release a resource back to the pool\n   */\n  private release(id: symbol): void {\n    const entry = this.pool.get(id);\n    if (entry) {\n      entry.isAcquired = false;\n      entry.lastUsed = Date.now();\n    }\n  }\n\n  /**\n   * Start periodic cleanup of idle resources\n   */\n  private startCleanup(): void {\n    this.cleanupInterval = setInterval(() => {\n      this.cleanup();\n    }, this.config.idleTTL / 2);\n  }\n}\n\n/**\n * WeakMap-based cache with TTL support\n * Uses WeakRef for automatic garbage collection\n */\nexport class WeakCache<K extends object, V> {\n  private cache: Map<K, { ref: WeakRef<V extends object ? V : never>; expires: number }> =\n    new Map();\n  private registry: FinalizationRegistry<K>;\n  private readonly defaultTTL: number;\n\n  constructor(options: { defaultTTL?: number } = {}) {\n    this.defaultTTL = options.defaultTTL ?? 5 * 60 * 1000; // 5 minutes\n\n    // Use FinalizationRegistry for automatic cleanup\n    this.registry = new FinalizationRegistry((key: K) => {\n      this.cache.delete(key);\n    });\n  }\n\n  /**\n   * Get cached value\n   */\n  get(key: K): V | undefined {\n    const entry = this.cache.get(key);\n    if (!entry) return undefined;\n\n    // Check expiration\n    if (Date.now() > entry.expires) {\n      this.cache.delete(key);\n      return undefined;\n    }\n\n    return entry.ref.deref() as V | undefined;\n  }\n\n  /**\n   * Set cached value\n   */\n  set(key: K, value: V, ttl?: number): void {\n    if (typeof value === 'object' && value !== null) {\n      const ref = new WeakRef(value);\n      this.cache.set(key, {\n        ref: ref as WeakRef<V extends object ? V : never>,\n        expires: Date.now() + (ttl ?? this.defaultTTL),\n      });\n      this.registry.register(value, key);\n    }\n  }\n\n  /**\n   * Check if key exists\n   */\n  has(key: K): boolean {\n    return this.get(key) !== undefined;\n  }\n\n  /**\n   * Delete cached value\n   */\n  delete(key: K): boolean {\n    return this.cache.delete(key);\n  }\n\n  /**\n   * Clear all cached values\n   */\n  clear(): void {\n    this.cache.clear();\n  }\n}\n\n/**\n * Memory pressure levels\n */\nexport type MemoryPressure = 'none' | 'moderate' | 'critical';\n\n/**\n * Memory pressure callback\n */\nexport type MemoryPressureCallback = (pressure: MemoryPressure) => void;\n\n/**\n * Memory monitor configuration\n */\nexport interface MemoryMonitorConfig {\n  /** Moderate pressure threshold (0-1) */\n  moderateThreshold?: number;\n  /** Critical pressure threshold (0-1) */\n  criticalThreshold?: number;\n  /** Check interval (ms) */\n  checkInterval?: number;\n}\n\n/**\n * Memory monitor for tracking heap usage and pressure\n */\nexport class MemoryMonitor {\n  private callbacks: Set<MemoryPressureCallback> = new Set();\n  private config: Required<MemoryMonitorConfig>;\n  private interval: ReturnType<typeof setInterval> | null = null;\n  private currentPressure: MemoryPressure = 'none';\n\n  constructor(config: MemoryMonitorConfig = {}) {\n    this.config = {\n      moderateThreshold: config.moderateThreshold ?? 0.7,\n      criticalThreshold: config.criticalThreshold ?? 0.9,\n      checkInterval: config.checkInterval ?? 30000, // 30 seconds\n    };\n  }\n\n  /**\n   * Start monitoring memory pressure\n   */\n  start(): void {\n    if (this.interval) return;\n\n    this.interval = setInterval(() => {\n      this.check();\n    }, this.config.checkInterval);\n\n    // Initial check\n    this.check();\n  }\n\n  /**\n   * Stop monitoring\n   */\n  stop(): void {\n    if (this.interval) {\n      clearInterval(this.interval);\n      this.interval = null;\n    }\n  }\n\n  /**\n   * Check current memory pressure\n   */\n  check(): MemoryPressure {\n    const usage = this.getUsageRatio();\n    let pressure: MemoryPressure = 'none';\n\n    if (usage >= this.config.criticalThreshold) {\n      pressure = 'critical';\n    } else if (usage >= this.config.moderateThreshold) {\n      pressure = 'moderate';\n    }\n\n    // Notify if pressure changed\n    if (pressure !== this.currentPressure) {\n      this.currentPressure = pressure;\n      this.notifyCallbacks(pressure);\n    }\n\n    return pressure;\n  }\n\n  /**\n   * Get detailed memory info\n   */\n  getMemoryInfo(): {\n    usedHeap: number;\n    totalHeap: number;\n    heapLimit: number;\n    usageRatio: number;\n    pressure: MemoryPressure;\n  } | null {\n    if (typeof performance !== 'undefined' && 'memory' in performance) {\n      const { memory } = performance as Performance & {\n        memory?: {\n          usedJSHeapSize: number;\n          totalJSHeapSize: number;\n          jsHeapSizeLimit: number;\n        };\n      };\n      if (memory) {\n        return {\n          usedHeap: memory.usedJSHeapSize,\n          totalHeap: memory.totalJSHeapSize,\n          heapLimit: memory.jsHeapSizeLimit,\n          usageRatio: memory.usedJSHeapSize / memory.jsHeapSizeLimit,\n          pressure: this.currentPressure,\n        };\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Subscribe to pressure changes\n   */\n  onPressureChange(callback: MemoryPressureCallback): () => void {\n    this.callbacks.add(callback);\n    return () => this.callbacks.delete(callback);\n  }\n\n  /**\n   * Suggest garbage collection (hint only)\n   */\n  suggestGC(): void {\n    // Try to encourage GC by nullifying references\n    if (typeof globalThis !== 'undefined' && 'gc' in globalThis) {\n      const globalWithGC = globalThis as typeof globalThis & { gc: () => void };\n      globalWithGC.gc();\n    }\n  }\n\n  /**\n   * Get memory usage ratio (0-1)\n   */\n  private getUsageRatio(): number {\n    if (typeof performance !== 'undefined' && 'memory' in performance) {\n      const { memory } = performance as Performance & {\n        memory?: { usedJSHeapSize: number; jsHeapSizeLimit: number };\n      };\n      if (memory) {\n        return memory.usedJSHeapSize / memory.jsHeapSizeLimit;\n      }\n    }\n    return 0;\n  }\n\n  /**\n   * Notify callbacks of pressure change\n   */\n  private notifyCallbacks(pressure: MemoryPressure): void {\n    for (const callback of this.callbacks) {\n      try {\n        callback(pressure);\n      } catch (error) {\n        console.error('[MemoryMonitor] Callback error:', error);\n      }\n    }\n  }\n}\n\n/**\n * Disposable interface for cleanup\n */\nexport interface Disposable {\n  dispose(): void;\n}\n\n/**\n * Disposable registry for tracking resources\n */\nexport class DisposableRegistry {\n  private disposables: Set<Disposable> = new Set();\n  private isDisposed = false;\n\n  /**\n   * Get registration count\n   */\n  get count(): number {\n    return this.disposables.size;\n  }\n\n  /**\n   * Register a disposable resource\n   */\n  register<T extends Disposable>(disposable: T): T {\n    if (this.isDisposed) {\n      disposable.dispose();\n      throw new Error('Registry is already disposed');\n    }\n    this.disposables.add(disposable);\n    return disposable;\n  }\n\n  /**\n   * Unregister a disposable\n   */\n  unregister(disposable: Disposable): boolean {\n    return this.disposables.delete(disposable);\n  }\n\n  /**\n   * Dispose all registered resources\n   */\n  dispose(): void {\n    if (this.isDisposed) return;\n    this.isDisposed = true;\n\n    for (const disposable of this.disposables) {\n      try {\n        disposable.dispose();\n      } catch (error) {\n        console.error('[DisposableRegistry] Disposal error:', error);\n      }\n    }\n\n    this.disposables.clear();\n  }\n}\n\n/**\n * Create a disposable from a cleanup function\n */\nexport function createDisposable(cleanup: () => void): Disposable {\n  let disposed = false;\n  return {\n    dispose: () => {\n      if (!disposed) {\n        disposed = true;\n        cleanup();\n      }\n    },\n  };\n}\n\n/**\n * LRU (Least Recently Used) Cache with size limits\n */\nexport class LRUCache<K, V> {\n  private cache: Map<K, V> = new Map();\n  private readonly maxSize: number;\n\n  constructor(maxSize: number) {\n    this.maxSize = maxSize;\n  }\n\n  /**\n   * Get cache size\n   */\n  get size(): number {\n    return this.cache.size;\n  }\n\n  /**\n   * Get value and mark as recently used\n   */\n  get(key: K): V | undefined {\n    const value = this.cache.get(key);\n    if (value !== undefined) {\n      // Move to end (most recently used)\n      this.cache.delete(key);\n      this.cache.set(key, value);\n    }\n    return value;\n  }\n\n  /**\n   * Set value\n   */\n  set(key: K, value: V): void {\n    // Delete existing to update order\n    this.cache.delete(key);\n\n    // Evict oldest if at capacity\n    if (this.cache.size >= this.maxSize) {\n      const oldest = this.cache.keys().next().value;\n      if (oldest !== undefined) {\n        this.cache.delete(oldest);\n      }\n    }\n\n    this.cache.set(key, value);\n  }\n\n  /**\n   * Check if key exists\n   */\n  has(key: K): boolean {\n    return this.cache.has(key);\n  }\n\n  /**\n   * Delete key\n   */\n  delete(key: K): boolean {\n    return this.cache.delete(key);\n  }\n\n  /**\n   * Clear cache\n   */\n  clear(): void {\n    this.cache.clear();\n  }\n\n  /**\n   * Get all entries\n   */\n  entries(): IterableIterator<[K, V]> {\n    return this.cache.entries();\n  }\n}\n\n/**\n * Global memory manager singleton\n */\nexport const memoryManager = {\n  monitor: new MemoryMonitor(),\n  registry: new DisposableRegistry(),\n\n  /**\n   * Create a resource pool\n   */\n  createPool<T>(config: ResourcePoolConfig<T>): ResourcePool<T> {\n    const pool = new ResourcePool(config);\n    this.registry.register({\n      dispose: () => pool.dispose(),\n    });\n    return pool;\n  },\n\n  /**\n   * Create an LRU cache\n   */\n  createLRUCache<K, V>(maxSize: number): LRUCache<K, V> {\n    return new LRUCache<K, V>(maxSize);\n  },\n\n  /**\n   * Start memory monitoring\n   */\n  startMonitoring(): void {\n    this.monitor.start();\n  },\n\n  /**\n   * Stop memory monitoring\n   */\n  stopMonitoring(): void {\n    this.monitor.stop();\n  },\n\n  /**\n   * Dispose all managed resources\n   */\n  dispose(): void {\n    this.monitor.stop();\n    this.registry.dispose();\n  },\n};\n"],"names":["ResourcePool","config","id","entry","tempResource","now","toRemove","acquired","i","WeakCache","options","key","value","ttl","ref","MemoryMonitor","usage","pressure","memory","callback","error","DisposableRegistry","disposable","createDisposable","cleanup","disposed","LRUCache","maxSize","oldest","memoryManager","pool"],"mappings":"AAyCO,MAAMA,EAAgB;AAAA,EACnB,2BAAsC,IAAA;AAAA,EACtC;AAAA,EACA,kBAAyD;AAAA,EAEjE,YAAYC,GAA+B;AACzC,SAAK,SAAS;AAAA,MACZ,SAASA,EAAO;AAAA,MAChB,SAASA,EAAO,WAAW;AAAA,MAC3B,SAASA,EAAO,WAAW;AAAA,MAC3B,SAASA,EAAO,WAAW,MAAS;AAAA;AAAA,MACpC,UAAUA,EAAO,aAAa,MAAM;AAAA,MACpC,SAASA,EAAO,YAAY,MAAM;AAAA,MAAC;AAAA,MACnC,OAAOA,EAAO,UAAU,MAAM;AAAA,MAAC;AAAA,IAAA,GAIjC,KAAK,YAAA,GAGL,KAAK,aAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgD;AAE9C,eAAW,CAACC,GAAIC,CAAK,KAAK,KAAK,KAAK;AAClC,UAAI,CAACA,EAAM,cAAc,KAAK,OAAO,SAASA,EAAM,QAAQ;AAC1D,eAAAA,EAAM,aAAa,IACnBA,EAAM,WAAW,KAAK,IAAA,GACtBA,EAAM,YACN,KAAK,OAAO,MAAMA,EAAM,QAAQ,GAEzB;AAAA,UACL,UAAUA,EAAM;AAAA,UAChB,SAAS,MAAM,KAAK,QAAQD,CAAE;AAAA,QAAA;AAMpC,QAAI,KAAK,KAAK,OAAO,KAAK,OAAO,SAAS;AACxC,YAAMA,IAAK,KAAK,YAAA,GACVC,IAAQ,KAAK,KAAK,IAAID,CAAE;AAC9B,UAAIC,MAAU;AACZ,cAAM,IAAI,MAAM,6BAA6B;AAE/C,aAAAA,EAAM,aAAa,IACnBA,EAAM,YAEC;AAAA,QACL,UAAUA,EAAM;AAAA,QAChB,SAAS,MAAM,KAAK,QAAQD,CAAE;AAAA,MAAA;AAAA,IAElC;AAGA,UAAME,IAAe,KAAK,OAAO,QAAA;AACjC,WAAO;AAAA,MACL,UAAUA;AAAA,MACV,SAAS,MAAM,KAAK,OAAO,QAAQA,CAAY;AAAA,IAAA;AAAA,EAEnD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,UAAMC,IAAM,KAAK,IAAA,GACXC,IAAqB,CAAA;AAE3B,eAAW,CAACJ,GAAIC,CAAK,KAAK,KAAK,KAAK;AAClC,MACE,CAACA,EAAM,cACP,KAAK,KAAK,OAAO,KAAK,OAAO,WAC7BE,IAAMF,EAAM,WAAW,KAAK,OAAO,WAEnCG,EAAS,KAAKJ,CAAE;AAIpB,eAAWA,KAAMI,GAAU;AACzB,YAAMH,IAAQ,KAAK,KAAK,IAAID,CAAE;AAC9B,MAAIC,MACF,KAAK,OAAO,QAAQA,EAAM,QAAQ,GAClC,KAAK,KAAK,OAAOD,CAAE;AAAA,IAEvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAKE;AACA,QAAIK,IAAW;AACf,eAAWJ,KAAS,KAAK,KAAK,OAAA;AAC5B,MAAIA,EAAM,cAAYI;AAGxB,WAAO;AAAA,MACL,OAAO,KAAK,KAAK;AAAA,MACjB,UAAAA;AAAA,MACA,WAAW,KAAK,KAAK,OAAOA;AAAA,MAC5B,SAAS,KAAK,OAAO;AAAA,IAAA;AAAA,EAEzB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,IAAI,KAAK,oBACP,cAAc,KAAK,eAAe,GAClC,KAAK,kBAAkB;AAGzB,eAAWJ,KAAS,KAAK,KAAK,OAAA;AAC5B,WAAK,OAAO,QAAQA,EAAM,QAAQ;AAGpC,SAAK,KAAK,MAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAoB;AAC1B,aAASK,IAAI,GAAGA,IAAI,KAAK,OAAO,SAASA;AACvC,WAAK,YAAA;AAAA,EAET;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAsB;AAC5B,UAAMN,IAAK,OAAO,YAAY,GACxBG,IAAM,KAAK,IAAA;AAEjB,gBAAK,KAAK,IAAIH,GAAI;AAAA,MAChB,UAAU,KAAK,OAAO,QAAA;AAAA,MACtB,WAAWG;AAAA,MACX,UAAUA;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,IAAA,CACb,GAEMH;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAQA,GAAkB;AAChC,UAAMC,IAAQ,KAAK,KAAK,IAAID,CAAE;AAC9B,IAAIC,MACFA,EAAM,aAAa,IACnBA,EAAM,WAAW,KAAK,IAAA;AAAA,EAE1B;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAqB;AAC3B,SAAK,kBAAkB,YAAY,MAAM;AACvC,WAAK,QAAA;AAAA,IACP,GAAG,KAAK,OAAO,UAAU,CAAC;AAAA,EAC5B;AACF;AAMO,MAAMM,EAA+B;AAAA,EAClC,4BACF,IAAA;AAAA,EACE;AAAA,EACS;AAAA,EAEjB,YAAYC,IAAmC,IAAI;AACjD,SAAK,aAAaA,EAAQ,cAAc,MAAS,KAGjD,KAAK,WAAW,IAAI,qBAAqB,CAACC,MAAW;AACnD,WAAK,MAAM,OAAOA,CAAG;AAAA,IACvB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,IAAIA,GAAuB;AACzB,UAAMR,IAAQ,KAAK,MAAM,IAAIQ,CAAG;AAChC,QAAKR,GAGL;AAAA,UAAI,KAAK,QAAQA,EAAM,SAAS;AAC9B,aAAK,MAAM,OAAOQ,CAAG;AACrB;AAAA,MACF;AAEA,aAAOR,EAAM,IAAI,MAAA;AAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAIQ,GAAQC,GAAUC,GAAoB;AACxC,QAAI,OAAOD,KAAU,YAAYA,MAAU,MAAM;AAC/C,YAAME,IAAM,IAAI,QAAQF,CAAK;AAC7B,WAAK,MAAM,IAAID,GAAK;AAAA,QAClB,KAAAG;AAAA,QACA,SAAS,KAAK,IAAA,KAASD,KAAO,KAAK;AAAA,MAAA,CACpC,GACD,KAAK,SAAS,SAASD,GAAOD,CAAG;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAIA,GAAiB;AACnB,WAAO,KAAK,IAAIA,CAAG,MAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAOA,GAAiB;AACtB,WAAO,KAAK,MAAM,OAAOA,CAAG;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,MAAM,MAAA;AAAA,EACb;AACF;AA2BO,MAAMI,EAAc;AAAA,EACjB,gCAA6C,IAAA;AAAA,EAC7C;AAAA,EACA,WAAkD;AAAA,EAClD,kBAAkC;AAAA,EAE1C,YAAYd,IAA8B,IAAI;AAC5C,SAAK,SAAS;AAAA,MACZ,mBAAmBA,EAAO,qBAAqB;AAAA,MAC/C,mBAAmBA,EAAO,qBAAqB;AAAA,MAC/C,eAAeA,EAAO,iBAAiB;AAAA;AAAA,IAAA;AAAA,EAE3C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,IAAI,KAAK,aAET,KAAK,WAAW,YAAY,MAAM;AAChC,WAAK,MAAA;AAAA,IACP,GAAG,KAAK,OAAO,aAAa,GAG5B,KAAK,MAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,IAAI,KAAK,aACP,cAAc,KAAK,QAAQ,GAC3B,KAAK,WAAW;AAAA,EAEpB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAwB;AACtB,UAAMe,IAAQ,KAAK,cAAA;AACnB,QAAIC,IAA2B;AAE/B,WAAID,KAAS,KAAK,OAAO,oBACvBC,IAAW,aACFD,KAAS,KAAK,OAAO,sBAC9BC,IAAW,aAITA,MAAa,KAAK,oBACpB,KAAK,kBAAkBA,GACvB,KAAK,gBAAgBA,CAAQ,IAGxBA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAMS;AACP,QAAI,OAAO,cAAgB,OAAe,YAAY,aAAa;AACjE,YAAM,EAAE,QAAAC,MAAW;AAOnB,UAAIA;AACF,eAAO;AAAA,UACL,UAAUA,EAAO;AAAA,UACjB,WAAWA,EAAO;AAAA,UAClB,WAAWA,EAAO;AAAA,UAClB,YAAYA,EAAO,iBAAiBA,EAAO;AAAA,UAC3C,UAAU,KAAK;AAAA,QAAA;AAAA,IAGrB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiBC,GAA8C;AAC7D,gBAAK,UAAU,IAAIA,CAAQ,GACpB,MAAM,KAAK,UAAU,OAAOA,CAAQ;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkB;AAEhB,IAAI,OAAO,aAAe,OAAe,QAAQ,cAC1B,WACR,GAAA;AAAA,EAEjB;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAwB;AAC9B,QAAI,OAAO,cAAgB,OAAe,YAAY,aAAa;AACjE,YAAM,EAAE,QAAAD,MAAW;AAGnB,UAAIA;AACF,eAAOA,EAAO,iBAAiBA,EAAO;AAAA,IAE1C;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgBD,GAAgC;AACtD,eAAWE,KAAY,KAAK;AAC1B,UAAI;AACF,QAAAA,EAASF,CAAQ;AAAA,MACnB,SAASG,GAAO;AACd,gBAAQ,MAAM,mCAAmCA,CAAK;AAAA,MACxD;AAAA,EAEJ;AACF;AAYO,MAAMC,EAAmB;AAAA,EACtB,kCAAmC,IAAA;AAAA,EACnC,aAAa;AAAA;AAAA;AAAA;AAAA,EAKrB,IAAI,QAAgB;AAClB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,SAA+BC,GAAkB;AAC/C,QAAI,KAAK;AACP,YAAAA,EAAW,QAAA,GACL,IAAI,MAAM,8BAA8B;AAEhD,gBAAK,YAAY,IAAIA,CAAU,GACxBA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAWA,GAAiC;AAC1C,WAAO,KAAK,YAAY,OAAOA,CAAU;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,QAAI,MAAK,YACT;AAAA,WAAK,aAAa;AAElB,iBAAWA,KAAc,KAAK;AAC5B,YAAI;AACF,UAAAA,EAAW,QAAA;AAAA,QACb,SAASF,GAAO;AACd,kBAAQ,MAAM,wCAAwCA,CAAK;AAAA,QAC7D;AAGF,WAAK,YAAY,MAAA;AAAA;AAAA,EACnB;AACF;AAKO,SAASG,EAAiBC,GAAiC;AAChE,MAAIC,IAAW;AACf,SAAO;AAAA,IACL,SAAS,MAAM;AACb,MAAKA,MACHA,IAAW,IACXD,EAAA;AAAA,IAEJ;AAAA,EAAA;AAEJ;AAKO,MAAME,EAAe;AAAA,EAClB,4BAAuB,IAAA;AAAA,EACd;AAAA,EAEjB,YAAYC,GAAiB;AAC3B,SAAK,UAAUA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAe;AACjB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAIhB,GAAuB;AACzB,UAAMC,IAAQ,KAAK,MAAM,IAAID,CAAG;AAChC,WAAIC,MAAU,WAEZ,KAAK,MAAM,OAAOD,CAAG,GACrB,KAAK,MAAM,IAAIA,GAAKC,CAAK,IAEpBA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAID,GAAQC,GAAgB;AAK1B,QAHA,KAAK,MAAM,OAAOD,CAAG,GAGjB,KAAK,MAAM,QAAQ,KAAK,SAAS;AACnC,YAAMiB,IAAS,KAAK,MAAM,KAAA,EAAO,OAAO;AACxC,MAAIA,MAAW,UACb,KAAK,MAAM,OAAOA,CAAM;AAAA,IAE5B;AAEA,SAAK,MAAM,IAAIjB,GAAKC,CAAK;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAID,GAAiB;AACnB,WAAO,KAAK,MAAM,IAAIA,CAAG;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAOA,GAAiB;AACtB,WAAO,KAAK,MAAM,OAAOA,CAAG;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,MAAM,MAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,UAAoC;AAClC,WAAO,KAAK,MAAM,QAAA;AAAA,EACpB;AACF;AAKO,MAAMkB,IAAgB;AAAA,EAC3B,SAAS,IAAId,EAAA;AAAA,EACb,UAAU,IAAIM,EAAA;AAAA;AAAA;AAAA;AAAA,EAKd,WAAcpB,GAAgD;AAC5D,UAAM6B,IAAO,IAAI9B,EAAaC,CAAM;AACpC,gBAAK,SAAS,SAAS;AAAA,MACrB,SAAS,MAAM6B,EAAK,QAAA;AAAA,IAAQ,CAC7B,GACMA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAqBH,GAAiC;AACpD,WAAO,IAAID,EAAeC,CAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAwB;AACtB,SAAK,QAAQ,MAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAuB;AACrB,SAAK,QAAQ,KAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,QAAQ,KAAA,GACb,KAAK,SAAS,QAAA;AAAA,EAChB;AACF;"}