{
  "version": 3,
  "sources": ["/cdn/shop/t/175/assets/caf-rd-header.js?caf_v=20261009-floaters-2"],
  "sourcesContent": ["/* CAF redesign 2026-10 \u2014 chrome behaviours (dev-only until owner approves release).\n * Loaded deferred on every page (layout/theme.liquid), after sections.js / app.js.\n * Spec: design-preview/v3/global.html (states m-sticky, search-*, drawer, chat-*, back-to-top).\n *\n * 1. --caf-sticky-header-h on :root = height (px) of the header that currently covers the top of\n *    the viewport (desktop: sticky header section; phones: fixed #header, full or compact).\n *    Other surfaces use it for sticky offsets / scroll-margin-top. Also fires `caf:header-change`.\n * 2. Phones (\u2264798px): compact header on scroll (owner-approved). Scrolling down past the header\n *    keeps only the 56px logo row (+ search icon); scrolling up / near the top restores it.\n *    CSS (transform + absolute search row, no layout change) in caf-rd-global.css \u00A74.\n * 3. Header search: clear (\u00D7) button, phone \"Cancel\", compact search icon, \"chat with us\" link.\n * 4. html.caf-overlay-open while the mobile menu drawer or the header search panel is open\n *    (shared convention \u2014 every overlay sets it; the BeOne chat stopgap in caf-rd-global.css \u00A78\n *    hides the bubble while it is present).\n * 5. Cart badge: .cart_count--zero (badge hidden at 0) + \"Cart, N items\" accessible name.\n * 6. Back-to-top hides while a text field is focused on phones (it covered inputs/errors).\n * 7. html.caf-floaters-clear while a key control (checkout, add to cart / Buy now, the personalization fields,\n *    the collection toolbar) would sit under the chat bubble / back-to-top (8px margin), or a desktop mega menu\n *    is open (review 2026-10-09). CSS hides the closed bubble + back-to-top meanwhile. A control that only\n *    reaches a few px into their left edge does not hide them: they step toward the window edge instead\n *    (--caf-floater-shift, 2026-10-12). The app's bubble stays unpainted until the page has loaded\n *    (html.caf-floaters-settling), so it does not show for a moment and then vanish.\n * Never touches app DOM except: reading .chat-widget state and clicking the app's own launcher.\n */\n(() => {\n  if (window.__cafRdHeaderInit) return;\n  window.__cafRdHeaderInit = true;\n\n  const doc = document;\n  const root = doc.documentElement;\n  const body = doc.body;\n  const mqMobile = window.matchMedia('(max-width: 798px)');\n\n  const mHeader = doc.getElementById('header');\n  const dHeaderSection = doc.querySelector('.shopify-section--header');\n  const mTopBar = mHeader && mHeader.querySelector('.top-bar');\n  const mPromo = mHeader && mHeader.querySelector('.promo-banner');\n  const mSearchRow = mHeader && mHeader.querySelector('.search-container-full-width');\n  const mSearchForm = mHeader && mHeader.querySelector('.search-form--header');\n  const mSearchInput = mSearchForm && mSearchForm.querySelector('[data-search-input]');\n  const searchToggle = mHeader && mHeader.querySelector('[data-caf-search-toggle]');\n\n  const isMobileFixed = () => !!mHeader && mqMobile.matches && mHeader.classList.contains('mobile_nav-fixed--true');\n\n  /* \u2500\u2500 shared overlay flag \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  // Ref-counted per source so the chrome never removes a flag another overlay still needs.\n  const overlaySources = new Set();\n  let overlayAddedByChrome = false;\n  const setOverlay = (source, open) => {\n    const had = overlaySources.size > 0;\n    if (open) overlaySources.add(source);\n    else overlaySources.delete(source);\n    const has = overlaySources.size > 0;\n    if (has === had) return;\n    if (has) {\n      if (!root.classList.contains('caf-overlay-open')) {\n        root.classList.add('caf-overlay-open');\n        overlayAddedByChrome = true;\n      }\n    } else if (overlayAddedByChrome) {\n      root.classList.remove('caf-overlay-open');\n      overlayAddedByChrome = false;\n    }\n  };\n  window.CAFChromeOverlay = { set: setOverlay };\n\n  /* \u2500\u2500 1 + 2. sticky height + compact phone header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  const COMPACT_CLASS = 'caf-header--compact';\n  const DELTA = 8; // px of travel before the direction counts (no flicker on tiny scrolls)\n  let compact = false;\n  let lastY = window.scrollY;\n  let travel = 0;\n  let publishedH = -1;\n  let fullH = 0;\n  let topBarH = 56;\n  let promoH = 0;\n\n  const measure = () => {\n    if (!mHeader || !mqMobile.matches) return;\n    // Layout heights (transform does not change them; the search row is only out of flow while compact).\n    promoH = mPromo ? Math.round(mPromo.offsetHeight) : 0;\n    topBarH = mTopBar ? Math.round(mTopBar.offsetHeight) : 56;\n    const searchH = mSearchRow ? Math.round(mSearchRow.offsetHeight) : 0;\n    fullH = promoH + topBarH + searchH;\n    mHeader.style.setProperty('--caf-rd-hide-top', `${promoH}px`);\n    root.style.setProperty('--caf-header-full-h', `${fullH}px`);\n  };\n\n  const currentStickyH = () => {\n    if (mqMobile.matches) {\n      if (!isMobileFixed()) return 0;\n      return compact ? topBarH : fullH;\n    }\n    if (!dHeaderSection) return 0;\n    const rect = dHeaderSection.getBoundingClientRect();\n    return Math.max(0, Math.round(rect.bottom));\n  };\n\n  const publish = () => {\n    const h = currentStickyH();\n    if (h === publishedH) return;\n    publishedH = h;\n    root.style.setProperty('--caf-sticky-header-h', `${h}px`);\n    window.dispatchEvent(new CustomEvent('caf:header-change', { detail: { height: h, compact } }));\n  };\n\n  const setSearchToggle = (on) => {\n    if (!searchToggle) return;\n    searchToggle.tabIndex = on ? 0 : -1;\n    searchToggle.setAttribute('aria-hidden', on ? 'false' : 'true');\n  };\n\n  const setCompact = (next) => {\n    if (!mHeader || next === compact) return;\n    compact = next;\n    mHeader.classList.toggle(COMPACT_CLASS, compact);\n    root.classList.toggle('caf-header-is-compact', compact);\n    setSearchToggle(compact);\n    publish();\n  };\n\n  const searchActive = () =>\n    !!(mSearchForm && (mSearchForm.classList.contains('search-form--active') || mSearchForm.contains(doc.activeElement)));\n\n  // While any overlay is up the header must not change underneath it (and body.is-active pins\n  // the page, which resets scrollY to 0).\n  const frozen = () =>\n    body.classList.contains('is-active') ||\n    body.classList.contains('caf-mini-cart-open') ||\n    root.classList.contains('caf-overlay-open');\n\n  const update = () => {\n    if (!isMobileFixed()) {\n      // Desktop sticky header height is constant while scrolling (refresh() re-measures it).\n      if (compact) setCompact(false);\n      return;\n    }\n    const y = Math.max(0, window.scrollY);\n    // Frozen: keep lastY from before the overlay, so the scroll restore after closing the drawer\n    // (body.is-active pins the page at scrollY 0) does not read as a big downward scroll.\n    if (frozen()) {\n      travel = 0;\n      return;\n    }\n    const dy = y - lastY;\n    lastY = y;\n    if (searchActive()) {\n      setCompact(false);\n      return;\n    }\n    if (y <= fullH) {\n      travel = 0;\n      setCompact(false);\n      return;\n    }\n    // Typing in a page field (keyboard up): iOS nudges the page on every focus change, and an upward nudge\n    // expanded the header (promo + logo + search \u2248 214px) over the field being typed in \u2014 it hid the field's\n    // label and took ~45% of the room above the keyboard (review 2026-10-10). Stay compact until the field blurs.\n    if (root.classList.contains('caf-field-focus')) {\n      travel = 0;\n      setCompact(true);\n      return;\n    }\n    // Accumulate travel in one direction; reset when it flips.\n    travel = (travel > 0 && dy < 0) || (travel < 0 && dy > 0) ? dy : travel + dy;\n    if (travel > DELTA) setCompact(true);\n    else if (travel < -DELTA) setCompact(false);\n  };\n\n  let rafId = 0;\n  const schedule = () => {\n    if (rafId) return;\n    rafId = window.requestAnimationFrame(() => {\n      rafId = 0;\n      update();\n    });\n  };\n\n  const refresh = () => {\n    measure();\n    lastY = Math.max(0, window.scrollY);\n    if (!isMobileFixed()) setCompact(false);\n    publishedH = -1;\n    publish();\n  };\n\n  window.addEventListener('scroll', schedule, { passive: true });\n  window.addEventListener('resize', () => window.requestAnimationFrame(refresh), { passive: true });\n  window.addEventListener('load', refresh);\n  window.addEventListener('pageshow', refresh);\n  if (mqMobile.addEventListener) mqMobile.addEventListener('change', refresh);\n  if (window.ResizeObserver && mHeader) {\n    // Promo copy wraps / fonts load / announcement removed \u2192 header height changes.\n    const ro = new ResizeObserver(() => {\n      if (!mqMobile.matches || compact) return;\n      measure();\n      publish();\n    });\n    [mPromo, mTopBar, mSearchRow].forEach((el) => el && ro.observe(el));\n    if (dHeaderSection) ro.observe(dHeaderSection);\n  }\n  refresh();\n\n  if (searchToggle) {\n    setSearchToggle(false);\n    searchToggle.addEventListener('click', (event) => {\n      event.preventDefault();\n      setCompact(false);\n      travel = 0;\n      // Focus opens the predictive panel (utilities.js `_onFocus`) = full-screen search on phones.\n      if (mSearchInput) window.requestAnimationFrame(() => mSearchInput.focus({ preventScroll: true }));\n    });\n  }\n\n  /* \u2500\u2500 3. header search helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  const headerForms = Array.from(doc.querySelectorAll('.caf-search .search-form--header'));\n  const syncClear = (form) => {\n    const input = form.querySelector('[data-search-input]');\n    const clear = form.querySelector('[data-caf-search-clear]');\n    if (!input || !clear) return;\n    clear.hidden = input.value.trim().length === 0;\n  };\n\n  headerForms.forEach((form) => {\n    const input = form.querySelector('[data-search-input]');\n    const clear = form.querySelector('[data-caf-search-clear]');\n    const container = form.closest('.caf-search');\n    const cancel = container && container.querySelector('[data-caf-search-cancel]');\n    if (!input) return;\n\n    syncClear(form);\n    input.addEventListener('input', () => syncClear(form));\n\n    if (clear) {\n      clear.addEventListener('click', (event) => {\n        event.preventDefault();\n        input.value = '';\n        syncClear(form);\n        // utilities.js listens to `input` (debounced) \u2192 back to the Popular searches state.\n        input.dispatchEvent(new Event('input', { bubbles: true }));\n        input.focus({ preventScroll: true });\n      });\n    }\n\n    if (cancel) {\n      // The body-click listener in utilities.js already closes the panel (Cancel is outside <form>).\n      cancel.addEventListener('click', () => {\n        input.value = '';\n        syncClear(form);\n        input.blur();\n      });\n    }\n\n    // Overlay flag + compact freeze follow the panel's open class (set by utilities.js).\n    const source = `search:${headerForms.indexOf(form)}`;\n    const syncOpen = () => {\n      const open = form.classList.contains('search-form--active');\n      if (container) container.classList.toggle('caf-search--open', open);\n      setOverlay(source, open);\n      if (mSearchForm === form) {\n        root.classList.toggle('caf-msearch-open', open && mqMobile.matches);\n        if (open) setCompact(false);\n        publish();\n      }\n    };\n    new MutationObserver(syncOpen).observe(form, { attributes: true, attributeFilter: ['class'] });\n    syncOpen();\n  });\n\n  // \"chat with us\" (no-results card): open the BeOne launcher if present, else follow the link.\n  doc.addEventListener('click', (event) => {\n    const link = event.target instanceof Element && event.target.closest('[data-caf-open-chat]');\n    if (!link) return;\n    const bubble = doc.getElementById('chat-bubble');\n    if (!bubble) return;\n    event.preventDefault();\n    const active = doc.querySelector('.search-form--active [data-search-input]');\n    if (active) active.blur();\n    body.click(); // closes the predictive panel through utilities.js' own outside-click path\n    window.setTimeout(() => bubble.click(), 60);\n  });\n\n  /* \u2500\u2500 4. mobile menu drawer \u2192 overlay flag \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  doc.querySelectorAll('[data-mobile-menu-drawer]').forEach((drawer, index) => {\n    const source = `drawer:${index}`;\n    const sync = () => setOverlay(source, drawer.getAttribute('data-animation-state') === 'open');\n    new MutationObserver(sync).observe(drawer, { attributes: true, attributeFilter: ['data-animation-state'] });\n    sync();\n  });\n\n  /* \u2500\u2500 5. cart badge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  const syncCount = (node) => {\n    const n = parseInt((node.textContent || '').replace(/[^0-9]/g, ''), 10) || 0;\n    node.classList.toggle('cart_count--zero', n === 0);\n    const link = node.closest('a');\n    if (link && link.hasAttribute('data-caf-cart-label')) {\n      const label = link.getAttribute('data-caf-cart-label') || 'Cart';\n      link.setAttribute('aria-label', n > 0 ? `${label}, ${n} ${n === 1 ? 'item' : 'items'}` : label);\n    }\n  };\n  const countObserver = new MutationObserver((records) => {\n    records.forEach((record) => {\n      const node = record.target.nodeType === 1 ? record.target : record.target.parentElement;\n      const count = node && node.closest('.cart_count');\n      if (count) syncCount(count);\n    });\n  });\n  const watchCounts = (scope) => {\n    scope.querySelectorAll('.cart_count').forEach((node) => {\n      if (node.__cafCountWatched) return;\n      node.__cafCountWatched = true;\n      syncCount(node);\n      countObserver.observe(node, { childList: true, characterData: true, subtree: true });\n    });\n  };\n  watchCounts(doc);\n  // Headhesive appends the desktop sticky clone to <body> after init \u2014 pick up its badge too.\n  new MutationObserver((records) => {\n    records.forEach((record) =>\n      record.addedNodes.forEach((added) => {\n        if (added.nodeType === 1 && added.querySelector) watchCounts(added);\n      })\n    );\n  }).observe(body, { childList: true });\n\n  /* \u2500\u2500 6. back-to-top vs. focused fields (phones) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  const isField = (el) =>\n    el instanceof HTMLElement &&\n    (el.matches('input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"button\"]):not([type=\"submit\"]), textarea, select') ||\n      el.isContentEditable);\n  doc.addEventListener('focusin', (event) => {\n    root.classList.toggle('caf-field-focus', isField(event.target));\n    schedule(); // \u00A72: a full header goes compact as soon as a page field takes focus\n  });\n  doc.addEventListener('focusout', () => {\n    window.setTimeout(() => root.classList.toggle('caf-field-focus', isField(doc.activeElement)), 0);\n  });\n\n  /* \u2500\u2500 7. keep the floating buttons off key controls \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n  // The BeOne chat bubble (app) and back-to-top float in the bottom-right corner and covered checkout / add to\n  // cart / the personalization inputs / Sort (review 2026-10-09). Read-only geometry checks on scroll \u2014 no DOM\n  // is moved; TeeInBlue's #teeFormInputs is only measured.\n  const KEEP_CLEAR = [\n    '#cart_form .caf-rd-summary .caf-rd-total',\n    '#cart_form .caf-rd-summary [name=\"checkout\"]',\n    '#cart_form .caf-rd-summary .caf-cutoff',\n    '#cart_form .caf-rd-summary .caf-cart-discount',\n    '#cart_form .caf-rd-summary__continue',\n    '#teeFormInputs',\n    '#teeAtcButton',\n    '#teeBuynowButton',\n    '.product__details--product-page .purchase-details',\n    '.product__details--product-page .recipient-form',\n    '#facet-form.caf-collection-toolbar',\n  ].join(',');\n  const GAP = 8; // px of breathing room above / below a floater\n  const SIDE_GAP = 4; // px between a floater and a control that ends beside it\n  const EDGE = 4; // px a floater keeps from the window edge when it steps aside\n  let megaOpen = false;\n  let clearFrame = 0;\n  // Step-aside (2026-10-12): the desktop form column ends 7px inside the 52px chat bubble, which hid the bubble for\n  // the whole first screen of a product page on every desktop width. When a control only reaches into the floaters'\n  // left edge and they have room toward the window edge, they move there (CSS var \u2192 margin-right in\n  // caf-rd-global.css \u00A78) and stay visible. The shift only grows for a given window width, so the cluster does not\n  // move sideways while the page scrolls.\n  let shift = 0;\n  let shiftWidth = 0;\n  let appliedShift = 0;\n  // Where the floaters would be without the shift (geometry is still reported while they are visibility:hidden).\n  // Fallback: the bottom-right corner they normally occupy (190 \u00D7 140px) if the app's bubble isn't in the DOM yet.\n  const floaterRects = () => {\n    const rects = [];\n    [doc.querySelector('.chat-widget .chat-bubble'), doc.getElementById('scrollToTopButton')].forEach((el) => {\n      if (!el) return;\n      const r = el.getBoundingClientRect();\n      if (r.width && r.height) {\n        rects.push({ left: r.left - appliedShift, right: r.right - appliedShift, top: r.top, bottom: r.bottom, canMove: true });\n      }\n    });\n    if (!rects.length) {\n      const vw = root.clientWidth;\n      const vh = window.innerHeight;\n      rects.push({ left: vw - 140, right: vw, top: vh - 190, bottom: vh, canMove: false });\n    }\n    return rects;\n  };\n  const checkClear = () => {\n    clearFrame = 0;\n    const vw = root.clientWidth;\n    if (vw !== shiftWidth) {\n      shift = 0;\n      shiftWidth = vw;\n    }\n    const floaters = floaterRects();\n    const room = floaters.every((f) => f.canMove) ? Math.min(...floaters.map((f) => vw - f.right)) - EDGE : 0;\n    let nextShift = shift;\n    let hit = false;\n    for (const el of doc.querySelectorAll(KEEP_CLEAR)) {\n      const r = el.getBoundingClientRect();\n      if (!r.width || !r.height) continue;\n      for (const f of floaters) {\n        if (r.top >= f.bottom + GAP || r.bottom <= f.top - GAP) continue; // not at the floater's height\n        const needed = Math.ceil(r.right + SIDE_GAP - f.left); // shift that puts the floater SIDE_GAP right of the control\n        if (needed <= shift || r.left >= f.right + shift + GAP) continue; // already clear of it\n        if (r.left < f.left && needed <= room) {\n          nextShift = Math.max(nextShift, needed); // only reaches into the left edge: step aside\n        } else {\n          hit = true;\n        }\n      }\n      if (hit) break;\n    }\n    if (!hit) shift = nextShift;\n    if (shift !== appliedShift) {\n      appliedShift = shift;\n      if (shift) root.style.setProperty('--caf-floater-shift', `${shift}px`);\n      else root.style.removeProperty('--caf-floater-shift');\n    }\n    root.classList.toggle('caf-floaters-clear', hit || megaOpen);\n  };\n  const scheduleClear = () => {\n    if (!clearFrame) clearFrame = window.requestAnimationFrame(checkClear);\n  };\n  window.addEventListener('scroll', scheduleClear, { passive: true });\n  window.addEventListener('resize', scheduleClear);\n  window.addEventListener('load', scheduleClear);\n  doc.addEventListener('teeinblue-event-component-injected', scheduleClear);\n  [600, 2000, 5000].forEach((ms) => window.setTimeout(scheduleClear, ms));\n  // The app adds its bubble after this script has run, while the page is still moving (fonts, images, the\n  // TeeInBlue form): it showed for a moment and then vanished when a control landed under it. Keep it unpainted\n  // (html.caf-floaters-settling) until the page has loaded, then decide once \u2014 it appears where it can stay, or\n  // not at all. Stops watching once the bubble is there (or after 20s if the app never loads).\n  if (window.MutationObserver && !doc.querySelector('.chat-widget .chat-bubble')) {\n    const arrival = new MutationObserver(() => {\n      if (!doc.querySelector('.chat-widget .chat-bubble')) return;\n      arrival.disconnect();\n      root.classList.add('caf-floaters-settling');\n      const arrivedAt = performance.now();\n      const settle = () => {\n        checkClear();\n        root.classList.remove('caf-floaters-settling');\n      };\n      const afterLoad = () => window.setTimeout(settle, Math.max(150, 700 - (performance.now() - arrivedAt)));\n      if (doc.readyState === 'complete') afterLoad();\n      else window.addEventListener('load', afterLoad, { once: true });\n      window.setTimeout(settle, 3000); // slow pages: never wait longer than this for `load`\n    });\n    arrival.observe(body, { childList: true, subtree: true });\n    window.setTimeout(() => arrival.disconnect(), 20000);\n  }\n  // Desktop mega menus are <details data-nav-desktop-details>; `toggle` does not bubble, so listen in capture.\n  doc.addEventListener(\n    'toggle',\n    (event) => {\n      if (!(event.target instanceof HTMLElement) || !event.target.matches('[data-nav-desktop-details]')) return;\n      megaOpen = !!doc.querySelector('[data-nav-desktop-details][open]');\n      scheduleClear();\n    },\n    true\n  );\n  scheduleClear();\n})();\n"],
  "mappings": "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",
  "names": []
}
