{"version":3,"file":"index.es.min.js","sources":["../../../packages/helpers/src/props.helpers.js","../../../packages/helpers/src/refs.helpers.js","../../../packages/helpers/src/events.helpers.ts","../../../packages/helpers/src/utils.ts","../../../packages/page-builder-sections/src/faqs/subcomponents/accordion/accordion.js","../../../packages/helpers/src/assets/js/eventDispatch.js","../../../packages/helpers/src/dataLayer.js","../../../packages/components/src/constants.mjs","../../../packages/page-builder-sections/src/faqs/faqs.js","../../../packages/page-builder-sections/src/faqs/faqs.service.js","../../../packages/helpers/src/htmlElement.js"],"sourcesContent":["const getData = attributes => attributes.find(attribute => attribute.nodeName === 'data')\n\nconst createProps = attributes => {\n const data = getData([...attributes])\n const props = [...attributes]\n .filter(attribute => attribute.nodeName !== 'data')\n .reduce((all, attr) => {\n return { ...all, [attr.nodeName]: attr.nodeValue }\n }, {})\n\n if (isNil(data)) {\n return props\n }\n\n try {\n return { ...props, ...JSON.parse(data.nodeValue) }\n } catch (error) {\n console.log('ERROR: No data', error, data?.nodeValue)\n }\n}\n\nconst isNil = obj => obj === undefined || obj === null\n\nexport const parseBool = value => (!value || value === 'false' ? false : true)\n\nexport default createProps\n","const createRefs = component => [...component.querySelectorAll('[data-ref]')].reduce(extract, {})\n\nconst extract = (refs, $ref) => {\n const { ref } = $ref.dataset\n\n // Check if ref is of type array\n const refArray = ref.match(/(\\w+)\\[(.+)\\]/)\n\n if (refArray !== null) {\n return getRefArray(refs, $ref, refArray)\n } else {\n return { ...refs, [$ref.dataset.ref]: $ref }\n }\n}\n\nconst getRefArray = (refs, $ref, [, name, index]) => {\n if (refs[name] === undefined) {\n refs[name] = []\n }\n refs[name][index] = $ref\n return refs\n}\n\nexport default createRefs\n","export type EventListener = {\n element: HTMLElement\n type: string\n listener: (e: Event) => void\n options?: boolean | AddEventListenerOptions\n}\n\nconst add = (eventListeners: EventListener[] = []) => {\n eventListeners.forEach(eventListener => {\n if (!eventListener || !eventListener.element) {\n return\n }\n return eventListener.element.addEventListener(\n eventListener.type,\n eventListener.listener,\n eventListener.options\n )\n })\n}\n\nconst remove = (eventListeners: EventListener[] = []) => {\n eventListeners.forEach(eventListener => {\n if (!eventListener || !eventListener.element) {\n return\n }\n eventListener.element.removeEventListener(eventListener.type, eventListener.listener)\n })\n}\n\nconst busNamespace = 'pageBuilder'\n\nexport const emitCustomEvent = (eventName: string, data: unknown) => {\n const customEvent = new CustomEvent(`${busNamespace}.${eventName}`, {\n detail: data,\n bubbles: true,\n cancelable: true,\n composed: false\n })\n\n window.dispatchEvent(customEvent)\n}\n\nexport default { add, emitCustomEvent, remove }\n","export { waitForSelector } from './waitForSelector'\n\nexport const constants = {\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n ESC: 27,\n SPACE: 32,\n ENTER: 13,\n TAB: 9\n}\n\nexport function capitalize(s = '') {\n return s[0].toUpperCase() + s.slice(1)\n}\n\nexport const convertToCamelCase = (str: string): string => {\n const arr = str.match(/[a-z]+|\\d+/gi)\n if (!arr) { return str }\n return arr.map((m, i) => {\n let low = m.toLowerCase()\n if (i !== 0) {\n low = low.split('').map((s, k) => (k === 0 ? s.toUpperCase() : s)).join(\"\")\n }\n return low\n }).join(\"\")\n}\n\nexport function slug(s = '') {\n return s\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, '-') // Replace spaces with -\n .replace(/[^\\w-]+/g, '') // Remove all non-word chars\n .replace(/--+/g, '-') // Replace multiple - with single -\n}\n\nexport function pxToEm(target: number, stripedInnerFontSize = 1) {\n return target / 14 / stripedInnerFontSize + 'em'\n}\n\nexport function percent(target: number) {\n return target + '%'\n}\n\nexport function parseHTML(str: string) {\n const tmp = document.implementation.createHTMLDocument('')\n tmp.body.innerHTML = str\n return tmp.body.childNodes\n}\n\nexport function stripHTML(str: string) {\n const tmp = document.implementation.createHTMLDocument('')\n tmp.body.innerHTML = str\n return (tmp.body.textContent ?? \"\").replace(RegExp('[\\\\s|\\'|\"]', 'g'), '')\n}\n\nexport function makeId(length: number) {\n var result = ''\n var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n var charactersLength = characters.length\n for (var i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength))\n }\n return result\n}\n\nexport function removeEmptyValues(obj: { [key: string]: any }): { [key: string]: any } {\n const findText = [\n 'Default campaign ID (tracking missing in Page Builder export)',\n 'Default campaign name (tracking missing in Page Builder export)',\n 'promoname', \n 'promoid', \n 'promocreative', \n 'undefined'\n ];\n \n for (let key in obj) {\n const value = obj[key];\n \n if (value === null || value === undefined || value === '') {\n delete obj[key];\n continue;\n }\n \n if (typeof value === 'string') {\n for (const text of findText) {\n if (value.includes(text)) {\n delete obj[key];\n break;\n }\n }\n }\n }\n \n return obj;\n}\n\nexport function makeHash(str: string) {\n var hash = 0,\n i,\n chr\n if (!str) {\n return hash\n }\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i)\n hash = (hash << 5) - hash + chr\n hash |= 0 // Convert to 32bit integer\n }\n return 'id-' + hash\n}\n\nexport function getHashLink(link: string) {\n let linkHash = link\n let linkNoHash = link\n if (link.indexOf('#') !== -1) {\n linkNoHash = link.replace('#', '')\n } else {\n linkHash = '#' + link\n }\n\n return { linkNoHash, linkHash }\n}\n\nexport function lazyLoad(node: Element, attribute: string, value: any, url: string) {\n const CLASSNAME_OUT_OF_SCREEN = 'lazy-load'\n const CLASSNAME_IN_SCREEN = 'lazy-loaded'\n const CLASSNAME_ON_ERROR = 'lazy-loaded-error'\n\n const isOldIOS = () => {\n var agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n }\n return false\n }\n\n const inViewPort = (attribute: string, value: any) => {\n node.setAttribute(attribute, value)\n\n const cb = () => node.classList.add(CLASSNAME_IN_SCREEN)\n\n if (url) {\n const img = new Image()\n img.src = url\n img.onload = cb\n img.onerror = () => {\n cb()\n node.classList.add(CLASSNAME_ON_ERROR)\n throw new Error(`Image ${url} cannot be loaded`)\n }\n\n return\n }\n\n cb()\n }\n\n if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n inViewPort(attribute, value)\n } else {\n if ('IntersectionObserver' in window) {\n node.classList.add(CLASSNAME_OUT_OF_SCREEN)\n let lazyBackgroundObserver = new IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n inViewPort(attribute, value)\n lazyBackgroundObserver.unobserve(entry.target)\n }\n })\n })\n lazyBackgroundObserver.observe(node)\n } else {\n inViewPort(attribute, value)\n }\n }\n}\n\nexport function lazyLoadCallback(node: Element, cb: () => void) {\n const isOldIOS = () => {\n var agent = window.navigator.userAgent,\n start = agent.indexOf('OS ')\n if ((agent.indexOf('iPhone') > -1 || agent.indexOf('iPad') > -1) && start > -1) {\n return window.Number(agent.substr(start + 3, 3).replace('_', '.')) < 14\n }\n return false\n }\n\n if (/Trident\\/|MSIE/.test(window.navigator.userAgent) || isOldIOS()) {\n cb()\n } else {\n if ('IntersectionObserver' in window) {\n let lazyBackgroundObserver = new IntersectionObserver(\n function (entries) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n cb()\n lazyBackgroundObserver.unobserve(entry.target)\n }\n })\n },\n { rootMargin: '150% 0px' }\n )\n lazyBackgroundObserver.observe(node)\n }\n }\n}\n\n// Debounce\nexport function debounce<T>(func: (v: T) => void, time = 100) {\n let timer: number\n return function (event: T) {\n if (timer) {\n window.clearTimeout(timer)\n }\n timer = window.setTimeout(func, time, event)\n }\n}\n\n// isIE - to check for internet explorer\nexport function isIE() {\n let ua = window.navigator.userAgent,\n isIE = /MSIE|Trident/.test(ua)\n\n return isIE\n}\n\n// Load external script\nexport const loadExternalScript = ({\n src,\n callback = null,\n async = false,\n defer = false,\n module = false,\n id = ''\n}: {\n src: string;\n callback: null | GlobalEventHandlers[\"onload\"]\n module: boolean,\n defer: boolean,\n async: boolean,\n id: string\n}) => {\n const script = document.createElement('script')\n script.type = module ? 'module' : 'text/javascript'\n script.src = src\n id ? (script.id = id) : false // add id attribute only if passed\n if (typeof callback === 'function') {\n script.onload = callback\n }\n script.async = async\n script.defer = defer\n document.body.appendChild(script)\n}\n\n// Load external css\nexport const loadExternalCss = ({ src }: { src: string }) => {\n const script = document.createElement('link')\n script.rel = 'stylesheet'\n script.href = src\n document.body.appendChild(script)\n}\n// Lazy load vendor script\nexport const lazyLoadVendorScript = (handler, el) => {\n const observer = new IntersectionObserver(handler)\n observer.observe(el)\n}\n\n/**\n * Replaces variable inside a given string\n * Each variable have to be enclosed between stChr and enChr\n * The values have to be contained in the vars object, they key must match\n * example :\n * txt : 'See {resultsLength} Results'\n * vars : {resultsLength:'30'}\n * stChr : '{'\n * enChr : '}'\n *\n * will return : 'See 30 Results'\n *\n * @param {string} txt\n * @param {object} vars\n * @param {string} stChr\n * @param {string} enChr\n */\nexport function interpolate(txt: string, vars: Record<string, null | undefined | string>, stChr: string, enChr: string) {\n let curIdx = 0\n\n while (txt) {\n const stIdx = txt.indexOf(stChr, curIdx)\n if (stIdx === -1) {\n break\n }\n const enIdx = txt.indexOf(enChr, stIdx + 1)\n if (enIdx === -1) {\n break\n }\n const hashId = txt.substring(stIdx + stChr.length, enIdx)\n if (vars[hashId] != null) {\n txt = txt.substr(0, stIdx) + vars[hashId] + txt.substr(enIdx + enChr.length)\n curIdx = stIdx\n } else {\n curIdx = enIdx\n }\n }\n return txt\n}\n\n/**\n * Find in container element, add height to equal size of element\n * @param container css path where my element is contain e.g. `.c-container`\n * @param el css path of elements to equalized\n */\nexport const equalHeight = (containerSelector: string, el: string, elementScope: HTMLElement) => {\n const container = elementScope.querySelector<HTMLElement>(containerSelector)\n if (!container) {\n return\n }\n\n const items = container.querySelectorAll<HTMLElement>(el)\n let max = -1\n\n for (let i = 0; i < [...items].length; i++) {\n const item = [...items][i]\n let h = item.offsetHeight\n max = h > max ? h : max\n }\n\n if (max <= 0) {\n return\n }\n\n for (let i = 0; i < [...items].length; i++) {\n const item = [...items][i]\n item.style.height = `${max}px`\n }\n}\n\nexport const stringifyCurlyQuote = (data: {}) => JSON.stringify(data).replace(\"'\", '’')\n\nexport const stringifyForAttribute = (data = {}) => {\n return escapeHtml(JSON.stringify(data))\n}\n\n/**\n * This function is included instead of sanitizeString because for\n * inserting HTML into innerHTML we need to make sure all HTML\n * entities are escaped.\n */\nexport const escapeHtml = (text: string) => {\n const map = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n } as { [s: string]: string }\n\n return text.replace(/[&<>\"']/g, (m) => map[m])\n}\n\n/**\n * Because setting attributes escapes more than the characters above and then preact also\n * escapes text we need a more complete way of unescaping all html entities (not just the ones\n * above)\n */\nconst domParser = new DOMParser()\nexport const unescapeHtml = (text: string) => {\n return domParser.parseFromString(text, \"text/html\").body.textContent\n}\n\nexport const sanitizeString = (data: {}) => {\n if (!data) {\n return ''\n }\n\n return data.toString().replace(/\"/g, '"').replace(/'/g, ''')\n}\n\nexport const stripTags = (s: string) => {\n return (s || '').replace(/(<([^>]+)>)/gi, '')\n}\n\nexport const setAttributes = (element: Element, attrs: Record<string, any>) => {\n for (let key in attrs) {\n element.setAttribute(key, attrs[key])\n }\n return element\n}\n\nexport const getMetaContent = (metaName: string) => {\n const metaTag = document.querySelector(`meta[name=${metaName}]`)\n if (!metaTag) {\n return ''\n }\n return metaTag.getAttribute('content')\n}\n\nexport const isObjectEmpty = (obj: {}) => {\n return Object.keys(obj).length === 0\n}\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport createRefs from '@kissui/helpers/src/refs.helpers'\nimport events from '@kissui/helpers/src/events.helpers'\nimport { readEvent } from '@kissui/helpers/src/assets/js/eventDispatch'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\nimport './accordion.scss'\n\nclass Accordion extends HTMLElement {\n static get observedAttributes() {\n return ['active-item', 'aria-expanded']\n }\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.createProperties()\n\n this.render()\n this.refs = createRefs(this)\n\n this.eventListeners = this.createEventListeners()\n events.add(this.eventListeners)\n\n this.refreshCollapses()\n }\n\n // POC for real POO properties\n createProperties() {\n const { limit, collapses = [], auto_collapse = 'false' } = this.props\n\n this.autoCollapse = auto_collapse === 'true'\n this.maxItems = collapses.length\n // Create the limit property only if needed\n if (limit !== null && limit > 0 && this.maxItems > limit) {\n this.limit = limit\n }\n this.hasShowMore = limit !== null && this.maxItems > limit\n // Expanded is used only if the show more/less button is set\n if (this.hasShowMore) {\n this.expanded = false\n }\n }\n\n render() {\n const { accordion = '' } = this.props.a11y_label\n\n this.innerHTML = `\n <div class=\"list\" role=\"list\" data-ref=\"list\"\n aria-label=\"${accordion}\"\n ${this.hasShowMore ? 'aria-expanded=\"' + this.expanded + '\"' : ''}>\n ${this.renderCollapses()}\n </div>\n ${this.renderShowMore()}\n `\n }\n\n renderCollapses() {\n const { collapses = [] } = this.props\n return collapses.reduce(\n (output, collapse, index) => `${output}${this.renderCollapse(collapse, index)}`,\n ''\n )\n }\n\n renderCollapse(collapse, id) {\n const data = stringifyForAttribute({\n ...collapse,\n id,\n campaign: this.props.campaign,\n nested: 'true'\n })\n\n return `\n <nb-collapse data='${data}' data-ref=\"collapses[${id}]\" role=\"listitem\"></nb-collapse>\n `\n }\n\n renderShowMore() {\n if (!this.hasShowMore) {\n return ''\n }\n\n return `\n <div class=\"show-more\">\n <nb-link size=\"large\" color=\"gold\" data-ref=\"showmore\">\n ${this.renderShowMoreLabel()}\n </nb-link>\n </div>\n `\n }\n\n renderShowMoreLabel() {\n const { cta } = this.props\n return `${this.expanded ? cta.less : cta.more}`\n }\n\n updateShowMoreLabel() {\n // Update label inside the button\n const label = this.refs.showmore.querySelector('span')\n label.innerText = this.renderShowMoreLabel()\n\n // Update button aria-description\n const button = this.refs.showmore.querySelector('button')\n button.setAttribute(\n 'aria-description',\n `${this.expanded ? this.renderA11YShowLess() : this.renderA11YShowMore()}`\n )\n }\n\n renderA11YAccordionDescription() {\n const { accordion_description = '' } = this.props.a11y_label\n return accordion_description\n .replace('{limitItems}', this.limit)\n .replace('{totalItems}', this.maxItems)\n }\n\n renderA11YShowMore() {\n const { show_more = '' } = this.props.a11y_label\n return show_more.replace('{totalItems}', this.maxItems)\n }\n\n renderA11YShowLess() {\n const { show_less = '' } = this.props.a11y_label\n return show_less.replace('{limitItems}', this.limit)\n }\n\n createEventListeners() {\n const onCollapseToggle = {\n element: this,\n type: 'EVENT_COLLAPSE_TOGGLE',\n listener: this.updateActiveCollapse.bind(this)\n }\n const onExpandShowMore = {\n element: this.refs.showmore,\n type: 'click',\n listener: this.updateExpanded.bind(this)\n }\n return [onCollapseToggle, onExpandShowMore]\n }\n\n updateActiveCollapse(event) {\n // By default auto_collapse if false (Better UX) -> see https://bootcamp.uxdesign.cc/multi-expand-vs-auto-collapse-accordions-2d51aaec69ed\n if (this.autoCollapse) {\n const { id } = readEvent(event)\n this.setAttribute('active-item', id)\n }\n }\n\n updateExpanded(event) {\n event.preventDefault()\n this.expanded = !this.expanded\n this.refs.list.setAttribute('aria-expanded', this.expanded)\n this.refreshCollapses()\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n // If the active accordion item is changed then it needs to make old active item collapse, only if auto_collapse=true\n this.props[name] = newValue\n if (this.autoCollapse && name === 'active-item' && oldValue !== newValue) {\n this.closeOldActiveItem(oldValue)\n }\n }\n\n closeOldActiveItem(oldActiveId) {\n if (oldActiveId !== null) {\n this.refs.collapses[oldActiveId].close()\n }\n }\n\n refreshCollapses() {\n if (this.hasShowMore) {\n this.refs.list.setAttribute('aria-description', this.renderA11YAccordionDescription())\n const extraCollapses = this.refs.collapses.slice(this.limit, this.refs.collapses.length)\n extraCollapses.forEach(collapse => collapse.setAttribute('aria-hidden', !this.expanded))\n this.updateShowMoreLabel()\n }\n }\n\n disconnectedCallback() {\n events.remove(this.eventListeners)\n }\n}\n\ncustomElements.get('nb-accordion') || customElements.define('nb-accordion', Accordion)\n\nexport default Accordion\n","export const dispatchEvent = ({ eventName, args, element }) => {\n // Use the provided element or fallback to window if available\n if (!element) {\n if (typeof window !== 'undefined') {\n element = window\n } else {\n throw new Error(\n '`element` is not provided and `window` is unavailable. Provide a valid element to dispatch the event.'\n )\n }\n }\n\n let event\n if (args) {\n event = new CustomEvent(eventName, { detail: args, bubbles: true })\n } else {\n if (typeof Event === 'function') {\n event = new Event(eventName)\n } else {\n event = document.createEvent('Event')\n event.initEvent(eventName, true, true)\n }\n }\n element.dispatchEvent(event)\n}\n\nexport const readEvent = e => {\n if (!e.detail) {\n return\n }\n return e.detail\n}\n","export const getDataLayer = () => {\n return window[window?.padlNamespace]?.dataLayer\n}\n\nexport const getMarketCode = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer) {\n return 'ch'\n }\n\n return dataLayer.app.app.market.toLocaleLowerCase()\n}\n\nexport const getLangCode = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer) {\n return 'en'\n }\n\n return getDataLayer().page.page.pageInfo.language.toLocaleLowerCase()\n}\n\nexport const getSegmentCode = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer) {\n return 'B2C'\n }\n\n return getDataLayer().page.page.pageInfo.segmentBusiness\n}\n\nexport const isLoggedIn = () => {\n const dataLayer = getDataLayer()\n if (!dataLayer || !dataLayer.user) {\n return false\n }\n\n return dataLayer.user.isLoggedIn\n}\n\nexport const interpolateMarketLang = (string, market, lang) => {\n return string.replace('{market}', market).replace('{lang}', lang)\n}\n","export const MAX_WIDTH_CONTAINER = 1160\n\nexport const BREAKPOINT_XL = 1920\nexport const BREAKPOINT_TABLET = 1024\nexport const BREAKPOINT_L = 996\nexport const BREAKPOINT_M = 768\nexport const BREAKPOINT_S = 750\nexport const BREAKPOINT_XS = 375\n\nexport const CTA_PRIMARY = 'primary'\nexport const CTA_PRIMARY_TRANSPARENT = 'primary_transparent'\nexport const CTA_SUBTLE = 'subtle'\nexport const CTA_LINK = 'link'\nexport const CTA_LINK_UNDERLINE = 'link-underline'\nexport const CTA_LINK_GOLD = 'link-gold'\nexport const CTA_LINK_ADD_TO_CART_SMALL = 'AddToCart_small'\nexport const CTA_LINK_ADD_TO_CART_LARGE = 'AddToCart_large'\n\nexport const EVENT_TAB_CHANGE = 'EVENT_TAB_CHANGE'\n\nexport const EVENT_VIDEO = 'WEB_COMPONENT_VIDEO'\nexport const EVENT_POPIN_OPEN = 'WEB_COMPONENT_POPIN_OPEN'\nexport const EVENT_POPIN_OPENED = 'WEB_COMPONENT_POPIN_OPENED'\nexport const EVENT_POPIN_CLOSE = 'WEB_COMPONENT_POPIN_CLOSE'\nexport const EVENT_POPIN_CLOSED = 'WEB_COMPONENT_POPIN_CLOSED'\nexport const EVENT_POPIN_CLOSE_CLICK = 'WEB_COMPONENT_POPIN_CLOSE_CLICK'\nexport const EVENT_POPIN_KEY_DOWN = 'keydown'\nexport const EVENT_POPIN_FORM_TOGGLE_TITLE = 'WEB_COMPONENT_POPIN_FORM_TOGGLE_TITLE'\nexport const EVENT_CTA_CLICK = 'WEB_COMPONENT_CTA_CLICK'\nexport const EVENT_HERO_REORDER_OPEN = 'WEB_COMPONENT_HERO_REORDER_OPEN'\nexport const EVENT_HERO_REORDER_CLOSE = 'WEB_COMPONENT_HERO_REORDER_CLOSE'\nexport const EVENT_QUICKVIEW_OPEN = 'WEB_COMPONENT_QUICKVIEW_OPEN'\nexport const EVENT_QS_OPEN = 'WEB_COMPONENT_QS_OPEN'\nexport const EVENT_QS_OPENED = 'WEB_COMPONENT_QS_OPENED'\nexport const EVENT_QS_CLOSE = 'WEB_COMPONENT_QS_CLOSE'\nexport const EVENT_QS_CLOSED = 'WEB_COMPONENT_QS_CLOSED'\nexport const EVENT_QS_CLOSE_CLICK = 'WEB_COMPONENT_QS_CLOSE_CLICK'\nexport const EVENT_QS_KEY_DOWN = 'keydown'\nexport const EVENT_ADD_TO_CART = 'WEB_COMPONENT_ADD_TO_CART'\nexport const EVENT_CART_UPDATED = 'WEB_COMPONENT_CART_UPDATED'\nexport const EVENT_VIDEO_TOGGLE = 'WEB_COMPONENT_VIDEO_TOGGLE'\nexport const VIDEO_ON_HOVER = 'VIDEO_ON_HOVER'\nexport const VIDEO_ON_OUT = 'VIDEO_ON_OUT'\nexport const EVENT_DETAIL_OPEN = 'WEB_COMPONENT_DETAIL_OPEN'\nexport const EVENT_SLIDER_READY = 'WEB_COMPONENT_SLIDER_READY'\nexport const EVENT_SLIDE_CHANGE = 'WEB_COMPONENT_SLIDE_CHANGE'\nexport const EVENT_OVERLAY_OPEN = 'WEB_COMPONENT_OVERLAY_OPEN'\nexport const EVENT_OVERLAY_CLOSE = 'WEB_COMPONENT_OVERLAY_CLOSE'\nexport const EVENT_OVERLAY_CLICKED = 'WEB_COMPONENT_OVERLAY_CLICKED'\nexport const EVENT_OPEN_PRODUCT_AR_CLICKED = 'OPEN_PRODUCT_AR_CLICKED'\nexport const EVENT_SORT_BY_CHANGE = 'WEB_COMPONENT_SORT_BY_CHANGE'\n\nexport const EVENT_BUBBLE_SELECTED = 'EVENT_BUBBLE_SELECTED'\nexport const EVENT_RECO_TOOL_OPTION_CLICKED = 'EVENT_RECO_TOOL_OPTION_CLICKED'\nexport const WEB_COMPONENT_PROJECTS_LOADED = 'WEB_COMPONENT_PROJECTS_LOADED'\nexport const WEB_COMPONENT_ANCHOR_LOADED = 'WEB_COMPONENT_ANCHOR_LOADED'\n\nexport const EVENT_SWIPED_UP = 'swiped-up'\nexport const EVENT_SWIPED_DOWN = 'swiped-down'\nexport const EVENT_SWIPED_LEFT = 'swiped-left'\nexport const EVENT_SWIPED_RIGHT = 'swiped-right'\n\nexport const EVENT_HEADER_POSITION_CHANGED = 'EVENT_HEADER_POSITION_CHANGED'\n\nexport const keys = { ESC: 'Escape' }\n\nexport const ADD_TO_CART_MODIFIER_MINI = 'mini'\nexport const ADD_TO_CART_MODIFIER_DEFAULT = ADD_TO_CART_MODIFIER_MINI\n\nexport const COFFEE_ORIGINAL = 'original'\nexport const COFFEE_VERTUO = 'vertuo'\nexport const COFFEE_PRO = 'pro'\nexport const COFFEE_OL = 'OL'\nexport const COFFEE_VL = 'VL'\nexport const INTENSITY_MAX_OL = 14\nexport const INTENSITY_MAX_VL = 12\nexport const DEFAULT_BUBBLE_ICON = ''\n\nexport const NUMBER_PRODUCTS_SLIDER = 8\nexport const NUMBER_FEATURES_PDP = 8\n\nexport const ALIGNMENT = ['center', 'left', 'right']\nexport const POSITION = ['top', 'right', 'bottom', 'left']\nexport const TRANSLATION_ADD_TO_CART = 'Add to cart'\nexport const TRANSLATION_UPDATE_BASKET = 'Update basket'\n\nexport const TIME_INSTANT = 1\nexport const TIME_FAST = 300\nexport const TIME_MEDIUM = 600\nexport const TIME_SLOW = 1200\n\nexport const APP_APPLE_LINK = {\n default: 'https://apps.apple.com/us/app/nespresso/id342879434',\n us: 'https://apps.apple.com/us/app/nespresso-new/id1609639566',\n uk: 'https://apps.apple.com/gb/app/nespresso-new/id1609639566'\n}\nexport const APP_ANDROID_LINK =\n 'https://play.google.com/store/apps/details?id=com.nespresso.activities'\nexport const APP_HUAWEI_LINK = 'https://appgallery.huawei.com/app/C102571517'\n\nexport const SRC_PAGE_PLP = 'plp'\nexport const SRC_PAGE_PDP = 'pdp'\n\nexport const PLP_TYPE_COFFEE = 'coffee'\nexport const PLP_TYPE_MACHINE = 'machine'\nexport const PLP_TYPE_ACCESSORY = 'accessory'\nexport const CALLEO_API_DOMAIN = 'https://www.contact.nespresso.com/'\n\n// SCSS RELATED\n// Todo : should be shared by JS and SCSS\nexport const BROWSER_CONTEXT = 16 // 1rem = 16px\nexport const COLOR_WHITE_1000 = '#FFFFFF' // Do not change for #FFF shortcut, it will break slider-natural gradients !\n\nexport const CONTRAST_DARK = 'dark'\nexport const CONTRAST_LIGHT = 'light'\n\nexport const B2B_CONTACT_FORM_POPIN_ID = 'b2b-contact-form-popin-id'\nexport const B2B_CONTACT_FORM_POPIN_SRC_SEARCH = 'coveo-search'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO = 'sku-main-info'\n\nexport const B2B_CONTACT_FORM_POPIN_SRC_SKU_MAIN_INFO_AUTO = 'sku-main-info-auto'\n\nexport const ASPECT_RATIO_16_9 = '16/9'\nexport const ASPECT_RATIO_1_1 = '1/1'\n\nexport const NESPRESSO_PRODUCTION_DOMAIN = 'https://www.nespresso.com'\nexport const NESPRESSO_ROLLOUT_DOMAIN = 'https://nc2-env-rollout.nespresso.com'\n\nexport const EVENT_QUIZ_ON_GO_BACK = 'WEB_COMPONENT_EVENT_QUIZ_ON_GO_BACK'\nexport const EVENT_QUIZ_SUBMIT = 'WEB_COMPONENT_EVENT_QUIZ_SUBMIT'\n","import createProps from '@kissui/helpers/src/props.helpers'\nimport createRefs from '@kissui/helpers/src/refs.helpers'\nimport { getLangCode, getMarketCode, getSegmentCode } from '@kissui/helpers/src/dataLayer'\nimport { getList, postLike, postDislike, buildSchemaJsonLdFaq } from './faqs.service'\nimport { appendSchema } from '@kissui/helpers/src/htmlElement'\nimport { stringifyForAttribute } from '@kissui/helpers/src/utils'\n\nclass Faqs extends HTMLElement {\n constructor() {\n super()\n this.boundOnLike = this.onLike.bind(this)\n this.boundOnDislike = this.onDislike.bind(this)\n }\n\n connectedCallback() {\n this.props = createProps(this.attributes)\n this.classes = this.createClasses()\n this.render()\n this.refs = createRefs(this)\n this.bindEvents()\n }\n\n createClasses() {\n const { padding_top = '', padding_bottom = '' } = this.props.layout ?? {}\n const baseClass = 'nb-faqs'\n\n return {\n base: `${baseClass} ${padding_top} ${padding_bottom} `,\n heading: `${baseClass}__heading h-3xl-300`,\n helpful: `${baseClass}__helpful t-xs-500`,\n likeBtn: `${baseClass}__like-btn`,\n dislikeBtn: `${baseClass}__dislike-btn`,\n downvote: `${baseClass}__downvote`\n }\n }\n\n render() {\n const { layout, campaign = { id: '', name: '', creative: 'before_faq', position: '' } } =\n this.props ?? {}\n const { heading = '' } = this.props.copywriting ?? {}\n const { contrast = 'light', background_color = 'white_1000' } = layout ?? {}\n\n this.innerHTML = `\n <nb-container\n contrast=\"${contrast}\"\n background_color=\"${background_color}\"\n campaign_id=\"${campaign.id}\"\n campaign_name=\"${campaign.name}\"\n campaign_creative=\"${campaign.creative}\"\n campaign_position=\"${campaign.position}\"\n classname=\"${this.classes.base}\"\n >\n ${heading ? `<h2 class=\"${this.classes.heading}\">${heading}</h2>` : ''}\n ${this.renderAccordion()}\n </nb-container>\n `\n }\n\n renderAccordion() {\n const { accordion, api } = this.props.copywriting ?? {}\n const { campaign } = this.props\n\n const accordionData = {\n ...accordion,\n campaign\n }\n\n if (api?.is_api) {\n this.consolidateData(accordion)\n .then(payload => {\n const container = document.getElementById('faqApi')\n const accordionElement = document.createElement('nb-accordion')\n const payloadData = {\n ...payload,\n campaign\n }\n accordionElement.setAttribute('data', JSON.stringify(payloadData))\n container.parentNode.replaceChild(accordionElement, container)\n this.bindEvents()\n this.addSchema(payload.collapses)\n })\n .catch(e => console.log(e))\n\n return `<nb-loader id=\"faqApi\"></nb-loader>`\n }\n\n this.addSchema(accordionData.collapses)\n return accordion\n ? `<nb-accordion data='${stringifyForAttribute(accordionData)}'></nb-accordion>`\n : ''\n }\n\n renderHelpfulMessage(question_id) {\n if (this.props?.copywriting?.api?.is_api !== true) return ''\n const { msg_review_helpful, a11y_label_upvote, a11y_label_downvote } =\n this.props.copywriting.api\n if (!msg_review_helpful) return ''\n\n return `\n <p class=\"${this.classes.helpful}\">${msg_review_helpful}\n <button class=\"${this.classes.likeBtn}\"\n aria-label=\"${a11y_label_upvote}\"\n >\n <nb-icon icon=\"24/symbol/upvote\" data-questionid=\"${question_id}\"></nb-icon>\n </button>\n <button class=\"${this.classes.dislikeBtn}\"\n aria-label=\"${a11y_label_downvote}\"\n >\n <nb-icon class=\"${this.classes.downvote}\"\n icon=\"24/symbol/upvote\" data-questionid=\"${question_id}\"></nb-icon>\n </button>\n </p>`\n }\n\n async consolidateData(pbData) {\n const { query, query_only } = this.props.copywriting.api\n if (!query.trim()) {\n return pbData\n }\n const country = getMarketCode()\n const lang = getLangCode()\n const channel = getSegmentCode()\n\n let apiData\n try {\n apiData = await getList(country, lang, channel, query)\n // To render only specific section of the query\n if (query_only) {\n const matchedObject = this.findMatchingObject(query, apiData.list)\n if (matchedObject) {\n apiData = { list: [matchedObject] }\n }\n }\n } catch (error) {\n console.log(error)\n }\n\n if (!apiData?.list?.length) {\n return pbData\n }\n\n return this.transformData(pbData, apiData.list)\n }\n\n findMatchingObject(query, list) {\n return list.find(item => item.name.toLowerCase().includes(query.toLowerCase()))\n }\n\n transformData(pbData, apiData) {\n apiData.forEach(list =>\n list?.__children.forEach(({ id, question, answer }) => {\n pbData.collapses.push({\n heading: question,\n text:\n answer.replace(/\\\\\"/g, '\"').replace(/'/g, '') +\n this.renderHelpfulMessage(id),\n expanded: 'false'\n })\n })\n )\n\n return pbData\n }\n\n addSchema(faqs) {\n if (!faqs || !faqs.length) {\n console.error('FAQ data is not available')\n return\n }\n const content = buildSchemaJsonLdFaq(this.convertDataForMainEntity(faqs))\n appendSchema(content)\n }\n\n convertDataForMainEntity(faqs) {\n let mainEntity = []\n faqs.forEach(faq => {\n if (!faq.heading || !faq.text) {\n return\n }\n mainEntity.push({\n '@type': 'Question',\n name: faq.heading,\n acceptedAnswer: {\n '@type': 'Answer',\n text: faq.text\n }\n })\n })\n return mainEntity\n }\n\n onLike(e) {\n this.onHelpfulClick(e, true)\n }\n\n onDislike(e) {\n this.onHelpfulClick(e, false)\n }\n\n async onHelpfulClick(e, isLike) {\n const likeIconEl = e.target.closest('nb-icon')\n if (!likeIconEl) {\n return\n }\n const questionId = likeIconEl.dataset.questionid\n if (!questionId) {\n console.error(`Error: Question ID is not available`)\n return\n }\n //optimistic indicator since we do not allow multiple clicks even if the API fails\n this.markIconAsClicked(likeIconEl)\n\n const country = getMarketCode()\n const lang = getLangCode()\n const channel = getSegmentCode()\n try {\n if (isLike) {\n await postLike(country, lang, channel, questionId)\n } else {\n await postDislike(country, lang, channel, questionId)\n }\n } catch (error) {\n console.error(error)\n }\n }\n\n markIconAsClicked(iconEl) {\n iconEl.classList.add('clicked')\n iconEl.closest(`.${this.classes.likeBtn},.${this.classes.dislikeBtn}`).disabled = true\n }\n\n bindEvents() {\n this.likesBtn = document.querySelectorAll(`.${this.classes.likeBtn}`)\n this.dislikesBtn = document.querySelectorAll(`.${this.classes.dislikeBtn}`)\n if (this.likesBtn) {\n this.likesBtn.forEach(likeBtn => {\n likeBtn.addEventListener('click', this.boundOnLike, { once: true })\n })\n }\n if (this.dislikesBtn) {\n this.dislikesBtn.forEach(dislikeBtn => {\n dislikeBtn.addEventListener('click', this.boundOnDislike, { once: true })\n })\n }\n }\n\n unbindEvent() {\n if (this.likesBtn) {\n this.likesBtn.forEach(likeBtn => {\n likeBtn.removeEventListener('click', this.boundOnLike)\n })\n }\n if (this.dislikesBtn) {\n this.dislikesBtn.forEach(dislikeBtn => {\n dislikeBtn.removeEventListener('click', this.boundOnDislike)\n })\n }\n }\n\n disconnectedCallback() {\n this.unbindEvent()\n }\n}\n\ncustomElements.get('nb-faqs') || customElements.define('nb-faqs', Faqs)\n\nexport default Faqs\n","import { CALLEO_API_DOMAIN } from '@kissui/components'\n\nexport const getList = async (country, lang, channel, query) => {\n const url = `${CALLEO_API_DOMAIN}c/pub-api/faq/${country}/${lang}/${channel}?top_count=10&query=${query}`\n const response = await fetch(url)\n const data = await response.json()\n return data\n}\n\nexport const postLike = async (country, lang, channel, questionId) => {\n const url = `${CALLEO_API_DOMAIN}c/pub-api/faq/popularity/${country}/${lang}/${channel}/${questionId}`\n await fetch(url, {\n method: 'POST'\n })\n}\n\nexport const postDislike = async (country, lang, channel, questionId) => {\n const url = `${CALLEO_API_DOMAIN}c/pub-api/faq/unsatisfied/${country}/${lang}/${channel}/${questionId}`\n await fetch(url, {\n method: 'POST'\n })\n}\n\nexport const buildSchemaJsonLdFaq = mainEntity => {\n return {\n '@context': 'https://schema.org',\n '@type': 'FAQPage',\n mainEntity: mainEntity\n }\n}\n","/**\n * Return real width for a DOM Node\n * @param {HTMLElement} el\n * @returns {number}\n */\nexport const outerWidth = el => {\n const style = getComputedStyle(el)\n const width = style.getPropertyValue('width') || 0\n const marginLeft = style.getPropertyValue('margin-left') || 0\n const marginRight = style.getPropertyValue('margin-right') || 0\n\n return parseInt(width) + parseInt(marginLeft) + parseInt(marginRight)\n}\n\n/**\n * Return real height for a DOM Node\n * @param {DOM Node} el\n * @returns {number}\n */\nexport const outerHeight = el => {\n const style = getComputedStyle(el)\n const height = style.getPropertyValue('height') || 0\n const marginTop = style.getPropertyValue('margin-top') || 0\n const marginBottom = style.getPropertyValue('margin-bottom') || 0\n\n return parseInt(height) + parseInt(marginTop) + parseInt(marginBottom)\n}\n\nexport const appendSchema = content => {\n const el = window.document.createElement('script')\n el.setAttribute('type', 'application/ld+json')\n el.innerHTML = JSON.stringify(content)\n window.document.head.appendChild(el)\n}\n"],"names":["createProps","attributes","data","find","attribute","nodeName","getData","props","filter","reduce","all","attr","nodeValue","isNil","JSON","parse","error","console","log","obj","createRefs","component","querySelectorAll","extract","refs","$ref","ref","dataset","refArray","match","getRefArray","name","index","undefined","events","add","eventListeners","forEach","eventListener","element","addEventListener","type","listener","options","remove","removeEventListener","stringifyForAttribute","escapeHtml","stringify","text","map","replace","m","DOMParser","Accordion","HTMLElement","observedAttributes","connectedCallback","this","createProperties","render","createEventListeners","refreshCollapses","limit","collapses","auto_collapse","autoCollapse","maxItems","length","hasShowMore","expanded","accordion","a11y_label","innerHTML","renderCollapses","renderShowMore","output","collapse","renderCollapse","id","campaign","nested","renderShowMoreLabel","cta","less","more","updateShowMoreLabel","showmore","querySelector","innerText","setAttribute","renderA11YShowLess","renderA11YShowMore","renderA11YAccordionDescription","accordion_description","show_more","show_less","updateActiveCollapse","bind","updateExpanded","event","e","detail","readEvent","preventDefault","list","attributeChangedCallback","oldValue","newValue","closeOldActiveItem","oldActiveId","close","slice","disconnectedCallback","customElements","get","define","getDataLayer","window","padlNamespace","dataLayer","getMarketCode","app","market","toLocaleLowerCase","getLangCode","page","pageInfo","language","getSegmentCode","segmentBusiness","CALLEO_API_DOMAIN","Faqs","constructor","super","boundOnLike","onLike","boundOnDislike","onDislike","classes","createClasses","bindEvents","padding_top","padding_bottom","layout","baseClass","base","heading","helpful","likeBtn","dislikeBtn","downvote","creative","position","copywriting","contrast","background_color","renderAccordion","api","accordionData","is_api","consolidateData","then","payload","container","document","getElementById","accordionElement","createElement","payloadData","parentNode","replaceChild","addSchema","catch","renderHelpfulMessage","question_id","msg_review_helpful","a11y_label_upvote","a11y_label_downvote","pbData","query","query_only","trim","country","lang","channel","apiData","async","url","fetch","json","getList","matchedObject","findMatchingObject","transformData","item","toLowerCase","includes","__children","question","answer","push","faqs","content","el","head","appendChild","appendSchema","mainEntity","convertDataForMainEntity","faq","acceptedAnswer","onHelpfulClick","isLike","likeIconEl","target","closest","questionId","questionid","markIconAsClicked","method","postLike","postDislike","iconEl","classList","disabled","likesBtn","dislikesBtn","once","unbindEvent"],"mappings":"AAAA,MAEMA,EAAcC,IACVC,MAAAA,EAHMD,CAAAA,GAAcA,EAAWE,MAAKC,GAAoC,SAAvBA,EAAUC,WAGpDC,CAAQ,IAAIL,IACnBM,EAAQ,IAAIN,GACbO,QAAOJ,GAAoC,SAAvBA,EAAUC,WAC9BI,QAAO,CAACC,EAAKC,KACH,IAAKD,EAAK,CAACC,EAAKN,UAAWM,EAAKC,aACxC,CAAE,GAET,GAAIC,EAAMX,GACCK,OAAAA,EAGP,IACO,MAAA,IAAKA,KAAUO,KAAKC,MAAMb,EAAKU,WACzC,OAAQI,GACLC,QAAQC,IAAI,iBAAkBF,EAAOd,GAAMU,UAC/C,GAGEC,EAAQM,GAAoC,MAARA,ECrBpCC,EAAaC,GAAa,IAAIA,EAAUC,iBAAiB,eAAeb,OAAOc,EAAS,CAAA,GAExFA,EAAUA,CAACC,EAAMC,KACb,MAAEC,IAAAA,GAAQD,EAAKE,QAGfC,EAAWF,EAAIG,MAAM,iBAE3B,OAAiB,OAAbD,EACOE,EAAYN,EAAMC,EAAMG,GAExB,IAAKJ,EAAM,CAACC,EAAKE,QAAQD,KAAMD,IAIxCK,EAAcA,CAACN,EAAMC,GAAM,CAAGM,EAAMC,WACnBC,IAAfT,EAAKO,KACLP,EAAKO,GAAQ,IAEjBP,EAAKO,GAAMC,GAASP,EACbD,GCsBIU,EAnCHC,CAACC,EAAkC,MAC3CA,EAAeC,SAAyBC,IAChC,GAACA,GAAkBA,EAAcC,QAG9BD,OAAAA,EAAcC,QAAQC,iBACzBF,EAAcG,KACdH,EAAcI,SACdJ,EAAcK,QAClB,GACH,EAyBUT,EAtBAU,CAACR,EAAkC,MAC9CA,EAAeC,SAAyBC,KAC/BA,IAAkBA,EAAcC,SAGrCD,EAAcC,QAAQM,oBAAoBP,EAAcG,KAAMH,EAAcI,SAAQ,GACvF,EC6TQI,EAAwBA,CAAC5C,EAAO,KAClC6C,EAAWjC,KAAKkC,UAAU9C,IAQxB6C,EAAcE,IACvB,MAAMC,EAAM,CACR,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,UAGT,OAAOD,EAAKE,QAAQ,YAAmBD,GAAAA,EAAIE,IAAE,EAQ/B,IAAIC,UC1WtB,MAAMC,UAAkBC,YACpB,6BAAWC,GACA,MAAA,CAAC,cAAe,gBAC3B,CACAC,iBAAAA,GACSlD,KAAAA,MAAQP,EAAY0D,KAAKzD,YAC9ByD,KAAKC,mBAELD,KAAKE,SACLF,KAAKlC,KAAOJ,EAAWsC,MAEvBA,KAAKtB,eAAiBsB,KAAKG,uBAC3B3B,EAAWwB,KAAKtB,gBAEhBsB,KAAKI,kBACT,CAGAH,gBAAAA,GACU,MAAEI,MAAAA,EAAOC,UAAAA,EAAY,GAAIC,cAAAA,EAAgB,SAAYP,KAAKnD,MAE3D2D,KAAAA,aAAiC,SAAlBD,EACpBP,KAAKS,SAAWH,EAAUI,OAEZ,OAAVL,GAAkBA,EAAQ,GAAKL,KAAKS,SAAWJ,IAC/CL,KAAKK,MAAQA,GAEjBL,KAAKW,YAAwB,OAAVN,GAAkBL,KAAKS,SAAWJ,EAEjDL,KAAKW,cACLX,KAAKY,UAAW,EAExB,CAEAV,MAAAA,GACU,MAAEW,UAAAA,EAAY,IAAOb,KAAKnD,MAAMiE,WAEtCd,KAAKe,UAAY,4FAEKF,uBACZb,KAAKW,YAAc,kBAAoBX,KAAKY,SAAW,IAAM,wBAC7DZ,KAAKgB,sDAEThB,KAAKiB,4BAEf,CAEAD,eAAAA,GACU,MAAEV,UAAAA,EAAY,IAAON,KAAKnD,MAChC,OAAOyD,EAAUvD,QACb,CAACmE,EAAQC,EAAU7C,IAAU,GAAG4C,IAASlB,KAAKoB,eAAeD,EAAU7C,MACvE,GAER,CAEA8C,cAAAA,CAAeD,EAAUE,GAQd,MAAA,oCAPMjC,EAAsB,IAC5B+B,EACHE,GAAAA,EACAC,SAAUtB,KAAKnD,MAAMyE,SACrBC,OAAQ,iCAI0CF,8CAE1D,CAEAJ,cAAAA,GACI,OAAKjB,KAAKW,YAIH,uIAGOX,KAAKwB,kFANR,EAUf,CAEAA,mBAAAA,GACU,MAAEC,IAAAA,GAAQzB,KAAKnD,MACrB,MAAO,GAAGmD,KAAKY,SAAWa,EAAIC,KAAOD,EAAIE,MAC7C,CAEAC,mBAAAA,GAEkB5B,KAAKlC,KAAK+D,SAASC,cAAc,QACzCC,UAAY/B,KAAKwB,sBAGRxB,KAAKlC,KAAK+D,SAASC,cAAc,UACzCE,aACH,mBACA,GAAGhC,KAAKY,SAAWZ,KAAKiC,qBAAuBjC,KAAKkC,uBAE5D,CAEAC,8BAAAA,GACU,MAAEC,sBAAAA,EAAwB,IAAOpC,KAAKnD,MAAMiE,WAC3CsB,OAAAA,EACF3C,QAAQ,eAAgBO,KAAKK,OAC7BZ,QAAQ,eAAgBO,KAAKS,SACtC,CAEAyB,kBAAAA,GACU,MAAEG,UAAAA,EAAY,IAAOrC,KAAKnD,MAAMiE,WACtC,OAAOuB,EAAU5C,QAAQ,eAAgBO,KAAKS,SAClD,CAEAwB,kBAAAA,GACU,MAAEK,UAAAA,EAAY,IAAOtC,KAAKnD,MAAMiE,WACtC,OAAOwB,EAAU7C,QAAQ,eAAgBO,KAAKK,MAClD,CAEAF,oBAAAA,GAWW,MAAA,CAVkB,CACrBtB,QAASmB,KACTjB,KAAM,wBACNC,SAAUgB,KAAKuC,qBAAqBC,KAAKxC,OAEpB,CACrBnB,QAASmB,KAAKlC,KAAK+D,SACnB9C,KAAM,QACNC,SAAUgB,KAAKyC,eAAeD,KAAKxC,OAG3C,CAEAuC,oBAAAA,CAAqBG,GAEjB,GAAI1C,KAAKQ,aAAc,CACb,MAAEa,GAAAA,GCnHKsB,CAAAA,IACrB,GAAKA,EAAEC,OAGP,OAAOD,EAAEC,MAAAA,ED+GcC,CAAUH,GACpBV,KAAAA,aAAa,cAAeX,EACrC,CACJ,CAEAoB,cAAAA,CAAeC,GACXA,EAAMI,iBACN9C,KAAKY,UAAYZ,KAAKY,SACtBZ,KAAKlC,KAAKiF,KAAKf,aAAa,gBAAiBhC,KAAKY,UAClDZ,KAAKI,kBACT,CAEA4C,wBAAAA,CAAyB3E,EAAM4E,EAAUC,GAErClD,KAAKnD,MAAMwB,GAAQ6E,EACflD,KAAKQ,cAAyB,gBAATnC,GAA0B4E,IAAaC,GAC5DlD,KAAKmD,mBAAmBF,EAEhC,CAEAE,kBAAAA,CAAmBC,GACK,OAAhBA,GACApD,KAAKlC,KAAKwC,UAAU8C,GAAaC,OAEzC,CAEAjD,gBAAAA,GACQJ,KAAKW,cACLX,KAAKlC,KAAKiF,KAAKf,aAAa,mBAAoBhC,KAAKmC,kCAC9BnC,KAAKlC,KAAKwC,UAAUgD,MAAMtD,KAAKK,MAAOL,KAAKlC,KAAKwC,UAAUI,QAClE/B,SAAQwC,GAAYA,EAASa,aAAa,eAAgBhC,KAAKY,YAC9EZ,KAAK4B,sBAEb,CAEA2B,oBAAAA,GACI/E,EAAcwB,KAAKtB,eACvB,EAGJ8E,eAAeC,IAAI,iBAAmBD,eAAeE,OAAO,eAAgB9D,GErLrE,MAAM+D,EAAeA,IACjBC,OAAOA,QAAQC,gBAAgBC,UAG7BC,EAAgBA,KACzB,MAAMD,EAAYH,IAClB,OAAKG,EAIEA,EAAUE,IAAIA,IAAIC,OAAOC,oBAHrB,IAAA,EAMFC,EAAcA,IACLR,IAKXA,IAAeS,KAAKA,KAAKC,SAASC,SAASJ,oBAHvC,KAMFK,EAAiBA,IACRZ,IAKXA,IAAeS,KAAKA,KAAKC,SAASG,gBAH9B,MCiFFC,EAAoB,qCCnGjC,MAAMC,UAAa7E,YACf8E,WAAAA,GACIC,QACA5E,KAAK6E,YAAc7E,KAAK8E,OAAOtC,KAAKxC,MACpCA,KAAK+E,eAAiB/E,KAAKgF,UAAUxC,KAAKxC,KAC9C,CAEAD,iBAAAA,GACIC,KAAKnD,MAAQP,EAAY0D,KAAKzD,YAC9ByD,KAAKiF,QAAUjF,KAAKkF,gBACpBlF,KAAKE,SACLF,KAAKlC,KAAOJ,EAAWsC,MACvBA,KAAKmF,YACT,CAEAD,aAAAA,GACU,MAAEE,YAAAA,EAAc,GAAIC,eAAAA,EAAiB,IAAOrF,KAAKnD,MAAMyI,QAAU,GACjEC,EAAY,UAEX,MAAA,CACHC,KAAM,GAAGD,KAAaH,KAAeC,KACrCI,QAAS,GAAGF,uBACZG,QAAS,GAAGH,sBACZI,QAAS,GAAGJ,cACZK,WAAY,GAAGL,iBACfM,SAAU,GAAGN,cAErB,CAEArF,MAAAA,GACU,MAAEoF,OAAAA,EAAQhE,SAAAA,EAAW,CAAED,GAAI,GAAIhD,KAAM,GAAIyH,SAAU,aAAcC,SAAU,KAC7E/F,KAAKnD,OAAS,IACV4I,QAAAA,EAAU,IAAOzF,KAAKnD,MAAMmJ,aAAe,IAC3CC,SAAAA,EAAW,QAASC,iBAAAA,EAAmB,cAAiBZ,GAAU,CAAA,EAE1EtF,KAAKe,UAAY,0DAEGkF,yCACQC,oCACL5E,EAASD,uCACPC,EAASjD,6CACLiD,EAASwE,iDACTxE,EAASyE,yCACjB/F,KAAKiF,QAAQO,yCAExBC,EAAU,cAAczF,KAAKiF,QAAQQ,YAAYA,SAAiB,uBAClEzF,KAAKmG,0DAGnB,CAEAA,eAAAA,GACU,MAAEtF,UAAAA,EAAWuF,IAAAA,GAAQpG,KAAKnD,MAAMmJ,aAAe,IAC7C1E,SAAAA,GAAatB,KAAKnD,MAEpBwJ,EAAgB,IACfxF,EACHS,SAAAA,GAGA8E,OAAAA,GAAKE,QACLtG,KAAKuG,gBAAgB1F,GAChB2F,MAAKC,IACIC,MAAAA,EAAYC,SAASC,eAAe,UACpCC,EAAmBF,SAASG,cAAc,gBAC1CC,EAAc,IACbN,EACHnF,SAAAA,GAEJuF,EAAiB7E,aAAa,OAAQ5E,KAAKkC,UAAUyH,IACrDL,EAAUM,WAAWC,aAAaJ,EAAkBH,GACpD1G,KAAKmF,aACLnF,KAAKkH,UAAUT,EAAQnG,UAAS,IAEnC6G,OAAMxE,GAAKpF,QAAQC,IAAImF,KAErB,wCAGX3C,KAAKkH,UAAUb,EAAc/F,WACtBO,EACD,uBAAuBzB,EAAsBiH,sBAC7C,GACV,CAEAe,oBAAAA,CAAqBC,GACjB,IAA6C,IAAzCrH,KAAKnD,OAAOmJ,aAAaI,KAAKE,OAAwB,MAAA,GACpD,MAAEgB,mBAAAA,EAAoBC,kBAAAA,EAAmBC,oBAAAA,GAC3CxH,KAAKnD,MAAMmJ,YAAYI,IAC3B,OAAKkB,EAEE,uBACKtH,KAAKiF,QAAQS,YAAY4B,iCAChBtH,KAAKiF,QAAQU,yCACZ4B,wFAEsCF,oEAEvCrH,KAAKiF,QAAQW,4CACZ4B,sDAEIxH,KAAKiF,QAAQY,2EACgBwB,qDAbvB,EAgBpC,CAEA,qBAAMd,CAAgBkB,GACZ,MAAEC,MAAAA,EAAOC,WAAAA,GAAe3H,KAAKnD,MAAMmJ,YAAYI,IACjD,IAACsB,EAAME,OACAH,OAAAA,EAEX,MAAMI,EAAU9D,IACV+D,EAAO3D,IACP4D,EAAUxD,IAEZyD,IAAAA,EACA,IACAA,GAAAA,OC3HWC,OAAOJ,EAASC,EAAMC,EAASL,KAC5CQ,MAAAA,EAAM,GAAGzD,kBAAkCoD,KAAWC,KAAQC,wBAA8BL,IAGlG,mBAFuBS,MAAMD,IACDE,QDwHJC,CAAQR,EAASC,EAAMC,EAASL,GAE5CC,EAAY,CACZ,MAAMW,EAAgBtI,KAAKuI,mBAAmBb,EAAOM,EAAQjF,MACzDuF,IACAN,EAAU,CAAEjF,KAAM,CAACuF,IAE3B,CACH,OAAQhL,GACLC,QAAQC,IAAIF,EAChB,CAEK0K,OAAAA,GAASjF,MAAMrC,OAIbV,KAAKwI,cAAcf,EAAQO,EAAQjF,MAH/B0E,CAIf,CAEAc,kBAAAA,CAAmBb,EAAO3E,GACtB,OAAOA,EAAKtG,MAAKgM,GAAQA,EAAKpK,KAAKqK,cAAcC,SAASjB,EAAMgB,gBACpE,CAEAF,aAAAA,CAAcf,EAAQO,GAClBA,OAAAA,EAAQrJ,SAAQoE,GACZA,GAAM6F,WAAWjK,SAAQ,EAAG0C,GAAAA,EAAIwH,SAAAA,EAAUC,OAAAA,MACtCrB,EAAOnH,UAAUyI,KAAK,CAClBtD,QAASoD,EACTtJ,KACIuJ,EAAOrJ,QAAQ,OAAQ,KAAKA,QAAQ,KAAM,IAC1CO,KAAKoH,qBAAqB/F,GAC9BT,SAAU,SACb,MAIF6G,CACX,CAEAP,SAAAA,CAAU8B,GACN,IAAKA,IAASA,EAAKtI,OAEf,YADAnD,QAAQD,MAAM,6BE1IE2L,CAAAA,IACxB,MAAMC,EAAKtF,OAAO+C,SAASG,cAAc,UACzCoC,EAAGlH,aAAa,OAAQ,uBACxBkH,EAAGnI,UAAY3D,KAAKkC,UAAU2J,GAC9BrF,OAAO+C,SAASwC,KAAKC,YAAYF,EAAE,EF0I/BG,CClJG,CACH,WAAY,qBACZ,QAAS,UACTC,WD8IqCtJ,KAAKuJ,yBAAyBP,IAEvE,CAEAO,wBAAAA,CAAyBP,GACrB,IAAIM,EAAa,GACjBN,OAAAA,EAAKrK,SAAQ6K,KACJA,EAAI/D,UAAY+D,EAAIjK,MAGzB+J,EAAWP,KAAK,CACZ,QAAS,WACT1K,KAAMmL,EAAI/D,QACVgE,eAAgB,CACZ,QAAS,SACTlK,KAAMiK,EAAIjK,OAEjB,IAEE+J,CACX,CAEAxE,MAAAA,CAAOnC,GACE+G,KAAAA,eAAe/G,GAAG,EAC3B,CAEAqC,SAAAA,CAAUrC,GACD+G,KAAAA,eAAe/G,GAAG,EAC3B,CAEA,oBAAM+G,CAAe/G,EAAGgH,GACpB,MAAMC,EAAajH,EAAEkH,OAAOC,QAAQ,WACpC,IAAKF,EACD,OAEEG,MAAAA,EAAaH,EAAW3L,QAAQ+L,WACtC,IAAKD,EAED,YADAxM,QAAQD,MAAM,uCAIlB0C,KAAKiK,kBAAkBL,GAEvB,MAAM/B,EAAU9D,IACV+D,EAAO3D,IACP4D,EAAUxD,IACZ,IACIoF,OC/MQ1B,OAAOJ,EAASC,EAAMC,EAASgC,KAC7C7B,MAAAA,EAAM,GAAGzD,6BAA6CoD,KAAWC,KAAQC,KAAWgC,UACpF5B,MAAMD,EAAK,CACbgC,OAAQ,QACX,ED4MiBC,CAAStC,EAASC,EAAMC,EAASgC,QCzM5B9B,OAAOJ,EAASC,EAAMC,EAASgC,KAChD7B,MAAAA,EAAM,GAAGzD,8BAA8CoD,KAAWC,KAAQC,KAAWgC,UACrF5B,MAAMD,EAAK,CACbgC,OAAQ,QACX,EDuMiBE,CAAYvC,EAASC,EAAMC,EAASgC,EAEjD,OAAQzM,GACLC,QAAQD,MAAMA,EAClB,CACJ,CAEA2M,iBAAAA,CAAkBI,GACdA,EAAOC,UAAU7L,IAAI,WACrB4L,EAAOP,QAAQ,IAAI9J,KAAKiF,QAAQU,YAAY3F,KAAKiF,QAAQW,cAAc2E,UAAW,CACtF,CAEApF,UAAAA,GACSqF,KAAAA,SAAW7D,SAAS/I,iBAAiB,IAAIoC,KAAKiF,QAAQU,WAC3D3F,KAAKyK,YAAc9D,SAAS/I,iBAAiB,IAAIoC,KAAKiF,QAAQW,cAC1D5F,KAAKwK,UACLxK,KAAKwK,SAAS7L,SAAQgH,IAClBA,EAAQ7G,iBAAiB,QAASkB,KAAK6E,YAAa,CAAE6F,MAAM,GAAM,IAGtE1K,KAAKyK,aACLzK,KAAKyK,YAAY9L,SAAQiH,IACrBA,EAAW9G,iBAAiB,QAASkB,KAAK+E,eAAgB,CAAE2F,MAAM,GAAM,GAGpF,CAEAC,WAAAA,GACQ3K,KAAKwK,UACLxK,KAAKwK,SAAS7L,SAAQgH,IAClBA,EAAQxG,oBAAoB,QAASa,KAAK6E,YAAW,IAGzD7E,KAAKyK,aACLzK,KAAKyK,YAAY9L,SAAQiH,IACrBA,EAAWzG,oBAAoB,QAASa,KAAK+E,eAAc,GAGvE,CAEAxB,oBAAAA,GACIvD,KAAK2K,aACT,EAGJnH,eAAeC,IAAI,YAAcD,eAAeE,OAAO,UAAWgB"}