{"version":3,"file":"animation-orchestrator.mjs","sources":["../../../src/lib/ux/animation-orchestrator.ts"],"sourcesContent":["/**\n * @file Animation Orchestrator\n * @description Performance-safe animation utilities with reduced motion support,\n * sequencing, and frame budget management.\n *\n * Features:\n * - Reduced motion support\n * - Animation sequencing\n * - Frame budget management\n * - CSS animation helpers\n * - Intersection-based animations\n * - Stagger animations\n */\n\n/* eslint-disable @typescript-eslint/strict-boolean-expressions, @typescript-eslint/prefer-nullish-coalescing, no-nested-ternary, no-case-declarations */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Animation timing function\n */\nexport type TimingFunction =\n  | 'linear'\n  | 'ease'\n  | 'ease-in'\n  | 'ease-out'\n  | 'ease-in-out'\n  | 'spring'\n  | string;\n\n/**\n * Animation state\n */\nexport type AnimationState = 'idle' | 'running' | 'paused' | 'finished' | 'cancelled';\n\n/**\n * Animation options\n */\nexport interface AnimationOptions {\n  /** Duration in ms */\n  duration: number;\n  /** Timing function */\n  easing: TimingFunction;\n  /** Delay before start in ms */\n  delay?: number;\n  /** Number of iterations */\n  iterations?: number;\n  /** Direction */\n  direction?: 'normal' | 'reverse' | 'alternate' | 'alternate-reverse';\n  /** Fill mode */\n  fill?: 'none' | 'forwards' | 'backwards' | 'both';\n  /** Respect reduced motion preference */\n  respectReducedMotion?: boolean;\n  /** Reduced motion fallback duration */\n  reducedMotionDuration?: number;\n}\n\n/**\n * Keyframe definition\n */\nexport interface AnimationKeyframe {\n  offset?: number;\n  opacity?: number;\n  transform?: string;\n  [property: string]: string | number | undefined;\n}\n\n/**\n * Animation sequence item\n */\nexport interface SequenceItem {\n  element: HTMLElement | string;\n  keyframes: AnimationKeyframe[] | PropertyIndexedKeyframes;\n  options?: Partial<AnimationOptions>;\n  offset?: number; // Start offset relative to sequence start\n}\n\n/**\n * Stagger options\n */\nexport interface StaggerOptions extends AnimationOptions {\n  /** Delay between each item in ms */\n  stagger: number;\n  /** Direction of stagger */\n  staggerDirection?: 'forward' | 'reverse' | 'center' | 'random';\n  /** Starting index for stagger */\n  startIndex?: number;\n}\n\n/**\n * Animation controller\n */\nexport interface AnimationController {\n  play: () => void;\n  pause: () => void;\n  reverse: () => void;\n  cancel: () => void;\n  finish: () => void;\n  getState: () => AnimationState;\n  getCurrentTime: () => number;\n  setCurrentTime: (time: number) => void;\n  onFinish: (callback: () => void) => void;\n  onCancel: (callback: () => void) => void;\n}\n\n/**\n * Intersection animation options\n */\nexport interface IntersectionAnimationOptions extends AnimationOptions {\n  /** Root element for intersection */\n  root?: Element | null;\n  /** Root margin */\n  rootMargin?: string;\n  /** Intersection threshold */\n  threshold?: number | number[];\n  /** Animate only once */\n  once?: boolean;\n  /** Animate on exit as well */\n  animateOnExit?: boolean;\n  /** Exit keyframes */\n  exitKeyframes?: AnimationKeyframe[];\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_OPTIONS: AnimationOptions = {\n  duration: 300,\n  easing: 'ease-out',\n  delay: 0,\n  iterations: 1,\n  direction: 'normal',\n  fill: 'forwards',\n  respectReducedMotion: true,\n  reducedMotionDuration: 0,\n};\n\n/**\n * Common easing functions\n */\nexport const EASING = {\n  linear: 'linear',\n  ease: 'ease',\n  easeIn: 'ease-in',\n  easeOut: 'ease-out',\n  easeInOut: 'ease-in-out',\n  // Custom cubic beziers\n  easeInQuad: 'cubic-bezier(0.55, 0.085, 0.68, 0.53)',\n  easeOutQuad: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',\n  easeInOutQuad: 'cubic-bezier(0.455, 0.03, 0.515, 0.955)',\n  easeInCubic: 'cubic-bezier(0.55, 0.055, 0.675, 0.19)',\n  easeOutCubic: 'cubic-bezier(0.215, 0.61, 0.355, 1)',\n  easeInOutCubic: 'cubic-bezier(0.645, 0.045, 0.355, 1)',\n  easeInQuart: 'cubic-bezier(0.895, 0.03, 0.685, 0.22)',\n  easeOutQuart: 'cubic-bezier(0.165, 0.84, 0.44, 1)',\n  easeInOutQuart: 'cubic-bezier(0.77, 0, 0.175, 1)',\n  spring: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n  bounce: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n};\n\n/**\n * Common animation presets\n */\nexport const PRESETS = {\n  fadeIn: [{ opacity: 0 }, { opacity: 1 }],\n  fadeOut: [{ opacity: 1 }, { opacity: 0 }],\n  slideUp: [\n    { transform: 'translateY(20px)', opacity: 0 },\n    { transform: 'translateY(0)', opacity: 1 },\n  ],\n  slideDown: [\n    { transform: 'translateY(-20px)', opacity: 0 },\n    { transform: 'translateY(0)', opacity: 1 },\n  ],\n  slideLeft: [\n    { transform: 'translateX(20px)', opacity: 0 },\n    { transform: 'translateX(0)', opacity: 1 },\n  ],\n  slideRight: [\n    { transform: 'translateX(-20px)', opacity: 0 },\n    { transform: 'translateX(0)', opacity: 1 },\n  ],\n  scaleIn: [\n    { transform: 'scale(0.9)', opacity: 0 },\n    { transform: 'scale(1)', opacity: 1 },\n  ],\n  scaleOut: [\n    { transform: 'scale(1)', opacity: 1 },\n    { transform: 'scale(0.9)', opacity: 0 },\n  ],\n  rotate: [{ transform: 'rotate(0deg)' }, { transform: 'rotate(360deg)' }],\n  shake: [\n    { transform: 'translateX(0)' },\n    { transform: 'translateX(-10px)' },\n    { transform: 'translateX(10px)' },\n    { transform: 'translateX(-10px)' },\n    { transform: 'translateX(10px)' },\n    { transform: 'translateX(0)' },\n  ],\n  pulse: [{ transform: 'scale(1)' }, { transform: 'scale(1.05)' }, { transform: 'scale(1)' }],\n};\n\n// ============================================================================\n// Animation Orchestrator\n// ============================================================================\n\n/**\n * Animation orchestrator for coordinating animations\n */\nexport class AnimationOrchestrator {\n  private animations: Map<string, Animation> = new Map();\n  private reducedMotion: boolean;\n  private frameCallbacks: Array<(timestamp: number) => boolean> = [];\n  private rafId: number | null = null;\n\n  constructor() {\n    this.reducedMotion = this.checkReducedMotion();\n    this.setupReducedMotionListener();\n  }\n\n  /**\n   * Animate an element with keyframes\n   */\n  animate(\n    element: HTMLElement | string,\n    keyframes: AnimationKeyframe[] | PropertyIndexedKeyframes,\n    options: Partial<AnimationOptions> = {}\n  ): AnimationController {\n    const el = typeof element === 'string' ? document.querySelector<HTMLElement>(element) : element;\n    if (!el) {\n      return this.createNoopController();\n    }\n\n    const fullOptions = { ...DEFAULT_OPTIONS, ...options };\n\n    // Respect reduced motion\n    if ((fullOptions.respectReducedMotion ?? false) && this.reducedMotion) {\n      return this.animateReduced(el, keyframes, fullOptions);\n    }\n\n    const webAnimationOptions: KeyframeAnimationOptions = {\n      duration: fullOptions.duration,\n      easing: this.resolveEasing(fullOptions.easing),\n      delay: fullOptions.delay,\n      iterations: fullOptions.iterations,\n      direction: fullOptions.direction,\n      fill: fullOptions.fill,\n    };\n\n    const animation = el.animate(keyframes, webAnimationOptions);\n    const id = this.generateId();\n    this.animations.set(id, animation);\n\n    return this.createController(animation, id);\n  }\n\n  /**\n   * Run animation sequence\n   */\n  sequence(items: SequenceItem[]): AnimationController {\n    const controllers: AnimationController[] = [];\n    let maxDuration = 0;\n\n    for (const item of items) {\n      const offset = item.offset ?? 0;\n      const delay = (item.options?.delay ?? 0) + offset;\n      const duration = (item.options?.duration ?? DEFAULT_OPTIONS.duration) + delay;\n      maxDuration = Math.max(maxDuration, duration);\n\n      const controller = this.animate(item.element, item.keyframes, {\n        ...item.options,\n        delay,\n      });\n\n      controllers.push(controller);\n    }\n\n    return this.createGroupController(controllers);\n  }\n\n  /**\n   * Stagger animations across elements\n   */\n  stagger(\n    elements: HTMLElement[] | NodeListOf<HTMLElement> | string,\n    keyframes: AnimationKeyframe[] | PropertyIndexedKeyframes,\n    options: Partial<StaggerOptions> = {}\n  ): AnimationController {\n    const els =\n      typeof elements === 'string'\n        ? Array.from(document.querySelectorAll<HTMLElement>(elements))\n        : Array.from(elements);\n\n    if (els.length === 0) {\n      return this.createNoopController();\n    }\n\n    const fullOptions: StaggerOptions = {\n      ...DEFAULT_OPTIONS,\n      stagger: 50,\n      staggerDirection: 'forward',\n      startIndex: 0,\n      ...options,\n    };\n\n    const controllers: AnimationController[] = [];\n    const delays = this.calculateStaggerDelays(els.length, fullOptions);\n\n    els.forEach((el, index) => {\n      const delayValue = delays[index] ?? 0;\n      const controller = this.animate(el, keyframes, {\n        ...fullOptions,\n        delay: (fullOptions.delay ?? 0) + (!Number.isNaN(delayValue) ? delayValue : 0),\n      });\n      controllers.push(controller);\n    });\n\n    return this.createGroupController(controllers);\n  }\n\n  /**\n   * Create intersection-triggered animation\n   */\n  onIntersect(\n    element: HTMLElement | string,\n    keyframes: AnimationKeyframe[] | PropertyIndexedKeyframes,\n    options: Partial<IntersectionAnimationOptions> = {}\n  ): { observe: () => void; disconnect: () => void } {\n    const el = typeof element === 'string' ? document.querySelector<HTMLElement>(element) : element;\n    if (!el) {\n      return { observe: () => {}, disconnect: () => {} };\n    }\n\n    const fullOptions: IntersectionAnimationOptions = {\n      ...DEFAULT_OPTIONS,\n      root: options.root ?? null,\n      rootMargin: options.rootMargin ?? '0px',\n      threshold: options.threshold ?? 0.1,\n      once: options.once ?? true,\n      animateOnExit: options.animateOnExit ?? false,\n      ...options,\n    };\n\n    let hasAnimated = false;\n    let observer: IntersectionObserver | null = null;\n\n    const observe = (): void => {\n      observer = new IntersectionObserver(\n        (entries) => {\n          entries.forEach((entry) => {\n            if (entry.isIntersecting) {\n              if (!hasAnimated || !fullOptions.once) {\n                this.animate(el, keyframes, fullOptions);\n                hasAnimated = true;\n              }\n            } else if (fullOptions.animateOnExit && fullOptions.exitKeyframes) {\n              this.animate(el, fullOptions.exitKeyframes, fullOptions);\n            }\n          });\n        },\n        {\n          root: fullOptions.root,\n          rootMargin: fullOptions.rootMargin,\n          threshold: fullOptions.threshold,\n        }\n      );\n\n      observer.observe(el);\n    };\n\n    const disconnect = (): void => {\n      observer?.disconnect();\n      observer = null;\n    };\n\n    return { observe, disconnect };\n  }\n\n  /**\n   * Animate with spring physics\n   */\n  spring(\n    element: HTMLElement | string,\n    from: Record<string, number>,\n    to: Record<string, number>,\n    options: {\n      stiffness?: number;\n      damping?: number;\n      mass?: number;\n      velocity?: number;\n      respectReducedMotion?: boolean;\n    } = {}\n  ): AnimationController {\n    const el = typeof element === 'string' ? document.querySelector<HTMLElement>(element) : element;\n    if (!el) {\n      return this.createNoopController();\n    }\n\n    const {\n      stiffness = 170,\n      damping = 26,\n      mass = 1,\n      velocity = 0,\n      respectReducedMotion = true,\n    } = options;\n\n    // Use simple animation for reduced motion\n    if (respectReducedMotion && this.reducedMotion) {\n      // Convert Record<string, number> to AnimationKeyframe format\n      const keyframes: AnimationKeyframe[] = [\n        Object.fromEntries(Object.entries(from).map(([k, v]) => [k, v])),\n        Object.fromEntries(Object.entries(to).map(([k, v]) => [k, v])),\n      ];\n      return this.animate(el, keyframes, {\n        duration: 0,\n        respectReducedMotion: false,\n      });\n    }\n\n    let currentVelocity = velocity;\n    const state: Record<string, number> = { ...from };\n    let finished = false;\n    let cancelled = false;\n    const finishCallbacks: Array<() => void> = [];\n    const cancelCallbacks: Array<() => void> = [];\n\n    const update = (_timestamp: number): boolean => {\n      if (finished || cancelled) return false;\n\n      const dt = Math.min(1 / 60, 0.016); // Cap at 60fps\n      let allSettled = true;\n\n      for (const key in to) {\n        const target = to[key];\n        const current = state[key];\n        if (target === undefined || current === undefined) continue;\n        const diff = target - current;\n\n        // Spring physics\n        const springForce = stiffness * diff;\n        const dampingForce = damping * currentVelocity;\n        const acceleration = (springForce - dampingForce) / mass;\n\n        currentVelocity += acceleration * dt;\n        state[key] = current + currentVelocity * dt;\n\n        // Check if settled\n        if (Math.abs(diff) > 0.01 || Math.abs(currentVelocity) > 0.01) {\n          allSettled = false;\n        }\n      }\n\n      // Apply to element\n      this.applyState(el, state);\n\n      if (allSettled) {\n        finished = true;\n        this.applyState(el, to);\n        finishCallbacks.forEach((cb) => cb());\n        return false;\n      }\n\n      return true;\n    };\n\n    this.addFrameCallback(update);\n\n    return {\n      play: () => {},\n      pause: () => {},\n      reverse: () => {},\n      cancel: () => {\n        cancelled = true;\n        cancelCallbacks.forEach((cb) => cb());\n      },\n      finish: () => {\n        finished = true;\n        this.applyState(el, to);\n        finishCallbacks.forEach((cb) => cb());\n      },\n      getState: () => (finished ? 'finished' : cancelled ? 'cancelled' : 'running'),\n      getCurrentTime: () => 0,\n      setCurrentTime: () => {},\n      onFinish: (cb) => finishCallbacks.push(cb),\n      onCancel: (cb) => cancelCallbacks.push(cb),\n    };\n  }\n\n  /**\n   * Cancel all running animations\n   */\n  cancelAll(): void {\n    this.animations.forEach((animation) => {\n      animation.cancel();\n    });\n    this.animations.clear();\n  }\n\n  /**\n   * Get reduced motion preference\n   */\n  isReducedMotion(): boolean {\n    return this.reducedMotion;\n  }\n\n  // ============================================================================\n  // Private Methods\n  // ============================================================================\n\n  private checkReducedMotion(): boolean {\n    if (typeof window === 'undefined') return false;\n    return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  }\n\n  private setupReducedMotionListener(): void {\n    if (typeof window === 'undefined') return;\n\n    const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');\n    mediaQuery.addEventListener('change', (e) => {\n      this.reducedMotion = e.matches;\n    });\n  }\n\n  private animateReduced(\n    element: HTMLElement,\n    keyframes: AnimationKeyframe[] | PropertyIndexedKeyframes,\n    options: AnimationOptions\n  ): AnimationController {\n    const duration = options.reducedMotionDuration || 0;\n\n    if (duration === 0) {\n      // Apply final state immediately\n      const finalKeyframe = Array.isArray(keyframes) ? keyframes[keyframes.length - 1] : keyframes;\n\n      if (!finalKeyframe) {\n        return this.createNoopController('finished');\n      }\n\n      Object.entries(finalKeyframe).forEach(([key, value]) => {\n        if (key !== 'offset' && value !== undefined) {\n          element.style.setProperty(key, String(value));\n        }\n      });\n\n      return this.createNoopController('finished');\n    }\n\n    return this.animate(element, keyframes, {\n      ...options,\n      duration,\n      respectReducedMotion: false,\n    });\n  }\n\n  private resolveEasing(easing: TimingFunction): string {\n    return easing in EASING ? EASING[easing as keyof typeof EASING] : easing;\n  }\n\n  private calculateStaggerDelays(count: number, options: StaggerOptions): number[] {\n    const delays: number[] = [];\n    const { stagger, staggerDirection, startIndex = 0 } = options;\n\n    for (let i = 0; i < count; i++) {\n      let delay: number;\n\n      switch (staggerDirection) {\n        case 'reverse':\n          delay = (count - 1 - i) * stagger;\n          break;\n        case 'center':\n          const center = count / 2;\n          delay = Math.abs(i - center) * stagger;\n          break;\n        case 'random':\n          delay = Math.random() * count * stagger;\n          break;\n        case 'forward':\n        default:\n          delay = (i - startIndex) * stagger;\n          if (delay < 0) delay = 0;\n      }\n\n      delays.push(delay);\n    }\n\n    return delays;\n  }\n\n  private applyState(element: HTMLElement, state: Record<string, number>): void {\n    const transforms: string[] = [];\n\n    for (const [key, value] of Object.entries(state)) {\n      if (key === 'x') {\n        transforms.push(`translateX(${value}px)`);\n      } else if (key === 'y') {\n        transforms.push(`translateY(${value}px)`);\n      } else if (key === 'scale') {\n        transforms.push(`scale(${value})`);\n      } else if (key === 'rotate') {\n        transforms.push(`rotate(${value}deg)`);\n      } else if (key === 'opacity') {\n        element.style.opacity = String(value);\n      } else {\n        element.style.setProperty(key, String(value));\n      }\n    }\n\n    if (transforms.length > 0) {\n      element.style.transform = transforms.join(' ');\n    }\n  }\n\n  private addFrameCallback(callback: (timestamp: number) => boolean): void {\n    this.frameCallbacks.push(callback);\n    this.startFrameLoop();\n  }\n\n  private startFrameLoop(): void {\n    if (this.rafId !== null) return;\n\n    const loop = (timestamp: number): void => {\n      this.frameCallbacks = this.frameCallbacks.filter((cb) => cb(timestamp));\n\n      if (this.frameCallbacks.length > 0) {\n        this.rafId = requestAnimationFrame(loop);\n      } else {\n        this.rafId = null;\n      }\n    };\n\n    this.rafId = requestAnimationFrame(loop);\n  }\n\n  private createController(animation: Animation, id: string): AnimationController {\n    return {\n      play: () => animation.play(),\n      pause: () => animation.pause(),\n      reverse: () => animation.reverse(),\n      cancel: () => {\n        animation.cancel();\n        this.animations.delete(id);\n      },\n      finish: () => animation.finish(),\n      getState: () => animation.playState as AnimationState,\n      getCurrentTime: () => (animation.currentTime as number) || 0,\n      setCurrentTime: (time) => {\n        animation.currentTime = time;\n      },\n      onFinish: (callback) => {\n        animation.addEventListener('finish', callback);\n      },\n      onCancel: (callback) => {\n        animation.addEventListener('cancel', callback);\n      },\n    };\n  }\n\n  private createGroupController(controllers: AnimationController[]): AnimationController {\n    return {\n      play: () => controllers.forEach((c) => c.play()),\n      pause: () => controllers.forEach((c) => c.pause()),\n      reverse: () => controllers.forEach((c) => c.reverse()),\n      cancel: () => controllers.forEach((c) => c.cancel()),\n      finish: () => controllers.forEach((c) => c.finish()),\n      getState: () => {\n        const states = controllers.map((c) => c.getState());\n        if (states.every((s) => s === 'finished')) return 'finished';\n        if (states.every((s) => s === 'idle')) return 'idle';\n        if (states.some((s) => s === 'running')) return 'running';\n        if (states.some((s) => s === 'paused')) return 'paused';\n        return 'cancelled';\n      },\n      getCurrentTime: () => Math.max(...controllers.map((c) => c.getCurrentTime())),\n      setCurrentTime: (time) => controllers.forEach((c) => c.setCurrentTime(time)),\n      onFinish: (callback) => {\n        let finishedCount = 0;\n        controllers.forEach((c) => {\n          c.onFinish(() => {\n            finishedCount++;\n            if (finishedCount === controllers.length) {\n              callback();\n            }\n          });\n        });\n      },\n      onCancel: (callback) => controllers.forEach((c) => c.onCancel(callback)),\n    };\n  }\n\n  private createNoopController(initialState: AnimationState = 'idle'): AnimationController {\n    return {\n      play: () => {},\n      pause: () => {},\n      reverse: () => {},\n      cancel: () => {},\n      finish: () => {},\n      getState: () => initialState,\n      getCurrentTime: () => 0,\n      setCurrentTime: () => {},\n      onFinish: () => {},\n      onCancel: () => {},\n    };\n  }\n\n  private generateId(): string {\n    return `anim-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n  }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet orchestratorInstance: AnimationOrchestrator | null = null;\n\n/**\n * Get or create the global animation orchestrator\n */\nexport function getAnimationOrchestrator(): AnimationOrchestrator {\n  if (!orchestratorInstance) {\n    orchestratorInstance = new AnimationOrchestrator();\n  }\n  return orchestratorInstance;\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Animate an element\n */\nexport function animate(\n  element: HTMLElement | string,\n  keyframes: AnimationKeyframe[] | PropertyIndexedKeyframes,\n  options?: Partial<AnimationOptions>\n): AnimationController {\n  return getAnimationOrchestrator().animate(element, keyframes, options);\n}\n\n/**\n * Run animation sequence\n */\nexport function animateSequence(items: SequenceItem[]): AnimationController {\n  return getAnimationOrchestrator().sequence(items);\n}\n\n/**\n * Stagger animations\n */\nexport function animateStagger(\n  elements: HTMLElement[] | NodeListOf<HTMLElement> | string,\n  keyframes: AnimationKeyframe[] | PropertyIndexedKeyframes,\n  options?: Partial<StaggerOptions>\n): AnimationController {\n  return getAnimationOrchestrator().stagger(elements, keyframes, options);\n}\n\n/**\n * Spring animation\n */\nexport function animateSpring(\n  element: HTMLElement | string,\n  from: Record<string, number>,\n  to: Record<string, number>,\n  options?: Parameters<AnimationOrchestrator['spring']>[3]\n): AnimationController {\n  return getAnimationOrchestrator().spring(element, from, to, options);\n}\n"],"names":["DEFAULT_OPTIONS","EASING","PRESETS","AnimationOrchestrator","element","keyframes","options","el","fullOptions","webAnimationOptions","animation","id","items","controllers","item","offset","delay","controller","elements","els","delays","index","delayValue","hasAnimated","observer","entries","entry","from","to","stiffness","damping","mass","velocity","respectReducedMotion","k","v","currentVelocity","state","finished","cancelled","finishCallbacks","cancelCallbacks","update","_timestamp","dt","allSettled","key","target","current","diff","springForce","dampingForce","acceleration","cb","e","duration","finalKeyframe","value","easing","count","stagger","staggerDirection","startIndex","i","center","transforms","callback","loop","timestamp","time","c","states","s","finishedCount","initialState","orchestratorInstance","getAnimationOrchestrator","animate","animateSequence","animateStagger","animateSpring"],"mappings":"AAiIA,MAAMA,IAAoC;AAAA,EACxC,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,MAAM;AAAA,EACN,sBAAsB;AAAA,EACtB,uBAAuB;AACzB,GAKaC,IAAS;AAAA,EACpB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA;AAAA,EAEX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,eAAe;AAAA,EACf,aAAa;AAAA,EACb,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,QAAQ;AACV,GAKaC,IAAU;AAAA,EACrB,QAAQ,CAAC,EAAE,SAAS,KAAK,EAAE,SAAS,GAAG;AAAA,EACvC,SAAS,CAAC,EAAE,SAAS,KAAK,EAAE,SAAS,GAAG;AAAA,EACxC,SAAS;AAAA,IACP,EAAE,WAAW,oBAAoB,SAAS,EAAA;AAAA,IAC1C,EAAE,WAAW,iBAAiB,SAAS,EAAA;AAAA,EAAE;AAAA,EAE3C,WAAW;AAAA,IACT,EAAE,WAAW,qBAAqB,SAAS,EAAA;AAAA,IAC3C,EAAE,WAAW,iBAAiB,SAAS,EAAA;AAAA,EAAE;AAAA,EAE3C,WAAW;AAAA,IACT,EAAE,WAAW,oBAAoB,SAAS,EAAA;AAAA,IAC1C,EAAE,WAAW,iBAAiB,SAAS,EAAA;AAAA,EAAE;AAAA,EAE3C,YAAY;AAAA,IACV,EAAE,WAAW,qBAAqB,SAAS,EAAA;AAAA,IAC3C,EAAE,WAAW,iBAAiB,SAAS,EAAA;AAAA,EAAE;AAAA,EAE3C,SAAS;AAAA,IACP,EAAE,WAAW,cAAc,SAAS,EAAA;AAAA,IACpC,EAAE,WAAW,YAAY,SAAS,EAAA;AAAA,EAAE;AAAA,EAEtC,UAAU;AAAA,IACR,EAAE,WAAW,YAAY,SAAS,EAAA;AAAA,IAClC,EAAE,WAAW,cAAc,SAAS,EAAA;AAAA,EAAE;AAAA,EAExC,QAAQ,CAAC,EAAE,WAAW,kBAAkB,EAAE,WAAW,kBAAkB;AAAA,EACvE,OAAO;AAAA,IACL,EAAE,WAAW,gBAAA;AAAA,IACb,EAAE,WAAW,oBAAA;AAAA,IACb,EAAE,WAAW,mBAAA;AAAA,IACb,EAAE,WAAW,oBAAA;AAAA,IACb,EAAE,WAAW,mBAAA;AAAA,IACb,EAAE,WAAW,gBAAA;AAAA,EAAgB;AAAA,EAE/B,OAAO,CAAC,EAAE,WAAW,WAAA,GAAc,EAAE,WAAW,cAAA,GAAiB,EAAE,WAAW,YAAY;AAC5F;AASO,MAAMC,EAAsB;AAAA,EACzB,iCAAyC,IAAA;AAAA,EACzC;AAAA,EACA,iBAAwD,CAAA;AAAA,EACxD,QAAuB;AAAA,EAE/B,cAAc;AACZ,SAAK,gBAAgB,KAAK,mBAAA,GAC1B,KAAK,2BAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,QACEC,GACAC,GACAC,IAAqC,CAAA,GAChB;AACrB,UAAMC,IAAK,OAAOH,KAAY,WAAW,SAAS,cAA2BA,CAAO,IAAIA;AACxF,QAAI,CAACG;AACH,aAAO,KAAK,qBAAA;AAGd,UAAMC,IAAc,EAAE,GAAGR,GAAiB,GAAGM,EAAA;AAG7C,SAAKE,EAAY,wBAAwB,OAAU,KAAK;AACtD,aAAO,KAAK,eAAeD,GAAIF,GAAWG,CAAW;AAGvD,UAAMC,IAAgD;AAAA,MACpD,UAAUD,EAAY;AAAA,MACtB,QAAQ,KAAK,cAAcA,EAAY,MAAM;AAAA,MAC7C,OAAOA,EAAY;AAAA,MACnB,YAAYA,EAAY;AAAA,MACxB,WAAWA,EAAY;AAAA,MACvB,MAAMA,EAAY;AAAA,IAAA,GAGdE,IAAYH,EAAG,QAAQF,GAAWI,CAAmB,GACrDE,IAAK,KAAK,WAAA;AAChB,gBAAK,WAAW,IAAIA,GAAID,CAAS,GAE1B,KAAK,iBAAiBA,GAAWC,CAAE;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,SAASC,GAA4C;AACnD,UAAMC,IAAqC,CAAA;AAG3C,eAAWC,KAAQF,GAAO;AACxB,YAAMG,IAASD,EAAK,UAAU,GACxBE,KAASF,EAAK,SAAS,SAAS,KAAKC;AACrC,OAAYD,EAAK,SAAS,YAAYd,EAAgB,YAAYgB;AAGxE,YAAMC,IAAa,KAAK,QAAQH,EAAK,SAASA,EAAK,WAAW;AAAA,QAC5D,GAAGA,EAAK;AAAA,QACR,OAAAE;AAAA,MAAA,CACD;AAED,MAAAH,EAAY,KAAKI,CAAU;AAAA,IAC7B;AAEA,WAAO,KAAK,sBAAsBJ,CAAW;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,QACEK,GACAb,GACAC,IAAmC,CAAA,GACd;AACrB,UAAMa,IAEA,MAAM,KADV,OAAOD,KAAa,WACL,SAAS,iBAA8BA,CAAQ,IAC/CA,CADgD;AAGjE,QAAIC,EAAI,WAAW;AACjB,aAAO,KAAK,qBAAA;AAGd,UAAMX,IAA8B;AAAA,MAClC,GAAGR;AAAA,MACH,SAAS;AAAA,MACT,kBAAkB;AAAA,MAClB,YAAY;AAAA,MACZ,GAAGM;AAAA,IAAA,GAGCO,IAAqC,CAAA,GACrCO,IAAS,KAAK,uBAAuBD,EAAI,QAAQX,CAAW;AAElE,WAAAW,EAAI,QAAQ,CAACZ,GAAIc,MAAU;AACzB,YAAMC,IAAaF,EAAOC,CAAK,KAAK,GAC9BJ,IAAa,KAAK,QAAQV,GAAIF,GAAW;AAAA,QAC7C,GAAGG;AAAA,QACH,QAAQA,EAAY,SAAS,MAAO,OAAO,MAAMc,CAAU,IAAiB,IAAbA;AAAA,MAAa,CAC7E;AACD,MAAAT,EAAY,KAAKI,CAAU;AAAA,IAC7B,CAAC,GAEM,KAAK,sBAAsBJ,CAAW;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,YACET,GACAC,GACAC,IAAiD,CAAA,GACA;AACjD,UAAMC,IAAK,OAAOH,KAAY,WAAW,SAAS,cAA2BA,CAAO,IAAIA;AACxF,QAAI,CAACG;AACH,aAAO,EAAE,SAAS,MAAM;AAAA,MAAC,GAAG,YAAY,MAAM;AAAA,MAAC,EAAA;AAGjD,UAAMC,IAA4C;AAAA,MAChD,GAAGR;AAAA,MACH,MAAMM,EAAQ,QAAQ;AAAA,MACtB,YAAYA,EAAQ,cAAc;AAAA,MAClC,WAAWA,EAAQ,aAAa;AAAA,MAChC,MAAMA,EAAQ,QAAQ;AAAA,MACtB,eAAeA,EAAQ,iBAAiB;AAAA,MACxC,GAAGA;AAAA,IAAA;AAGL,QAAIiB,IAAc,IACdC,IAAwC;AA+B5C,WAAO,EAAE,SA7BO,MAAY;AAC1B,MAAAA,IAAW,IAAI;AAAA,QACb,CAACC,MAAY;AACX,UAAAA,EAAQ,QAAQ,CAACC,MAAU;AACzB,YAAIA,EAAM,kBACJ,CAACH,KAAe,CAACf,EAAY,UAC/B,KAAK,QAAQD,GAAIF,GAAWG,CAAW,GACvCe,IAAc,MAEPf,EAAY,iBAAiBA,EAAY,iBAClD,KAAK,QAAQD,GAAIC,EAAY,eAAeA,CAAW;AAAA,UAE3D,CAAC;AAAA,QACH;AAAA,QACA;AAAA,UACE,MAAMA,EAAY;AAAA,UAClB,YAAYA,EAAY;AAAA,UACxB,WAAWA,EAAY;AAAA,QAAA;AAAA,MACzB,GAGFgB,EAAS,QAAQjB,CAAE;AAAA,IACrB,GAOkB,YALC,MAAY;AAC7B,MAAAiB,GAAU,WAAA,GACVA,IAAW;AAAA,IACb,EAEkB;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,OACEpB,GACAuB,GACAC,GACAtB,IAMI,CAAA,GACiB;AACrB,UAAMC,IAAK,OAAOH,KAAY,WAAW,SAAS,cAA2BA,CAAO,IAAIA;AACxF,QAAI,CAACG;AACH,aAAO,KAAK,qBAAA;AAGd,UAAM;AAAA,MACJ,WAAAsB,IAAY;AAAA,MACZ,SAAAC,IAAU;AAAA,MACV,MAAAC,IAAO;AAAA,MACP,UAAAC,IAAW;AAAA,MACX,sBAAAC,IAAuB;AAAA,IAAA,IACrB3B;AAGJ,QAAI2B,KAAwB,KAAK,eAAe;AAE9C,YAAM5B,IAAiC;AAAA,QACrC,OAAO,YAAY,OAAO,QAAQsB,CAAI,EAAE,IAAI,CAAC,CAACO,GAAGC,CAAC,MAAM,CAACD,GAAGC,CAAC,CAAC,CAAC;AAAA,QAC/D,OAAO,YAAY,OAAO,QAAQP,CAAE,EAAE,IAAI,CAAC,CAACM,GAAGC,CAAC,MAAM,CAACD,GAAGC,CAAC,CAAC,CAAC;AAAA,MAAA;AAE/D,aAAO,KAAK,QAAQ5B,GAAIF,GAAW;AAAA,QACjC,UAAU;AAAA,QACV,sBAAsB;AAAA,MAAA,CACvB;AAAA,IACH;AAEA,QAAI+B,IAAkBJ;AACtB,UAAMK,IAAgC,EAAE,GAAGV,EAAA;AAC3C,QAAIW,IAAW,IACXC,IAAY;AAChB,UAAMC,IAAqC,CAAA,GACrCC,IAAqC,CAAA,GAErCC,IAAS,CAACC,MAAgC;AAC9C,UAAIL,KAAYC,EAAW,QAAO;AAElC,YAAMK,IAAK,KAAK,IAAI,IAAI,IAAI,KAAK;AACjC,UAAIC,IAAa;AAEjB,iBAAWC,KAAOlB,GAAI;AACpB,cAAMmB,IAASnB,EAAGkB,CAAG,GACfE,IAAUX,EAAMS,CAAG;AACzB,YAAIC,MAAW,UAAaC,MAAY,OAAW;AACnD,cAAMC,IAAOF,IAASC,GAGhBE,IAAcrB,IAAYoB,GAC1BE,IAAerB,IAAUM,GACzBgB,KAAgBF,IAAcC,KAAgBpB;AAEpD,QAAAK,KAAmBgB,IAAeR,GAClCP,EAAMS,CAAG,IAAIE,IAAUZ,IAAkBQ,IAGrC,KAAK,IAAIK,CAAI,IAAI,QAAQ,KAAK,IAAIb,CAAe,IAAI,UACvDS,IAAa;AAAA,MAEjB;AAKA,aAFA,KAAK,WAAWtC,GAAI8B,CAAK,GAErBQ,KACFP,IAAW,IACX,KAAK,WAAW/B,GAAIqB,CAAE,GACtBY,EAAgB,QAAQ,CAACa,MAAOA,EAAA,CAAI,GAC7B,MAGF;AAAA,IACT;AAEA,gBAAK,iBAAiBX,CAAM,GAErB;AAAA,MACL,MAAM,MAAM;AAAA,MAAC;AAAA,MACb,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,SAAS,MAAM;AAAA,MAAC;AAAA,MAChB,QAAQ,MAAM;AACZ,QAAAH,IAAY,IACZE,EAAgB,QAAQ,CAACY,MAAOA,EAAA,CAAI;AAAA,MACtC;AAAA,MACA,QAAQ,MAAM;AACZ,QAAAf,IAAW,IACX,KAAK,WAAW/B,GAAIqB,CAAE,GACtBY,EAAgB,QAAQ,CAACa,MAAOA,EAAA,CAAI;AAAA,MACtC;AAAA,MACA,UAAU,MAAOf,IAAW,aAAaC,IAAY,cAAc;AAAA,MACnE,gBAAgB,MAAM;AAAA,MACtB,gBAAgB,MAAM;AAAA,MAAC;AAAA,MACvB,UAAU,CAACc,MAAOb,EAAgB,KAAKa,CAAE;AAAA,MACzC,UAAU,CAACA,MAAOZ,EAAgB,KAAKY,CAAE;AAAA,IAAA;AAAA,EAE7C;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkB;AAChB,SAAK,WAAW,QAAQ,CAAC3C,MAAc;AACrC,MAAAA,EAAU,OAAA;AAAA,IACZ,CAAC,GACD,KAAK,WAAW,MAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAA2B;AACzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAA8B;AACpC,WAAI,OAAO,SAAW,MAAoB,KACnC,OAAO,WAAW,kCAAkC,EAAE;AAAA,EAC/D;AAAA,EAEQ,6BAAmC;AACzC,QAAI,OAAO,SAAW,IAAa;AAGnC,IADmB,OAAO,WAAW,kCAAkC,EAC5D,iBAAiB,UAAU,CAAC4C,MAAM;AAC3C,WAAK,gBAAgBA,EAAE;AAAA,IACzB,CAAC;AAAA,EACH;AAAA,EAEQ,eACNlD,GACAC,GACAC,GACqB;AACrB,UAAMiD,IAAWjD,EAAQ,yBAAyB;AAElD,QAAIiD,MAAa,GAAG;AAElB,YAAMC,IAAgB,MAAM,QAAQnD,CAAS,IAAIA,EAAUA,EAAU,SAAS,CAAC,IAAIA;AAEnF,aAAKmD,KAIL,OAAO,QAAQA,CAAa,EAAE,QAAQ,CAAC,CAACV,GAAKW,CAAK,MAAM;AACtD,QAAIX,MAAQ,YAAYW,MAAU,UAChCrD,EAAQ,MAAM,YAAY0C,GAAK,OAAOW,CAAK,CAAC;AAAA,MAEhD,CAAC,GAEM,KAAK,qBAAqB,UAAU,KATlC,KAAK,qBAAqB,UAAU;AAAA,IAU/C;AAEA,WAAO,KAAK,QAAQrD,GAASC,GAAW;AAAA,MACtC,GAAGC;AAAA,MACH,UAAAiD;AAAA,MACA,sBAAsB;AAAA,IAAA,CACvB;AAAA,EACH;AAAA,EAEQ,cAAcG,GAAgC;AACpD,WAAOA,KAAUzD,IAASA,EAAOyD,CAA6B,IAAIA;AAAA,EACpE;AAAA,EAEQ,uBAAuBC,GAAerD,GAAmC;AAC/E,UAAMc,IAAmB,CAAA,GACnB,EAAE,SAAAwC,GAAS,kBAAAC,GAAkB,YAAAC,IAAa,MAAMxD;AAEtD,aAASyD,IAAI,GAAGA,IAAIJ,GAAOI,KAAK;AAC9B,UAAI/C;AAEJ,cAAQ6C,GAAA;AAAA,QACN,KAAK;AACH,UAAA7C,KAAS2C,IAAQ,IAAII,KAAKH;AAC1B;AAAA,QACF,KAAK;AACH,gBAAMI,IAASL,IAAQ;AACvB,UAAA3C,IAAQ,KAAK,IAAI+C,IAAIC,CAAM,IAAIJ;AAC/B;AAAA,QACF,KAAK;AACH,UAAA5C,IAAQ,KAAK,OAAA,IAAW2C,IAAQC;AAChC;AAAA,QACF,KAAK;AAAA,QACL;AACE,UAAA5C,KAAS+C,IAAID,KAAcF,GACvB5C,IAAQ,MAAGA,IAAQ;AAAA,MAAA;AAG3B,MAAAI,EAAO,KAAKJ,CAAK;AAAA,IACnB;AAEA,WAAOI;AAAA,EACT;AAAA,EAEQ,WAAWhB,GAAsBiC,GAAqC;AAC5E,UAAM4B,IAAuB,CAAA;AAE7B,eAAW,CAACnB,GAAKW,CAAK,KAAK,OAAO,QAAQpB,CAAK;AAC7C,MAAIS,MAAQ,MACVmB,EAAW,KAAK,cAAcR,CAAK,KAAK,IAC/BX,MAAQ,MACjBmB,EAAW,KAAK,cAAcR,CAAK,KAAK,IAC/BX,MAAQ,UACjBmB,EAAW,KAAK,SAASR,CAAK,GAAG,IACxBX,MAAQ,WACjBmB,EAAW,KAAK,UAAUR,CAAK,MAAM,IAC5BX,MAAQ,YACjB1C,EAAQ,MAAM,UAAU,OAAOqD,CAAK,IAEpCrD,EAAQ,MAAM,YAAY0C,GAAK,OAAOW,CAAK,CAAC;AAIhD,IAAIQ,EAAW,SAAS,MACtB7D,EAAQ,MAAM,YAAY6D,EAAW,KAAK,GAAG;AAAA,EAEjD;AAAA,EAEQ,iBAAiBC,GAAgD;AACvE,SAAK,eAAe,KAAKA,CAAQ,GACjC,KAAK,eAAA;AAAA,EACP;AAAA,EAEQ,iBAAuB;AAC7B,QAAI,KAAK,UAAU,KAAM;AAEzB,UAAMC,IAAO,CAACC,MAA4B;AACxC,WAAK,iBAAiB,KAAK,eAAe,OAAO,CAACf,MAAOA,EAAGe,CAAS,CAAC,GAElE,KAAK,eAAe,SAAS,IAC/B,KAAK,QAAQ,sBAAsBD,CAAI,IAEvC,KAAK,QAAQ;AAAA,IAEjB;AAEA,SAAK,QAAQ,sBAAsBA,CAAI;AAAA,EACzC;AAAA,EAEQ,iBAAiBzD,GAAsBC,GAAiC;AAC9E,WAAO;AAAA,MACL,MAAM,MAAMD,EAAU,KAAA;AAAA,MACtB,OAAO,MAAMA,EAAU,MAAA;AAAA,MACvB,SAAS,MAAMA,EAAU,QAAA;AAAA,MACzB,QAAQ,MAAM;AACZ,QAAAA,EAAU,OAAA,GACV,KAAK,WAAW,OAAOC,CAAE;AAAA,MAC3B;AAAA,MACA,QAAQ,MAAMD,EAAU,OAAA;AAAA,MACxB,UAAU,MAAMA,EAAU;AAAA,MAC1B,gBAAgB,MAAOA,EAAU,eAA0B;AAAA,MAC3D,gBAAgB,CAAC2D,MAAS;AACxB,QAAA3D,EAAU,cAAc2D;AAAA,MAC1B;AAAA,MACA,UAAU,CAACH,MAAa;AACtB,QAAAxD,EAAU,iBAAiB,UAAUwD,CAAQ;AAAA,MAC/C;AAAA,MACA,UAAU,CAACA,MAAa;AACtB,QAAAxD,EAAU,iBAAiB,UAAUwD,CAAQ;AAAA,MAC/C;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,sBAAsBrD,GAAyD;AACrF,WAAO;AAAA,MACL,MAAM,MAAMA,EAAY,QAAQ,CAACyD,MAAMA,EAAE,MAAM;AAAA,MAC/C,OAAO,MAAMzD,EAAY,QAAQ,CAACyD,MAAMA,EAAE,OAAO;AAAA,MACjD,SAAS,MAAMzD,EAAY,QAAQ,CAACyD,MAAMA,EAAE,SAAS;AAAA,MACrD,QAAQ,MAAMzD,EAAY,QAAQ,CAACyD,MAAMA,EAAE,QAAQ;AAAA,MACnD,QAAQ,MAAMzD,EAAY,QAAQ,CAACyD,MAAMA,EAAE,QAAQ;AAAA,MACnD,UAAU,MAAM;AACd,cAAMC,IAAS1D,EAAY,IAAI,CAACyD,MAAMA,EAAE,UAAU;AAClD,eAAIC,EAAO,MAAM,CAACC,MAAMA,MAAM,UAAU,IAAU,aAC9CD,EAAO,MAAM,CAACC,MAAMA,MAAM,MAAM,IAAU,SAC1CD,EAAO,KAAK,CAACC,MAAMA,MAAM,SAAS,IAAU,YAC5CD,EAAO,KAAK,CAACC,MAAMA,MAAM,QAAQ,IAAU,WACxC;AAAA,MACT;AAAA,MACA,gBAAgB,MAAM,KAAK,IAAI,GAAG3D,EAAY,IAAI,CAACyD,MAAMA,EAAE,eAAA,CAAgB,CAAC;AAAA,MAC5E,gBAAgB,CAACD,MAASxD,EAAY,QAAQ,CAACyD,MAAMA,EAAE,eAAeD,CAAI,CAAC;AAAA,MAC3E,UAAU,CAACH,MAAa;AACtB,YAAIO,IAAgB;AACpB,QAAA5D,EAAY,QAAQ,CAACyD,MAAM;AACzB,UAAAA,EAAE,SAAS,MAAM;AACf,YAAAG,KACIA,MAAkB5D,EAAY,UAChCqD,EAAA;AAAA,UAEJ,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,MACA,UAAU,CAACA,MAAarD,EAAY,QAAQ,CAACyD,MAAMA,EAAE,SAASJ,CAAQ,CAAC;AAAA,IAAA;AAAA,EAE3E;AAAA,EAEQ,qBAAqBQ,IAA+B,QAA6B;AACvF,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MAAC;AAAA,MACb,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,SAAS,MAAM;AAAA,MAAC;AAAA,MAChB,QAAQ,MAAM;AAAA,MAAC;AAAA,MACf,QAAQ,MAAM;AAAA,MAAC;AAAA,MACf,UAAU,MAAMA;AAAA,MAChB,gBAAgB,MAAM;AAAA,MACtB,gBAAgB,MAAM;AAAA,MAAC;AAAA,MACvB,UAAU,MAAM;AAAA,MAAC;AAAA,MACjB,UAAU,MAAM;AAAA,MAAC;AAAA,IAAA;AAAA,EAErB;AAAA,EAEQ,aAAqB;AAC3B,WAAO,QAAQ,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAAA,EACtE;AACF;AAMA,IAAIC,IAAqD;AAKlD,SAASC,IAAkD;AAChE,SAAKD,MACHA,IAAuB,IAAIxE,EAAA,IAEtBwE;AACT;AASO,SAASE,EACdzE,GACAC,GACAC,GACqB;AACrB,SAAOsE,EAAA,EAA2B,QAAQxE,GAASC,GAAWC,CAAO;AACvE;AAKO,SAASwE,EAAgBlE,GAA4C;AAC1E,SAAOgE,EAAA,EAA2B,SAAShE,CAAK;AAClD;AAKO,SAASmE,EACd7D,GACAb,GACAC,GACqB;AACrB,SAAOsE,EAAA,EAA2B,QAAQ1D,GAAUb,GAAWC,CAAO;AACxE;AAKO,SAAS0E,EACd5E,GACAuB,GACAC,GACAtB,GACqB;AACrB,SAAOsE,IAA2B,OAAOxE,GAASuB,GAAMC,GAAItB,CAAO;AACrE;"}