{
  "version": 3,
  "sources": ["/cdn/shop/t/163/assets/x-anavi.js?x=14217"],
  "sourcesContent": ["/*\n  CUSTOM: Anavi scripts, loaded by snippets/theme-globals.liquid.\n  Each block is marked with the PORTING.md item it belongs to.\n*/\n\n/* [P1e] Sibling swatches: while a swatch is hovered or focused, the option label shows its colour\n   name (data-sibling-cutline), as Stiletto 3.x did. Delegated, so it also works in the quick view. */\n(() => {\n  const groupSelector = '[data-sibling-products][data-x-label-hover]';\n  const swatchSelector = '[data-sibling-swatch]';\n  const labelSelector = '[data-sibling-label-value]';\n\n  const update = (event, entering) => {\n    const swatch = event.target.closest(swatchSelector);\n    const group = swatch && swatch.closest(groupSelector);\n    const label = group && group.querySelector(labelSelector);\n    if (!label) return;\n\n    if (label.dataset.xBaseLabel === undefined) {\n      label.dataset.xBaseLabel = label.textContent.trim();\n    }\n\n    const name = swatch.dataset.siblingCutline;\n    label.textContent = entering && name ? name : label.dataset.xBaseLabel;\n  };\n\n  document.addEventListener('mouseover', (event) => update(event, true));\n  document.addEventListener('mouseout', (event) => update(event, false));\n  document.addEventListener('focusin', (event) => update(event, true));\n  document.addEventListener('focusout', (event) => update(event, false));\n})();\n\n/* [L5] Expandable text ([data-x-collapsible], e.g. the collection description): clamped to\n   --x-collapsed-lines; the \"Read more\" button appears only when the text is actually cut, and is\n   checked again on resize and once web fonts are loaded. data-position=\"inline\" puts the button at the end of the\n   text (over the last line while closed), \"newline\" on its own line below. Without JavaScript the\n   full text stays visible. */\n(() => {\n  const setup = (box) => {\n    if (box.dataset.xReady) return;\n    box.dataset.xReady = 'true';\n\n    const content = box.firstElementChild;\n    if (!content) return;\n    const inline = box.dataset.position === 'inline';\n\n    const button = document.createElement('button');\n    button.type = 'button';\n    button.className = 'x-collapsible__toggle';\n    button.setAttribute('aria-expanded', 'false');\n    button.textContent = box.dataset.readMore;\n    button.hidden = true;\n\n    const placeButton = () => {\n      const open = box.dataset.xOpen === 'true';\n      button.remove();\n      if (inline && open) {\n        (content.lastElementChild || content).append(button);\n      } else if (inline) {\n        content.append(button);\n      } else {\n        box.after(button);\n      }\n    };\n\n    // Compare the full height with the clamped one: with the standard line-clamp, text past the\n    // last visible line does not count in scrollHeight, so the clamp is lifted to measure it\n    const update = () => {\n      if (box.dataset.xOpen === 'true') return;\n      box.classList.remove('is-collapsed');\n      const fullHeight = content.getBoundingClientRect().height;\n      box.classList.add('is-collapsed');\n      button.hidden = fullHeight <= content.getBoundingClientRect().height + 1;\n    };\n\n    button.addEventListener('click', () => {\n      const open = box.dataset.xOpen !== 'true';\n      box.dataset.xOpen = String(open);\n      box.classList.toggle('is-collapsed', !open);\n      button.textContent = open ? box.dataset.readLess : box.dataset.readMore;\n      button.setAttribute('aria-expanded', String(open));\n      placeButton();\n      update();\n    });\n\n    box.classList.add('is-collapsed');\n    placeButton();\n    update();\n    // Wrapping can change without the clamped box changing size (web fonts, viewport width)\n    if ('ResizeObserver' in window) new ResizeObserver(update).observe(box);\n    if (document.fonts) document.fonts.ready.then(update);\n    window.addEventListener('load', update);\n    window.addEventListener('resize', update);\n  };\n\n  const init = () => document.querySelectorAll('[data-x-collapsible]').forEach(setup);\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n  document.addEventListener('shopify:section:load', init);\n})();\n\n/* CUSTOM: [L1b] Space taken by the overlaid vendor inside the card media, as CSS variables on\n   .product-item__media, so x-anavi.css can keep the overlaid gallery dots clear of it.\n   [L32] All the reads first, then all the writes, in one batch per frame (a read after a write forces the browser\n   to lay out the page again: with 77 cards on the home that was ~0.8 s on a phone). The ResizeObserver measures\n   each label when it starts watching it and whenever the label or its media change size; new cards are only\n   picked up, not every card measured again at every change of the page. */\n(() => {\n  const read = (label) => {\n    const media = label.parentElement;\n    if (!media) return null;\n    const outset = (label.offsetHeight * (parseFloat(label.dataset.xOutset) || 0)) / 100;\n    return {\n      label,\n      media,\n      fromBottom: media.clientHeight - label.offsetTop,\n      inline: label.dataset.h === 'right' ? media.clientWidth - label.offsetLeft : label.offsetLeft + label.offsetWidth,\n      height: label.offsetHeight,\n      outset,\n      radius: outset > 0 ? parseFloat(getComputedStyle(label).getPropertyValue('--corner-radius-cards-and-images')) || 0 : 0,\n    };\n  };\n\n  const write = ({ label, media, fromBottom, inline, height, outset, radius }) => {\n    media.style.setProperty('--x-vo-inline', `${inline}px`);\n    // [L1c] Label sticking out of the bottom edge: only the part still inside the image takes space there.\n    // offsetTop ignores the transform that moves it. The two curves of the cutout must fit in that part\n    if (outset > 0) {\n      const inside = height - outset;\n      label.style.setProperty('--x-vo-r', `${Math.min(radius, inside / 2)}px`);\n      media.style.setProperty('--x-vo-outset-px', `${outset}px`);\n      media.style.setProperty('--x-vo-block', `${fromBottom - outset}px`);\n      media.style.setProperty('--x-vo-mid', `${Math.max(inside / 2, 10)}px`);\n      // All of it below the image: the dots have nothing to keep clear of\n      if (inside < 1) {\n        media.style.setProperty('--x-vo-inline', '0px');\n        media.style.setProperty('--x-vo-extra', '0px');\n      }\n      return;\n    }\n    media.style.setProperty('--x-vo-block', `${fromBottom}px`);\n    media.style.setProperty('--x-vo-mid', `${fromBottom - height / 2}px`);\n  };\n\n  const measureAll = (labels) => [...labels].map(read).filter(Boolean).forEach(write);\n  const SELECTOR = '.x-vendor-overlay[data-v=\"bottom\"]';\n  const labelOf = (el) => (el.matches(SELECTOR) ? el : el.querySelector(`:scope > ${SELECTOR}`));\n\n  const observer = 'ResizeObserver' in window\n    ? new ResizeObserver((entries) => measureAll(new Set(entries.map((entry) => labelOf(entry.target)).filter(Boolean))))\n    : null;\n  const seen = new WeakSet();\n\n  const init = () => {\n    const labels = [...document.querySelectorAll(SELECTOR)].filter((label) => !seen.has(label));\n    labels.forEach((label) => seen.add(label));\n    if (!observer) return measureAll(labels);\n    labels.forEach((label) => {\n      observer.observe(label);\n      if (label.parentElement) observer.observe(label.parentElement);\n    });\n  };\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n  document.addEventListener('shopify:section:load', init);\n  // Filtering, sorting and infinite scroll swap the product cards: new ones, once per frame\n  let queued = false;\n  new MutationObserver((mutations) => {\n    if (queued || !mutations.some((m) => m.addedNodes.length)) return;\n    queued = true;\n    requestAnimationFrame(() => {\n      queued = false;\n      init();\n    });\n  }).observe(document.documentElement, { childList: true, subtree: true });\n})();\n\n/* CUSTOM: [L12] Bottom offset for chips overlaid on the card image: above the overlaid gallery dots\n   and a vendor overlaid at the bottom, whichever is higher.\n   [L32] Reads first, writes after, one batch per frame; after a change of the page only the cards it touched\n   (e.g. the gallery dots Swiper adds when a gallery starts) are measured again, not all of them */\n(() => {\n  const GAP = 8;\n  const MEDIA = '.product-item__media';\n\n  const read = (media) => {\n    const box = media.getBoundingClientRect();\n    let taken = 0;\n    const vendor = media.querySelector(':scope > .x-vendor-overlay[data-v=\"bottom\"]');\n    if (vendor) taken = Math.max(taken, box.bottom - vendor.getBoundingClientRect().top);\n    media.querySelectorAll('.product-item__gallery .product-item__gallery-pagination').forEach((dots) => {\n      const style = getComputedStyle(dots);\n      if (style.display === 'none' || style.position !== 'absolute') return;\n      taken = Math.max(taken, box.bottom - dots.getBoundingClientRect().top);\n    });\n    return [media, `${Math.round(taken + GAP)}px`];\n  };\n\n  const measureAll = (medias) =>\n    [...medias].map(read).forEach(([media, value]) => {\n      if (media.style.getPropertyValue('--x-chips-bottom') !== value) media.style.setProperty('--x-chips-bottom', value);\n    });\n\n  const observer = 'ResizeObserver' in window\n    ? new ResizeObserver((entries) => measureAll(new Set(entries.map((entry) => entry.target))))\n    : null;\n  const seen = new WeakSet();\n\n  const chipsMedia = (root) =>\n    [...root.querySelectorAll('.x-chips-overlay')].map((chips) => chips.parentElement).filter(Boolean);\n\n  const init = () => {\n    const medias = chipsMedia(document).filter((media) => !seen.has(media));\n    medias.forEach((media) => seen.add(media));\n    if (!observer) return measureAll(medias);\n    medias.forEach((media) => observer.observe(media));\n  };\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n  window.addEventListener('load', () => measureAll(chipsMedia(document)));\n  document.addEventListener('shopify:section:load', init);\n\n  // New cards, and cards whose content changed (dots added by a gallery starting): once per frame\n  const dirty = new Set();\n  let queued = false;\n  new MutationObserver((mutations) => {\n    mutations.forEach((m) => {\n      if (!m.addedNodes.length) return;\n      const media = m.target.closest?.(MEDIA);\n      if (media && seen.has(media)) dirty.add(media);\n    });\n    if (queued) return;\n    queued = true;\n    requestAnimationFrame(() => {\n      queued = false;\n      init();\n      const medias = [...dirty];\n      dirty.clear();\n      if (medias.length) measureAll(medias);\n    });\n  }).observe(document.documentElement, { childList: true, subtree: true });\n})();\n\n/* CUSTOM: [L14] Clicking a swatch on a card with data-x-swatch-reload replaces the whole card with the\n   one of the chosen sibling product / colour variant (sections/x-product-card.liquid), without a page load */\n(() => {\n  const cache = new Map();\n\n  const fetchCard = (url) => {\n    if (!cache.has(url)) {\n      const sep = url.includes('?') ? '&' : '?';\n      const request = fetch(`${url}${sep}section_id=x-product-card`)\n        .then((response) => {\n          if (!response.ok) throw new Error(response.status);\n          return response.text();\n        })\n        .then((html) => {\n          const box = document.createElement('div');\n          box.innerHTML = html;\n          const card = box.querySelector('[data-x-product-card] .product-item');\n          if (!card) throw new Error('no card');\n          return card.outerHTML;\n        });\n      request.catch(() => cache.delete(url));\n      cache.set(url, request);\n    }\n    return cache.get(url);\n  };\n\n  // Quick buttons get their listeners when the section loads: keep the original elements, with the new data\n  const keepQuickButtons = (oldCard, newCard) => {\n    const oldButtons = oldCard.querySelectorAll('[data-quick-shop-trigger]');\n    newCard.querySelectorAll('[data-quick-shop-trigger]').forEach((fresh, i) => {\n      const kept = oldButtons[i];\n      if (!kept || kept.dataset.quickShopTrigger !== fresh.dataset.quickShopTrigger) return;\n      [...kept.attributes].forEach((attr) => {\n        if (attr.name.startsWith('data-') && !fresh.hasAttribute(attr.name)) kept.removeAttribute(attr.name);\n      });\n      [...fresh.attributes].forEach((attr) => {\n        if (attr.name.startsWith('data-') || attr.name === 'href' || attr.name === 'aria-label') {\n          kept.setAttribute(attr.name, attr.value);\n        }\n      });\n      fresh.replaceWith(kept);\n    });\n  };\n\n  const swap = (oldCard, html, key) => {\n    const box = document.createElement('div');\n    box.innerHTML = html;\n    const newCard = box.firstElementChild;\n    // Context of the original render: reveal classes, z-index and section colours, image sizes\n    newCard.className = oldCard.className;\n    newCard.setAttribute('style', oldCard.getAttribute('style') || '');\n    const sizes = oldCard.querySelector('img[sizes]')?.getAttribute('sizes');\n    if (sizes) newCard.querySelectorAll('img[sizes]').forEach((img) => img.setAttribute('sizes', sizes));\n    keepQuickButtons(oldCard, newCard);\n    oldCard.replaceWith(newCard);\n    const selected = [...newCard.querySelectorAll('[js-option-swatch]')].find((el) => el.dataset.xCardKey === key);\n    selected?.focus({ preventScroll: true });\n  };\n\n  document.addEventListener('click', (event) => {\n    const swatch = event.target.closest('[js-option-swatch][data-x-card-url]');\n    const card = swatch?.closest('.product-item[data-x-swatch-reload]');\n    if (!card || !swatch.dataset.xCardUrl) return;\n    if (swatch.dataset.xCardKey === card.dataset.xCardKey) return;\n    if (card.getAttribute('aria-busy') === 'true') return;\n\n    card.setAttribute('aria-busy', 'true');\n    fetchCard(swatch.dataset.xCardUrl)\n      .then((html) => swap(card, html, swatch.dataset.xCardKey))\n      .catch(() => card.removeAttribute('aria-busy'));\n  });\n})();\n\n/* CUSTOM: [P17] Arrows on the main image of the product page \"thumbnails\" gallery: each arrow clicks the\n   previous/next thumbnail, so the theme switches the image and the active thumbnail as on a thumbnail click */\n(() => {\n  const thumbsOf = (container) => [...container.querySelectorAll('[data-product-thumbnail]')];\n\n  const update = (arrows) => {\n    const thumbs = thumbsOf(arrows.closest('.product__media-container'));\n    const index = thumbs.findIndex((thumb) => thumb.classList.contains('active'));\n    const loop = arrows.hasAttribute('data-x-loop');\n    arrows.querySelector('[data-x-media-step=\"-1\"]').disabled = !loop && index <= 0;\n    arrows.querySelector('[data-x-media-step=\"1\"]').disabled = !loop && index >= thumbs.length - 1;\n  };\n\n  // Keep the chosen thumbnail visible in its scrolling strip without scrolling the page\n  const reveal = (thumb) => {\n    const viewport = thumb.closest('[data-scroll-container-viewport]');\n    if (!viewport) return;\n    const box = viewport.getBoundingClientRect();\n    const rect = thumb.getBoundingClientRect();\n    if (rect.top < box.top) viewport.scrollTop -= box.top - rect.top;\n    if (rect.bottom > box.bottom) viewport.scrollTop += rect.bottom - box.bottom;\n    if (rect.left < box.left) viewport.scrollLeft -= box.left - rect.left;\n    if (rect.right > box.right) viewport.scrollLeft += rect.right - box.right;\n  };\n\n  document.addEventListener('click', (event) => {\n    const button = event.target.closest('[data-x-media-arrows] [data-x-media-step]');\n    if (!button) return;\n    event.preventDefault();\n    event.stopPropagation();\n    const arrows = button.closest('[data-x-media-arrows]');\n    const thumbs = thumbsOf(arrows.closest('.product__media-container'));\n    const index = thumbs.findIndex((thumb) => thumb.classList.contains('active'));\n    let next = index + Number(button.dataset.xMediaStep);\n    // With looping, past the last image comes the first one, and before the first the last\n    if (arrows.hasAttribute('data-x-loop')) next = (next + thumbs.length) % thumbs.length;\n    const target = thumbs[next];\n    if (!target) return;\n    target.click();\n    reveal(target);\n    update(arrows);\n  });\n\n  const observed = new WeakSet();\n  const init = () => {\n    document.querySelectorAll('[data-x-media-arrows]').forEach((arrows) => {\n      update(arrows);\n      if (observed.has(arrows)) return;\n      observed.add(arrows);\n      // Thumbnail clicks and variant changes move the active thumbnail too\n      const list = arrows.closest('.product__media-container').querySelector('.product-thumbnails__items');\n      if (list) {\n        new MutationObserver(() => update(arrows)).observe(list, {\n          attributes: true,\n          attributeFilter: ['class'],\n          subtree: true\n        });\n      }\n    });\n  };\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n  document.addEventListener('shopify:section:load', init);\n})();\n\n/* CUSTOM: [P18] Product page \"thumbnails\" gallery: the theme loads each hidden image only when it is shown.\n   Once the page has finished loading (browser idle), fetch the images next to the shown one, and the one\n   under the pointer on a thumbnail, so switching image is immediate without slowing the first load. */\n(() => {\n  const warm = (container, mediaId) => {\n    const media = container.querySelector(`.product__media [data-media-id=\"${mediaId}\"]`);\n    const img = media?.closest('.product__media-item')?.querySelector('img[loading=\"lazy\"]');\n    if (img) img.loading = 'eager';\n  };\n\n  const warmAround = (container) => {\n    if (!container.offsetParent) return; // gallery of the other breakpoint\n    const thumbs = [...container.querySelectorAll('[data-product-thumbnail]')];\n    const index = thumbs.findIndex((thumb) => thumb.classList.contains('active'));\n    // The shown one too: a lazy image only starts once the browser has laid it out\n    [thumbs[index], thumbs[index - 1], thumbs[index + 1]].forEach((thumb) => thumb && warm(container, thumb.dataset.thumbnailId));\n  };\n\n  const observed = new WeakSet();\n  const init = () => {\n    document.querySelectorAll('.product__media-container[data-gallery-style=\"thumbnails\"]').forEach((container) => {\n      warmAround(container);\n      if (observed.has(container)) return;\n      observed.add(container);\n      const list = container.querySelector('.product-thumbnails__items');\n      if (list) {\n        new MutationObserver(() => warmAround(container)).observe(list, {\n          attributes: true,\n          attributeFilter: ['class'],\n          subtree: true\n        });\n      }\n    });\n  };\n\n  const idle = (fn) => ('requestIdleCallback' in window ? requestIdleCallback(fn, { timeout: 2000 }) : setTimeout(fn, 200));\n  if (document.readyState === 'complete') {\n    idle(init);\n  } else {\n    window.addEventListener('load', () => idle(init), { once: true });\n  }\n  document.addEventListener('shopify:section:load', init);\n  window.addEventListener('resize', () => document\n    .querySelectorAll('.product__media-container[data-gallery-style=\"thumbnails\"]')\n    .forEach(warmAround));\n\n  document.addEventListener('pointerover', (event) => {\n    const thumb = event.target.closest?.('[data-product-thumbnail]');\n    const container = thumb?.closest('.product__media-container[data-gallery-style=\"thumbnails\"]');\n    if (container) warm(container, thumb.dataset.thumbnailId);\n  });\n})();\n\n/* CUSTOM: [L16] Product card gallery in a real loop (Theme settings > Product cards > Gallery loop): after the\n   last image the first one comes in as the next, with the arrows and with a swipe. The theme's\n   <product-item-gallery> creates its slider without loop; for cards with data-x-gallery-loop it is switched\n   to loop in place, the way Swiper does it itself at a breakpoint, whether the slider started before or after\n   this script. Relies on theme internals (ProductItemGallery in assets/theme.js): recheck after a Stiletto\n   update. If they are missing this does nothing and the gallery works as in the theme. */\n(() => {\n  const Gallery = customElements.get('product-item-gallery');\n  const proto = Gallery?.prototype;\n  const methods = ['_handleAfterSwiperInitialized', '_handleSlideChanged', '_slideToMediaId', '_updateBulletWindow'];\n  if (!proto || methods.some((name) => typeof proto[name] !== 'function')) return;\n  const original = Object.fromEntries(methods.map((name) => [name, proto[name]]));\n\n  const loops = (gallery) =>\n    Boolean(gallery.closest('.product-item[data-x-gallery-loop]')) && gallery.swiperSlides?.length > 1;\n\n  const toLoop = (gallery, swiper) => {\n    if (!swiper || swiper.destroyed || swiper.params.loop || typeof swiper.loopCreate !== 'function') return;\n    const index = swiper.activeIndex;\n    swiper.params.loop = true;\n    swiper.params.loopedSlides = Math.min(2, gallery.swiperSlides.length);\n    swiper.loopCreate();\n    swiper.updateSlides();\n    swiper.slideTo(index + swiper.loopedSlides, 0, false);\n    // Arrows disabled at the ends before the switch stay disabled otherwise\n    gallery.querySelectorAll('[js-swiper-prev-button], [js-swiper-next-button]').forEach((button) => {\n      button.disabled = false;\n      button.classList.remove('swiper-button-disabled');\n      button.removeAttribute('aria-disabled');\n    });\n    swiper.pagination?.render();\n    swiper.pagination?.update();\n    // Count the images, not Swiper's copies at the ends, for the windowed dots\n    gallery.slidesCount = gallery.swiperSlides.length;\n    original._updateBulletWindow.call(gallery, swiper.realIndex);\n  };\n\n  proto._handleAfterSwiperInitialized = function (swiper) {\n    original._handleAfterSwiperInitialized.call(this, swiper);\n    if (loops(this)) toLoop(this, swiper);\n  };\n\n  proto._handleSlideChanged = function (swiper) {\n    if (!loops(this) || !swiper.params.loop) return original._handleSlideChanged.call(this, swiper);\n    this._playActiveSlideVideo(swiper);\n    this._updateBulletWindow(swiper.realIndex);\n  };\n\n  // Swatch clicks and the featured image: index among the images, not among Swiper's slides\n  proto._slideToMediaId = function (mediaId, speed) {\n    if (!loops(this) || !this.swiperInstance?.params.loop) return original._slideToMediaId.call(this, mediaId, speed);\n    const index = this.swiperSlidesArray.findIndex((slide) => slide.getAttribute(this.attrs.mediaId) === mediaId);\n    if (index < 0) return;\n    this.swiperInstance.slideToLoop(index, speed);\n    const activeSlide = this.swiperInstance.slides[this.swiperInstance.activeIndex];\n    if (this.productItemSwatchesList && activeSlide) {\n      this.productItemSwatchesList.setAttribute(this.attrs.activeURL, activeSlide.href);\n    }\n  };\n\n  // Galleries whose slider was already running when this script loaded\n  document.querySelectorAll('.product-item[data-x-gallery-loop] product-item-gallery').forEach((gallery) => {\n    if (loops(gallery)) toLoop(gallery, gallery.swiperInstance);\n  });\n})();\n\n\n/* CUSTOM: [L28] Product card galleries: only the image shown first comes with the page; the others are rendered\n   with an empty src, their 360px URL in data-x-src and a data-x-srcset flag (snippets/responsive-image.liquid,\n   x_defer); the srcset is made here from that URL, so the server computes one URL instead of a whole srcset.\n   When a card comes into view the images next to the shown one are loaded (a swipe finds them ready); all the\n   others when the card is used: hover, touch, focus, a swatch or an arrow. Swiper's loop copies (L16) are\n   copies of the slides, so every image with the same media id is loaded together. */\n(() => {\n  const DEFERRED = 'img[data-x-srcset]';\n\n  // The 360px URL from the page, at other widths: same crop, height in proportion; never wider than the original\n  const WIDTHS = [360, 540, 720, 1080];\n  const srcset = (src, naturalWidth) => {\n    const base = new URL(src, location.href);\n    const width = Number(base.searchParams.get('width')) || 360;\n    const height = Number(base.searchParams.get('height'));\n    return WIDTHS.filter((w) => w === 360 || !naturalWidth || w <= naturalWidth)\n      .map((w) => {\n        const url = new URL(base);\n        url.searchParams.set('width', w);\n        if (height) url.searchParams.set('height', Math.round((height * w) / width));\n        return `${url.href} ${w}w`;\n      })\n      .join(', ');\n  };\n\n  const BLANK = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n\n  const load = (img) => {\n    if (!img.hasAttribute('data-x-srcset') || !img.dataset.xSrc) return;\n    if ('xKeepSrc' in img.dataset) {\n      // [L38] an image released by the carousel: the same URLs as before, so the browser takes it from its cache\n      if (img.dataset.xKeepSrcset) img.srcset = img.dataset.xKeepSrcset;\n      img.src = img.dataset.xKeepSrc;\n      delete img.dataset.xKeepSrc;\n      delete img.dataset.xKeepSrcset;\n    } else {\n      img.srcset = srcset(img.dataset.xSrc, Number(img.getAttribute('width')));\n      img.src = img.dataset.xSrc;\n    }\n    img.removeAttribute('data-x-srcset');\n    img.removeAttribute('data-x-src');\n  };\n\n  // [L38] Back to the deferred state: an empty src, the URLs kept to be loaded again by load()\n  const release = (img) => {\n    if (img.hasAttribute('data-x-srcset')) return;\n    const src = img.getAttribute('src');\n    if (!src || src === BLANK) return;\n    img.dataset.xKeepSrc = src;\n    img.dataset.xKeepSrcset = img.getAttribute('srcset') || '';\n    img.dataset.xSrc = src;\n    img.setAttribute('data-x-srcset', '');\n    img.removeAttribute('srcset');\n    img.src = BLANK;\n  };\n\n  const loadAll = (gallery) => gallery?.querySelectorAll(DEFERRED).forEach(load);\n\n  const loadMedia = (gallery, ids) =>\n    ids.forEach((id) => {\n      gallery.querySelectorAll(`[data-media-id=\"${id}\"] ${DEFERRED}`).forEach(load);\n    });\n\n  // The shown image and the ones before and after it, among the real slides (not the loop copies)\n  const loadNeighbours = (gallery) => {\n    const slides = [...gallery.querySelectorAll('.swiper-slide[data-media-id]:not(.swiper-slide-duplicate)')];\n    if (!slides.length) return;\n    const shownId = gallery.dataset.featuredMediaId;\n    let index = slides.findIndex((slide) => slide.dataset.mediaId === shownId);\n    if (index < 0) index = 0;\n    const ids = [index - 1, index, index + 1].map((i) => slides[(i + slides.length) % slides.length].dataset.mediaId);\n    loadMedia(gallery, ids);\n  };\n\n  // CUSTOM: [L29/L30] carousel cards from the 3rd on (Theme settings > Performance > Mobile) have their shown image\n  // deferred too. On mobile the first image of all the carousel's cards is loaded together: at the first touch on\n  // the carousel, or as soon as one of those cards comes into view without a touch. On desktop (720px and up) at once.\n  const CAROUSEL = '.featured-collection-slider__content';\n  const desktop = window.matchMedia('(min-width: 720px)');\n\n  const shownDeferred = (gallery) =>\n    Boolean(gallery.dataset.featuredMediaId) &&\n    Boolean(gallery.querySelector(`[data-media-id=\"${gallery.dataset.featuredMediaId}\"] ${DEFERRED}`));\n\n  // [L31] \"card per card\" (Theme settings > Performance > Mobile): on mobile each card loads its own first image when\n  // it comes into view, the carousel is never loaded all together\n  const perCard = (carousel) => carousel.hasAttribute('data-x-defer-per-card') && !desktop.matches;\n\n  // [L38] Mobile carousels with \"Galleria solo con le frecce\" (Theme settings > Performance > Mobile): the card\n  // gallery doesn't swipe there (L18), so its other images wait for an arrow (or a dot, or a swatch). Collection\n  // grids keep loading them at the first touch, where the gallery is browsed by swiping\n  const arrowsOnly = (gallery) =>\n    !desktop.matches &&\n    Boolean(gallery?.closest(`${CAROUSEL}[data-x-gallery-arrows-only]`)) &&\n    Boolean(gallery.closest('.product-item[data-x-gallery-no-swipe-mobile]'));\n\n  const loadShown = (carousel, force) => {\n    if (carousel.dataset.xShownLoaded || (perCard(carousel) && !force)) return;\n    carousel.dataset.xShownLoaded = 'true';\n    carousel.querySelectorAll('product-item-gallery').forEach((gallery) => {\n      if (gallery.dataset.featuredMediaId) loadMedia(gallery, [gallery.dataset.featuredMediaId]);\n    });\n  };\n\n  const observer =\n    'IntersectionObserver' in window\n      ? new IntersectionObserver(\n          (entries) =>\n            entries.forEach((entry) => {\n              if (!entry.isIntersecting) return;\n              observer.unobserve(entry.target);\n              const carousel = entry.target.closest(CAROUSEL);\n              if (carousel && shownDeferred(entry.target)) loadShown(carousel);\n              if (!arrowsOnly(entry.target)) loadNeighbours(entry.target);\n            }),\n          { rootMargin: '200px 0px' }\n        )\n      : null;\n\n  const watch = (gallery) => {\n    if (!gallery.querySelector(DEFERRED)) return;\n    if (desktop.matches && shownDeferred(gallery)) loadMedia(gallery, [gallery.dataset.featuredMediaId]);\n    if (observer) observer.observe(gallery);\n    else loadAll(gallery);\n  };\n\n  // A phone turned to landscape, or a window widened past 720px: the desktop behaviour\n  desktop.addEventListener?.('change', (event) => {\n    if (event.matches) document.querySelectorAll(CAROUSEL).forEach((carousel) => loadShown(carousel, true));\n  });\n\n  // Galleries already in the page, and the ones added later (swatch reload L14, filters, quick views)\n  document.querySelectorAll('product-item-gallery').forEach(watch);\n  // (custom element callbacks are read when the element is defined, so a MutationObserver instead of a patch)\n  new MutationObserver((records) =>\n    records.forEach((record) =>\n      record.addedNodes.forEach((node) => {\n        if (node.nodeType !== 1 || !node.querySelector(DEFERRED)) return;\n        if (node.matches('product-item-gallery')) watch(node);\n        else node.querySelectorAll('product-item-gallery').forEach(watch);\n      })\n    )\n  ).observe(document.body, { childList: true, subtree: true });\n\n  // Use of the card: every image of its gallery\n  const onUse = (event) => {\n    const target = event.target;\n    // [L29] a touch (or the mouse) on a carousel: the first image of all its cards, before the swipe shows them\n    const carousel = target.closest?.(CAROUSEL);\n    if (carousel) loadShown(carousel);\n    const card = target.closest?.('.product-item');\n    const gallery = card?.querySelector('product-item-gallery');\n    if (gallery && !arrowsOnly(gallery)) loadAll(gallery);\n  };\n  ['pointerover', 'touchstart', 'focusin'].forEach((type) =>\n    document.addEventListener(type, onUse, { passive: true, capture: true })\n  );\n\n  // [L38] An arrow or a dot of the gallery: all its images (before Swiper moves, so the next one is on its way)\n  const onArrow = (event) => {\n    const button = event.target.closest?.(\n      '[js-swiper-next-button], [js-swiper-prev-button], .swiper-pagination-bullet'\n    );\n    const gallery = button?.closest('.product-item')?.querySelector('product-item-gallery');\n    if (gallery) loadAll(gallery);\n  };\n  ['pointerdown', 'click'].forEach((type) =>\n    document.addEventListener(type, onArrow, { passive: true, capture: true })\n  );\n\n  // [L38] A swatch (L14) shows another image: that one, whatever the gallery has loaded\n  const Gallery = customElements.get('product-item-gallery');\n  if (Gallery) {\n    const slideToMediaId = Gallery.prototype._slideToMediaId;\n    Gallery.prototype._slideToMediaId = function (mediaId, speed) {\n      if (mediaId) loadMedia(this, [String(mediaId)]);\n      return slideToMediaId.call(this, mediaId, speed);\n    };\n  }\n\n  // [L38] Mobile carousels with \"Libera la memoria\" (Theme settings > Performance > Mobile): when a carousel is\n  // two screens away its images are released (back to an empty src), except the image shown by its first 3 cards.\n  // Coming back within a screen, the image shown by each card comes again, from the browser cache; the other\n  // gallery images wait for an arrow. Safari keeps less in memory, so it doesn't redraw blank the cards in view\n  const KEEP_CARDS = 3;\n  const shownId = (gallery) => {\n    const swiper = gallery.swiperInstance;\n    const active = swiper?.slides?.[swiper.activeIndex];\n    return active?.dataset.mediaId || gallery.dataset.featuredMediaId;\n  };\n  const galleries = (carousel) => [...carousel.querySelectorAll('product-item-gallery')];\n\n  const releaseCarousel = (carousel) => {\n    galleries(carousel).forEach((gallery, index) => {\n      const keep = index < KEEP_CARDS ? shownId(gallery) : null;\n      gallery.querySelectorAll('.swiper-slide[data-media-id] img').forEach((img) => {\n        if (keep && img.closest('.swiper-slide').dataset.mediaId === keep) return;\n        release(img);\n      });\n    });\n    carousel.dataset.xReleased = 'true';\n  };\n\n  const restoreCarousel = (carousel) => {\n    delete carousel.dataset.xReleased;\n    galleries(carousel).forEach((gallery) => {\n      const id = shownId(gallery);\n      if (id) loadMedia(gallery, [id]);\n    });\n  };\n\n  if ('IntersectionObserver' in window) {\n    // Near: within a screen above or below\n    const near = new IntersectionObserver(\n      (entries) =>\n        entries.forEach(({ target, isIntersecting }) => {\n          if (!isIntersecting) return;\n          target.dataset.xSeen = 'true';\n          if (target.dataset.xReleased) restoreCarousel(target);\n        }),\n      { rootMargin: '100% 0px' }\n    );\n    // Far: more than two screens away, and seen before (a carousel not reached yet keeps its first load as it is)\n    const far = new IntersectionObserver(\n      (entries) =>\n        entries.forEach(({ target, isIntersecting }) => {\n          if (isIntersecting || desktop.matches || !target.dataset.xSeen || target.dataset.xReleased) return;\n          releaseCarousel(target);\n        }),\n      { rootMargin: '200% 0px' }\n    );\n    document.querySelectorAll(`${CAROUSEL}[data-x-release]`).forEach((carousel) => {\n      near.observe(carousel);\n      far.observe(carousel);\n    });\n    // Widened to desktop: everything back\n    desktop.addEventListener?.('change', (event) => {\n      if (event.matches) document.querySelectorAll(`${CAROUSEL}[data-x-released]`).forEach(restoreCarousel);\n    });\n  }\n})();\n\n/* CUSTOM: [H23] Collections mega menu (Header block \"Mega menu collezioni\"): the desktop carousel, with the\n   collection list slider's options. The header isn't a slider section, so nothing else starts it. The theme\n   editor re-renders the header and opens the menu from the block: start new carousels whenever they appear and\n   measure again each time the menu opens */\n(() => {\n  const start = (el) => {\n    if (el.swiper || el.dataset.xStarting || !window.flu?.chunks?.swiper) return;\n    el.dataset.xStarting = 'true';\n    // Full URL: in the theme editor this file comes from the CDN, and a classic script from another origin has no\n    // base URL, so the chunk's protocol-relative one can't be resolved\n    import(new URL(window.flu.chunks.swiper, location.href).href).then(({ Swiper, Navigation }) => {\n      if (el.swiper || !el.isConnected) return;\n      const columns = parseInt(el.dataset.columns, 10) || 4;\n      // Custom card width: the CSS sets each slide's width, the last one can stay cut until the arrow\n      const auto = el.hasAttribute('data-x-card-width');\n      const perView = auto ? 'auto' : columns === 5 ? 4 : columns;\n      // Gap between the cards from the settings; the mega menu only has the desktop one\n      const gap = parseInt(el.dataset.gap, 10);\n      const gapMobile = parseInt(el.dataset.gapMobile ?? el.dataset.gap, 10);\n      const swiper = new Swiper(el, {\n        modules: [Navigation],\n        slidesPerView: perView,\n        // [L19] Few cards follow a centred banner\n        centerInsufficientSlides: getComputedStyle(el).getPropertyValue('--text-horizontal-position').trim() === 'center',\n        spaceBetween: gapMobile,\n        grabCursor: true,\n        preloadImages: false,\n        watchSlidesProgress: true,\n        // The meganav is hidden until hovered: measure again when it shows\n        observer: true,\n        observeParents: true,\n        navigation: { nextEl: el.querySelector('[data-next]'), prevEl: el.querySelector('[data-prev]') },\n        breakpoints: { 720: { spaceBetween: gap, slidesPerView: perView }, 1200: { spaceBetween: gap, slidesPerView: auto ? 'auto' : columns } }\n      });\n      // [L19] Bring the current collection into view when it starts beyond the edge\n      const current = el.querySelector('[aria-current]')?.closest('.swiper-slide');\n      if (current && current.getBoundingClientRect().right > el.getBoundingClientRect().right) {\n        // One card before it stays in view\n        swiper.slideTo(Math.max(0, swiper.slides.indexOf(current) - 1), 0);\n      }\n    }).catch((error) => {\n      delete el.dataset.xStarting;\n      console.error('[x-carousel]', error);\n    });\n  };\n  const init = (root) => root.querySelectorAll?.('[data-x-collection-carousel]').forEach(start);\n  const refresh = (menu) => {\n    const el = menu?.querySelector('[data-x-collection-carousel]');\n    if (!el) return;\n    start(el);\n    requestAnimationFrame(() => {\n      if (!el.swiper) return;\n      el.swiper.update();\n      el.swiper.navigation?.update();\n    });\n  };\n\n  init(document);\n  document.addEventListener('shopify:section:load', (event) => init(event.target));\n  document.addEventListener('shopify:block:select', (event) => {\n    if (event.target.classList?.contains('x-collection-meganav')) refresh(event.target);\n  });\n  ['mouseover', 'focusin'].forEach((type) =>\n    document.addEventListener(type, (event) => {\n      const trigger = event.target.closest?.('[data-meganav-handle]');\n      if (!trigger) return;\n      refresh(document.querySelector(`.x-collection-meganav[data-menu-handle=\"${trigger.dataset.meganavHandle}\"]`));\n    })\n  );\n  new MutationObserver((records) => {\n    records.forEach((record) => record.addedNodes.forEach((node) => node.nodeType === 1 && (node.matches('[data-x-collection-carousel]') ? start(node) : init(node))));\n  }).observe(document.documentElement, { childList: true, subtree: true });\n})();\n\n/* CUSTOM: [L19] Related collections, title only: on mobile the row scrolls, start with the current one in view */\ndocument.querySelectorAll('[data-x-related-titles]').forEach((row) => {\n  const current = row.querySelector('[aria-current]');\n  if (current && current.offsetLeft + current.offsetWidth > row.clientWidth) row.scrollLeft = current.offsetLeft - (row.clientWidth - current.offsetWidth) / 2;\n});\n\n/* CUSTOM: [P22] Mobile product gallery fitted to the view: the measures for the height in x-anavi.css. All read\n   from the page, so a different header or a sticky bar with other content adapts by itself. The theme's\n   --sticky-atc-bar-height drops to 0 when the bar hides, which would make the image jump: not used here */\n(() => {\n  const setVar = (el, name, px) => {\n    const value = `${px}px`;\n    if (el.style.getPropertyValue(name) === value) return false;\n    el.style.setProperty(name, value);\n    return true;\n  };\n\n  const init = () => {\n    const section = document.querySelector('.product--main[data-x-mobile-fit]');\n    const container = section?.querySelector('.product__media-container.below-mobile');\n    if (!container) return;\n    const root = document.documentElement;\n    const bar = document.querySelector('.sticky-atc-bar');\n\n    const measure = () => {\n      const top = Math.round(container.getBoundingClientRect().top + window.scrollY);\n      let changed = setVar(section, '--x-fit-top', top);\n      try {\n        sessionStorage.setItem('x-fit-top', top);\n      } catch (e) {}\n\n      // A bar with no height stays at its last measure, unless it's switched off on mobile\n      let sticky = null;\n      if (!bar || bar.dataset.showMobile === 'false') sticky = 0;\n      else if (bar.offsetHeight > 0) sticky = bar.offsetHeight;\n      if (sticky !== null) {\n        changed = setVar(root, '--x-fit-sticky', sticky) || changed;\n        try {\n          sessionStorage.setItem('x-fit-sticky', sticky);\n        } catch (e) {}\n      }\n\n      let below = 0;\n      const thumbs = container.querySelector('.product-thumbnails');\n      if (thumbs && section.hasAttribute('data-x-mobile-fit-thumbs')) {\n        below += thumbs.offsetHeight + (parseFloat(getComputedStyle(container).rowGap) || 0);\n      }\n      if (section.dataset.xMobileDots === 'below') {\n        below += container.querySelector('.x-dots-bar, .swiper-pagination')?.offsetHeight || 0;\n      }\n      changed = setVar(section, '--x-fit-below', below) || changed;\n\n      if (changed) container.swiper?.update();\n    };\n\n    measure();\n    window.addEventListener('resize', measure);\n    window.addEventListener('load', measure);\n    if ('ResizeObserver' in window) {\n      const observer = new ResizeObserver(measure);\n      [bar, document.body, container.querySelector('.product-thumbnails')].forEach((el) => el && observer.observe(el));\n    }\n  };\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n  document.addEventListener('shopify:section:load', init);\n})();\n\n/* CUSTOM: [P23] Size chips in the sticky add to cart bar on mobile: they click the variant picker's chip, so the\n   theme changes the variant as usual, and copy its selected and sold out states */\n(() => {\n  const init = () => {\n    const bar = document.querySelector('.sticky-atc-bar[data-x-sticky-chips]');\n    const row = bar?.querySelector('.x-sticky-chips');\n    if (!row || row.dataset.xReady) return;\n    const picker = document.querySelector(`[data-option-buttons][data-product-option=\"${row.dataset.xChipsOption}\"]`);\n    if (!picker) {\n      // No picker to drive: the theme's \"Change\" stays\n      bar.removeAttribute('data-x-sticky-chips');\n      return;\n    }\n    row.dataset.xReady = 'true';\n    const chips = [...row.querySelectorAll('[data-x-sticky-chip]')];\n    const pickerChip = (chip) =>\n      [...picker.querySelectorAll('[data-option-value]')].find((el) => el.dataset.optionValue === chip.dataset.optionValue);\n\n    const sync = () => {\n      chips.forEach((chip) => {\n        const source = pickerChip(chip);\n        if (!source) return;\n        const selected = source.classList.contains('selected');\n        chip.classList.toggle('selected', selected);\n        chip.classList.toggle('disabled', source.classList.contains('disabled'));\n        chip.setAttribute('aria-pressed', selected);\n      });\n    };\n\n    chips.forEach((chip) => chip.addEventListener('click', () => pickerChip(chip)?.click()));\n    new MutationObserver(sync).observe(picker, { subtree: true, childList: true, attributes: true, attributeFilter: ['class'] });\n    sync();\n  };\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n  document.addEventListener('shopify:section:load', init);\n})();\n\n/* CUSTOM: [P25] Discount code lines (product header and sticky add to cart): they follow the selected variant.\n   The theme rewrites the prices on every variant change, which is the signal used here */\n(() => {\n  const start = (line) => {\n    if (line.dataset.xReady) return;\n    line.dataset.xReady = 'true';\n    const section = line.closest('.product--main') || document;\n    const input = section.querySelector('form[action*=\"/cart/add\"] [name=\"id\"]');\n    const price = line.querySelector('[data-x-code-price]');\n    let variants = {};\n    try {\n      variants = JSON.parse(line.querySelector('[data-x-code-variants]').textContent);\n    } catch (e) {\n      return;\n    }\n    const sync = () => {\n      const variant = variants[input?.value];\n      if (!variant) return;\n      line.hidden = !variant.show;\n      price.textContent = variant.price;\n    };\n    const themePrice = (line.closest('.sticky-atc-bar') || line.closest('.product__block') || section).querySelector('[data-price]');\n    if (themePrice) new MutationObserver(sync).observe(themePrice, { childList: true, characterData: true, subtree: true });\n    input?.addEventListener('change', sync);\n    sync();\n  };\n  const init = () => document.querySelectorAll('[data-x-code-line]').forEach(start);\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n  document.addEventListener('shopify:section:load', init);\n})();\n\n/* CUSTOM: [C2] Discount codes in the quick cart, with Shopify's own cart endpoint: the codes stay on the cart, so they\n   also apply to what's added later and reach the checkout. The theme refreshes the items on each cart change, with the\n   codes' lines inside, and the footer takes them from there */\n(() => {\n  const MESSAGE_TIME = 4000;\n  const same = (a, b) => a.toLowerCase() === b.toLowerCase();\n  let messageTimer;\n\n  const showMessage = (block, type) => {\n    const message = block.querySelector('[data-x-cart-discount-message]');\n    const input = block.querySelector('[data-x-cart-discount-input]');\n    clearTimeout(messageTimer);\n    message.textContent = block.dataset[`x${type}`];\n    message.classList.remove('hidden');\n    input.classList.add('input--error');\n    messageTimer = setTimeout(() => {\n      message.classList.add('hidden');\n      input.classList.remove('input--error');\n    }, MESSAGE_TIME);\n  };\n\n  const clearMessage = (block) => {\n    clearTimeout(messageTimer);\n    block.querySelector('[data-x-cart-discount-message]').classList.add('hidden');\n    block.querySelector('[data-x-cart-discount-input]').classList.remove('input--error');\n  };\n\n  const getCart = async () => {\n    const response = await fetch(`${window.theme.routes.cart.base}.js`);\n    if (!response.ok) throw new Error('cart');\n    return response.json();\n  };\n\n  const codesOf = (cart) => (cart.discount_codes || []).map((discount) => discount.code);\n\n  const setCodes = async (codes) => {\n    const response = await fetch(`${window.theme.routes.cart.update}.js`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n      body: JSON.stringify({ discount: codes.join(',') }),\n    });\n    if (!response.ok) throw new Error('cart');\n    return response.json();\n  };\n\n  // The event the theme listens to for changes made outside it: it refreshes the quick cart and the header's count\n  const refresh = () => document.dispatchEvent(new CustomEvent('apps:product-added-to-cart'));\n\n  // A code Shopify accepts but with nothing off the items, like free shipping, only shows at checkout.\n  // From /cart.js: the answer of /cart/update.js has no title on the discounts of the whole order\n  const hasCartDiscount = (cart, code) =>\n    (cart.cart_level_discount_applications || []).some((discount) => same(discount.title, code)) ||\n    (cart.items || []).some((item) =>\n      (item.line_level_discount_allocations || []).some((allocation) => same(allocation.discount_application.title, code)),\n    );\n\n  const apply = async (block) => {\n    const input = block.querySelector('[data-x-cart-discount-input]');\n    const button = block.querySelector('[data-x-cart-discount-apply]');\n    const code = input.value.trim();\n    input.blur();\n    if (!code || button.classList.contains('loading')) return;\n\n    clearMessage(block);\n    const shown = [...block.closest('.quick-cart__footer').querySelectorAll('[data-x-cart-discount-code]')].map(\n      (el) => el.dataset.xCartDiscountCode,\n    );\n    if (shown.some((other) => same(other, code))) {\n      input.value = '';\n      return;\n    }\n\n    button.classList.add('loading');\n    try {\n      const before = codesOf(await getCart()).filter((other) => !same(other, code));\n      const cart = await setCodes([...before, code]);\n      const result = (cart.discount_codes || []).find((discount) => same(discount.code, code));\n      if (!result || !result.applicable) {\n        await setCodes(before);\n        refresh();\n        showMessage(block, 'Error');\n        return;\n      }\n      input.value = '';\n      refresh();\n      if (!hasCartDiscount(await getCart(), code)) showMessage(block, 'Shipping');\n    } catch (e) {\n      showMessage(block, 'Network');\n    } finally {\n      button.classList.remove('loading');\n    }\n  };\n\n  const remove = async (block, line) => {\n    clearMessage(block);\n    try {\n      await setCodes(codesOf(await getCart()).filter((code) => !same(code, line.dataset.xCartDiscountCode)));\n      refresh();\n    } catch (e) {\n      showMessage(block, 'Network');\n    }\n  };\n\n  document.addEventListener('click', (event) => {\n    // The summary can be below the separator line, away from the field\n    const block = event.target.closest?.('.quick-cart__footer')?.querySelector('[data-x-cart-discount]');\n    if (!block) return;\n    const removeButton = event.target.closest('[data-x-cart-discount-remove]');\n    if (removeButton) remove(block, removeButton.closest('[data-x-cart-discount-code]'));\n    else if (event.target.closest('[data-x-cart-discount-apply]')) apply(block);\n  });\n\n  // On touch the code goes at once, without waiting for the click: with the keyboard open, iOS can lose it\n  document.addEventListener(\n    'touchend',\n    (event) => {\n      const button = event.target.closest?.('[data-x-cart-discount-apply]');\n      if (!button) return;\n      event.preventDefault();\n      apply(button.closest('[data-x-cart-discount]'));\n    },\n    { passive: false },\n  );\n\n  // Enter stays in the field: the quick cart is a form, and it would go to checkout\n  document.addEventListener('keydown', (event) => {\n    if (event.key !== 'Enter' || !event.target.matches?.('[data-x-cart-discount-input]')) return;\n    event.preventDefault();\n    apply(event.target.closest('[data-x-cart-discount]'));\n  });\n\n  // iOS zooms the page when a field below 16px gets focus, and the theme's body size is smaller. A maximum scale set\n  // before the focus stops it, and iOS still lets people pinch to zoom. Only there: elsewhere it would block the pinch\n  const isIOS = () => /iP(hone|ad|od)/.test(navigator.userAgent) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n  const viewport = document.querySelector('meta[name=\"viewport\"]');\n  const baseViewport = viewport?.content;\n  const isInput = (event) => event.target.matches?.('[data-x-cart-discount-input]');\n\n  document.addEventListener(\n    'touchstart',\n    (event) => {\n      if (viewport && isInput(event) && isIOS()) viewport.content = `${baseViewport},maximum-scale=1`;\n    },\n    { passive: true },\n  );\n  document.addEventListener('focusout', (event) => {\n    if (viewport && isInput(event)) viewport.content = baseViewport;\n  });\n\n  // With the on-screen keyboard open, the cart stays still and its footer slides up until the field is right above the\n  // keyboard: the rest of the footer, with the checkout button, fades away. The focus comes from here to stop the\n  // browser scrolling everything up to show the field, which would make the whole cart jump.\n  // Some browsers cover the page with the keyboard, others make the page shorter, in steps of their own: the footer\n  // hangs from the top of the cart meanwhile, so these steps don't move it and it only makes one smooth trip.\n  // Nothing happens until the visible area shrinks: with a hardware keyboard it never does. Chrome on iOS can close the\n  // keyboard and keep the focus: closed is treated as leaving the field\n  const visible = window.visualViewport;\n  const KEYBOARD_MIN_HEIGHT = 100;\n  const FOOTER_RETURN_TIME = 400;\n  let typingFooter = null;\n  let typingHeight = 0;\n  let typingFieldEnd = 0;\n  let keyboardOpen = false;\n  let footerReturn;\n  const releaseFooter = (el) => {\n    el.classList.remove('x-cart-discount-settling');\n    ['top', 'bottom'].forEach((property) => el.style.removeProperty(property));\n  };\n  const fitTypingFooter = () => {\n    if (!typingFooter) return;\n    if (visible.height > typingHeight - KEYBOARD_MIN_HEIGHT) {\n      if (keyboardOpen) document.activeElement?.blur();\n      return;\n    }\n    keyboardOpen = true;\n    typingFooter.classList.add('x-cart-discount-typing', 'x-cart-discount-settling');\n    typingFooter.style.translate = `0 ${Math.min(0, visible.offsetTop + visible.height - typingFieldEnd)}px`;\n  };\n  document.addEventListener(\n    'touchend',\n    (event) => {\n      if (!visible || !isInput(event) || document.activeElement === event.target) return;\n      event.preventDefault();\n      event.target.focus({ preventScroll: true });\n    },\n    { passive: false },\n  );\n  document.addEventListener('focusin', (event) => {\n    if (!visible || !isInput(event) || !matchMedia('(pointer: coarse)').matches) return;\n    clearTimeout(footerReturn);\n    typingFooter = event.target.closest('.quick-cart__footer');\n    if (!typingFooter) return;\n    typingHeight = visible.height;\n    typingFieldEnd = 0;\n    for (let el = typingFooter.querySelector('.quick-cart__footer-inner'); el; el = el.offsetParent) typingFieldEnd += el.offsetTop;\n    typingFooter.style.top = `${typingFooter.offsetTop}px`;\n    typingFooter.style.bottom = 'auto';\n  });\n  document.addEventListener('focusout', (event) => {\n    if (!typingFooter || !isInput(event)) return;\n    const el = typingFooter;\n    el.classList.remove('x-cart-discount-typing');\n    el.style.removeProperty('translate');\n    typingFooter = null;\n    keyboardOpen = false;\n    footerReturn = setTimeout(() => releaseFooter(el), FOOTER_RETURN_TIME);\n  });\n  visible?.addEventListener('resize', fitTypingFooter);\n  visible?.addEventListener('scroll', fitTypingFooter);\n\n  // Closing the cart closes the keyboard too\n  document.addEventListener('click', (event) => {\n    if (typingFooter && event.target.closest?.('.quick-cart__overlay, .quick-cart [data-modal-close]')) document.activeElement?.blur();\n  });\n\n  // The footer is over the items: their space at the bottom follows its height, like the theme does when it refreshes\n  let footer = null;\n  const fitItems = () => {\n    const items = footer?.parentElement.querySelector('.quick-cart__items');\n    if (items) items.style.paddingBottom = `${footer.clientHeight}px`;\n  };\n  const footerObserver = 'ResizeObserver' in window ? new ResizeObserver(fitItems) : null;\n\n  const sync = (cart) => {\n    const lines = cart.querySelector('[data-x-cart-discount-lines]');\n    const source = cart.querySelector('[data-x-cart-discount-source]');\n    const nextFooter = lines ? lines.closest('.quick-cart__footer') : null;\n    if (nextFooter !== footer) {\n      footerObserver?.disconnect();\n      footer = nextFooter;\n      if (footer) footerObserver?.observe(footer);\n    }\n    if (lines && source && lines.innerHTML !== source.innerHTML) {\n      lines.innerHTML = source.innerHTML;\n      fitItems();\n    }\n  };\n\n  let cartObserver = null;\n  const init = () => {\n    cartObserver?.disconnect();\n    const cart = document.querySelector('.quick-cart');\n    if (!cart) return;\n    sync(cart);\n    cartObserver = new MutationObserver(() => sync(cart));\n    cartObserver.observe(cart, { childList: true, subtree: true });\n  };\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n  document.addEventListener('shopify:section:load', init);\n})();\n\n/* CUSTOM: [P33] Delivery and returns block: dates and shipping costs follow today's date and the selected variant.\n   Worked out here because pages are cached. Italian time, business days only (weekends and \"Giorni festivi\") */\n(() => {\n  /* x-delivery-dates:start */\n  const deliveryDates = ({ now, cutoff, holidays, handling, min, max }) => {\n    const parts = {};\n    new Intl.DateTimeFormat('en-CA', {\n      timeZone: 'Europe/Rome',\n      year: 'numeric',\n      month: '2-digit',\n      day: '2-digit',\n      hour: '2-digit',\n      minute: '2-digit',\n      hourCycle: 'h23',\n    })\n      .formatToParts(now)\n      .forEach((part) => {\n        parts[part.type] = part.value;\n      });\n\n    const key = (date) => date.toISOString().slice(0, 10);\n    const isBusiness = (date) => {\n      const day = date.getUTCDay();\n      if (day === 0 || day === 6) return false;\n      return !holidays.includes(key(date)) && !holidays.includes(key(date).slice(5));\n    };\n    const addBusinessDays = (date, count) => {\n      const next = new Date(date);\n      for (let left = count; left > 0; ) {\n        next.setUTCDate(next.getUTCDate() + 1);\n        if (isBusiness(next)) left -= 1;\n      }\n      return next;\n    };\n\n    const today = new Date(Date.UTC(+parts.year, +parts.month - 1, +parts.day));\n    const time = `${parts.hour}:${parts.minute}`;\n    const inTime = !/^\\d{2}:\\d{2}$/.test(cutoff) || time < cutoff;\n    const start = isBusiness(today) && inTime ? today : addBusinessDays(today, 1);\n    const ship = addBusinessDays(start, handling);\n    return { from: addBusinessDays(ship, min), to: addBusinessDays(ship, max) };\n  };\n  /* x-delivery-dates:end */\n\n  const start = (box) => {\n    if (box.dataset.xReady) return;\n    box.dataset.xReady = 'true';\n\n    const holidays = (box.dataset.xDeliveryHolidays || '').split(',').map((item) => item.trim()).filter(Boolean);\n    const format = new Intl.DateTimeFormat(box.dataset.xDeliveryLocale, {\n      timeZone: 'UTC',\n      weekday: 'short',\n      day: 'numeric',\n      month: 'short',\n    });\n\n    box.querySelectorAll('[data-x-delivery-row]').forEach((row) => {\n      const { from, to } = deliveryDates({\n        now: new Date(),\n        cutoff: box.dataset.xDeliveryCutoff || '',\n        holidays,\n        handling: +box.dataset.xDeliveryHandling || 0,\n        min: +row.dataset.xDeliveryMin,\n        max: +row.dataset.xDeliveryMax,\n      });\n      const first = format.format(from);\n      const last = format.format(to);\n      row.querySelector('[data-x-delivery-date]').textContent = first === last ? first : `${first} \u2013 ${last}`;\n    });\n\n    /* Settings are in the shop's currency. In another one, the block setting hides the amounts, keeps them as they are\n       or converts them with Shopify's rate, in whole numbers because the checkout may round differently */\n    const currency = box.dataset.xDeliveryCurrency;\n    const display = currency ? box.dataset.xDeliveryDisplay : 'shop';\n    const shopifyCurrency = window.Shopify?.currency;\n    const rate = currency ? +shopifyCurrency?.rate : 1;\n    const hasRate = !currency || (rate > 0 && shopifyCurrency?.active === currency);\n    const showAmounts = display === 'shop' || display === 'euro' || (display === 'convert' && hasRate);\n    if (display === 'convert' && hasRate) {\n      /* The store's own money format, from a sample amount in the markup */\n      const whole = new Intl.NumberFormat(box.dataset.xDeliveryLocale, { maximumFractionDigits: 0 });\n      const money = (value) => box.dataset.xDeliveryMoney.replace(/\\d[\\d.,\\s]*\\d|\\d/, whole.format(value));\n      const estimate = (element) => {\n        const amount = money(+element.dataset.xDeliveryEur * rate);\n        const approx = box.dataset.xDeliveryApprox;\n        return approx ? approx.replace('[[amount]]', amount) : amount;\n      };\n      box.querySelectorAll('[data-x-delivery-cost], [data-x-delivery-fee]').forEach((element) => {\n        element.textContent = estimate(element);\n      });\n      box.querySelectorAll('[data-x-delivery-free-note]').forEach((element) => {\n        element.textContent = element.dataset.xDeliveryTemplate.replace('[[amount]]', estimate(element));\n      });\n      box.querySelectorAll('[data-x-delivery-fee]').forEach((element) => {\n        element.hidden = false;\n      });\n    }\n\n    let variants = {};\n    try {\n      variants = JSON.parse(box.querySelector('[data-x-delivery-variants]').textContent);\n    } catch (e) {\n      return;\n    }\n    const section = box.closest('.product--main') || document;\n    const input = section.querySelector('form[action*=\"/cart/add\"] [name=\"id\"]');\n\n    const sync = () => {\n      const variant = variants[input?.value];\n      if (!variant) return;\n      box.querySelectorAll('[data-x-delivery-row]').forEach((row) => {\n        row.hidden = !variant.available;\n        const freeFrom = +row.dataset.xDeliveryFreeFrom * rate;\n        const isFree = showAmounts && hasRate && freeFrom > 0 && variant.price >= freeFrom;\n        const cost = row.querySelector('[data-x-delivery-cost]');\n        const free = row.querySelector('[data-x-delivery-free]');\n        const note = row.querySelector('[data-x-delivery-free-note]');\n        if (cost) cost.hidden = !showAmounts || isFree;\n        if (free) free.hidden = !isFree;\n        if (note) note.hidden = !showAmounts || isFree;\n      });\n    };\n\n    const themePrice = section.querySelector('[data-price]');\n    if (themePrice) new MutationObserver(sync).observe(themePrice, { childList: true, characterData: true, subtree: true });\n    input?.addEventListener('change', sync);\n    sync();\n  };\n  const init = () => document.querySelectorAll('[data-x-delivery]').forEach(start);\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n  document.addEventListener('shopify:section:load', init);\n})();\n"],
  "mappings": "CAOC,IAAM,CACL,MAAM,cAAgB,8CAChB,eAAiB,wBACjB,cAAgB,6BAEhB,OAAS,CAAC,MAAO,WAAa,CAClC,MAAM,OAAS,MAAM,OAAO,QAAQ,cAAc,EAC5C,MAAQ,QAAU,OAAO,QAAQ,aAAa,EAC9C,MAAQ,OAAS,MAAM,cAAc,aAAa,EACxD,GAAI,CAAC,MAAO,OAER,MAAM,QAAQ,aAAe,SAC/B,MAAM,QAAQ,WAAa,MAAM,YAAY,KAAK,GAGpD,MAAM,KAAO,OAAO,QAAQ,eAC5B,MAAM,YAAc,UAAY,KAAO,KAAO,MAAM,QAAQ,UAC9D,EAEA,SAAS,iBAAiB,YAAc,OAAU,OAAO,MAAO,EAAI,CAAC,EACrE,SAAS,iBAAiB,WAAa,OAAU,OAAO,MAAO,EAAK,CAAC,EACrE,SAAS,iBAAiB,UAAY,OAAU,OAAO,MAAO,EAAI,CAAC,EACnE,SAAS,iBAAiB,WAAa,OAAU,OAAO,MAAO,EAAK,CAAC,CACvE,GAAG,GAOF,IAAM,CACL,MAAM,MAAS,KAAQ,CACrB,GAAI,IAAI,QAAQ,OAAQ,OACxB,IAAI,QAAQ,OAAS,OAErB,MAAM,QAAU,IAAI,kBACpB,GAAI,CAAC,QAAS,OACd,MAAM,OAAS,IAAI,QAAQ,WAAa,SAElC,OAAS,SAAS,cAAc,QAAQ,EAC9C,OAAO,KAAO,SACd,OAAO,UAAY,wBACnB,OAAO,aAAa,gBAAiB,OAAO,EAC5C,OAAO,YAAc,IAAI,QAAQ,SACjC,OAAO,OAAS,GAEhB,MAAM,YAAc,IAAM,CACxB,MAAM,KAAO,IAAI,QAAQ,QAAU,OACnC,OAAO,OAAO,EACV,QAAU,MACX,QAAQ,kBAAoB,SAAS,OAAO,MAAM,EAC1C,OACT,QAAQ,OAAO,MAAM,EAErB,IAAI,MAAM,MAAM,CAEpB,EAIM,OAAS,IAAM,CACnB,GAAI,IAAI,QAAQ,QAAU,OAAQ,OAClC,IAAI,UAAU,OAAO,cAAc,EACnC,MAAM,WAAa,QAAQ,sBAAsB,EAAE,OACnD,IAAI,UAAU,IAAI,cAAc,EAChC,OAAO,OAAS,YAAc,QAAQ,sBAAsB,EAAE,OAAS,CACzE,EAEA,OAAO,iBAAiB,QAAS,IAAM,CACrC,MAAM,KAAO,IAAI,QAAQ,QAAU,OACnC,IAAI,QAAQ,MAAQ,OAAO,IAAI,EAC/B,IAAI,UAAU,OAAO,eAAgB,CAAC,IAAI,EAC1C,OAAO,YAAc,KAAO,IAAI,QAAQ,SAAW,IAAI,QAAQ,SAC/D,OAAO,aAAa,gBAAiB,OAAO,IAAI,CAAC,EACjD,YAAY,EACZ,OAAO,CACT,CAAC,EAED,IAAI,UAAU,IAAI,cAAc,EAChC,YAAY,EACZ,OAAO,EAEH,mBAAoB,QAAQ,IAAI,eAAe,MAAM,EAAE,QAAQ,GAAG,EAClE,SAAS,OAAO,SAAS,MAAM,MAAM,KAAK,MAAM,EACpD,OAAO,iBAAiB,OAAQ,MAAM,EACtC,OAAO,iBAAiB,SAAU,MAAM,CAC1C,EAEM,KAAO,IAAM,SAAS,iBAAiB,sBAAsB,EAAE,QAAQ,KAAK,EAE9E,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAI,EAElD,KAAK,EAEP,SAAS,iBAAiB,uBAAwB,IAAI,CACxD,GAAG,GAQF,IAAM,CACL,MAAM,KAAQ,OAAU,CACtB,MAAM,MAAQ,MAAM,cACpB,GAAI,CAAC,MAAO,OAAO,KACnB,MAAM,OAAU,MAAM,cAAgB,WAAW,MAAM,QAAQ,OAAO,GAAK,GAAM,IACjF,MAAO,CACL,MACA,MACA,WAAY,MAAM,aAAe,MAAM,UACvC,OAAQ,MAAM,QAAQ,IAAM,QAAU,MAAM,YAAc,MAAM,WAAa,MAAM,WAAa,MAAM,YACtG,OAAQ,MAAM,aACd,OACA,OAAQ,OAAS,GAAI,WAAW,iBAAiB,KAAK,EAAE,iBAAiB,kCAAkC,CAAC,GAAK,CACnH,CACF,EAEM,MAAQ,CAAC,CAAE,MAAO,MAAO,WAAY,OAAQ,OAAQ,OAAQ,MAAO,IAAM,CAI9E,GAHA,MAAM,MAAM,YAAY,gBAAiB,GAAG,MAAM,IAAI,EAGlD,OAAS,EAAG,CACd,MAAM,OAAS,OAAS,OACxB,MAAM,MAAM,YAAY,WAAY,GAAG,KAAK,IAAI,OAAQ,OAAS,CAAC,CAAC,IAAI,EACvE,MAAM,MAAM,YAAY,mBAAoB,GAAG,MAAM,IAAI,EACzD,MAAM,MAAM,YAAY,eAAgB,GAAG,WAAa,MAAM,IAAI,EAClE,MAAM,MAAM,YAAY,aAAc,GAAG,KAAK,IAAI,OAAS,EAAG,EAAE,CAAC,IAAI,EAEjE,OAAS,IACX,MAAM,MAAM,YAAY,gBAAiB,KAAK,EAC9C,MAAM,MAAM,YAAY,eAAgB,KAAK,GAE/C,MACF,CACA,MAAM,MAAM,YAAY,eAAgB,GAAG,UAAU,IAAI,EACzD,MAAM,MAAM,YAAY,aAAc,GAAG,WAAa,OAAS,CAAC,IAAI,CACtE,EAEM,WAAc,QAAW,CAAC,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE,OAAO,OAAO,EAAE,QAAQ,KAAK,EAC5E,SAAW,qCACX,QAAW,IAAQ,GAAG,QAAQ,QAAQ,EAAI,GAAK,GAAG,cAAc,YAAY,QAAQ,EAAE,EAEtF,SAAW,mBAAoB,OACjC,IAAI,eAAgB,SAAY,WAAW,IAAI,IAAI,QAAQ,IAAK,OAAU,QAAQ,MAAM,MAAM,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC,CAAC,EAClH,KACE,KAAO,IAAI,QAEX,KAAO,IAAM,CACjB,MAAM,OAAS,CAAC,GAAG,SAAS,iBAAiB,QAAQ,CAAC,EAAE,OAAQ,OAAU,CAAC,KAAK,IAAI,KAAK,CAAC,EAE1F,GADA,OAAO,QAAS,OAAU,KAAK,IAAI,KAAK,CAAC,EACrC,CAAC,SAAU,OAAO,WAAW,MAAM,EACvC,OAAO,QAAS,OAAU,CACxB,SAAS,QAAQ,KAAK,EAClB,MAAM,eAAe,SAAS,QAAQ,MAAM,aAAa,CAC/D,CAAC,CACH,EAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAI,EAElD,KAAK,EAEP,SAAS,iBAAiB,uBAAwB,IAAI,EAEtD,IAAI,OAAS,GACb,IAAI,iBAAkB,WAAc,CAC9B,QAAU,CAAC,UAAU,KAAM,GAAM,EAAE,WAAW,MAAM,IACxD,OAAS,GACT,sBAAsB,IAAM,CAC1B,OAAS,GACT,KAAK,CACP,CAAC,EACH,CAAC,EAAE,QAAQ,SAAS,gBAAiB,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,CACzE,GAAG,GAMF,IAAM,CAEL,MAAM,MAAQ,uBAER,KAAQ,OAAU,CACtB,MAAM,IAAM,MAAM,sBAAsB,EACxC,IAAI,MAAQ,EACZ,MAAM,OAAS,MAAM,cAAc,6CAA6C,EAChF,OAAI,SAAQ,MAAQ,KAAK,IAAI,MAAO,IAAI,OAAS,OAAO,sBAAsB,EAAE,GAAG,GACnF,MAAM,iBAAiB,0DAA0D,EAAE,QAAS,MAAS,CACnG,MAAM,MAAQ,iBAAiB,IAAI,EAC/B,MAAM,UAAY,QAAU,MAAM,WAAa,aACnD,MAAQ,KAAK,IAAI,MAAO,IAAI,OAAS,KAAK,sBAAsB,EAAE,GAAG,EACvE,CAAC,EACM,CAAC,MAAO,GAAG,KAAK,MAAM,MAAQ,CAAG,CAAC,IAAI,CAC/C,EAEM,WAAc,QAClB,CAAC,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE,QAAQ,CAAC,CAAC,MAAO,KAAK,IAAM,CAC5C,MAAM,MAAM,iBAAiB,kBAAkB,IAAM,OAAO,MAAM,MAAM,YAAY,mBAAoB,KAAK,CACnH,CAAC,EAEG,SAAW,mBAAoB,OACjC,IAAI,eAAgB,SAAY,WAAW,IAAI,IAAI,QAAQ,IAAK,OAAU,MAAM,MAAM,CAAC,CAAC,CAAC,EACzF,KACE,KAAO,IAAI,QAEX,WAAc,MAClB,CAAC,GAAG,KAAK,iBAAiB,kBAAkB,CAAC,EAAE,IAAK,OAAU,MAAM,aAAa,EAAE,OAAO,OAAO,EAE7F,KAAO,IAAM,CACjB,MAAM,OAAS,WAAW,QAAQ,EAAE,OAAQ,OAAU,CAAC,KAAK,IAAI,KAAK,CAAC,EAEtE,GADA,OAAO,QAAS,OAAU,KAAK,IAAI,KAAK,CAAC,EACrC,CAAC,SAAU,OAAO,WAAW,MAAM,EACvC,OAAO,QAAS,OAAU,SAAS,QAAQ,KAAK,CAAC,CACnD,EAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAI,EAElD,KAAK,EAEP,OAAO,iBAAiB,OAAQ,IAAM,WAAW,WAAW,QAAQ,CAAC,CAAC,EACtE,SAAS,iBAAiB,uBAAwB,IAAI,EAGtD,MAAM,MAAQ,IAAI,IAClB,IAAI,OAAS,GACb,IAAI,iBAAkB,WAAc,CAClC,UAAU,QAAS,GAAM,CACvB,GAAI,CAAC,EAAE,WAAW,OAAQ,OAC1B,MAAM,MAAQ,EAAE,OAAO,UAAU,KAAK,EAClC,OAAS,KAAK,IAAI,KAAK,GAAG,MAAM,IAAI,KAAK,CAC/C,CAAC,EACG,UACJ,OAAS,GACT,sBAAsB,IAAM,CAC1B,OAAS,GACT,KAAK,EACL,MAAM,OAAS,CAAC,GAAG,KAAK,EACxB,MAAM,MAAM,EACR,OAAO,QAAQ,WAAW,MAAM,CACtC,CAAC,EACH,CAAC,EAAE,QAAQ,SAAS,gBAAiB,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,CACzE,GAAG,GAIF,IAAM,CACL,MAAM,MAAQ,IAAI,IAEZ,UAAa,KAAQ,CACzB,GAAI,CAAC,MAAM,IAAI,GAAG,EAAG,CACnB,MAAM,IAAM,IAAI,SAAS,GAAG,EAAI,IAAM,IAChC,QAAU,MAAM,GAAG,GAAG,GAAG,GAAG,2BAA2B,EAC1D,KAAM,UAAa,CAClB,GAAI,CAAC,SAAS,GAAI,MAAM,IAAI,MAAM,SAAS,MAAM,EACjD,OAAO,SAAS,KAAK,CACvB,CAAC,EACA,KAAM,MAAS,CACd,MAAM,IAAM,SAAS,cAAc,KAAK,EACxC,IAAI,UAAY,KAChB,MAAM,KAAO,IAAI,cAAc,qCAAqC,EACpE,GAAI,CAAC,KAAM,MAAM,IAAI,MAAM,SAAS,EACpC,OAAO,KAAK,SACd,CAAC,EACH,QAAQ,MAAM,IAAM,MAAM,OAAO,GAAG,CAAC,EACrC,MAAM,IAAI,IAAK,OAAO,CACxB,CACA,OAAO,MAAM,IAAI,GAAG,CACtB,EAGM,iBAAmB,CAAC,QAAS,UAAY,CAC7C,MAAM,WAAa,QAAQ,iBAAiB,2BAA2B,EACvE,QAAQ,iBAAiB,2BAA2B,EAAE,QAAQ,CAAC,MAAO,IAAM,CAC1E,MAAM,KAAO,WAAW,CAAC,EACrB,CAAC,MAAQ,KAAK,QAAQ,mBAAqB,MAAM,QAAQ,mBAC7D,CAAC,GAAG,KAAK,UAAU,EAAE,QAAS,MAAS,CACjC,KAAK,KAAK,WAAW,OAAO,GAAK,CAAC,MAAM,aAAa,KAAK,IAAI,GAAG,KAAK,gBAAgB,KAAK,IAAI,CACrG,CAAC,EACD,CAAC,GAAG,MAAM,UAAU,EAAE,QAAS,MAAS,EAClC,KAAK,KAAK,WAAW,OAAO,GAAK,KAAK,OAAS,QAAU,KAAK,OAAS,eACzE,KAAK,aAAa,KAAK,KAAM,KAAK,KAAK,CAE3C,CAAC,EACD,MAAM,YAAY,IAAI,EACxB,CAAC,CACH,EAEM,KAAO,CAAC,QAAS,KAAM,MAAQ,CACnC,MAAM,IAAM,SAAS,cAAc,KAAK,EACxC,IAAI,UAAY,KAChB,MAAM,QAAU,IAAI,kBAEpB,QAAQ,UAAY,QAAQ,UAC5B,QAAQ,aAAa,QAAS,QAAQ,aAAa,OAAO,GAAK,EAAE,EACjE,MAAM,MAAQ,QAAQ,cAAc,YAAY,GAAG,aAAa,OAAO,EACnE,OAAO,QAAQ,iBAAiB,YAAY,EAAE,QAAS,KAAQ,IAAI,aAAa,QAAS,KAAK,CAAC,EACnG,iBAAiB,QAAS,OAAO,EACjC,QAAQ,YAAY,OAAO,EACV,CAAC,GAAG,QAAQ,iBAAiB,oBAAoB,CAAC,EAAE,KAAM,IAAO,GAAG,QAAQ,WAAa,GAAG,GACnG,MAAM,CAAE,cAAe,EAAK,CAAC,CACzC,EAEA,SAAS,iBAAiB,QAAU,OAAU,CAC5C,MAAM,OAAS,MAAM,OAAO,QAAQ,qCAAqC,EACnE,KAAO,QAAQ,QAAQ,qCAAqC,EAC9D,CAAC,MAAQ,CAAC,OAAO,QAAQ,UACzB,OAAO,QAAQ,WAAa,KAAK,QAAQ,UACzC,KAAK,aAAa,WAAW,IAAM,SAEvC,KAAK,aAAa,YAAa,MAAM,EACrC,UAAU,OAAO,QAAQ,QAAQ,EAC9B,KAAM,MAAS,KAAK,KAAM,KAAM,OAAO,QAAQ,QAAQ,CAAC,EACxD,MAAM,IAAM,KAAK,gBAAgB,WAAW,CAAC,EAClD,CAAC,CACH,GAAG,GAIF,IAAM,CACL,MAAM,SAAY,WAAc,CAAC,GAAG,UAAU,iBAAiB,0BAA0B,CAAC,EAEpF,OAAU,QAAW,CACzB,MAAM,OAAS,SAAS,OAAO,QAAQ,2BAA2B,CAAC,EAC7D,MAAQ,OAAO,UAAW,OAAU,MAAM,UAAU,SAAS,QAAQ,CAAC,EACtE,KAAO,OAAO,aAAa,aAAa,EAC9C,OAAO,cAAc,0BAA0B,EAAE,SAAW,CAAC,MAAQ,OAAS,EAC9E,OAAO,cAAc,yBAAyB,EAAE,SAAW,CAAC,MAAQ,OAAS,OAAO,OAAS,CAC/F,EAGM,OAAU,OAAU,CACxB,MAAM,SAAW,MAAM,QAAQ,kCAAkC,EACjE,GAAI,CAAC,SAAU,OACf,MAAM,IAAM,SAAS,sBAAsB,EACrC,KAAO,MAAM,sBAAsB,EACrC,KAAK,IAAM,IAAI,MAAK,SAAS,WAAa,IAAI,IAAM,KAAK,KACzD,KAAK,OAAS,IAAI,SAAQ,SAAS,WAAa,KAAK,OAAS,IAAI,QAClE,KAAK,KAAO,IAAI,OAAM,SAAS,YAAc,IAAI,KAAO,KAAK,MAC7D,KAAK,MAAQ,IAAI,QAAO,SAAS,YAAc,KAAK,MAAQ,IAAI,MACtE,EAEA,SAAS,iBAAiB,QAAU,OAAU,CAC5C,MAAM,OAAS,MAAM,OAAO,QAAQ,2CAA2C,EAC/E,GAAI,CAAC,OAAQ,OACb,MAAM,eAAe,EACrB,MAAM,gBAAgB,EACtB,MAAM,OAAS,OAAO,QAAQ,uBAAuB,EAC/C,OAAS,SAAS,OAAO,QAAQ,2BAA2B,CAAC,EAEnE,IAAI,KADU,OAAO,UAAW,OAAU,MAAM,UAAU,SAAS,QAAQ,CAAC,EACzD,OAAO,OAAO,QAAQ,UAAU,EAE/C,OAAO,aAAa,aAAa,IAAG,MAAQ,KAAO,OAAO,QAAU,OAAO,QAC/E,MAAM,OAAS,OAAO,IAAI,EACrB,SACL,OAAO,MAAM,EACb,OAAO,MAAM,EACb,OAAO,MAAM,EACf,CAAC,EAED,MAAM,SAAW,IAAI,QACf,KAAO,IAAM,CACjB,SAAS,iBAAiB,uBAAuB,EAAE,QAAS,QAAW,CAErE,GADA,OAAO,MAAM,EACT,SAAS,IAAI,MAAM,EAAG,OAC1B,SAAS,IAAI,MAAM,EAEnB,MAAM,KAAO,OAAO,QAAQ,2BAA2B,EAAE,cAAc,4BAA4B,EAC/F,MACF,IAAI,iBAAiB,IAAM,OAAO,MAAM,CAAC,EAAE,QAAQ,KAAM,CACvD,WAAY,GACZ,gBAAiB,CAAC,OAAO,EACzB,QAAS,EACX,CAAC,CAEL,CAAC,CACH,EAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAI,EAElD,KAAK,EAEP,SAAS,iBAAiB,uBAAwB,IAAI,CACxD,GAAG,GAKF,IAAM,CACL,MAAM,KAAO,CAAC,UAAW,UAAY,CAEnC,MAAM,IADQ,UAAU,cAAc,mCAAmC,OAAO,IAAI,GACjE,QAAQ,sBAAsB,GAAG,cAAc,qBAAqB,EACnF,MAAK,IAAI,QAAU,QACzB,EAEM,WAAc,WAAc,CAChC,GAAI,CAAC,UAAU,aAAc,OAC7B,MAAM,OAAS,CAAC,GAAG,UAAU,iBAAiB,0BAA0B,CAAC,EACnE,MAAQ,OAAO,UAAW,OAAU,MAAM,UAAU,SAAS,QAAQ,CAAC,EAE5E,CAAC,OAAO,KAAK,EAAG,OAAO,MAAQ,CAAC,EAAG,OAAO,MAAQ,CAAC,CAAC,EAAE,QAAS,OAAU,OAAS,KAAK,UAAW,MAAM,QAAQ,WAAW,CAAC,CAC9H,EAEM,SAAW,IAAI,QACf,KAAO,IAAM,CACjB,SAAS,iBAAiB,4DAA4D,EAAE,QAAS,WAAc,CAE7G,GADA,WAAW,SAAS,EAChB,SAAS,IAAI,SAAS,EAAG,OAC7B,SAAS,IAAI,SAAS,EACtB,MAAM,KAAO,UAAU,cAAc,4BAA4B,EAC7D,MACF,IAAI,iBAAiB,IAAM,WAAW,SAAS,CAAC,EAAE,QAAQ,KAAM,CAC9D,WAAY,GACZ,gBAAiB,CAAC,OAAO,EACzB,QAAS,EACX,CAAC,CAEL,CAAC,CACH,EAEM,KAAQ,IAAQ,wBAAyB,OAAS,oBAAoB,GAAI,CAAE,QAAS,GAAK,CAAC,EAAI,WAAW,GAAI,GAAG,EACnH,SAAS,aAAe,WAC1B,KAAK,IAAI,EAET,OAAO,iBAAiB,OAAQ,IAAM,KAAK,IAAI,EAAG,CAAE,KAAM,EAAK,CAAC,EAElE,SAAS,iBAAiB,uBAAwB,IAAI,EACtD,OAAO,iBAAiB,SAAU,IAAM,SACrC,iBAAiB,4DAA4D,EAC7E,QAAQ,UAAU,CAAC,EAEtB,SAAS,iBAAiB,cAAgB,OAAU,CAClD,MAAM,MAAQ,MAAM,OAAO,UAAU,0BAA0B,EACzD,UAAY,OAAO,QAAQ,4DAA4D,EACzF,WAAW,KAAK,UAAW,MAAM,QAAQ,WAAW,CAC1D,CAAC,CACH,GAAG,GAQF,IAAM,CAEL,MAAM,MADU,eAAe,IAAI,sBAAsB,GAClC,UACjB,QAAU,CAAC,gCAAiC,sBAAuB,kBAAmB,qBAAqB,EACjH,GAAI,CAAC,OAAS,QAAQ,KAAM,MAAS,OAAO,MAAM,IAAI,GAAM,UAAU,EAAG,OACzE,MAAM,SAAW,OAAO,YAAY,QAAQ,IAAK,MAAS,CAAC,KAAM,MAAM,IAAI,CAAC,CAAC,CAAC,EAExE,MAAS,SACb,EAAQ,QAAQ,QAAQ,oCAAoC,GAAM,QAAQ,cAAc,OAAS,EAE7F,OAAS,CAAC,QAAS,SAAW,CAClC,GAAI,CAAC,QAAU,OAAO,WAAa,OAAO,OAAO,MAAQ,OAAO,OAAO,YAAe,WAAY,OAClG,MAAM,MAAQ,OAAO,YACrB,OAAO,OAAO,KAAO,GACrB,OAAO,OAAO,aAAe,KAAK,IAAI,EAAG,QAAQ,aAAa,MAAM,EACpE,OAAO,WAAW,EAClB,OAAO,aAAa,EACpB,OAAO,QAAQ,MAAQ,OAAO,aAAc,EAAG,EAAK,EAEpD,QAAQ,iBAAiB,kDAAkD,EAAE,QAAS,QAAW,CAC/F,OAAO,SAAW,GAClB,OAAO,UAAU,OAAO,wBAAwB,EAChD,OAAO,gBAAgB,eAAe,CACxC,CAAC,EACD,OAAO,YAAY,OAAO,EAC1B,OAAO,YAAY,OAAO,EAE1B,QAAQ,YAAc,QAAQ,aAAa,OAC3C,SAAS,oBAAoB,KAAK,QAAS,OAAO,SAAS,CAC7D,EAEA,MAAM,8BAAgC,SAAU,OAAQ,CACtD,SAAS,8BAA8B,KAAK,KAAM,MAAM,EACpD,MAAM,IAAI,GAAG,OAAO,KAAM,MAAM,CACtC,EAEA,MAAM,oBAAsB,SAAU,OAAQ,CAC5C,GAAI,CAAC,MAAM,IAAI,GAAK,CAAC,OAAO,OAAO,KAAM,OAAO,SAAS,oBAAoB,KAAK,KAAM,MAAM,EAC9F,KAAK,sBAAsB,MAAM,EACjC,KAAK,oBAAoB,OAAO,SAAS,CAC3C,EAGA,MAAM,gBAAkB,SAAU,QAAS,MAAO,CAChD,GAAI,CAAC,MAAM,IAAI,GAAK,CAAC,KAAK,gBAAgB,OAAO,KAAM,OAAO,SAAS,gBAAgB,KAAK,KAAM,QAAS,KAAK,EAChH,MAAM,MAAQ,KAAK,kBAAkB,UAAW,OAAU,MAAM,aAAa,KAAK,MAAM,OAAO,IAAM,OAAO,EAC5G,GAAI,MAAQ,EAAG,OACf,KAAK,eAAe,YAAY,MAAO,KAAK,EAC5C,MAAM,YAAc,KAAK,eAAe,OAAO,KAAK,eAAe,WAAW,EAC1E,KAAK,yBAA2B,aAClC,KAAK,wBAAwB,aAAa,KAAK,MAAM,UAAW,YAAY,IAAI,CAEpF,EAGA,SAAS,iBAAiB,yDAAyD,EAAE,QAAS,SAAY,CACpG,MAAM,OAAO,GAAG,OAAO,QAAS,QAAQ,cAAc,CAC5D,CAAC,CACH,GAAG,GASF,IAAM,CACL,MAAM,SAAW,qBAGX,OAAS,CAAC,IAAK,IAAK,IAAK,IAAI,EAC7B,OAAS,CAAC,IAAK,eAAiB,CACpC,MAAM,KAAO,IAAI,IAAI,IAAK,SAAS,IAAI,EACjC,MAAQ,OAAO,KAAK,aAAa,IAAI,OAAO,CAAC,GAAK,IAClD,OAAS,OAAO,KAAK,aAAa,IAAI,QAAQ,CAAC,EACrD,OAAO,OAAO,OAAQ,GAAM,IAAM,KAAO,CAAC,cAAgB,GAAK,YAAY,EACxE,IAAK,GAAM,CACV,MAAM,IAAM,IAAI,IAAI,IAAI,EACxB,WAAI,aAAa,IAAI,QAAS,CAAC,EAC3B,QAAQ,IAAI,aAAa,IAAI,SAAU,KAAK,MAAO,OAAS,EAAK,KAAK,CAAC,EACpE,GAAG,IAAI,IAAI,IAAI,CAAC,GACzB,CAAC,EACA,KAAK,IAAI,CACd,EAEM,MAAQ,iFAER,KAAQ,KAAQ,CAChB,CAAC,IAAI,aAAa,eAAe,GAAK,CAAC,IAAI,QAAQ,OACnD,aAAc,IAAI,SAEhB,IAAI,QAAQ,cAAa,IAAI,OAAS,IAAI,QAAQ,aACtD,IAAI,IAAM,IAAI,QAAQ,SACtB,OAAO,IAAI,QAAQ,SACnB,OAAO,IAAI,QAAQ,cAEnB,IAAI,OAAS,OAAO,IAAI,QAAQ,KAAM,OAAO,IAAI,aAAa,OAAO,CAAC,CAAC,EACvE,IAAI,IAAM,IAAI,QAAQ,MAExB,IAAI,gBAAgB,eAAe,EACnC,IAAI,gBAAgB,YAAY,EAClC,EAGM,QAAW,KAAQ,CACvB,GAAI,IAAI,aAAa,eAAe,EAAG,OACvC,MAAM,IAAM,IAAI,aAAa,KAAK,EAC9B,CAAC,KAAO,MAAQ,QACpB,IAAI,QAAQ,SAAW,IACvB,IAAI,QAAQ,YAAc,IAAI,aAAa,QAAQ,GAAK,GACxD,IAAI,QAAQ,KAAO,IACnB,IAAI,aAAa,gBAAiB,EAAE,EACpC,IAAI,gBAAgB,QAAQ,EAC5B,IAAI,IAAM,MACZ,EAEM,QAAW,SAAY,SAAS,iBAAiB,QAAQ,EAAE,QAAQ,IAAI,EAEvE,UAAY,CAAC,QAAS,MAC1B,IAAI,QAAS,IAAO,CAClB,QAAQ,iBAAiB,mBAAmB,EAAE,MAAM,QAAQ,EAAE,EAAE,QAAQ,IAAI,CAC9E,CAAC,EAGG,eAAkB,SAAY,CAClC,MAAM,OAAS,CAAC,GAAG,QAAQ,iBAAiB,2DAA2D,CAAC,EACxG,GAAI,CAAC,OAAO,OAAQ,OACpB,MAAMA,SAAU,QAAQ,QAAQ,gBAChC,IAAI,MAAQ,OAAO,UAAW,OAAU,MAAM,QAAQ,UAAYA,QAAO,EACrE,MAAQ,IAAG,MAAQ,GACvB,MAAM,IAAM,CAAC,MAAQ,EAAG,MAAO,MAAQ,CAAC,EAAE,IAAK,GAAM,QAAQ,EAAI,OAAO,QAAU,OAAO,MAAM,EAAE,QAAQ,OAAO,EAChH,UAAU,QAAS,GAAG,CACxB,EAKM,SAAW,uCACX,QAAU,OAAO,WAAW,oBAAoB,EAEhD,cAAiB,SACrB,EAAQ,QAAQ,QAAQ,iBACxB,EAAQ,QAAQ,cAAc,mBAAmB,QAAQ,QAAQ,eAAe,MAAM,QAAQ,EAAE,EAI5F,QAAW,UAAa,SAAS,aAAa,uBAAuB,GAAK,CAAC,QAAQ,QAKnF,WAAc,SAClB,CAAC,QAAQ,SACT,EAAQ,SAAS,QAAQ,GAAG,QAAQ,8BAA8B,GAClE,EAAQ,QAAQ,QAAQ,+CAA+C,EAEnE,UAAY,CAAC,SAAU,QAAU,CACjC,SAAS,QAAQ,cAAiB,QAAQ,QAAQ,GAAK,CAAC,QAC5D,SAAS,QAAQ,aAAe,OAChC,SAAS,iBAAiB,sBAAsB,EAAE,QAAS,SAAY,CACjE,QAAQ,QAAQ,iBAAiB,UAAU,QAAS,CAAC,QAAQ,QAAQ,eAAe,CAAC,CAC3F,CAAC,EACH,EAEM,SACJ,yBAA0B,OACtB,IAAI,qBACD,SACC,QAAQ,QAAS,OAAU,CACzB,GAAI,CAAC,MAAM,eAAgB,OAC3B,SAAS,UAAU,MAAM,MAAM,EAC/B,MAAM,SAAW,MAAM,OAAO,QAAQ,QAAQ,EAC1C,UAAY,cAAc,MAAM,MAAM,GAAG,UAAU,QAAQ,EAC1D,WAAW,MAAM,MAAM,GAAG,eAAe,MAAM,MAAM,CAC5D,CAAC,EACH,CAAE,WAAY,WAAY,CAC5B,EACA,KAEA,MAAS,SAAY,CACpB,QAAQ,cAAc,QAAQ,IAC/B,QAAQ,SAAW,cAAc,OAAO,GAAG,UAAU,QAAS,CAAC,QAAQ,QAAQ,eAAe,CAAC,EAC/F,SAAU,SAAS,QAAQ,OAAO,EACjC,QAAQ,OAAO,EACtB,EAGA,QAAQ,mBAAmB,SAAW,OAAU,CAC1C,MAAM,SAAS,SAAS,iBAAiB,QAAQ,EAAE,QAAS,UAAa,UAAU,SAAU,EAAI,CAAC,CACxG,CAAC,EAGD,SAAS,iBAAiB,sBAAsB,EAAE,QAAQ,KAAK,EAE/D,IAAI,iBAAkB,SACpB,QAAQ,QAAS,QACf,OAAO,WAAW,QAAS,MAAS,CAC9B,KAAK,WAAa,GAAK,CAAC,KAAK,cAAc,QAAQ,IACnD,KAAK,QAAQ,sBAAsB,EAAG,MAAM,IAAI,EAC/C,KAAK,iBAAiB,sBAAsB,EAAE,QAAQ,KAAK,EAClE,CAAC,CACH,CACF,EAAE,QAAQ,SAAS,KAAM,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,EAG3D,MAAM,MAAS,OAAU,CACvB,MAAM,OAAS,MAAM,OAEf,SAAW,OAAO,UAAU,QAAQ,EACtC,UAAU,UAAU,QAAQ,EAEhC,MAAM,QADO,OAAO,UAAU,eAAe,GACvB,cAAc,sBAAsB,EACtD,SAAW,CAAC,WAAW,OAAO,GAAG,QAAQ,OAAO,CACtD,EACA,CAAC,cAAe,aAAc,SAAS,EAAE,QAAS,MAChD,SAAS,iBAAiB,KAAM,MAAO,CAAE,QAAS,GAAM,QAAS,EAAK,CAAC,CACzE,EAGA,MAAM,QAAW,OAAU,CAIzB,MAAM,QAHS,MAAM,OAAO,UAC1B,6EACF,GACwB,QAAQ,eAAe,GAAG,cAAc,sBAAsB,EAClF,SAAS,QAAQ,OAAO,CAC9B,EACA,CAAC,cAAe,OAAO,EAAE,QAAS,MAChC,SAAS,iBAAiB,KAAM,QAAS,CAAE,QAAS,GAAM,QAAS,EAAK,CAAC,CAC3E,EAGA,MAAM,QAAU,eAAe,IAAI,sBAAsB,EACzD,GAAI,QAAS,CACX,MAAM,eAAiB,QAAQ,UAAU,gBACzC,QAAQ,UAAU,gBAAkB,SAAU,QAAS,MAAO,CAC5D,OAAI,SAAS,UAAU,KAAM,CAAC,OAAO,OAAO,CAAC,CAAC,EACvC,eAAe,KAAK,KAAM,QAAS,KAAK,CACjD,CACF,CAMA,MAAM,WAAa,EACb,QAAW,SAAY,CAC3B,MAAM,OAAS,QAAQ,eAEvB,OADe,QAAQ,SAAS,OAAO,WAAW,GACnC,QAAQ,SAAW,QAAQ,QAAQ,eACpD,EACM,UAAa,UAAa,CAAC,GAAG,SAAS,iBAAiB,sBAAsB,CAAC,EAE/E,gBAAmB,UAAa,CACpC,UAAU,QAAQ,EAAE,QAAQ,CAAC,QAAS,QAAU,CAC9C,MAAM,KAAO,MAAQ,WAAa,QAAQ,OAAO,EAAI,KACrD,QAAQ,iBAAiB,kCAAkC,EAAE,QAAS,KAAQ,CACxE,MAAQ,IAAI,QAAQ,eAAe,EAAE,QAAQ,UAAY,MAC7D,QAAQ,GAAG,CACb,CAAC,CACH,CAAC,EACD,SAAS,QAAQ,UAAY,MAC/B,EAEM,gBAAmB,UAAa,CACpC,OAAO,SAAS,QAAQ,UACxB,UAAU,QAAQ,EAAE,QAAS,SAAY,CACvC,MAAM,GAAK,QAAQ,OAAO,EACtB,IAAI,UAAU,QAAS,CAAC,EAAE,CAAC,CACjC,CAAC,CACH,EAEA,GAAI,yBAA0B,OAAQ,CAEpC,MAAM,KAAO,IAAI,qBACd,SACC,QAAQ,QAAQ,CAAC,CAAE,OAAQ,cAAe,IAAM,CACzC,iBACL,OAAO,QAAQ,MAAQ,OACnB,OAAO,QAAQ,WAAW,gBAAgB,MAAM,EACtD,CAAC,EACH,CAAE,WAAY,UAAW,CAC3B,EAEM,IAAM,IAAI,qBACb,SACC,QAAQ,QAAQ,CAAC,CAAE,OAAQ,cAAe,IAAM,CAC1C,gBAAkB,QAAQ,SAAW,CAAC,OAAO,QAAQ,OAAS,OAAO,QAAQ,WACjF,gBAAgB,MAAM,CACxB,CAAC,EACH,CAAE,WAAY,UAAW,CAC3B,EACA,SAAS,iBAAiB,GAAG,QAAQ,kBAAkB,EAAE,QAAS,UAAa,CAC7E,KAAK,QAAQ,QAAQ,EACrB,IAAI,QAAQ,QAAQ,CACtB,CAAC,EAED,QAAQ,mBAAmB,SAAW,OAAU,CAC1C,MAAM,SAAS,SAAS,iBAAiB,GAAG,QAAQ,mBAAmB,EAAE,QAAQ,eAAe,CACtG,CAAC,CACH,CACF,GAAG,GAMF,IAAM,CACL,MAAM,MAAS,IAAO,CAChB,GAAG,QAAU,GAAG,QAAQ,WAAa,CAAC,OAAO,KAAK,QAAQ,SAC9D,GAAG,QAAQ,UAAY,OAGvB,OAAO,IAAI,IAAI,OAAO,IAAI,OAAO,OAAQ,SAAS,IAAI,EAAE,MAAM,KAAK,CAAC,CAAE,OAAQ,UAAW,IAAM,CAC7F,GAAI,GAAG,QAAU,CAAC,GAAG,YAAa,OAClC,MAAM,QAAU,SAAS,GAAG,QAAQ,QAAS,EAAE,GAAK,EAE9C,KAAO,GAAG,aAAa,mBAAmB,EAC1C,QAAU,KAAO,OAAS,UAAY,EAAI,EAAI,QAE9C,IAAM,SAAS,GAAG,QAAQ,IAAK,EAAE,EACjC,UAAY,SAAS,GAAG,QAAQ,WAAa,GAAG,QAAQ,IAAK,EAAE,EAC/D,OAAS,IAAI,OAAO,GAAI,CAC5B,QAAS,CAAC,UAAU,EACpB,cAAe,QAEf,yBAA0B,iBAAiB,EAAE,EAAE,iBAAiB,4BAA4B,EAAE,KAAK,IAAM,SACzG,aAAc,UACd,WAAY,GACZ,cAAe,GACf,oBAAqB,GAErB,SAAU,GACV,eAAgB,GAChB,WAAY,CAAE,OAAQ,GAAG,cAAc,aAAa,EAAG,OAAQ,GAAG,cAAc,aAAa,CAAE,EAC/F,YAAa,CAAE,IAAK,CAAE,aAAc,IAAK,cAAe,OAAQ,EAAG,KAAM,CAAE,aAAc,IAAK,cAAe,KAAO,OAAS,OAAQ,CAAE,CACzI,CAAC,EAEK,QAAU,GAAG,cAAc,gBAAgB,GAAG,QAAQ,eAAe,EACvE,SAAW,QAAQ,sBAAsB,EAAE,MAAQ,GAAG,sBAAsB,EAAE,OAEhF,OAAO,QAAQ,KAAK,IAAI,EAAG,OAAO,OAAO,QAAQ,OAAO,EAAI,CAAC,EAAG,CAAC,CAErE,CAAC,EAAE,MAAO,OAAU,CAClB,OAAO,GAAG,QAAQ,UAClB,QAAQ,MAAM,eAAgB,KAAK,CACrC,CAAC,EACH,EACM,KAAQ,MAAS,KAAK,mBAAmB,8BAA8B,EAAE,QAAQ,KAAK,EACtF,QAAW,MAAS,CACxB,MAAM,GAAK,MAAM,cAAc,8BAA8B,EACxD,KACL,MAAM,EAAE,EACR,sBAAsB,IAAM,CACrB,GAAG,SACR,GAAG,OAAO,OAAO,EACjB,GAAG,OAAO,YAAY,OAAO,EAC/B,CAAC,EACH,EAEA,KAAK,QAAQ,EACb,SAAS,iBAAiB,uBAAyB,OAAU,KAAK,MAAM,MAAM,CAAC,EAC/E,SAAS,iBAAiB,uBAAyB,OAAU,CACvD,MAAM,OAAO,WAAW,SAAS,sBAAsB,GAAG,QAAQ,MAAM,MAAM,CACpF,CAAC,EACD,CAAC,YAAa,SAAS,EAAE,QAAS,MAChC,SAAS,iBAAiB,KAAO,OAAU,CACzC,MAAM,QAAU,MAAM,OAAO,UAAU,uBAAuB,EACzD,SACL,QAAQ,SAAS,cAAc,2CAA2C,QAAQ,QAAQ,aAAa,IAAI,CAAC,CAC9G,CAAC,CACH,EACA,IAAI,iBAAkB,SAAY,CAChC,QAAQ,QAAS,QAAW,OAAO,WAAW,QAAS,MAAS,KAAK,WAAa,IAAM,KAAK,QAAQ,8BAA8B,EAAI,MAAM,IAAI,EAAI,KAAK,IAAI,EAAE,CAAC,CACnK,CAAC,EAAE,QAAQ,SAAS,gBAAiB,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,CACzE,GAAG,EAGH,SAAS,iBAAiB,yBAAyB,EAAE,QAAS,KAAQ,CACpE,MAAM,QAAU,IAAI,cAAc,gBAAgB,EAC9C,SAAW,QAAQ,WAAa,QAAQ,YAAc,IAAI,cAAa,IAAI,WAAa,QAAQ,YAAc,IAAI,YAAc,QAAQ,aAAe,EAC7J,CAAC,GAKA,IAAM,CACL,MAAM,OAAS,CAAC,GAAI,KAAM,KAAO,CAC/B,MAAM,MAAQ,GAAG,EAAE,KACnB,OAAI,GAAG,MAAM,iBAAiB,IAAI,IAAM,MAAc,IACtD,GAAG,MAAM,YAAY,KAAM,KAAK,EACzB,GACT,EAEM,KAAO,IAAM,CACjB,MAAM,QAAU,SAAS,cAAc,mCAAmC,EACpE,UAAY,SAAS,cAAc,wCAAwC,EACjF,GAAI,CAAC,UAAW,OAChB,MAAM,KAAO,SAAS,gBAChB,IAAM,SAAS,cAAc,iBAAiB,EAE9C,QAAU,IAAM,CACpB,MAAM,IAAM,KAAK,MAAM,UAAU,sBAAsB,EAAE,IAAM,OAAO,OAAO,EAC7E,IAAI,QAAU,OAAO,QAAS,cAAe,GAAG,EAChD,GAAI,CACF,eAAe,QAAQ,YAAa,GAAG,CACzC,MAAY,CAAC,CAGb,IAAI,OAAS,KAGb,GAFI,CAAC,KAAO,IAAI,QAAQ,aAAe,QAAS,OAAS,EAChD,IAAI,aAAe,IAAG,OAAS,IAAI,cACxC,SAAW,KAAM,CACnB,QAAU,OAAO,KAAM,iBAAkB,MAAM,GAAK,QACpD,GAAI,CACF,eAAe,QAAQ,eAAgB,MAAM,CAC/C,MAAY,CAAC,CACf,CAEA,IAAI,MAAQ,EACZ,MAAM,OAAS,UAAU,cAAc,qBAAqB,EACxD,QAAU,QAAQ,aAAa,0BAA0B,IAC3D,OAAS,OAAO,cAAgB,WAAW,iBAAiB,SAAS,EAAE,MAAM,GAAK,IAEhF,QAAQ,QAAQ,cAAgB,UAClC,OAAS,UAAU,cAAc,iCAAiC,GAAG,cAAgB,GAEvF,QAAU,OAAO,QAAS,gBAAiB,KAAK,GAAK,QAEjD,SAAS,UAAU,QAAQ,OAAO,CACxC,EAKA,GAHA,QAAQ,EACR,OAAO,iBAAiB,SAAU,OAAO,EACzC,OAAO,iBAAiB,OAAQ,OAAO,EACnC,mBAAoB,OAAQ,CAC9B,MAAM,SAAW,IAAI,eAAe,OAAO,EAC3C,CAAC,IAAK,SAAS,KAAM,UAAU,cAAc,qBAAqB,CAAC,EAAE,QAAS,IAAO,IAAM,SAAS,QAAQ,EAAE,CAAC,CACjH,CACF,EAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAI,EAElD,KAAK,EAEP,SAAS,iBAAiB,uBAAwB,IAAI,CACxD,GAAG,GAIF,IAAM,CACL,MAAM,KAAO,IAAM,CACjB,MAAM,IAAM,SAAS,cAAc,sCAAsC,EACnE,IAAM,KAAK,cAAc,iBAAiB,EAChD,GAAI,CAAC,KAAO,IAAI,QAAQ,OAAQ,OAChC,MAAM,OAAS,SAAS,cAAc,8CAA8C,IAAI,QAAQ,YAAY,IAAI,EAChH,GAAI,CAAC,OAAQ,CAEX,IAAI,gBAAgB,qBAAqB,EACzC,MACF,CACA,IAAI,QAAQ,OAAS,OACrB,MAAM,MAAQ,CAAC,GAAG,IAAI,iBAAiB,sBAAsB,CAAC,EACxD,WAAc,MAClB,CAAC,GAAG,OAAO,iBAAiB,qBAAqB,CAAC,EAAE,KAAM,IAAO,GAAG,QAAQ,cAAgB,KAAK,QAAQ,WAAW,EAEhH,KAAO,IAAM,CACjB,MAAM,QAAS,MAAS,CACtB,MAAM,OAAS,WAAW,IAAI,EAC9B,GAAI,CAAC,OAAQ,OACb,MAAM,SAAW,OAAO,UAAU,SAAS,UAAU,EACrD,KAAK,UAAU,OAAO,WAAY,QAAQ,EAC1C,KAAK,UAAU,OAAO,WAAY,OAAO,UAAU,SAAS,UAAU,CAAC,EACvE,KAAK,aAAa,eAAgB,QAAQ,CAC5C,CAAC,CACH,EAEA,MAAM,QAAS,MAAS,KAAK,iBAAiB,QAAS,IAAM,WAAW,IAAI,GAAG,MAAM,CAAC,CAAC,EACvF,IAAI,iBAAiB,IAAI,EAAE,QAAQ,OAAQ,CAAE,QAAS,GAAM,UAAW,GAAM,WAAY,GAAM,gBAAiB,CAAC,OAAO,CAAE,CAAC,EAC3H,KAAK,CACP,EAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAI,EAElD,KAAK,EAEP,SAAS,iBAAiB,uBAAwB,IAAI,CACxD,GAAG,GAIF,IAAM,CACL,MAAM,MAAS,MAAS,CACtB,GAAI,KAAK,QAAQ,OAAQ,OACzB,KAAK,QAAQ,OAAS,OACtB,MAAM,QAAU,KAAK,QAAQ,gBAAgB,GAAK,SAC5C,MAAQ,QAAQ,cAAc,uCAAuC,EACrE,MAAQ,KAAK,cAAc,qBAAqB,EACtD,IAAI,SAAW,CAAC,EAChB,GAAI,CACF,SAAW,KAAK,MAAM,KAAK,cAAc,wBAAwB,EAAE,WAAW,CAChF,MAAY,CACV,MACF,CACA,MAAM,KAAO,IAAM,CACjB,MAAM,QAAU,SAAS,OAAO,KAAK,EAChC,UACL,KAAK,OAAS,CAAC,QAAQ,KACvB,MAAM,YAAc,QAAQ,MAC9B,EACM,YAAc,KAAK,QAAQ,iBAAiB,GAAK,KAAK,QAAQ,iBAAiB,GAAK,SAAS,cAAc,cAAc,EAC3H,YAAY,IAAI,iBAAiB,IAAI,EAAE,QAAQ,WAAY,CAAE,UAAW,GAAM,cAAe,GAAM,QAAS,EAAK,CAAC,EACtH,OAAO,iBAAiB,SAAU,IAAI,EACtC,KAAK,CACP,EACM,KAAO,IAAM,SAAS,iBAAiB,oBAAoB,EAAE,QAAQ,KAAK,EAE5E,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAI,EAElD,KAAK,EAEP,SAAS,iBAAiB,uBAAwB,IAAI,CACxD,GAAG,GAKF,IAAM,CAEL,MAAM,KAAO,CAAC,EAAG,IAAM,EAAE,YAAY,IAAM,EAAE,YAAY,EACzD,IAAI,aAEJ,MAAM,YAAc,CAAC,MAAO,OAAS,CACnC,MAAM,QAAU,MAAM,cAAc,gCAAgC,EAC9D,MAAQ,MAAM,cAAc,8BAA8B,EAChE,aAAa,YAAY,EACzB,QAAQ,YAAc,MAAM,QAAQ,IAAI,IAAI,EAAE,EAC9C,QAAQ,UAAU,OAAO,QAAQ,EACjC,MAAM,UAAU,IAAI,cAAc,EAClC,aAAe,WAAW,IAAM,CAC9B,QAAQ,UAAU,IAAI,QAAQ,EAC9B,MAAM,UAAU,OAAO,cAAc,CACvC,EAAG,GAAY,CACjB,EAEM,aAAgB,OAAU,CAC9B,aAAa,YAAY,EACzB,MAAM,cAAc,gCAAgC,EAAE,UAAU,IAAI,QAAQ,EAC5E,MAAM,cAAc,8BAA8B,EAAE,UAAU,OAAO,cAAc,CACrF,EAEM,QAAU,SAAY,CAC1B,MAAM,SAAW,MAAM,MAAM,GAAG,OAAO,MAAM,OAAO,KAAK,IAAI,KAAK,EAClE,GAAI,CAAC,SAAS,GAAI,MAAM,IAAI,MAAM,MAAM,EACxC,OAAO,SAAS,KAAK,CACvB,EAEM,QAAW,OAAU,KAAK,gBAAkB,CAAC,GAAG,IAAK,UAAa,SAAS,IAAI,EAE/E,SAAW,MAAO,OAAU,CAChC,MAAM,SAAW,MAAM,MAAM,GAAG,OAAO,MAAM,OAAO,KAAK,MAAM,MAAO,CACpE,OAAQ,OACR,QAAS,CAAE,eAAgB,mBAAoB,OAAQ,kBAAmB,EAC1E,KAAM,KAAK,UAAU,CAAE,SAAU,MAAM,KAAK,GAAG,CAAE,CAAC,CACpD,CAAC,EACD,GAAI,CAAC,SAAS,GAAI,MAAM,IAAI,MAAM,MAAM,EACxC,OAAO,SAAS,KAAK,CACvB,EAGM,QAAU,IAAM,SAAS,cAAc,IAAI,YAAY,4BAA4B,CAAC,EAIpF,gBAAkB,CAAC,KAAM,QAC5B,KAAK,kCAAoC,CAAC,GAAG,KAAM,UAAa,KAAK,SAAS,MAAO,IAAI,CAAC,IAC1F,KAAK,OAAS,CAAC,GAAG,KAAM,OACtB,KAAK,iCAAmC,CAAC,GAAG,KAAM,YAAe,KAAK,WAAW,qBAAqB,MAAO,IAAI,CAAC,CACrH,EAEI,MAAQ,MAAO,OAAU,CAC7B,MAAM,MAAQ,MAAM,cAAc,8BAA8B,EAC1D,OAAS,MAAM,cAAc,8BAA8B,EAC3D,KAAO,MAAM,MAAM,KAAK,EAE9B,GADA,MAAM,KAAK,EACP,CAAC,MAAQ,OAAO,UAAU,SAAS,SAAS,EAAG,OAMnD,GAJA,aAAa,KAAK,EACJ,CAAC,GAAG,MAAM,QAAQ,qBAAqB,EAAE,iBAAiB,6BAA6B,CAAC,EAAE,IACrG,IAAO,GAAG,QAAQ,iBACrB,EACU,KAAM,OAAU,KAAK,MAAO,IAAI,CAAC,EAAG,CAC5C,MAAM,MAAQ,GACd,MACF,CAEA,OAAO,UAAU,IAAI,SAAS,EAC9B,GAAI,CACF,MAAM,OAAS,QAAQ,MAAM,QAAQ,CAAC,EAAE,OAAQ,OAAU,CAAC,KAAK,MAAO,IAAI,CAAC,EAEtE,SADO,MAAM,SAAS,CAAC,GAAG,OAAQ,IAAI,CAAC,GACxB,gBAAkB,CAAC,GAAG,KAAM,UAAa,KAAK,SAAS,KAAM,IAAI,CAAC,EACvF,GAAI,CAAC,QAAU,CAAC,OAAO,WAAY,CACjC,MAAM,SAAS,MAAM,EACrB,QAAQ,EACR,YAAY,MAAO,OAAO,EAC1B,MACF,CACA,MAAM,MAAQ,GACd,QAAQ,EACH,gBAAgB,MAAM,QAAQ,EAAG,IAAI,GAAG,YAAY,MAAO,UAAU,CAC5E,MAAY,CACV,YAAY,MAAO,SAAS,CAC9B,QAAE,CACA,OAAO,UAAU,OAAO,SAAS,CACnC,CACF,EAEM,OAAS,MAAO,MAAO,OAAS,CACpC,aAAa,KAAK,EAClB,GAAI,CACF,MAAM,SAAS,QAAQ,MAAM,QAAQ,CAAC,EAAE,OAAQ,MAAS,CAAC,KAAK,KAAM,KAAK,QAAQ,iBAAiB,CAAC,CAAC,EACrG,QAAQ,CACV,MAAY,CACV,YAAY,MAAO,SAAS,CAC9B,CACF,EAEA,SAAS,iBAAiB,QAAU,OAAU,CAE5C,MAAM,MAAQ,MAAM,OAAO,UAAU,qBAAqB,GAAG,cAAc,wBAAwB,EACnG,GAAI,CAAC,MAAO,OACZ,MAAM,aAAe,MAAM,OAAO,QAAQ,+BAA+B,EACrE,aAAc,OAAO,MAAO,aAAa,QAAQ,6BAA6B,CAAC,EAC1E,MAAM,OAAO,QAAQ,8BAA8B,GAAG,MAAM,KAAK,CAC5E,CAAC,EAGD,SAAS,iBACP,WACC,OAAU,CACT,MAAM,OAAS,MAAM,OAAO,UAAU,8BAA8B,EAC/D,SACL,MAAM,eAAe,EACrB,MAAM,OAAO,QAAQ,wBAAwB,CAAC,EAChD,EACA,CAAE,QAAS,EAAM,CACnB,EAGA,SAAS,iBAAiB,UAAY,OAAU,CAC1C,MAAM,MAAQ,SAAW,CAAC,MAAM,OAAO,UAAU,8BAA8B,IACnF,MAAM,eAAe,EACrB,MAAM,MAAM,OAAO,QAAQ,wBAAwB,CAAC,EACtD,CAAC,EAID,MAAM,MAAQ,IAAM,iBAAiB,KAAK,UAAU,SAAS,GAAM,UAAU,WAAa,YAAc,UAAU,eAAiB,EAC7H,SAAW,SAAS,cAAc,uBAAuB,EACzD,aAAe,UAAU,QACzB,QAAW,OAAU,MAAM,OAAO,UAAU,8BAA8B,EAEhF,SAAS,iBACP,aACC,OAAU,CACL,UAAY,QAAQ,KAAK,GAAK,MAAM,IAAG,SAAS,QAAU,GAAG,YAAY,mBAC/E,EACA,CAAE,QAAS,EAAK,CAClB,EACA,SAAS,iBAAiB,WAAa,OAAU,CAC3C,UAAY,QAAQ,KAAK,IAAG,SAAS,QAAU,aACrD,CAAC,EASD,MAAM,QAAU,OAAO,eACjB,oBAAsB,IACtB,mBAAqB,IAC3B,IAAI,aAAe,KACf,aAAe,EACf,eAAiB,EACjB,aAAe,GACf,aACJ,MAAM,cAAiB,IAAO,CAC5B,GAAG,UAAU,OAAO,0BAA0B,EAC9C,CAAC,MAAO,QAAQ,EAAE,QAAS,UAAa,GAAG,MAAM,eAAe,QAAQ,CAAC,CAC3E,EACM,gBAAkB,IAAM,CAC5B,GAAK,aACL,IAAI,QAAQ,OAAS,aAAe,oBAAqB,CACnD,cAAc,SAAS,eAAe,KAAK,EAC/C,MACF,CACA,aAAe,GACf,aAAa,UAAU,IAAI,yBAA0B,0BAA0B,EAC/E,aAAa,MAAM,UAAY,KAAK,KAAK,IAAI,EAAG,QAAQ,UAAY,QAAQ,OAAS,cAAc,CAAC,KACtG,EACA,SAAS,iBACP,WACC,OAAU,CACL,CAAC,SAAW,CAAC,QAAQ,KAAK,GAAK,SAAS,gBAAkB,MAAM,SACpE,MAAM,eAAe,EACrB,MAAM,OAAO,MAAM,CAAE,cAAe,EAAK,CAAC,EAC5C,EACA,CAAE,QAAS,EAAM,CACnB,EACA,SAAS,iBAAiB,UAAY,OAAU,CAC9C,GAAI,GAAC,SAAW,CAAC,QAAQ,KAAK,GAAK,CAAC,WAAW,mBAAmB,EAAE,WACpE,aAAa,YAAY,EACzB,aAAe,MAAM,OAAO,QAAQ,qBAAqB,EACrD,EAAC,cACL,cAAe,QAAQ,OACvB,eAAiB,EACjB,QAAS,GAAK,aAAa,cAAc,2BAA2B,EAAG,GAAI,GAAK,GAAG,aAAc,gBAAkB,GAAG,UACtH,aAAa,MAAM,IAAM,GAAG,aAAa,SAAS,KAClD,aAAa,MAAM,OAAS,OAC9B,CAAC,EACD,SAAS,iBAAiB,WAAa,OAAU,CAC/C,GAAI,CAAC,cAAgB,CAAC,QAAQ,KAAK,EAAG,OACtC,MAAM,GAAK,aACX,GAAG,UAAU,OAAO,wBAAwB,EAC5C,GAAG,MAAM,eAAe,WAAW,EACnC,aAAe,KACf,aAAe,GACf,aAAe,WAAW,IAAM,cAAc,EAAE,EAAG,kBAAkB,CACvE,CAAC,EACD,SAAS,iBAAiB,SAAU,eAAe,EACnD,SAAS,iBAAiB,SAAU,eAAe,EAGnD,SAAS,iBAAiB,QAAU,OAAU,CACxC,cAAgB,MAAM,OAAO,UAAU,sDAAsD,GAAG,SAAS,eAAe,KAAK,CACnI,CAAC,EAGD,IAAI,OAAS,KACb,MAAM,SAAW,IAAM,CACrB,MAAM,MAAQ,QAAQ,cAAc,cAAc,oBAAoB,EAClE,QAAO,MAAM,MAAM,cAAgB,GAAG,OAAO,YAAY,KAC/D,EACM,eAAiB,mBAAoB,OAAS,IAAI,eAAe,QAAQ,EAAI,KAE7E,KAAQ,MAAS,CACrB,MAAM,MAAQ,KAAK,cAAc,8BAA8B,EACzD,OAAS,KAAK,cAAc,+BAA+B,EAC3D,WAAa,MAAQ,MAAM,QAAQ,qBAAqB,EAAI,KAC9D,aAAe,SACjB,gBAAgB,WAAW,EAC3B,OAAS,WACL,QAAQ,gBAAgB,QAAQ,MAAM,GAExC,OAAS,QAAU,MAAM,YAAc,OAAO,YAChD,MAAM,UAAY,OAAO,UACzB,SAAS,EAEb,EAEA,IAAI,aAAe,KACnB,MAAM,KAAO,IAAM,CACjB,cAAc,WAAW,EACzB,MAAM,KAAO,SAAS,cAAc,aAAa,EAC5C,OACL,KAAK,IAAI,EACT,aAAe,IAAI,iBAAiB,IAAM,KAAK,IAAI,CAAC,EACpD,aAAa,QAAQ,KAAM,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,EAC/D,EAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAI,EAElD,KAAK,EAEP,SAAS,iBAAiB,uBAAwB,IAAI,CACxD,GAAG,GAIF,IAAM,CAEL,MAAM,cAAgB,CAAC,CAAE,IAAK,OAAQ,SAAU,SAAU,IAAK,GAAI,IAAM,CACvE,MAAM,MAAQ,CAAC,EACf,IAAI,KAAK,eAAe,QAAS,CAC/B,SAAU,cACV,KAAM,UACN,MAAO,UACP,IAAK,UACL,KAAM,UACN,OAAQ,UACR,UAAW,KACb,CAAC,EACE,cAAc,GAAG,EACjB,QAAS,MAAS,CACjB,MAAM,KAAK,IAAI,EAAI,KAAK,KAC1B,CAAC,EAEH,MAAM,IAAO,MAAS,KAAK,YAAY,EAAE,MAAM,EAAG,EAAE,EAC9C,WAAc,MAAS,CAC3B,MAAM,IAAM,KAAK,UAAU,EAC3B,OAAI,MAAQ,GAAK,MAAQ,EAAU,GAC5B,CAAC,SAAS,SAAS,IAAI,IAAI,CAAC,GAAK,CAAC,SAAS,SAAS,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC,CAC/E,EACM,gBAAkB,CAAC,KAAM,QAAU,CACvC,MAAM,KAAO,IAAI,KAAK,IAAI,EAC1B,QAAS,KAAO,MAAO,KAAO,GAC5B,KAAK,WAAW,KAAK,WAAW,EAAI,CAAC,EACjC,WAAW,IAAI,IAAG,MAAQ,GAEhC,OAAO,IACT,EAEM,MAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,KAAM,CAAC,MAAM,MAAQ,EAAG,CAAC,MAAM,GAAG,CAAC,EACpE,KAAO,GAAG,MAAM,IAAI,IAAI,MAAM,MAAM,GACpC,OAAS,CAAC,gBAAgB,KAAK,MAAM,GAAK,KAAO,OACjDC,OAAQ,WAAW,KAAK,GAAK,OAAS,MAAQ,gBAAgB,MAAO,CAAC,EACtE,KAAO,gBAAgBA,OAAO,QAAQ,EAC5C,MAAO,CAAE,KAAM,gBAAgB,KAAM,GAAG,EAAG,GAAI,gBAAgB,KAAM,GAAG,CAAE,CAC5E,EAGM,MAAS,KAAQ,CACrB,GAAI,IAAI,QAAQ,OAAQ,OACxB,IAAI,QAAQ,OAAS,OAErB,MAAM,UAAY,IAAI,QAAQ,mBAAqB,IAAI,MAAM,GAAG,EAAE,IAAK,MAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO,EACrG,OAAS,IAAI,KAAK,eAAe,IAAI,QAAQ,gBAAiB,CAClE,SAAU,MACV,QAAS,QACT,IAAK,UACL,MAAO,OACT,CAAC,EAED,IAAI,iBAAiB,uBAAuB,EAAE,QAAS,KAAQ,CAC7D,KAAM,CAAE,KAAM,EAAG,EAAI,cAAc,CACjC,IAAK,IAAI,KACT,OAAQ,IAAI,QAAQ,iBAAmB,GACvC,SACA,SAAU,CAAC,IAAI,QAAQ,mBAAqB,EAC5C,IAAK,CAAC,IAAI,QAAQ,aAClB,IAAK,CAAC,IAAI,QAAQ,YACpB,CAAC,EACK,MAAQ,OAAO,OAAO,IAAI,EAC1B,KAAO,OAAO,OAAO,EAAE,EAC7B,IAAI,cAAc,wBAAwB,EAAE,YAAc,QAAU,KAAO,MAAQ,GAAG,KAAK,WAAM,IAAI,EACvG,CAAC,EAID,MAAM,SAAW,IAAI,QAAQ,kBACvB,QAAU,SAAW,IAAI,QAAQ,iBAAmB,OACpD,gBAAkB,OAAO,SAAS,SAClC,KAAO,SAAW,CAAC,iBAAiB,KAAO,EAC3C,QAAU,CAAC,UAAa,KAAO,GAAK,iBAAiB,SAAW,SAChE,YAAc,UAAY,QAAU,UAAY,QAAW,UAAY,WAAa,QAC1F,GAAI,UAAY,WAAa,QAAS,CAEpC,MAAM,MAAQ,IAAI,KAAK,aAAa,IAAI,QAAQ,gBAAiB,CAAE,sBAAuB,CAAE,CAAC,EACvF,MAAS,OAAU,IAAI,QAAQ,eAAe,QAAQ,mBAAoB,MAAM,OAAO,KAAK,CAAC,EAC7F,SAAY,SAAY,CAC5B,MAAM,OAAS,MAAM,CAAC,QAAQ,QAAQ,aAAe,IAAI,EACnD,OAAS,IAAI,QAAQ,gBAC3B,OAAO,OAAS,OAAO,QAAQ,aAAc,MAAM,EAAI,MACzD,EACA,IAAI,iBAAiB,+CAA+C,EAAE,QAAS,SAAY,CACzF,QAAQ,YAAc,SAAS,OAAO,CACxC,CAAC,EACD,IAAI,iBAAiB,6BAA6B,EAAE,QAAS,SAAY,CACvE,QAAQ,YAAc,QAAQ,QAAQ,kBAAkB,QAAQ,aAAc,SAAS,OAAO,CAAC,CACjG,CAAC,EACD,IAAI,iBAAiB,uBAAuB,EAAE,QAAS,SAAY,CACjE,QAAQ,OAAS,EACnB,CAAC,CACH,CAEA,IAAI,SAAW,CAAC,EAChB,GAAI,CACF,SAAW,KAAK,MAAM,IAAI,cAAc,4BAA4B,EAAE,WAAW,CACnF,MAAY,CACV,MACF,CACA,MAAM,QAAU,IAAI,QAAQ,gBAAgB,GAAK,SAC3C,MAAQ,QAAQ,cAAc,uCAAuC,EAErE,KAAO,IAAM,CACjB,MAAM,QAAU,SAAS,OAAO,KAAK,EAChC,SACL,IAAI,iBAAiB,uBAAuB,EAAE,QAAS,KAAQ,CAC7D,IAAI,OAAS,CAAC,QAAQ,UACtB,MAAM,SAAW,CAAC,IAAI,QAAQ,kBAAoB,KAC5C,OAAS,aAAe,SAAW,SAAW,GAAK,QAAQ,OAAS,SACpE,KAAO,IAAI,cAAc,wBAAwB,EACjD,KAAO,IAAI,cAAc,wBAAwB,EACjD,KAAO,IAAI,cAAc,6BAA6B,EACxD,OAAM,KAAK,OAAS,CAAC,aAAe,QACpC,OAAM,KAAK,OAAS,CAAC,QACrB,OAAM,KAAK,OAAS,CAAC,aAAe,OAC1C,CAAC,CACH,EAEM,WAAa,QAAQ,cAAc,cAAc,EACnD,YAAY,IAAI,iBAAiB,IAAI,EAAE,QAAQ,WAAY,CAAE,UAAW,GAAM,cAAe,GAAM,QAAS,EAAK,CAAC,EACtH,OAAO,iBAAiB,SAAU,IAAI,EACtC,KAAK,CACP,EACM,KAAO,IAAM,SAAS,iBAAiB,mBAAmB,EAAE,QAAQ,KAAK,EAE3E,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAI,EAElD,KAAK,EAEP,SAAS,iBAAiB,uBAAwB,IAAI,CACxD,GAAG",
  "names": ["shownId", "start"]
}
