{"version":3,"file":"promo-message-banner-BxpYJQY_.js","sources":["../../../../src/main/js/content/promo-message-banner/components/pmb-slider.js","../../../../src/main/js/content/promo-message-banner/components/targeted-message.js","../../../../src/main/js/content/promo-message-banner/util/pmb-metrics.js","../../../../src/main/js/content/promo-message-banner/main/main.js","../../../../src/main/js/content/promo-message-banner/promo-message-banner.js"],"sourcesContent":["/* eslint-disable no-use-before-define */\n/* eslint no-plusplus: [\"error\", { \"allowForLoopAfterthoughts\": true }] */\n\nfunction pmbSlider(test) {\n const d = document;\n const pmb = d.querySelector('#promo-message-banner');\n const itemClassName = 'pmb_slide';\n let items = d.getElementsByClassName(itemClassName);\n let itemLinks = d.querySelectorAll('.pmb_link');\n\n // if no pmb or only one message, abort.\n if (!pmb || items.length === 0) return;\n\n function checkForMobile() {\n return window.matchMedia('(max-width: 767px)').matches;\n }\n\n // Variables to target our base class, get slider items,\n // count how many slider items there are,\n // and set motion to true which disables interactivity.\n const next = d.querySelector('.pmb_nextButton');\n const prev = d.querySelector('.pmb_prevButton');\n const pauseBtn = d.querySelector('.pause-button');\n let totalItems = items.length;\n let twoMessages = false;\n let slideIndex = 0;\n let moving = true;\n let pmbInFocus = false;\n let isMobile = checkForMobile();\n let autoSlide;\n let hoverTimer;\n let autoSlideActive = true;\n\n function setBannerHeight() {\n // this preserves banner height as messages animate\n // and receive absolute positioning\n pmb.style.height = `${pmb.offsetHeight}px`;\n }\n\n function getSlideTotal() {\n if (totalItems === 2) {\n twoMessages = true;\n // add more slides so slider can wrap.\n const parentEl = d.querySelector('.pmb_viewport');\n for (let i = 0; i < 2; i++) {\n const clone = items[i].cloneNode(true);\n clone.setAttribute('aria-hidden', 'true');\n clone.querySelector('.pmb_link').setAttribute('tabindex', '-1');\n clone.querySelector('.pmb_link').setAttribute('data-slide-index', `${i + 2}`);\n parentEl.appendChild(clone);\n }\n // reset item list and total\n items = d.getElementsByClassName(itemClassName);\n itemLinks = d.querySelectorAll('.pmb_link');\n totalItems = items.length;\n }\n }\n\n function slidesNotReady() {\n for (let i = 0; i < items.length; i++) {\n items[i].classList.remove('slide-ready');\n }\n }\n\n function slidesReady() {\n for (let i = 0; i < items.length; i++) {\n items[i].classList.add('slide-ready');\n }\n }\n\n function setInitialClasses() {\n // Target the last, initial, and next items and give them the relevant class.\n // This assumes there are three or more items.\n\n slidesReady();\n items[totalItems - 1].classList.add('prev');\n items[0].classList.add('active');\n items[1].classList.add('next');\n }\n\n // Disable interaction by setting 'moving' to true\n // for the same duration as our transition\n function disableInteraction() {\n moving = true;\n\n setTimeout(() => {\n moving = false;\n }, 300);\n }\n\n function moveSliderTo(slide) {\n // Check if slider is moving, if not, allow interaction\n if (!moving) {\n // temporarily disable interactivity\n disableInteraction();\n\n // Preemptively set variables for the current next and previous slide,\n // as well as the potential next or previous slide.\n let newPrevious = slide - 1;\n let newNext = slide + 1;\n\n // Check if current slide is at the beginning or end and sets slide numbers\n if (slide === 0) {\n newPrevious = totalItems - 1;\n } else if (slide === totalItems - 1) {\n newPrevious = slide - 1;\n newNext = 0;\n }\n\n // Reset to default classes.\n for (let i = 0; i < items.length; i++) {\n items[i].className = `${itemClassName} slide-ready`;\n if (!pmbInFocus) items[i].classList.add('animate');\n }\n // Add the new classes.\n items[newPrevious].classList.add('prev');\n items[newNext].classList.add('next');\n items[slide].classList.add('active');\n }\n }\n\n // Next navigation handler\n function moveNext() {\n // Check if moving\n if (!moving) {\n // If it's the last slide, reset to 0, else +1\n if (slideIndex === totalItems - 1) {\n slideIndex = 0;\n } else {\n slideIndex += 1;\n }\n\n // Move slider to updated slideIndex\n moveSliderTo(slideIndex);\n }\n }\n // Previous navigation handler\n function movePrev() {\n // Check if moving\n if (!moving) {\n // If it's the first slideIndex, set as the last slideIndex, else -1\n if (slideIndex === 0) {\n slideIndex = totalItems - 1;\n } else {\n slideIndex -= 1;\n }\n // Move slider to updated slideIndex\n moveSliderTo(slideIndex);\n }\n }\n function clearHoverTimer() {\n clearTimeout(hoverTimer);\n }\n function startAutoSlide() {\n autoSlide = setInterval(moveNext, 6000);\n }\n function stopAutoSlide(e) {\n const eventType = e.type;\n // set delay before hover kills auto slide\n if (e.type === 'mouseover') {\n hoverTimer = setTimeout(() => {\n clearInterval(autoSlide);\n removeEvents(e.type);\n }, 200);\n } else {\n clearInterval(autoSlide);\n removeEvents(eventType);\n }\n }\n function removeEvents(type) {\n // remove listeners for auto slide.\n\n next.removeEventListener(type, stopAutoSlide);\n prev.removeEventListener(type, stopAutoSlide);\n\n for (let i = 0; i < itemLinks.length; i++) {\n itemLinks[i].removeEventListener(type, stopAutoSlide);\n }\n autoSlideActive = false;\n }\n\n // Set click events to navigation buttons\n function moveNextByClick(e) {\n if (autoSlideActive) stopAutoSlide(e);\n moveNext();\n }\n function movePrevByClick(e) {\n if (autoSlideActive) stopAutoSlide(e);\n movePrev();\n }\n\n function setTouchEvents() {\n let swipeStart;\n // const viewport = d.querySelector('.pmb_viewport');\n pmb.addEventListener('touchstart', (e) => {\n stopAutoSlide(e);\n swipeStart = e.changedTouches[0].screenX;\n }, { passive: true });\n\n pmb.addEventListener('touchend', (e) => {\n if (!swipeStart) return;\n const swipeEnd = e.changedTouches[0].screenX;\n if (swipeStart === swipeEnd) return;\n if (swipeStart > swipeEnd) {\n e.preventDefault();\n moveNextByClick();\n } else {\n e.preventDefault();\n movePrevByClick();\n }\n // Need to reset value, otherwise you get unexpected behavior\n swipeStart = null;\n }, { passive: true });\n // Need to ignore touchstart events on pause button\n pauseBtn?.addEventListener('touchstart', (e) => {\n e.stopPropagation();\n }, { passive: true });\n }\n\n function handleSlideFocus(e) {\n pmbInFocus = true;\n for (let i = 0; i < itemLinks.length; i++) {\n items[i].classList.remove('animate');\n }\n\n stopAutoSlide(e);\n const focusIndex = parseInt(e.target.dataset.slideIndex, 10);\n // handle tabbing into PMB when slide is on cloned elements.\n if (twoMessages && slideIndex > 1) {\n if (focusIndex === 0) {\n slideIndex = 3;\n moveNext();\n } else {\n slideIndex = 0;\n moveNext();\n }\n } else {\n if (focusIndex > slideIndex) {\n if (focusIndex === 2 && slideIndex === 0) {\n movePrev();\n } else {\n moveNext();\n }\n }\n if (focusIndex < slideIndex) {\n if (focusIndex === 0 && slideIndex === 2) {\n moveNext();\n } else {\n movePrev();\n }\n }\n }\n }\n\n function handleSlideBlur() {\n pmbInFocus = false;\n }\n function togglePlay(e) {\n const div = e.currentTarget;\n // Toggle classes\n div.classList.toggle('play');\n div.classList.toggle('pause');\n const isPaused = div.classList.contains('play');\n // Toggle aria messages\n div.ariaLabel = isPaused ? div.dataset.playMsg : div.dataset.pauseMsg;\n // Pause/resume message play\n if (isPaused) {\n stopAutoSlide(e);\n } else {\n startAutoSlide();\n }\n }\n function setControlsEventListeners() {\n // add listeners\n if (next && prev && !isMobile) {\n next.addEventListener('click', moveNextByClick);\n prev.addEventListener('click', movePrevByClick);\n next.addEventListener('mouseover', stopAutoSlide);\n prev.addEventListener('mouseover', stopAutoSlide);\n // keep auto slide active if hover is very short\n next.addEventListener('mouseout', clearHoverTimer);\n prev.addEventListener('mouseout', clearHoverTimer);\n }\n if (pauseBtn) {\n pauseBtn.addEventListener('click', togglePlay);\n }\n\n for (let i = 0; i < items.length; i++) {\n itemLinks[i].addEventListener('focus', handleSlideFocus);\n itemLinks[i].addEventListener('blur', handleSlideBlur);\n itemLinks[i].addEventListener('mouseover', stopAutoSlide);\n itemLinks[i].addEventListener('mouseout', clearHoverTimer);\n }\n setTouchEvents();\n }\n\n // check window for mobile\n function windowCheck() {\n observer.disconnect();\n moving = true;\n isMobile = checkForMobile();\n\n // remove slide ready class.\n slidesNotReady();\n // reset banner height when switching breakpoints.\n pmb.style.height = 'auto';\n setBannerHeight();\n // add slide ready class.\n slidesReady();\n // add listeners if on desktop.\n if (!isMobile) {\n setControlsEventListeners();\n }\n moving = false;\n initObserver();\n }\n\n // check for text spacing changes\n const observer = new MutationObserver((mutations) => {\n mutations.forEach(() => {\n windowCheck();\n });\n });\n\n const target = document.getElementById('promo-message-banner');\n\n function initObserver() {\n // disable oberver if this is a unit test\n if (test) return;\n observer.observe(target, { attributes: true, attributeFilter: ['style'] });\n }\n\n // Initialize slider\n function initSlider() {\n window.addEventListener('resize', windowCheck);\n initObserver();\n setBannerHeight();\n getSlideTotal();\n setInitialClasses();\n setControlsEventListeners();\n\n // disable auto slide if reduced motion is turned on\n if (window.matchMedia('(prefers-reduced-motion)').matches) {\n autoSlideActive = false;\n } else {\n startAutoSlide();\n }\n\n // Set moving to false now that the slider is ready\n moving = false;\n }\n\n // make it go\n initSlider();\n}\nexport default pmbSlider;\n","import { getUser } from '@rei/session';\n\nconst getPmbElem = () => document.querySelector('[data-js=\"pmb\"]');\nconst getAltMessagesElm = () => document.querySelector('.pmb_alternate-messages');\nconst getDefaultMessagesElm = () => document.querySelector('.pmb_default-messages');\n\n/**\n * @param {string|null|undefined} tagName\n * @returns {boolean} true if tagName is for an anchor element\n */\nconst isSingleMessage = (tagName) => tagName === 'A';\n\n/**\n * If the element param is not a single banner then the left-right arrow buttons\n * are made visible\n * @param {HTMLDivElement|HTMLAnchorElement|{}} element\n */\nconst showArrowButtons = (element) => {\n const { tagName } = element || {};\n const pmbElem = getPmbElem();\n if (!isSingleMessage(tagName) && pmbElem) {\n const previousBtn = pmbElem.querySelector(\n '[data-js=\"previous-message-button\"]'\n );\n const nextBtn = pmbElem.querySelector('[data-js=\"next-message-button\"]');\n if (previousBtn) {\n previousBtn.classList.remove('pmb_hidden');\n }\n if (nextBtn) {\n nextBtn.classList.remove('pmb_hidden');\n }\n // Show pause button as well\n pmbElem.querySelector('[data-js=\"pause-button\"]')?.classList?.remove('pmb_hidden');\n }\n};\n/**\n * @param {HTMLDivElement|HTMLAnchorElement|null} element\n */\nconst showMessages = (element) => {\n if (element) {\n element.classList.remove('pmb_hidden');\n element.classList.add('active');\n }\n};\n\n/**\n * @param {HTMLDivElement|HTMLAnchorElement|null} element\n */\nconst removeMessages = (element) => {\n if (element) {\n element.remove();\n }\n};\n\nconst getMemberInfo = async () => {\n const user = await getUser();\n return !!user?.isLoggedIn && !!user?.membership;\n};\n\n/**\n *\n * @param {HTMLDivElement|HTMLAnchorElement|null} bannerElemToShow\n * @param {HTMLDivElement|HTMLAnchorElement|null} bannerElemToHide\n */\nconst displayTargetedBanners = (bannerElemToShow, bannerElemToHide = null) => {\n showArrowButtons(bannerElemToShow);\n showMessages(bannerElemToShow);\n removeMessages(bannerElemToHide);\n};\n\nconst swapMessages = async () => {\n const altMessages = getAltMessagesElm();\n const defaultMessages = getDefaultMessagesElm();\n if (!window.pmbHasMemberMessages) {\n displayTargetedBanners(defaultMessages);\n return;\n }\n const isMember = await getMemberInfo();\n if (isMember) {\n displayTargetedBanners(altMessages, defaultMessages);\n } else {\n displayTargetedBanners(defaultMessages, altMessages);\n }\n};\n\nexport default swapMessages;\n","const init = (navSelector = null) => {\n const pmbElem = document.querySelector(navSelector);\n const { metrics } = window;\n\n if (pmbElem && metrics) {\n [].forEach.call(pmbElem.querySelectorAll('a, button'), (element) => {\n element.addEventListener('click', function handlePmbClick() {\n const linkText = this.dataset.analyticsId || this.textContent.trim();\n const linkName = `promo-message-banner:${linkText}`;\n metrics.link(\n {\n linkName,\n },\n this\n );\n });\n });\n }\n};\n\nexport default init;\n","/* Promo Message Banner */\n\nimport pmbSlider from '../components/pmb-slider';\nimport swapMessages from '../components/targeted-message';\nimport pmbAnalyticsInit from '../util/pmb-metrics';\n\nexport async function app(win) {\n await swapMessages();\n pmbSlider();\n pmbAnalyticsInit('[data-js=\"pmb\"]');\n\n return win;\n}\n\nexport function main(win = window) {\n if (win.document.readyState === 'loading') {\n // Loading hasn't finished yet\n win.document.addEventListener('DOMContentLoaded', app.bind(null, win));\n } else {\n // `DOMContentLoaded` has already fired\n app(win);\n }\n}\n","import '../../../style/content/promo-message-banner/promo-message-banner.scss';\n/**\n * If any JS is needed for pmb, add the main entry point to this file.\n */\nimport { main } from './main/main';\n\n/**\n * This is the main js entry point.\n *\n * @param win Window object. Pass in to allow for window stubbing.\n * @returns {Window}\n */\n\nmain(window);\n"],"names":["pmbSlider","test","d","document","pmb","querySelector","itemClassName","items","getElementsByClassName","itemLinks","querySelectorAll","length","checkForMobile","window","matchMedia","matches","next","prev","pauseBtn","totalItems","twoMessages","slideIndex","moving","pmbInFocus","isMobile","autoSlide","hoverTimer","autoSlideActive","setBannerHeight","style","height","offsetHeight","getSlideTotal","parentEl","i","clone","cloneNode","setAttribute","appendChild","slidesNotReady","classList","remove","slidesReady","add","setInitialClasses","disableInteraction","setTimeout","moveSliderTo","slide","newPrevious","newNext","className","moveNext","movePrev","clearHoverTimer","clearTimeout","startAutoSlide","setInterval","stopAutoSlide","e","eventType","type","clearInterval","removeEvents","removeEventListener","moveNextByClick","movePrevByClick","setTouchEvents","swipeStart","addEventListener","changedTouches","screenX","passive","swipeEnd","preventDefault","stopPropagation","handleSlideFocus","focusIndex","parseInt","target","dataset","handleSlideBlur","togglePlay","div","currentTarget","toggle","isPaused","contains","ariaLabel","playMsg","pauseMsg","setControlsEventListeners","windowCheck","observer","disconnect","initObserver","MutationObserver","mutations","forEach","getElementById","observe","attributes","attributeFilter","initSlider","getPmbElem","getAltMessagesElm","getDefaultMessagesElm","isSingleMessage","tagName","showArrowButtons","element","pmbElem","previousBtn","nextBtn","showMessages","removeMessages","getMemberInfo","user","getUser","isLoggedIn","membership","displayTargetedBanners","bannerElemToShow","bannerElemToHide","swapMessages","altMessages","defaultMessages","pmbHasMemberMessages","init","navSelector","metrics","call","linkName","analyticsId","textContent","trim","link","app","win","pmbAnalyticsInit","main","readyState","bind"],"mappings":"iRAGA,SAASA,EAAUC,EAAM,CACvB,MAAMC,EAAIC,SACJC,EAAMF,EAAEG,cAAc,uBAAuB,EAC7CC,EAAgB,YACtB,IAAIC,EAAQL,EAAEM,uBAAuBF,CAAa,EAC9CG,EAAYP,EAAEQ,iBAAiB,WAAW,EAG9C,GAAI,CAACN,GAAOG,EAAMI,SAAW,EAAG,OAEhC,SAASC,GAAiB,CACxB,OAAOC,OAAOC,WAAW,oBAAoB,EAAEC,OACjD,CAKA,MAAMC,EAAOd,EAAEG,cAAc,iBAAiB,EACxCY,EAAOf,EAAEG,cAAc,iBAAiB,EACxCa,EAAWhB,EAAEG,cAAc,eAAe,EAChD,IAAIc,EAAaZ,EAAMI,OACnBS,EAAc,GACdC,EAAa,EACbC,EAAS,GACTC,EAAa,GACbC,EAAWZ,EAAgB,EAC3Ba,EACAC,EACAC,EAAkB,GAEtB,SAASC,GAAkB,CAGzBxB,EAAIyB,MAAMC,OAAS,GAAG1B,EAAI2B,YAAY,IACxC,CAEA,SAASC,GAAgB,CACvB,GAAIb,IAAe,EAAG,CACpBC,EAAc,GAEd,MAAMa,EAAW/B,EAAEG,cAAc,eAAe,EAChD,QAAS6B,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMC,EAAQ5B,EAAM2B,CAAC,EAAEE,UAAU,EAAI,EACrCD,EAAME,aAAa,cAAe,MAAM,EACxCF,EAAM9B,cAAc,WAAW,EAAEgC,aAAa,WAAY,IAAI,EAC9DF,EAAM9B,cAAc,WAAW,EAAEgC,aAAa,mBAAoB,GAAGH,EAAI,CAAC,EAAE,EAC5ED,EAASK,YAAYH,CAAK,CAC5B,CAEA5B,EAAQL,EAAEM,uBAAuBF,CAAa,EAC9CG,EAAYP,EAAEQ,iBAAiB,WAAW,EAC1CS,EAAaZ,EAAMI,MACrB,CACF,CAEA,SAAS4B,GAAiB,CACxB,QAASL,EAAI,EAAGA,EAAI3B,EAAMI,OAAQuB,IAChC3B,EAAM2B,CAAC,EAAEM,UAAUC,OAAO,aAAa,CAE3C,CAEA,SAASC,GAAc,CACrB,QAASR,EAAI,EAAGA,EAAI3B,EAAMI,OAAQuB,IAChC3B,EAAM2B,CAAC,EAAEM,UAAUG,IAAI,aAAa,CAExC,CAEA,SAASC,GAAoB,CAI3BF,EAAa,EACbnC,EAAMY,EAAa,CAAC,EAAEqB,UAAUG,IAAI,MAAM,EAC1CpC,EAAM,CAAC,EAAEiC,UAAUG,IAAI,QAAQ,EAC/BpC,EAAM,CAAC,EAAEiC,UAAUG,IAAI,MAAM,CAC/B,CAIA,SAASE,GAAqB,CAC5BvB,EAAS,GAETwB,WAAW,IAAM,CACfxB,EAAS,EACV,EAAE,GAAG,CACR,CAEA,SAASyB,EAAaC,EAAO,CAE3B,GAAI,CAAC1B,EAAQ,CAEXuB,EAAoB,EAIpB,IAAII,EAAcD,EAAQ,EACtBE,EAAUF,EAAQ,EAGlBA,IAAU,EACZC,EAAc9B,EAAa,EAClB6B,IAAU7B,EAAa,IAChC8B,EAAcD,EAAQ,EACtBE,EAAU,GAIZ,QAAShB,EAAI,EAAGA,EAAI3B,EAAMI,OAAQuB,IAChC3B,EAAM2B,CAAC,EAAEiB,UAAY,GAAG7C,CAAa,eAChCiB,GAAYhB,EAAM2B,CAAC,EAAEM,UAAUG,IAAI,SAAS,EAGnDpC,EAAM0C,CAAW,EAAET,UAAUG,IAAI,MAAM,EACvCpC,EAAM2C,CAAO,EAAEV,UAAUG,IAAI,MAAM,EACnCpC,EAAMyC,CAAK,EAAER,UAAUG,IAAI,QAAQ,CACrC,CACF,CAGA,SAASS,GAAW,CAEb9B,IAECD,IAAeF,EAAa,EAC9BE,EAAa,EAEbA,GAAc,EAIhB0B,EAAa1B,CAAU,EAE3B,CAEA,SAASgC,GAAW,CAEb/B,IAECD,IAAe,EACjBA,EAAaF,EAAa,EAE1BE,GAAc,EAGhB0B,EAAa1B,CAAU,EAE3B,CACA,SAASiC,GAAkB,CACzBC,aAAa7B,CAAU,CACzB,CACA,SAAS8B,GAAiB,CACxB/B,EAAYgC,YAAYL,EAAU,GAAI,CACxC,CACA,SAASM,EAAcC,EAAG,CACxB,MAAMC,EAAYD,EAAEE,KAEhBF,EAAEE,OAAS,YACbnC,EAAaoB,WAAW,IAAM,CAC5BgB,cAAcrC,CAAS,EACvBsC,EAAaJ,EAAEE,IAAI,CACpB,EAAE,GAAG,GAENC,cAAcrC,CAAS,EACvBsC,EAAaH,CAAS,EAE1B,CACA,SAASG,EAAaF,EAAM,CAG1B7C,EAAKgD,oBAAoBH,EAAMH,CAAa,EAC5CzC,EAAK+C,oBAAoBH,EAAMH,CAAa,EAE5C,QAASxB,EAAI,EAAGA,EAAIzB,EAAUE,OAAQuB,IACpCzB,EAAUyB,CAAC,EAAE8B,oBAAoBH,EAAMH,CAAa,EAEtD/B,EAAkB,EACpB,CAGA,SAASsC,EAAgBN,EAAG,CACtBhC,GAAiB+B,EAAcC,CAAC,EACpCP,EAAU,CACZ,CACA,SAASc,EAAgBP,EAAG,CACtBhC,GAAiB+B,EAAcC,CAAC,EACpCN,EAAU,CACZ,CAEA,SAASc,GAAiB,CACxB,IAAIC,EAEJhE,EAAIiE,iBAAiB,aAAeV,GAAM,CACxCD,EAAcC,CAAC,EACfS,EAAaT,EAAEW,eAAe,CAAC,EAAEC,OACnC,EAAG,CAAEC,QAAS,EAAK,CAAC,EAEpBpE,EAAIiE,iBAAiB,WAAaV,GAAM,CACtC,GAAI,CAACS,EAAY,OACjB,MAAMK,EAAWd,EAAEW,eAAe,CAAC,EAAEC,QACjCH,IAAeK,IACfL,EAAaK,GACfd,EAAEe,eAAgB,EAClBT,EAAiB,IAEjBN,EAAEe,eAAgB,EAClBR,EAAiB,GAGnBE,EAAa,KACf,EAAG,CAAEI,QAAS,EAAK,CAAC,EAEpBtD,GAAAA,MAAAA,EAAUmD,iBAAiB,aAAeV,GAAM,CAC9CA,EAAEgB,gBAAiB,CACrB,EAAG,CAAEH,QAAS,EAAK,EACrB,CAEA,SAASI,EAAiBjB,EAAG,CAC3BpC,EAAa,GACb,QAASW,EAAI,EAAGA,EAAIzB,EAAUE,OAAQuB,IACpC3B,EAAM2B,CAAC,EAAEM,UAAUC,OAAO,SAAS,EAGrCiB,EAAcC,CAAC,EACf,MAAMkB,EAAaC,SAASnB,EAAEoB,OAAOC,QAAQ3D,WAAY,EAAE,EAEvDD,GAAeC,EAAa,EAC1BwD,IAAe,GACjBxD,EAAa,EACb+B,EAAU,IAEV/B,EAAa,EACb+B,EAAU,IAGRyB,EAAaxD,IACXwD,IAAe,GAAKxD,IAAe,EACrCgC,EAAU,EAEVD,EAAU,GAGVyB,EAAaxD,IACXwD,IAAe,GAAKxD,IAAe,EACrC+B,EAAU,EAEVC,EAAU,GAIlB,CAEA,SAAS4B,GAAkB,CACzB1D,EAAa,EACf,CACA,SAAS2D,EAAWvB,EAAG,CACrB,MAAMwB,EAAMxB,EAAEyB,cAEdD,EAAI3C,UAAU6C,OAAO,MAAM,EAC3BF,EAAI3C,UAAU6C,OAAO,OAAO,EAC5B,MAAMC,EAAWH,EAAI3C,UAAU+C,SAAS,MAAM,EAE9CJ,EAAIK,UAAYF,EAAWH,EAAIH,QAAQS,QAAUN,EAAIH,QAAQU,SAEzDJ,EACF5B,EAAcC,CAAC,EAEfH,EAAgB,CAEpB,CACA,SAASmC,GAA4B,CAE/B3E,GAAQC,GAAQ,CAACO,IACnBR,EAAKqD,iBAAiB,QAASJ,CAAe,EAC9ChD,EAAKoD,iBAAiB,QAASH,CAAe,EAC9ClD,EAAKqD,iBAAiB,YAAaX,CAAa,EAChDzC,EAAKoD,iBAAiB,YAAaX,CAAa,EAEhD1C,EAAKqD,iBAAiB,WAAYf,CAAe,EACjDrC,EAAKoD,iBAAiB,WAAYf,CAAe,GAE/CpC,GACFA,EAASmD,iBAAiB,QAASa,CAAU,EAG/C,QAAShD,EAAI,EAAGA,EAAI3B,EAAMI,OAAQuB,IAChCzB,EAAUyB,CAAC,EAAEmC,iBAAiB,QAASO,CAAgB,EACvDnE,EAAUyB,CAAC,EAAEmC,iBAAiB,OAAQY,CAAe,EACrDxE,EAAUyB,CAAC,EAAEmC,iBAAiB,YAAaX,CAAa,EACxDjD,EAAUyB,CAAC,EAAEmC,iBAAiB,WAAYf,CAAe,EAE3Da,EAAgB,CAClB,CAGA,SAASyB,GAAc,CACrBC,EAASC,WAAY,EACrBxE,EAAS,GACTE,EAAWZ,EAAgB,EAG3B2B,EAAgB,EAEhBnC,EAAIyB,MAAMC,OAAS,OACnBF,EAAiB,EAEjBc,EAAa,EAERlB,GACHmE,EAA2B,EAE7BrE,EAAS,GACTyE,EAAc,CAChB,CAGA,MAAMF,EAAW,IAAIG,iBAAkBC,GAAc,CACnDA,EAAUC,QAAQ,IAAM,CACtBN,EAAa,CACf,CAAC,CACH,CAAC,EAEKb,EAAS5E,SAASgG,eAAe,sBAAsB,EAE7D,SAASJ,GAAe,CAGtBF,EAASO,QAAQrB,EAAQ,CAAEsB,WAAY,GAAMC,gBAAiB,CAAC,OAAO,CAAE,CAAC,CAC3E,CAGA,SAASC,GAAa,CACpB1F,OAAOwD,iBAAiB,SAAUuB,CAAW,EAC7CG,EAAc,EACdnE,EAAiB,EACjBI,EAAe,EACfY,EAAmB,EACnB+C,EAA2B,EAGvB9E,OAAOC,WAAW,0BAA0B,EAAEC,QAChDY,EAAkB,GAElB6B,EAAgB,EAIlBlC,EAAS,EACX,CAGAiF,EAAY,CACd,CChWA,MAAMC,EAAaA,IAAMrG,SAASE,cAAc,iBAAiB,EAC3DoG,EAAoBA,IAAMtG,SAASE,cAAc,yBAAyB,EAC1EqG,GAAwBA,IAAMvG,SAASE,cAAc,uBAAuB,EAM5EsG,GAAmBC,GAAYA,IAAY,IAO3CC,GAAoBC,GAAY,SACpC,KAAM,CAAEF,QAAAA,CAAS,EAAGE,GAAW,CAAE,EAC3BC,EAAUP,EAAY,EAC5B,GAAI,CAACG,GAAgBC,CAAO,GAAKG,EAAS,CACxC,MAAMC,EAAcD,EAAQ1G,cAC1B,qCACF,EACM4G,EAAUF,EAAQ1G,cAAc,iCAAiC,EACnE2G,GACFA,EAAYxE,UAAUC,OAAO,YAAY,EAEvCwE,GACFA,EAAQzE,UAAUC,OAAO,YAAY,GAGvCsE,GAAAA,EAAAA,EAAQ1G,cAAc,0BAA0B,IAAhD0G,YAAAA,EAAmDvE,YAAnDuE,MAAAA,EAA8DtE,OAAO,aACvE,CACF,EAIMyE,GAAgBJ,GAAY,CAC5BA,IACFA,EAAQtE,UAAUC,OAAO,YAAY,EACrCqE,EAAQtE,UAAUG,IAAI,QAAQ,EAElC,EAKMwE,GAAkBL,GAAY,CAC9BA,GACFA,EAAQrE,OAAQ,CAEpB,EAEM2E,GAAgB,SAAY,CAChC,MAAMC,EAAO,MAAMC,EAAS,EAC5B,MAAO,CAAC,EAACD,GAAAA,MAAAA,EAAME,aAAc,CAAC,EAACF,GAAAA,MAAAA,EAAMG,WACvC,EAOMC,EAAyBA,CAACC,EAAkBC,EAAmB,OAAS,CAC5Ed,GAAiBa,CAAgB,EACjCR,GAAaQ,CAAgB,EAC7BP,GAAeQ,CAAgB,CACjC,EAEMC,GAAe,SAAY,CAC/B,MAAMC,EAAcpB,EAAmB,EACjCqB,EAAkBpB,GAAuB,EAC/C,GAAI,CAAC7F,OAAOkH,qBAAsB,CAChCN,EAAuBK,CAAe,EACtC,MACF,CACiB,MAAMV,GAAe,EAEpCK,EAAuBI,EAAaC,CAAe,EAEnDL,EAAuBK,EAAiBD,CAAW,CAEvD,ECnFMG,GAAOA,CAACC,EAAc,OAAS,CACnC,MAAMlB,EAAU5G,SAASE,cAAc4H,CAAW,EAC5C,CAAEC,QAAAA,CAAQ,EAAIrH,OAEhBkG,GAAWmB,GACb,CAAE,EAAChC,QAAQiC,KAAKpB,EAAQrG,iBAAiB,WAAW,EAAIoG,GAAY,CAClEA,EAAQzC,iBAAiB,QAAS,UAA0B,CAE1D,MAAM+D,EAAW,wBADA,KAAKpD,QAAQqD,aAAe,KAAKC,YAAYC,KAAM,CACnB,GACjDL,EAAQM,KACN,CACEJ,SAAAA,CACD,EACD,IACF,CACF,CAAC,CACH,CAAC,CAEL,ECZO,eAAeK,EAAIC,EAAK,CAC7B,aAAMd,GAAc,EACpB5H,EAAW,EACX2I,GAAiB,iBAAiB,EAE3BD,CACT,CAEO,SAASE,GAAKF,EAAM7H,OAAQ,CAC7B6H,EAAIvI,SAAS0I,aAAe,UAE9BH,EAAIvI,SAASkE,iBAAiB,mBAAoBoE,EAAIK,KAAK,KAAMJ,CAAG,CAAC,EAGrED,EAAIC,CAAG,CAEX,CCTAE,GAAK/H,MAAM"}