{"version":3,"file":"feature-bridge.mjs","sources":["../../../src/lib/coordination/feature-bridge.ts"],"sourcesContent":["/**\n * @file Feature Bridge\n * @module coordination/feature-bridge\n * @description PhD-level module interconnection layer for cross-feature communication.\n *\n * Implements sophisticated feature bridging with:\n * - Type-safe cross-feature method invocation\n * - Feature capability discovery\n * - Version-aware API contracts\n * - Fallback handling for missing features\n * - Lazy feature loading integration\n * - Feature dependency resolution\n *\n * @author Agent 5 - PhD TypeScript Architect\n * @version 1.0.0\n */\n\nimport {\n  type LibraryId,\n} from './types';\n// import { getCoordinationEventBus, publishEvent, subscribeToEvent } from './event-bus';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Feature identifier.\n */\nexport type FeatureId = string & { readonly __brand: 'FeatureId' };\n\n/**\n * Creates a FeatureId.\n */\nexport function createFeatureId(id: string): FeatureId {\n  return id as FeatureId;\n}\n\n/**\n * Feature capability definition.\n */\nexport interface FeatureCapability<T = unknown> {\n  /** Capability name */\n  name: string;\n  /** Capability version */\n  version: string;\n  /** Capability handler */\n  handler: T;\n  /** Required dependencies */\n  dependencies?: FeatureId[];\n  /** Description */\n  description?: string;\n}\n\n/**\n * Feature registration.\n */\nexport interface FeatureRegistration {\n  /** Feature identifier */\n  id: FeatureId;\n  /** Feature name */\n  name: string;\n  /** Feature version */\n  version: string;\n  /** Owning library */\n  library: LibraryId;\n  /** Capabilities provided by this feature */\n  capabilities: Map<string, FeatureCapability>;\n  /** Dependencies on other features */\n  dependencies: FeatureId[];\n  /** Whether feature is loaded/active */\n  isActive: boolean;\n  /** Lazy loader for the feature */\n  loader?: () => Promise<void>;\n}\n\n/**\n * Bridge invocation options.\n */\nexport interface InvocationOptions {\n  /** Timeout for the invocation (ms) */\n  timeout?: number;\n  /** Fallback value if capability not available */\n  fallback?: unknown;\n  /** Whether to throw on missing capability */\n  throwOnMissing?: boolean;\n  /** Required minimum version */\n  minVersion?: string;\n}\n\n/**\n * Bridge invocation result.\n */\nexport interface InvocationResult<T> {\n  /** Whether invocation succeeded */\n  success: boolean;\n  /** Result value */\n  value?: T;\n  /** Error if failed */\n  error?: Error;\n  /** Feature that handled the invocation */\n  handledBy?: FeatureId;\n  /** Time taken (ms) */\n  duration: number;\n}\n\n/**\n * Feature bridge configuration.\n */\nexport interface FeatureBridgeConfig {\n  /** Default invocation timeout (ms) */\n  defaultTimeout: number;\n  /** Enable lazy loading */\n  enableLazyLoading: boolean;\n  /** Enable invocation logging */\n  debug: boolean;\n  /** Fallback behavior */\n  defaultFallbackBehavior: 'throw' | 'return-undefined' | 'use-fallback';\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Compares semantic versions.\n * @returns -1 if a < b, 0 if a == b, 1 if a > b\n */\nfunction compareVersions(a: string, b: string): number {\n  const partsA = a.split('.').map(Number);\n  const partsB = b.split('.').map(Number);\n  const len = Math.max(partsA.length, partsB.length);\n\n  for (let i = 0; i < len; i++) {\n    const numA = partsA[i] ?? 0;\n    const numB = partsB[i] ?? 0;\n    if (numA < numB) return -1;\n    if (numA > numB) return 1;\n  }\n\n  return 0;\n}\n\n/**\n * Default configuration.\n */\nconst DEFAULT_CONFIG: FeatureBridgeConfig = {\n  defaultTimeout: 5000,\n  enableLazyLoading: true,\n  debug: false,\n  defaultFallbackBehavior: 'throw',\n};\n\n// ============================================================================\n// FeatureBridgeImpl Class\n// ============================================================================\n\n/**\n * Implementation of the feature bridge.\n *\n * @example\n * ```typescript\n * const bridge = new FeatureBridgeImpl();\n *\n * // Register a feature with capabilities\n * bridge.registerFeature({\n *   id: createFeatureId('user-management'),\n *   name: 'User Management',\n *   version: '1.0.0',\n *   library: createLibraryId('auth'),\n *   capabilities: new Map([\n *     ['getUserById', {\n *       name: 'getUserById',\n *       version: '1.0.0',\n *       handler: async (id: string) => userService.getById(id),\n *     }],\n *   ]),\n *   dependencies: [],\n *   isActive: true,\n * });\n *\n * // Invoke a capability\n * const result = await bridge.invoke<User>(\n *   'user-management',\n *   'getUserById',\n *   ['user-123']\n * );\n * ```\n */\nexport class FeatureBridgeImpl {\n  /** Configuration */\n  private readonly config: FeatureBridgeConfig;\n\n  /** Registered features */\n  private readonly features: Map<FeatureId, FeatureRegistration> = new Map();\n\n  /** Capability index for fast lookup */\n  private readonly capabilityIndex: Map<string, Set<FeatureId>> = new Map();\n\n  /** Loading promises for lazy features */\n  private readonly loadingPromises: Map<FeatureId, Promise<void>> = new Map();\n\n  /**\n   * Creates a new feature bridge.\n   * @param config - Configuration options\n   */\n  constructor(config: Partial<FeatureBridgeConfig> = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n  }\n\n  // ==========================================================================\n  // Feature Registration\n  // ==========================================================================\n\n  /**\n   * Registers a feature.\n   * @param registration - Feature registration\n   */\n  registerFeature(registration: FeatureRegistration): void {\n    // Store registration\n    this.features.set(registration.id, registration);\n\n    // Index capabilities\n    for (const [capName] of registration.capabilities) {\n      let featureSet = this.capabilityIndex.get(capName);\n      if (!featureSet) {\n        featureSet = new Set();\n        this.capabilityIndex.set(capName, featureSet);\n      }\n      featureSet.add(registration.id);\n    }\n\n    if (this.config.debug) {\n      console.info(`[FeatureBridge] Registered feature: ${registration.name}`, {\n        id: registration.id,\n        capabilities: Array.from(registration.capabilities.keys()),\n      });\n    }\n  }\n\n  /**\n   * Unregisters a feature.\n   * @param id - Feature ID\n   */\n  unregisterFeature(id: FeatureId): void {\n    const registration = this.features.get(id);\n    if (!registration) return;\n\n    // Remove from capability index\n    for (const [capName] of registration.capabilities) {\n      const featureSet = this.capabilityIndex.get(capName);\n      if (featureSet) {\n        featureSet.delete(id);\n        if (featureSet.size === 0) {\n          this.capabilityIndex.delete(capName);\n        }\n      }\n    }\n\n    this.features.delete(id);\n  }\n\n  /**\n   * Adds a capability to a feature.\n   * @param featureId - Feature ID\n   * @param capability - Capability to add\n   */\n  addCapability<T>(featureId: FeatureId, capability: FeatureCapability<T>): void {\n    const registration = this.features.get(featureId);\n    if (!registration) {\n      throw new Error(`Feature not found: ${featureId}`);\n    }\n\n    registration.capabilities.set(capability.name, capability as FeatureCapability);\n\n    // Update index\n    let featureSet = this.capabilityIndex.get(capability.name);\n    if (!featureSet) {\n      featureSet = new Set();\n      this.capabilityIndex.set(capability.name, featureSet);\n    }\n    featureSet.add(featureId);\n  }\n\n  /**\n   * Removes a capability from a feature.\n   * @param featureId - Feature ID\n   * @param capabilityName - Capability name\n   */\n  removeCapability(featureId: FeatureId, capabilityName: string): void {\n    const registration = this.features.get(featureId);\n    if (!registration) return;\n\n    registration.capabilities.delete(capabilityName);\n\n    // Update index\n    const featureSet = this.capabilityIndex.get(capabilityName);\n    if (featureSet) {\n      featureSet.delete(featureId);\n      if (featureSet.size === 0) {\n        this.capabilityIndex.delete(capabilityName);\n      }\n    }\n  }\n\n  // ==========================================================================\n  // Capability Invocation\n  // ==========================================================================\n\n  /**\n   * Invokes a capability on a specific feature.\n   * @template T - Return type\n   * @param featureId - Feature ID\n   * @param capability - Capability name\n   * @param args - Arguments to pass\n   * @param options - Invocation options\n   * @returns Invocation result\n   */\n  async invoke<T>(\n    featureId: FeatureId | string,\n    capability: string,\n    args: unknown[] = [],\n    options: InvocationOptions = {}\n  ): Promise<InvocationResult<T>> {\n    const startTime = performance.now();\n    const id = featureId as FeatureId;\n\n    try {\n      // Find feature\n      const registration = this.features.get(id);\n      if (!registration) {\n        return this.handleMissing<T>(\n          `Feature not found: ${featureId}`,\n          options,\n          startTime\n        );\n      }\n\n      // Load lazy feature if needed\n      if (!registration.isActive && registration.loader) {\n        await this.loadFeature(id);\n      }\n\n      // Find capability\n      const cap = registration.capabilities.get(capability);\n      if (!cap) {\n        return this.handleMissing<T>(\n          `Capability not found: ${capability} in ${featureId}`,\n          options,\n          startTime\n        );\n      }\n\n      // Check version\n      if (options.minVersion != null && compareVersions(cap.version, options.minVersion) < 0) {\n        return this.handleMissing<T>(\n          `Capability version ${cap.version} is below required ${options.minVersion}`,\n          options,\n          startTime\n        );\n      }\n\n      // Invoke handler\n      const handler = cap.handler as (...a: unknown[]) => T | Promise<T>;\n      const timeout = options.timeout ?? this.config.defaultTimeout;\n\n      const result = await this.invokeWithTimeout(handler, args, timeout);\n\n      return {\n        success: true,\n        value: result,\n        handledBy: id,\n        duration: performance.now() - startTime,\n      };\n    } catch (error) {\n      return {\n        success: false,\n        error: error instanceof Error ? error : new Error(String(error)),\n        duration: performance.now() - startTime,\n      };\n    }\n  }\n\n  /**\n   * Invokes a capability on any feature that provides it.\n   * @template T - Return type\n   * @param capability - Capability name\n   * @param args - Arguments to pass\n   * @param options - Invocation options\n   * @returns Invocation result\n   */\n  async invokeAny<T>(\n    capability: string,\n    args: unknown[] = [],\n    options: InvocationOptions = {}\n  ): Promise<InvocationResult<T>> {\n    const featureIds = this.capabilityIndex.get(capability);\n    if (!featureIds || featureIds.size === 0) {\n      return this.handleMissing<T>(\n        `No feature provides capability: ${capability}`,\n        options,\n        performance.now()\n      );\n    }\n\n    // Try first active feature\n    for (const id of featureIds) {\n      const registration = this.features.get(id);\n      if (registration?.isActive === true) {\n        return this.invoke<T>(id, capability, args, options);\n      }\n    }\n\n    // Try first loadable feature\n    if (this.config.enableLazyLoading) {\n      for (const id of featureIds) {\n        const registration = this.features.get(id);\n        if (registration?.loader) {\n          return this.invoke<T>(id, capability, args, options);\n        }\n      }\n    }\n\n    return this.handleMissing<T>(\n      `No active feature provides capability: ${capability}`,\n      options,\n      performance.now()\n    );\n  }\n\n  // ==========================================================================\n  // Feature Discovery\n  // ==========================================================================\n\n  /**\n   * Checks if a feature is registered.\n   * @param id - Feature ID\n   */\n  hasFeature(id: FeatureId | string): boolean {\n    return this.features.has(id as FeatureId);\n  }\n\n  /**\n   * Checks if a capability is available.\n   * @param capability - Capability name\n   */\n  hasCapability(capability: string): boolean {\n    const features = this.capabilityIndex.get(capability);\n    return features !== undefined && features.size > 0;\n  }\n\n  /**\n   * Gets features that provide a capability.\n   * @param capability - Capability name\n   * @returns Array of feature IDs\n   */\n  getFeaturesWithCapability(capability: string): FeatureId[] {\n    const features = this.capabilityIndex.get(capability);\n    return features ? Array.from(features) : [];\n  }\n\n  /**\n   * Gets all capabilities of a feature.\n   * @param id - Feature ID\n   * @returns Array of capability names\n   */\n  getFeatureCapabilities(id: FeatureId | string): string[] {\n    const registration = this.features.get(id as FeatureId);\n    return registration ? Array.from(registration.capabilities.keys()) : [];\n  }\n\n  /**\n   * Gets all registered features.\n   * @returns Array of feature registrations\n   */\n  getAllFeatures(): FeatureRegistration[] {\n    return Array.from(this.features.values());\n  }\n\n  /**\n   * Gets feature by ID.\n   * @param id - Feature ID\n   */\n  getFeature(id: FeatureId | string): FeatureRegistration | undefined {\n    return this.features.get(id as FeatureId);\n  }\n\n  // ==========================================================================\n  // Feature Loading\n  // ==========================================================================\n\n  /**\n   * Loads a lazy feature.\n   * @param id - Feature ID\n   */\n  async loadFeature(id: FeatureId): Promise<void> {\n    const registration = this.features.get(id);\n    if (!registration) {\n      throw new Error(`Feature not found: ${id}`);\n    }\n\n    if (registration.isActive) {\n      return; // Already loaded\n    }\n\n    if (!registration.loader) {\n      throw new Error(`Feature ${id} has no loader`);\n    }\n\n    // Deduplicate concurrent loads\n    let loadPromise = this.loadingPromises.get(id);\n    if (loadPromise) {\n      return loadPromise;\n    }\n\n    loadPromise = (async () => {\n      try {\n        // Load dependencies first\n        for (const depId of registration.dependencies) {\n          await this.loadFeature(depId);\n        }\n\n        // Load the feature\n        if (registration.loader != null) {\n          await registration.loader();\n        }\n        registration.isActive = true;\n\n        if (this.config.debug) {\n          console.info(`[FeatureBridge] Loaded feature: ${registration.name}`);\n        }\n      } finally {\n        this.loadingPromises.delete(id);\n      }\n    })();\n\n    this.loadingPromises.set(id, loadPromise);\n    return loadPromise;\n  }\n\n  /**\n   * Activates a feature (marks as active without loading).\n   * @param id - Feature ID\n   */\n  activateFeature(id: FeatureId): void {\n    const registration = this.features.get(id);\n    if (registration) {\n      registration.isActive = true;\n    }\n  }\n\n  /**\n   * Deactivates a feature.\n   * @param id - Feature ID\n   */\n  deactivateFeature(id: FeatureId): void {\n    const registration = this.features.get(id);\n    if (registration) {\n      registration.isActive = false;\n    }\n  }\n\n  // ==========================================================================\n  // Private Methods\n  // ==========================================================================\n\n  /**\n   * Disposes the bridge.\n   */\n  dispose(): void {\n    this.features.clear();\n    this.capabilityIndex.clear();\n    this.loadingPromises.clear();\n  }\n\n  /**\n   * Handles missing capability/feature.\n   */\n  private handleMissing<T>(\n    message: string,\n    options: InvocationOptions,\n    startTime: number\n  ): InvocationResult<T> {\n    let behavior: 'throw' | 'use-fallback' | 'return-undefined';\n    if (options.throwOnMissing === true) {\n      behavior = 'throw';\n    } else if (options.fallback !== undefined) {\n      behavior = 'use-fallback';\n    } else {\n      behavior = this.config.defaultFallbackBehavior;\n    }\n\n    switch (behavior) {\n      case 'throw':\n        return {\n          success: false,\n          error: new Error(message),\n          duration: performance.now() - startTime,\n        };\n\n      case 'use-fallback':\n        return {\n          success: true,\n          value: options.fallback as T,\n          duration: performance.now() - startTime,\n        };\n\n      case 'return-undefined':\n      default:\n        return {\n          success: true,\n          value: undefined,\n          duration: performance.now() - startTime,\n        };\n    }\n  }\n\n  /**\n   * Invokes a handler with timeout.\n   */\n  private async invokeWithTimeout<T>(\n    handler: (...args: unknown[]) => T | Promise<T>,\n    args: unknown[],\n    timeout: number\n  ): Promise<T> {\n    return new Promise<T>((resolve, reject) => {\n      const timeoutId = setTimeout(() => {\n        reject(new Error(`Invocation timed out after ${timeout}ms`));\n      }, timeout);\n\n      try {\n        const result = handler(...args);\n\n        if (result instanceof Promise) {\n          result\n            .then((value) => {\n              clearTimeout(timeoutId);\n              resolve(value);\n            })\n            .catch((error: unknown) => {\n              clearTimeout(timeoutId);\n              reject(error instanceof Error ? error : new Error(String(error)));\n            });\n        } else {\n          clearTimeout(timeoutId);\n          resolve(result);\n        }\n      } catch (error: unknown) {\n        clearTimeout(timeoutId);\n        reject(error instanceof Error ? error : new Error(String(error)));\n      }\n    });\n  }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\n/**\n * Global feature bridge instance.\n */\nlet globalBridge: FeatureBridgeImpl | null = null;\n\n/**\n * Gets the global feature bridge.\n * @param config - Optional configuration\n */\nexport function getFeatureBridge(\n  config?: Partial<FeatureBridgeConfig>\n): FeatureBridgeImpl {\n  globalBridge ??= new FeatureBridgeImpl(config);\n  return globalBridge;\n}\n\n/**\n * Sets the global feature bridge.\n * @param bridge - Feature bridge instance\n */\nexport function setFeatureBridge(bridge: FeatureBridgeImpl): void {\n  if (globalBridge) {\n    globalBridge.dispose();\n  }\n  globalBridge = bridge;\n}\n\n/**\n * Resets the global feature bridge.\n */\nexport function resetFeatureBridge(): void {\n  if (globalBridge) {\n    globalBridge.dispose();\n    globalBridge = null;\n  }\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Registers a feature with the global bridge.\n */\nexport function registerFeature(registration: FeatureRegistration): void {\n  getFeatureBridge().registerFeature(registration);\n}\n\n/**\n * Invokes a capability on the global bridge.\n */\nexport async function invokeCapability<T>(\n  featureId: FeatureId | string,\n  capability: string,\n  args?: unknown[],\n  options?: InvocationOptions\n): Promise<InvocationResult<T>> {\n  return getFeatureBridge().invoke<T>(\n    featureId as FeatureId,\n    capability,\n    args,\n    options\n  );\n}\n\n/**\n * Invokes a capability on any providing feature.\n */\nexport async function invokeAnyCapability<T>(\n  capability: string,\n  args?: unknown[],\n  options?: InvocationOptions\n): Promise<InvocationResult<T>> {\n  return getFeatureBridge().invokeAny<T>(capability, args, options);\n}\n"],"names":["createFeatureId","id","compareVersions","a","b","partsA","partsB","len","i","numA","numB","DEFAULT_CONFIG","FeatureBridgeImpl","config","registration","capName","featureSet","featureId","capability","capabilityName","args","options","startTime","cap","handler","timeout","error","featureIds","features","loadPromise","depId","message","behavior","resolve","reject","timeoutId","result","value","globalBridge","getFeatureBridge","setFeatureBridge","bridge","resetFeatureBridge","registerFeature","invokeCapability","invokeAnyCapability"],"mappings":"AAkCO,SAASA,EAAgBC,GAAuB;AACrD,SAAOA;AACT;AA4FA,SAASC,EAAgBC,GAAWC,GAAmB;AACrD,QAAMC,IAASF,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM,GAChCG,IAASF,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM,GAChCG,IAAM,KAAK,IAAIF,EAAO,QAAQC,EAAO,MAAM;AAEjD,WAASE,IAAI,GAAGA,IAAID,GAAKC,KAAK;AAC5B,UAAMC,IAAOJ,EAAOG,CAAC,KAAK,GACpBE,IAAOJ,EAAOE,CAAC,KAAK;AAC1B,QAAIC,IAAOC,EAAM,QAAO;AACxB,QAAID,IAAOC,EAAM,QAAO;AAAA,EAC1B;AAEA,SAAO;AACT;AAKA,MAAMC,IAAsC;AAAA,EAC1C,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP,yBAAyB;AAC3B;AAsCO,MAAMC,EAAkB;AAAA;AAAA,EAEZ;AAAA;AAAA,EAGA,+BAAoD,IAAA;AAAA;AAAA,EAGpD,sCAAmD,IAAA;AAAA;AAAA,EAGnD,sCAAqD,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtE,YAAYC,IAAuC,IAAI;AACrD,SAAK,SAAS,EAAE,GAAGF,GAAgB,GAAGE,EAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,gBAAgBC,GAAyC;AAEvD,SAAK,SAAS,IAAIA,EAAa,IAAIA,CAAY;AAG/C,eAAW,CAACC,CAAO,KAAKD,EAAa,cAAc;AACjD,UAAIE,IAAa,KAAK,gBAAgB,IAAID,CAAO;AACjD,MAAKC,MACHA,wBAAiB,IAAA,GACjB,KAAK,gBAAgB,IAAID,GAASC,CAAU,IAE9CA,EAAW,IAAIF,EAAa,EAAE;AAAA,IAChC;AAEA,IAAI,KAAK,OAAO,SACd,QAAQ,KAAK,uCAAuCA,EAAa,IAAI,IAAI;AAAA,MACvE,IAAIA,EAAa;AAAA,MACjB,cAAc,MAAM,KAAKA,EAAa,aAAa,MAAM;AAAA,IAAA,CAC1D;AAAA,EAEL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkBb,GAAqB;AACrC,UAAMa,IAAe,KAAK,SAAS,IAAIb,CAAE;AACzC,QAAKa,GAGL;AAAA,iBAAW,CAACC,CAAO,KAAKD,EAAa,cAAc;AACjD,cAAME,IAAa,KAAK,gBAAgB,IAAID,CAAO;AACnD,QAAIC,MACFA,EAAW,OAAOf,CAAE,GAChBe,EAAW,SAAS,KACtB,KAAK,gBAAgB,OAAOD,CAAO;AAAA,MAGzC;AAEA,WAAK,SAAS,OAAOd,CAAE;AAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAiBgB,GAAsBC,GAAwC;AAC7E,UAAMJ,IAAe,KAAK,SAAS,IAAIG,CAAS;AAChD,QAAI,CAACH;AACH,YAAM,IAAI,MAAM,sBAAsBG,CAAS,EAAE;AAGnD,IAAAH,EAAa,aAAa,IAAII,EAAW,MAAMA,CAA+B;AAG9E,QAAIF,IAAa,KAAK,gBAAgB,IAAIE,EAAW,IAAI;AACzD,IAAKF,MACHA,wBAAiB,IAAA,GACjB,KAAK,gBAAgB,IAAIE,EAAW,MAAMF,CAAU,IAEtDA,EAAW,IAAIC,CAAS;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiBA,GAAsBE,GAA8B;AACnE,UAAML,IAAe,KAAK,SAAS,IAAIG,CAAS;AAChD,QAAI,CAACH,EAAc;AAEnB,IAAAA,EAAa,aAAa,OAAOK,CAAc;AAG/C,UAAMH,IAAa,KAAK,gBAAgB,IAAIG,CAAc;AAC1D,IAAIH,MACFA,EAAW,OAAOC,CAAS,GACvBD,EAAW,SAAS,KACtB,KAAK,gBAAgB,OAAOG,CAAc;AAAA,EAGhD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,OACJF,GACAC,GACAE,IAAkB,CAAA,GAClBC,IAA6B,IACC;AAC9B,UAAMC,IAAY,YAAY,IAAA,GACxBrB,IAAKgB;AAEX,QAAI;AAEF,YAAMH,IAAe,KAAK,SAAS,IAAIb,CAAE;AACzC,UAAI,CAACa;AACH,eAAO,KAAK;AAAA,UACV,sBAAsBG,CAAS;AAAA,UAC/BI;AAAA,UACAC;AAAA,QAAA;AAKJ,MAAI,CAACR,EAAa,YAAYA,EAAa,UACzC,MAAM,KAAK,YAAYb,CAAE;AAI3B,YAAMsB,IAAMT,EAAa,aAAa,IAAII,CAAU;AACpD,UAAI,CAACK;AACH,eAAO,KAAK;AAAA,UACV,yBAAyBL,CAAU,OAAOD,CAAS;AAAA,UACnDI;AAAA,UACAC;AAAA,QAAA;AAKJ,UAAID,EAAQ,cAAc,QAAQnB,EAAgBqB,EAAI,SAASF,EAAQ,UAAU,IAAI;AACnF,eAAO,KAAK;AAAA,UACV,sBAAsBE,EAAI,OAAO,sBAAsBF,EAAQ,UAAU;AAAA,UACzEA;AAAA,UACAC;AAAA,QAAA;AAKJ,YAAME,IAAUD,EAAI,SACdE,IAAUJ,EAAQ,WAAW,KAAK,OAAO;AAI/C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAJa,MAAM,KAAK,kBAAkBG,GAASJ,GAAMK,CAAO;AAAA,QAKhE,WAAWxB;AAAA,QACX,UAAU,YAAY,QAAQqB;AAAA,MAAA;AAAA,IAElC,SAASI,GAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAOA,aAAiB,QAAQA,IAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC;AAAA,QAC/D,UAAU,YAAY,QAAQJ;AAAA,MAAA;AAAA,IAElC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,UACJJ,GACAE,IAAkB,CAAA,GAClBC,IAA6B,CAAA,GACC;AAC9B,UAAMM,IAAa,KAAK,gBAAgB,IAAIT,CAAU;AACtD,QAAI,CAACS,KAAcA,EAAW,SAAS;AACrC,aAAO,KAAK;AAAA,QACV,mCAAmCT,CAAU;AAAA,QAC7CG;AAAA,QACA,YAAY,IAAA;AAAA,MAAI;AAKpB,eAAWpB,KAAM0B;AAEf,UADqB,KAAK,SAAS,IAAI1B,CAAE,GACvB,aAAa;AAC7B,eAAO,KAAK,OAAUA,GAAIiB,GAAYE,GAAMC,CAAO;AAKvD,QAAI,KAAK,OAAO;AACd,iBAAWpB,KAAM0B;AAEf,YADqB,KAAK,SAAS,IAAI1B,CAAE,GACvB;AAChB,iBAAO,KAAK,OAAUA,GAAIiB,GAAYE,GAAMC,CAAO;AAAA;AAKzD,WAAO,KAAK;AAAA,MACV,0CAA0CH,CAAU;AAAA,MACpDG;AAAA,MACA,YAAY,IAAA;AAAA,IAAI;AAAA,EAEpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,WAAWpB,GAAiC;AAC1C,WAAO,KAAK,SAAS,IAAIA,CAAe;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAciB,GAA6B;AACzC,UAAMU,IAAW,KAAK,gBAAgB,IAAIV,CAAU;AACpD,WAAOU,MAAa,UAAaA,EAAS,OAAO;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,0BAA0BV,GAAiC;AACzD,UAAMU,IAAW,KAAK,gBAAgB,IAAIV,CAAU;AACpD,WAAOU,IAAW,MAAM,KAAKA,CAAQ,IAAI,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,uBAAuB3B,GAAkC;AACvD,UAAMa,IAAe,KAAK,SAAS,IAAIb,CAAe;AACtD,WAAOa,IAAe,MAAM,KAAKA,EAAa,aAAa,KAAA,CAAM,IAAI,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAwC;AACtC,WAAO,MAAM,KAAK,KAAK,SAAS,QAAQ;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAWb,GAAyD;AAClE,WAAO,KAAK,SAAS,IAAIA,CAAe;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,YAAYA,GAA8B;AAC9C,UAAMa,IAAe,KAAK,SAAS,IAAIb,CAAE;AACzC,QAAI,CAACa;AACH,YAAM,IAAI,MAAM,sBAAsBb,CAAE,EAAE;AAG5C,QAAIa,EAAa;AACf;AAGF,QAAI,CAACA,EAAa;AAChB,YAAM,IAAI,MAAM,WAAWb,CAAE,gBAAgB;AAI/C,QAAI4B,IAAc,KAAK,gBAAgB,IAAI5B,CAAE;AAC7C,WAAI4B,MAIJA,KAAe,YAAY;AACzB,UAAI;AAEF,mBAAWC,KAAShB,EAAa;AAC/B,gBAAM,KAAK,YAAYgB,CAAK;AAI9B,QAAIhB,EAAa,UAAU,QACzB,MAAMA,EAAa,OAAA,GAErBA,EAAa,WAAW,IAEpB,KAAK,OAAO,SACd,QAAQ,KAAK,mCAAmCA,EAAa,IAAI,EAAE;AAAA,MAEvE,UAAA;AACE,aAAK,gBAAgB,OAAOb,CAAE;AAAA,MAChC;AAAA,IACF,GAAA,GAEA,KAAK,gBAAgB,IAAIA,GAAI4B,CAAW,GACjCA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB5B,GAAqB;AACnC,UAAMa,IAAe,KAAK,SAAS,IAAIb,CAAE;AACzC,IAAIa,MACFA,EAAa,WAAW;AAAA,EAE5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkBb,GAAqB;AACrC,UAAMa,IAAe,KAAK,SAAS,IAAIb,CAAE;AACzC,IAAIa,MACFA,EAAa,WAAW;AAAA,EAE5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAgB;AACd,SAAK,SAAS,MAAA,GACd,KAAK,gBAAgB,MAAA,GACrB,KAAK,gBAAgB,MAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,cACNiB,GACAV,GACAC,GACqB;AACrB,QAAIU;AASJ,YARIX,EAAQ,mBAAmB,KAC7BW,IAAW,UACFX,EAAQ,aAAa,SAC9BW,IAAW,iBAEXA,IAAW,KAAK,OAAO,yBAGjBA,GAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO,IAAI,MAAMD,CAAO;AAAA,UACxB,UAAU,YAAY,QAAQT;AAAA,QAAA;AAAA,MAGlC,KAAK;AACH,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAOD,EAAQ;AAAA,UACf,UAAU,YAAY,QAAQC;AAAA,QAAA;AAAA,MAGlC,KAAK;AAAA,MACL;AACE,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,UACP,UAAU,YAAY,QAAQA;AAAA,QAAA;AAAA,IAChC;AAAA,EAEN;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBACZE,GACAJ,GACAK,GACY;AACZ,WAAO,IAAI,QAAW,CAACQ,GAASC,MAAW;AACzC,YAAMC,IAAY,WAAW,MAAM;AACjC,QAAAD,EAAO,IAAI,MAAM,8BAA8BT,CAAO,IAAI,CAAC;AAAA,MAC7D,GAAGA,CAAO;AAEV,UAAI;AACF,cAAMW,IAASZ,EAAQ,GAAGJ,CAAI;AAE9B,QAAIgB,aAAkB,UACpBA,EACG,KAAK,CAACC,MAAU;AACf,uBAAaF,CAAS,GACtBF,EAAQI,CAAK;AAAA,QACf,CAAC,EACA,MAAM,CAACX,MAAmB;AACzB,uBAAaS,CAAS,GACtBD,EAAOR,aAAiB,QAAQA,IAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,CAAC;AAAA,QAClE,CAAC,KAEH,aAAaS,CAAS,GACtBF,EAAQG,CAAM;AAAA,MAElB,SAASV,GAAgB;AACvB,qBAAaS,CAAS,GACtBD,EAAOR,aAAiB,QAAQA,IAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,CAAC;AAAA,MAClE;AAAA,IACF,CAAC;AAAA,EACH;AACF;AASA,IAAIY,IAAyC;AAMtC,SAASC,EACd1B,GACmB;AACnB,SAAAyB,MAAiB,IAAI1B,EAAkBC,CAAM,GACtCyB;AACT;AAMO,SAASE,EAAiBC,GAAiC;AAChE,EAAIH,KACFA,EAAa,QAAA,GAEfA,IAAeG;AACjB;AAKO,SAASC,IAA2B;AACzC,EAAIJ,MACFA,EAAa,QAAA,GACbA,IAAe;AAEnB;AASO,SAASK,EAAgB7B,GAAyC;AACvE,EAAAyB,EAAA,EAAmB,gBAAgBzB,CAAY;AACjD;AAKA,eAAsB8B,EACpB3B,GACAC,GACAE,GACAC,GAC8B;AAC9B,SAAOkB,IAAmB;AAAA,IACxBtB;AAAA,IACAC;AAAA,IACAE;AAAA,IACAC;AAAA,EAAA;AAEJ;AAKA,eAAsBwB,EACpB3B,GACAE,GACAC,GAC8B;AAC9B,SAAOkB,EAAA,EAAmB,UAAarB,GAAYE,GAAMC,CAAO;AAClE;"}