{"version":3,"file":"accessibility-auto.mjs","sources":["../../../src/lib/ux/accessibility-auto.ts"],"sourcesContent":["/**\n * @file Automatic Accessibility Enhancements\n * @description PhD-level automatic accessibility system with focus management,\n * dynamic ARIA injection, motion preferences, and contrast adjustment.\n *\n * Features:\n * - Auto focus management on navigation\n * - Dynamic ARIA attribute injection\n * - Motion preference detection and adaptation\n * - Automatic contrast adjustment\n * - Keyboard navigation enhancement\n * - Screen reader optimizations\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Accessibility preferences\n */\nexport interface AccessibilityPreferences {\n  /** Prefers reduced motion */\n  reducedMotion: boolean;\n  /** Prefers high contrast */\n  highContrast: boolean;\n  /** Prefers dark mode */\n  darkMode: boolean;\n  /** Prefers reduced transparency */\n  reducedTransparency: boolean;\n  /** Uses screen reader */\n  screenReader: boolean;\n  /** Keyboard navigation active */\n  keyboardNavigation: boolean;\n}\n\n/**\n * Focus management options\n */\nexport interface FocusManagementOptions {\n  /** Element to focus after navigation */\n  focusTarget?: 'main' | 'heading' | 'first-focusable' | 'custom';\n  /** Custom focus selector */\n  customSelector?: string;\n  /** Scroll behavior */\n  scrollBehavior?: 'auto' | 'smooth' | 'instant';\n  /** Delay before focusing (ms) */\n  focusDelay?: number;\n  /** Announce navigation to screen readers */\n  announceNavigation?: boolean;\n}\n\n/**\n * ARIA enhancement rule\n */\nexport interface ARIAEnhancementRule {\n  /** CSS selector */\n  selector: string;\n  /** ARIA attributes to add */\n  attributes: Record<string, string | boolean>;\n  /** Condition to apply */\n  condition?: () => boolean;\n}\n\n/**\n * Auto accessibility configuration\n */\nexport interface AutoAccessibilityConfig {\n  /** Enable auto focus management */\n  autoFocus?: boolean;\n  /** Focus management options */\n  focusOptions?: FocusManagementOptions;\n  /** Enable auto ARIA */\n  autoARIA?: boolean;\n  /** ARIA enhancement rules */\n  ariaRules?: ARIAEnhancementRule[];\n  /** Enable motion adaptation */\n  adaptMotion?: boolean;\n  /** Enable contrast adaptation */\n  adaptContrast?: boolean;\n  /** Enable keyboard navigation detection */\n  detectKeyboardNav?: boolean;\n  /** Enable screen reader detection */\n  detectScreenReader?: boolean;\n  /** Enable debug logging */\n  debug?: boolean;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_FOCUS_OPTIONS: Required<FocusManagementOptions> = {\n  focusTarget: 'main',\n  customSelector: '',\n  scrollBehavior: 'smooth',\n  focusDelay: 100,\n  announceNavigation: true,\n};\n\nconst DEFAULT_ARIA_RULES: ARIAEnhancementRule[] = [\n  // Navigation landmarks\n  { selector: 'nav:not([role])', attributes: { role: 'navigation' } },\n  { selector: 'header:not([role])', attributes: { role: 'banner' } },\n  { selector: 'footer:not([role])', attributes: { role: 'contentinfo' } },\n  { selector: 'main:not([role])', attributes: { role: 'main' } },\n  { selector: 'aside:not([role])', attributes: { role: 'complementary' } },\n  // Interactive elements\n  { selector: 'button:not([type])', attributes: { type: 'button' } },\n  // Images\n  {\n    selector: 'img:not([alt])',\n    attributes: { alt: '', role: 'presentation' },\n  },\n  // Icons\n  {\n    selector: 'svg[aria-hidden=\"true\"]',\n    attributes: { focusable: 'false' },\n  },\n  // Loading states\n  {\n    selector: '[data-loading=\"true\"]',\n    attributes: { 'aria-busy': 'true' },\n  },\n  // Expandable elements\n  {\n    selector: '[data-expanded]',\n    attributes: { 'aria-expanded': 'false' },\n  },\n];\n\n// ============================================================================\n// Preference Detection\n// ============================================================================\n\n/**\n * Detect accessibility preferences\n */\nexport function detectAccessibilityPreferences(): AccessibilityPreferences {\n  if (typeof window === 'undefined') {\n    return {\n      reducedMotion: false,\n      highContrast: false,\n      darkMode: false,\n      reducedTransparency: false,\n      screenReader: false,\n      keyboardNavigation: false,\n    };\n  }\n\n  return {\n    reducedMotion: window.matchMedia('(prefers-reduced-motion: reduce)').matches,\n    highContrast: window.matchMedia('(prefers-contrast: more)').matches,\n    darkMode: window.matchMedia('(prefers-color-scheme: dark)').matches,\n    reducedTransparency: window.matchMedia('(prefers-reduced-transparency: reduce)').matches,\n    screenReader: detectScreenReader(),\n    keyboardNavigation: false, // Detected dynamically\n  };\n}\n\n/**\n * Detect screen reader (heuristic)\n */\nfunction detectScreenReader(): boolean {\n  // This is a heuristic - screen readers are hard to detect definitively\n  if (typeof window === 'undefined') return false;\n\n  // Check for common screen reader indicators\n  const indicators = [\n    // ARIA live region usage\n    document.querySelector('[aria-live]') !== null,\n    // Accessibility tree modifications\n    'ariaHidden' in Element.prototype,\n  ];\n\n  return indicators.some(Boolean);\n}\n\n// ============================================================================\n// Focus Management\n// ============================================================================\n\n/**\n * Focus manager for accessible navigation\n */\nexport class FocusManager {\n  private readonly options: Required<FocusManagementOptions>;\n  private previousFocus: HTMLElement | null = null;\n  private focusHistory: HTMLElement[] = [];\n\n  constructor(options: FocusManagementOptions = {}) {\n    this.options = { ...DEFAULT_FOCUS_OPTIONS, ...options };\n  }\n\n  /**\n   * Focus main content after navigation\n   */\n  focusMainContent(): void {\n    const { focusTarget, customSelector, focusDelay, scrollBehavior, announceNavigation } = this.options;\n\n    // Save previous focus\n    this.previousFocus = document.activeElement as HTMLElement;\n\n    setTimeout(() => {\n      let targetElement: HTMLElement | null = null;\n\n      switch (focusTarget) {\n        case 'main':\n          targetElement = document.querySelector('main, [role=\"main\"]');\n          break;\n        case 'heading':\n          targetElement = document.querySelector('h1, [role=\"heading\"][aria-level=\"1\"]');\n          break;\n        case 'first-focusable':\n          targetElement = this.getFirstFocusable(document.body);\n          break;\n        case 'custom':\n          if (customSelector) {\n            targetElement = document.querySelector(customSelector);\n          }\n          break;\n      }\n\n      if (targetElement) {\n        // Make focusable if needed\n        if (!targetElement.hasAttribute('tabindex')) {\n          targetElement.setAttribute('tabindex', '-1');\n        }\n\n        targetElement.focus({ preventScroll: scrollBehavior === 'instant' });\n\n        // Scroll into view\n        if (scrollBehavior !== 'instant') {\n          targetElement.scrollIntoView({\n            behavior: scrollBehavior,\n            block: 'start',\n          });\n        }\n\n        // Track focus history\n        this.focusHistory.push(targetElement);\n        if (this.focusHistory.length > 10) {\n          this.focusHistory.shift();\n        }\n      }\n\n      // Announce navigation\n      if (announceNavigation) {\n        this.announcePageChange();\n      }\n    }, focusDelay);\n  }\n\n  /**\n   * Restore previous focus\n   */\n  restoreFocus(): void {\n    if (this.previousFocus && document.body.contains(this.previousFocus)) {\n      this.previousFocus.focus();\n    }\n  }\n\n  /**\n   * Get first focusable element\n   */\n  getFirstFocusable(container: HTMLElement): HTMLElement | null {\n    const focusableSelectors = [\n      'a[href]',\n      'button:not([disabled])',\n      'input:not([disabled]):not([type=\"hidden\"])',\n      'select:not([disabled])',\n      'textarea:not([disabled])',\n      '[tabindex]:not([tabindex=\"-1\"])',\n      '[contenteditable=\"true\"]',\n    ].join(', ');\n\n    return container.querySelector(focusableSelectors);\n  }\n\n  /**\n   * Create focus trap within container\n   */\n  createFocusTrap(container: HTMLElement): () => void {\n    const focusableElements = this.getAllFocusable(container);\n    const [firstElement] = focusableElements;\n    const lastElement = focusableElements[focusableElements.length - 1];\n\n    const handleKeyDown = (e: KeyboardEvent): void => {\n      if (e.key !== 'Tab') return;\n\n      if (e.shiftKey && document.activeElement === firstElement) {\n        e.preventDefault();\n        lastElement?.focus();\n      } else if (!e.shiftKey && document.activeElement === lastElement) {\n        e.preventDefault();\n        firstElement?.focus();\n      }\n    };\n\n    container.addEventListener('keydown', handleKeyDown);\n\n    // Focus first element\n    firstElement?.focus();\n\n    // Return cleanup function\n    return () => {\n      container.removeEventListener('keydown', handleKeyDown);\n    };\n  }\n\n  /**\n   * Get all focusable elements in container\n   */\n  private getAllFocusable(container: HTMLElement): HTMLElement[] {\n    const selector = [\n      'a[href]',\n      'button:not([disabled])',\n      'input:not([disabled]):not([type=\"hidden\"])',\n      'select:not([disabled])',\n      'textarea:not([disabled])',\n      '[tabindex]:not([tabindex=\"-1\"])',\n    ].join(', ');\n\n    return Array.from(container.querySelectorAll<HTMLElement>(selector));\n  }\n\n  /**\n   * Announce page change to screen readers\n   */\n  private announcePageChange(): void {\n    const title = document.title || 'Page';\n    announce(`Navigated to ${title}`);\n  }\n}\n\n// ============================================================================\n// ARIA Enhancement\n// ============================================================================\n\n/**\n * ARIA enhancement manager\n */\nexport class ARIAEnhancer {\n  private readonly rules: ARIAEnhancementRule[];\n  private observer: MutationObserver | null = null;\n\n  constructor(rules: ARIAEnhancementRule[] = DEFAULT_ARIA_RULES) {\n    this.rules = rules;\n  }\n\n  /**\n   * Start enhancing\n   */\n  start(): void {\n    // Initial enhancement\n    this.enhance();\n\n    // Watch for DOM changes\n    this.observer = new MutationObserver((mutations) => {\n      let needsEnhance = false;\n\n      for (const mutation of mutations) {\n        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {\n          needsEnhance = true;\n          break;\n        }\n      }\n\n      if (needsEnhance) {\n        this.enhance();\n      }\n    });\n\n    this.observer.observe(document.body, {\n      childList: true,\n      subtree: true,\n    });\n  }\n\n  /**\n   * Stop enhancing\n   */\n  stop(): void {\n    this.observer?.disconnect();\n    this.observer = null;\n  }\n\n  /**\n   * Enhance DOM with ARIA attributes\n   */\n  enhance(): void {\n    for (const rule of this.rules) {\n      // Check condition\n      if (rule.condition && !rule.condition()) continue;\n\n      // Find matching elements\n      const elements = document.querySelectorAll(rule.selector);\n\n      elements.forEach((element) => {\n        for (const [attr, value] of Object.entries(rule.attributes)) {\n          if (!element.hasAttribute(attr)) {\n            element.setAttribute(attr, String(value));\n          }\n        }\n      });\n    }\n  }\n\n  /**\n   * Add custom rule\n   */\n  addRule(rule: ARIAEnhancementRule): void {\n    this.rules.push(rule);\n    this.enhance();\n  }\n}\n\n// ============================================================================\n// Motion Adaptation\n// ============================================================================\n\n/**\n * Adapt animations based on user preferences\n */\nexport function adaptMotion(reducedMotion: boolean): void {\n  if (reducedMotion) {\n    // Add class to document for CSS targeting\n    document.documentElement.classList.add('reduce-motion');\n\n    // Inject styles to reduce motion\n    const styleId = 'a11y-reduce-motion';\n    if (!document.getElementById(styleId)) {\n      const style = document.createElement('style');\n      style.id = styleId;\n      style.textContent = `\n        .reduce-motion *,\n        .reduce-motion *::before,\n        .reduce-motion *::after {\n          animation-duration: 0.01ms !important;\n          animation-iteration-count: 1 !important;\n          transition-duration: 0.01ms !important;\n          scroll-behavior: auto !important;\n        }\n      `;\n      document.head.appendChild(style);\n    }\n  } else {\n    document.documentElement.classList.remove('reduce-motion');\n    const style = document.getElementById('a11y-reduce-motion');\n    style?.remove();\n  }\n}\n\n// ============================================================================\n// Screen Reader Utilities\n// ============================================================================\n\n/**\n * Announce message to screen readers\n */\nexport function announce(message: string, priority: 'polite' | 'assertive' = 'polite'): void {\n  const region = document.createElement('div');\n  region.setAttribute('role', 'status');\n  region.setAttribute('aria-live', priority);\n  region.setAttribute('aria-atomic', 'true');\n  region.className = 'sr-only';\n  region.style.cssText = `\n    position: absolute;\n    width: 1px;\n    height: 1px;\n    padding: 0;\n    margin: -1px;\n    overflow: hidden;\n    clip: rect(0, 0, 0, 0);\n    white-space: nowrap;\n    border: 0;\n  `;\n\n  document.body.appendChild(region);\n\n  // Delay to ensure screen reader picks up the change\n  setTimeout(() => {\n    region.textContent = message;\n  }, 100);\n\n  // Remove after announcement\n  setTimeout(() => {\n    region.remove();\n  }, 3000);\n}\n\n/**\n * Create skip link\n */\nexport function createSkipLink(targetId: string, text = 'Skip to main content'): HTMLAnchorElement {\n  const link = document.createElement('a');\n  link.href = `#${targetId}`;\n  link.textContent = text;\n  link.className = 'skip-link';\n  link.style.cssText = `\n    position: fixed;\n    top: -100px;\n    left: 0;\n    background: #000;\n    color: #fff;\n    padding: 8px 16px;\n    z-index: 100000;\n    text-decoration: none;\n    transition: top 0.3s;\n  `;\n\n  link.addEventListener('focus', () => {\n    link.style.top = '0';\n  });\n\n  link.addEventListener('blur', () => {\n    link.style.top = '-100px';\n  });\n\n  return link;\n}\n\n// ============================================================================\n// Auto Accessibility Manager\n// ============================================================================\n\n/**\n * Auto accessibility manager\n */\nexport class AutoAccessibility {\n  private static instance: AutoAccessibility;\n  private config: Required<AutoAccessibilityConfig>;\n  private readonly focusManager: FocusManager;\n  private ariaEnhancer: ARIAEnhancer;\n  private readonly preferences: AccessibilityPreferences;\n  private keyboardNavActive = false;\n  private cleanupFns: Array<() => void> = [];\n\n  constructor(config: AutoAccessibilityConfig = {}) {\n    this.config = {\n      autoFocus: config.autoFocus ?? true,\n      focusOptions: { ...DEFAULT_FOCUS_OPTIONS, ...config.focusOptions },\n      autoARIA: config.autoARIA ?? true,\n      ariaRules: [...DEFAULT_ARIA_RULES, ...(config.ariaRules ?? [])],\n      adaptMotion: config.adaptMotion ?? true,\n      adaptContrast: config.adaptContrast ?? true,\n      detectKeyboardNav: config.detectKeyboardNav ?? true,\n      detectScreenReader: config.detectScreenReader ?? true,\n      debug: config.debug ?? false,\n    };\n\n    this.focusManager = new FocusManager(this.config.focusOptions);\n    this.ariaEnhancer = new ARIAEnhancer(this.config.ariaRules);\n    this.preferences = detectAccessibilityPreferences();\n  }\n\n  /**\n   * Get singleton instance\n   */\n  static getInstance(config?: AutoAccessibilityConfig): AutoAccessibility {\n    AutoAccessibility.instance ??= new AutoAccessibility(config);\n    return AutoAccessibility.instance;\n  }\n\n  /**\n   * Reset singleton\n   */\n  static reset(): void {\n    if (AutoAccessibility.instance !== null && AutoAccessibility.instance !== undefined) {\n      AutoAccessibility.instance.cleanup();\n      // Type-safe null assignment for singleton reset\n      (AutoAccessibility as unknown as { instance: AutoAccessibility | null }).instance = null;\n    }\n  }\n\n  /**\n   * Initialize\n   */\n  init(): void {\n    this.log('Initializing auto accessibility');\n\n    // Start ARIA enhancement\n    if (this.config.autoARIA) {\n      this.ariaEnhancer.start();\n    }\n\n    // Setup motion adaptation\n    if (this.config.adaptMotion) {\n      adaptMotion(this.preferences.reducedMotion);\n      this.setupMotionListener();\n    }\n\n    // Setup keyboard navigation detection\n    if (this.config.detectKeyboardNav) {\n      this.setupKeyboardNavDetection();\n    }\n\n    // Add skip link\n    this.addSkipLink();\n\n    this.log('Auto accessibility initialized');\n  }\n\n  /**\n   * Cleanup\n   */\n  cleanup(): void {\n    this.ariaEnhancer.stop();\n    this.cleanupFns.forEach((fn) => fn());\n    this.cleanupFns = [];\n  }\n\n  /**\n   * Handle route change\n   */\n  handleRouteChange(): void {\n    if (this.config.autoFocus) {\n      this.focusManager.focusMainContent();\n    }\n  }\n\n  /**\n   * Get preferences\n   */\n  getPreferences(): AccessibilityPreferences {\n    return { ...this.preferences, keyboardNavigation: this.keyboardNavActive };\n  }\n\n  /**\n   * Get focus manager\n   */\n  getFocusManager(): FocusManager {\n    return this.focusManager;\n  }\n\n  /**\n   * Setup motion preference listener\n   */\n  private setupMotionListener(): void {\n    const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');\n\n    const handler = (e: MediaQueryListEvent): void => {\n      this.preferences.reducedMotion = e.matches;\n      adaptMotion(e.matches);\n    };\n\n    mediaQuery.addEventListener('change', handler);\n    this.cleanupFns.push(() => mediaQuery.removeEventListener('change', handler));\n  }\n\n  /**\n   * Setup keyboard navigation detection\n   */\n  private setupKeyboardNavDetection(): void {\n    const handleKeyDown = (e: KeyboardEvent): void => {\n      if (e.key === 'Tab') {\n        this.keyboardNavActive = true;\n        document.body.classList.add('keyboard-nav');\n      }\n    };\n\n    const handleMouseDown = (): void => {\n      this.keyboardNavActive = false;\n      document.body.classList.remove('keyboard-nav');\n    };\n\n    document.addEventListener('keydown', handleKeyDown);\n    document.addEventListener('mousedown', handleMouseDown);\n\n    this.cleanupFns.push(() => {\n      document.removeEventListener('keydown', handleKeyDown);\n      document.removeEventListener('mousedown', handleMouseDown);\n    });\n  }\n\n  /**\n   * Add skip link\n   */\n  private addSkipLink(): void {\n    const mainContent = document.querySelector('main, [role=\"main\"]');\n    if (!mainContent) return;\n\n    const id = mainContent.id || 'main-content';\n    mainContent.id = id;\n\n    const skipLink = createSkipLink(id);\n    document.body.insertBefore(skipLink, document.body.firstChild);\n\n    this.cleanupFns.push(() => skipLink.remove());\n  }\n\n  /**\n   * Debug log\n   */\n  private log(message: string, ...args: unknown[]): void {\n    if (this.config.debug) {\n      console.info(`[AutoA11y] ${message}`, ...args);\n    }\n  }\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook for accessibility preferences\n */\nexport function useAccessibilityPreferences(): AccessibilityPreferences {\n  const [preferences, setPreferences] = useState(detectAccessibilityPreferences);\n\n  useEffect(() => {\n    const queries = {\n      reducedMotion: window.matchMedia('(prefers-reduced-motion: reduce)'),\n      highContrast: window.matchMedia('(prefers-contrast: more)'),\n      darkMode: window.matchMedia('(prefers-color-scheme: dark)'),\n    };\n\n    const handlers = Object.entries(queries).map(([key, query]) => {\n      const handler = (e: MediaQueryListEvent): void => {\n        setPreferences((prev) => ({ ...prev, [key]: e.matches }));\n      };\n      query.addEventListener('change', handler);\n      return () => query.removeEventListener('change', handler);\n    });\n\n    return () => handlers.forEach((cleanup) => cleanup());\n  }, []);\n\n  return preferences;\n}\n\n/**\n * Hook for focus trap\n */\nexport function useFocusTrap(enabled = true): { current: HTMLDivElement | null } {\n  const ref = useRef<HTMLDivElement>(null);\n  const focusManager = useMemo(() => new FocusManager(), []);\n\n  useEffect(() => {\n    if (!enabled || !ref.current) return;\n    return focusManager.createFocusTrap(ref.current);\n  }, [enabled, focusManager]);\n\n  return ref;\n}\n\n/**\n * Hook for announcing messages\n */\nexport function useAnnounce(): {\n  announce: (message: string) => void;\n  announceAssertive: (message: string) => void;\n} {\n  return {\n    announce: useCallback((message: string) => announce(message, 'polite'), []),\n    announceAssertive: useCallback((message: string) => announce(message, 'assertive'), []),\n  };\n}\n\n/**\n * Hook for keyboard navigation detection\n */\nexport function useKeyboardNavigation(): boolean {\n  const [isKeyboard, setIsKeyboard] = useState(false);\n\n  useEffect(() => {\n    const handleKeyDown = (e: KeyboardEvent): void => {\n      if (e.key === 'Tab') setIsKeyboard(true);\n    };\n    const handleMouseDown = (): void => setIsKeyboard(false);\n\n    document.addEventListener('keydown', handleKeyDown);\n    document.addEventListener('mousedown', handleMouseDown);\n\n    return () => {\n      document.removeEventListener('keydown', handleKeyDown);\n      document.removeEventListener('mousedown', handleMouseDown);\n    };\n  }, []);\n\n  return isKeyboard;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Initialize auto accessibility\n */\nexport function initAutoAccessibility(config?: AutoAccessibilityConfig): () => void {\n  const instance = AutoAccessibility.getInstance(config);\n  instance.init();\n  return () => instance.cleanup();\n}\n\n/**\n * Get auto accessibility instance\n */\nexport function getAutoAccessibility(config?: AutoAccessibilityConfig): AutoAccessibility {\n  return AutoAccessibility.getInstance(config);\n}\n\n/**\n * Reset auto accessibility\n */\nexport function resetAutoAccessibility(): void {\n  AutoAccessibility.reset();\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport default {\n  AutoAccessibility,\n  FocusManager,\n  ARIAEnhancer,\n  initAutoAccessibility,\n  getAutoAccessibility,\n  resetAutoAccessibility,\n  detectAccessibilityPreferences,\n  adaptMotion,\n  announce,\n  createSkipLink,\n  useAccessibilityPreferences,\n  useFocusTrap,\n  useAnnounce,\n  useKeyboardNavigation,\n};\n"],"names":["DEFAULT_FOCUS_OPTIONS","DEFAULT_ARIA_RULES","detectAccessibilityPreferences","detectScreenReader","FocusManager","options","focusTarget","customSelector","focusDelay","scrollBehavior","announceNavigation","targetElement","container","focusableSelectors","focusableElements","firstElement","lastElement","handleKeyDown","e","selector","title","announce","ARIAEnhancer","rules","mutations","needsEnhance","mutation","rule","element","attr","value","adaptMotion","reducedMotion","styleId","style","message","priority","region","createSkipLink","targetId","text","link","AutoAccessibility","config","fn","mediaQuery","handler","handleMouseDown","mainContent","id","skipLink","args","useAccessibilityPreferences","preferences","setPreferences","useState","useEffect","queries","handlers","key","query","prev","cleanup","useFocusTrap","enabled","ref","useRef","focusManager","useMemo","useAnnounce","useCallback","useKeyboardNavigation","isKeyboard","setIsKeyboard","initAutoAccessibility","instance","getAutoAccessibility","resetAutoAccessibility"],"mappings":"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"}