{"version":3,"file":"cxense.essecshop.min.js","sources":["../../src/helpers/Storage.js","../../src/helpers/getValueFromObjectList.js","../../src/helpers/Sync.js","../../src/helpers/getCachedSegments.js","../../src/adapters/UserSync.js","../../src/setup.js","../../src/helpers/createScript.js","../../src/helpers/sortQueue.js","../../src/helpers/getLangIdFromUrl.js","../../src/helpers/clean.js"],"sourcesContent":["import log from './logger';\n\n/**\n * This class sets, gets and deletes entries\n * in localStorage and sessionStorage.\n */\n\nclass Storage {\n static set = (key, value, type) => {\n if (type === 'localStorage') {\n if (window.localStorage && window.localStorage.setItem) {\n try {\n window.localStorage.setItem(key, value);\n log(`set ${key}=${value} to local storage`);\n } catch (err) {\n log(`unable to set ${key} to local storage`);\n log(err);\n }\n }\n } else if (type === 'sessionStorage') {\n if (window.sessionStorage && window.sessionStorage.setItem) {\n try {\n window.sessionStorage.setItem(key, value);\n log(`set ${key}=${value} to session storage`);\n } catch (err) {\n log(`unable to set ${key} to session storage`);\n log(err);\n }\n }\n }\n\n return null;\n };\n static get = (key, type) => {\n let value;\n if (type === 'localStorage') {\n if (window.localStorage && window.localStorage.getItem) {\n try {\n value = window.localStorage.getItem(key);\n log(`get ${key}=${value} from local storage`);\n } catch (err) {\n log(`unable to get ${key} from local storage`);\n log(err);\n }\n }\n } else if (type === 'sessionStorage') {\n if (window.sessionStorage && window.sessionStorage.setItem) {\n try {\n value = window.sessionStorage.getItem(key, value);\n log(`get ${key}=${value} from session storage`);\n } catch (err) {\n log(`unable to get ${key} from session storage`);\n log(err);\n }\n }\n }\n\n return value;\n };\n static del = (key, type) => {\n if (type === 'localStorage') {\n if (window.localStorage && window.localStorage.removeItem) {\n try {\n window.localStorage.removeItem(key);\n log(`delete ${key} from local storage`);\n } catch (err) {\n log(`unable to delete ${key} from local storage`);\n log(err);\n }\n }\n } else if (type === 'sessionStorage') {\n if (window.sessionStorage && window.sessionStorage.removeItem) {\n try {\n window.sessionStorage.removeItem(key);\n log(`delete ${key} from session storage`);\n } catch (err) {\n log(`unable to delete ${key} from session storage`);\n log(err);\n }\n }\n }\n\n return null;\n };\n}\n\nexport default Storage;\n","import log from './logger';\nimport Storage from './Storage';\n\nconst getValueFromObjectList = arr => {\n const getValue = obj => {\n let objSplitted;\n let value = null;\n let property = obj.name;\n switch (obj.type) {\n case 'object':\n objSplitted = obj.name.split('.');\n property = objSplitted[objSplitted.length - 1];\n value = window[objSplitted[0]];\n objSplitted.forEach((val, index) => {\n if (index > 0) {\n try {\n value = value[objSplitted[index]];\n } catch (err) {\n log(err);\n }\n }\n });\n break;\n case 'localStorage':\n value = Storage.get(obj.name, 'localStorage');\n objSplitted = obj.name.split('.');\n property = objSplitted[objSplitted.length - 1];\n break;\n case 'cookie':\n if (document.cookie && obj.name) {\n const name = `${obj.name}=`;\n const decodedCookie = decodeURIComponent(document.cookie);\n const ca = decodedCookie.split(';');\n for (let i = 0; i < ca.length; i += 1) {\n let c = ca[i];\n while (c.charAt(0) === ' ') {\n c = c.substring(1);\n }\n if (c.indexOf(name) === 0) {\n value = c.substring(name.length, c.length);\n }\n }\n }\n break;\n case 'url':\n value = document.location.search;\n if (value) {\n value = value.match(`[\\\\?&]${obj.name}=([^\\\\?&]+)`);\n value ? (value = value[1]) : (value = null);\n property = obj.name;\n }\n break;\n case 'method': {\n objSplitted = obj.name.split('.');\n property = objSplitted[objSplitted.length - 1];\n const method = objSplitted\n .slice(-1)[0]\n .match(/(.*)\\(\\\\?'?([^\\\\']*)\\\\?'?\\)/);\n value = window[objSplitted[0]];\n objSplitted.pop(); // last element can be removed as it is not an object\n objSplitted.forEach((val, index) => {\n if (index > 0) {\n value = value[objSplitted[index]];\n }\n });\n value = value[method[1]](method[2]);\n break;\n }\n case 'datalayer':\n value = window.dataLayer.find(data => data.event === 'pageview')[\n obj.name\n ];\n break;\n case 'dataAttribute':\n try {\n const script = document.querySelector(`script[${obj.name}]`);\n value = script && script.getAttribute(obj.name);\n } catch (err) {\n log(err);\n }\n break;\n default:\n // do nothing\n }\n\n // we are allready logging in the Storage class\n if (obj.type !== 'localStorage') {\n log(`get ${obj.name}=${value} from ${obj.type}`);\n }\n\n return [value, property];\n };\n\n return arr.find(el => {\n const [value, property] = getValue(el);\n el.value = value;\n el.property = property;\n\n return value !== null;\n });\n};\n\nexport default getValueFromObjectList;\n","/* eslint-disable no-invalid-this */\nimport Storage from './Storage';\n\n/**\n * This class facilitates the parameter synchronisation between\n * Cxense and KaChing.\n * The first script sets the parameter so the second script retrieves it.\n * The same logic needs to run in KaChing.\n */\n\nclass Sync {\n constructor(key, local, remote) {\n this._key = key;\n this._local = local;\n this._remote = remote;\n this._storage = 'sessionStorage';\n }\n\n get fetch() {\n return this._get() || this._set();\n }\n\n _get = () => {\n const str = Storage.get(this._key, this._storage);\n this._del();\n\n if (str) {\n const obj = JSON.parse(str);\n\n if (obj.source === this._remote) {\n return obj.value;\n }\n }\n return null;\n };\n\n _set = () => {\n const obj = {\n source: this._local,\n value: Sync._randomString(),\n };\n\n Storage.set(this._key, JSON.stringify(obj), this._storage);\n\n return obj.value;\n };\n\n _del = () => {\n Storage.del(this._key, this._storage);\n };\n\n static _randomString = () => {\n const result = [];\n let strLength = 16;\n const charSet = 'abcdefghijklmnopqrstuvwxyz0123456789';\n\n // eslint-disable-next-line no-plusplus\n while (strLength--) {\n result.push(charSet.charAt(Math.floor(Math.random() * charSet.length)));\n }\n\n return result.join('');\n };\n}\n\nexport default Sync;\n","import Storage from './Storage';\nimport log from './logger';\n\nconst getCachedSegments = () => {\n let segmentIds = [];\n const segmentKey = PERSIST.segments[0];\n\n const rawSegmentIds = Storage.get(segmentKey.name, segmentKey.type);\n if (rawSegmentIds !== null) {\n segmentIds = JSON.parse(rawSegmentIds);\n } else {\n log('Segments not found in storage');\n }\n\n return segmentIds;\n};\n\nexport default getCachedSegments;\n","import getCachedSegments from '../helpers/getCachedSegments';\nimport log from '../helpers/logger';\n\n/**\n * handles string and objects containing SSP configuration\n * for either client or server user syncing\n */\n\nclass UserSync {\n constructor(ssps) {\n this.ssps = ssps;\n }\n\n static _getType = ssp => {\n let type;\n if (typeof ssp === 'string') {\n type = 's2s';\n } else if (typeof ssp === 'object' && ssp.type) {\n type = ssp.type;\n }\n\n return type;\n };\n\n sendRequests() {\n this.ssps.forEach(ssp => {\n if (UserSync._getType(ssp) === 's2s') {\n window.cX.callQueue.push(['sync', ssp]);\n log(`add usersync for ${ssp.partner ? ssp.partner : ssp} to queue`);\n } else if (ssp.queryId) {\n window.cX.callQueue.push([\n 'invoke',\n () => {\n window.cX.getUserSegmentIds({\n persistedQueryId: ssp.queryId,\n callback: userSegmentIds => {\n UserSync._appNexusS2s(ssp.customerId, userSegmentIds);\n },\n });\n },\n ]);\n } else {\n // eslint-disable-next-line no-lonely-if\n if (ssp.partner === 'appnexus') {\n UserSync._appNexusS2s(ssp.customerId, getCachedSegments());\n } else if (ssp.partner === 'facebook') {\n UserSync._facebook(ssp.customerId, getCachedSegments());\n } else {\n //\n }\n }\n });\n }\n\n static _appNexusS2s = (id, seg) => {\n if (seg.length > 0) {\n const el = document.createElement('img');\n const prefix = 'cxsegment_';\n const keyvalues = [];\n keyvalues.push(`add_Code=${prefix}${seg.join(`,${prefix}`)}`);\n keyvalues.push(`member=${id}`);\n el.setAttribute('src', `//ib.adnxs.com/seg?${keyvalues.join('&')}`);\n el.setAttribute('width', '1');\n el.setAttribute('height', '1');\n if (document.body) document.body.appendChild(el);\n }\n };\n\n static _facebook = (id, seg) => {\n if (typeof window.fbq === 'undefined') {\n return;\n }\n\n // fbq ignores long arrays\n const chunk = 80;\n let i = 0;\n\n for (i; i < seg.length; i += chunk) {\n window.fbq('trackSingleCustom', id, 'CxSegments', {\n segmentIds: seg.slice(i, i + chunk),\n });\n }\n };\n}\n\nexport default UserSync;\n","import createScript from './helpers/createScript';\nimport getValueFromObjectList from './helpers/getValueFromObjectList';\nimport getAllKeyValues from './helpers/getAllKeyValues';\nimport getLangIdFromUrl from './helpers/getLangIdFromUrl';\nimport getRegioFromCookie from './helpers/getRegioFromCookie';\nimport sortQueue from './helpers/sortQueue';\nimport trackImaEvents from './adapters/trackImaEvents';\nimport funnelEvents from './adapters/funnelEvents';\nimport intentEvents from './adapters/intentEvents';\nimport nativeArticleReads from './adapters/nativeArticleReads';\nimport Sync from './helpers/Sync';\nimport Storage from './helpers/Storage';\nimport UserSync from './adapters/UserSync';\nimport clean from './helpers/clean';\nimport kantar from './adapters/kantar';\nimport log from './helpers/logger';\n\nconst init = () => {\n const CX_URL = 'https://cdn.cxense.com/cx.js';\n const siteid = getLangIdFromUrl(CXENSE_SITE_ID);\n const extid = getValueFromObjectList(USER);\n const persist = PERSIST;\n let options = {};\n\n window.cX = window.cX || CXINIT;\n\n createScript(CX_URL);\n window.cX.shouldPoll = false;\n window.cX.callQueue = window.cX.callQueue || [];\n if (persist) {\n const s = new Sync('cxPrnd', 'cx', 'ga');\n window.cX.callQueue.push(['setRandomId', s.fetch]);\n }\n if (REGIO) {\n // regio box on popular MH titles\n const pc = getRegioFromCookie();\n if (pc) {\n window.cX.callQueue.push([\n 'setUserProfileParameters',\n { regiobox: [pc] },\n ]);\n }\n }\n window.cX.callQueue.push(['setSiteId', siteid]);\n if (extid && extid.value) {\n const id = clean(extid.value);\n window.cX.callQueue.push(['addExternalId', { id, type: PREFIX }]);\n // used later when calling cX.getUserSegmentIds\n options = {\n identities: [\n {\n type: PREFIX,\n id,\n },\n ],\n };\n }\n\n if (KNT) {\n // NLprofiel\n if (KNT.path && KNT.path.test(document.location.pathname)) {\n kantar();\n }\n }\n\n if (CUSTOM) {\n // Collect additional datalayer parameters\n const cp = getAllKeyValues(CUSTOM);\n if (cp) {\n window.cX.callQueue.push(['setCustomParameters', cp]);\n }\n }\n\n if (URLARGS) {\n window.cX.callQueue.push([\n 'invoke',\n () => {\n const urlArgs = window.cX.parseUrlArgs();\n const allowed = URLARGS;\n\n const cp = Object.keys(urlArgs)\n .filter(key => allowed.includes(key))\n .reduce((obj, key) => {\n obj[key] = urlArgs[key];\n return obj;\n }, {});\n\n window.cX.setCustomParameters(cp);\n },\n ]);\n }\n\n if (SHOP)\n // webshop events\n funnelEvents();\n\n if (INTENT)\n // intent events (Audience Interest Group)\n intentEvents();\n\n if (TRACKIMA)\n // video player events\n trackImaEvents();\n\n if (ARTICLE_READ)\n // native article reads\n nativeArticleReads();\n\n if (PERSIST) {\n if (SYNC) {\n if (!Storage.get(persist.cache.name, persist.cache.type)) {\n const u = new UserSync(SYNC);\n u.sendRequests();\n }\n }\n\n window.cX.callQueue.push([\n 'invoke',\n () => {\n // register userid in localStorage\n const uid = window.cX.getUserId();\n Storage.set(persist.user.name, uid, persist.user.type);\n persist.segments.forEach(segment => {\n // register segmentids in localStorage\n try {\n window.cX.getUserSegmentIds(\n {\n persistedQueryId: segment.queryid,\n callback: userSegmentIds => {\n Storage.set(\n segment.name,\n JSON.stringify(userSegmentIds),\n segment.type\n );\n },\n },\n options\n );\n // use cache flag\n Storage.set(persist.cache.name, 1, persist.cache.type);\n } catch (err) {\n log(`unable to get userSegmentIds from API`);\n log(err);\n }\n });\n },\n ]);\n }\n\n // Send Page View Event\n if (window.location.pathname.match(FILTER)) {\n window.cX.callQueue.push([\n 'sendPageViewEvent',\n {\n location: window.location.href,\n referrer: document.referrer,\n useAutoRefreshCheck: false,\n },\n ]);\n }\n\n window.cX.callQueue = sortQueue(window.cX.callQueue);\n\n return null;\n};\n\nif (WAIT_FOR) {\n // reload for SPA\n document.addEventListener(WAIT_FOR, init);\n log(`waiting for ${WAIT_FOR} to initialize`);\n // tell referer async loading is ready\n document.dispatchEvent(new CustomEvent('cxLoaded'));\n log(`dispatch cxLoaded event`);\n} else {\n init();\n}\n","const createScript = src =>\n new Promise((resolve, reject) => {\n if (typeof document === 'undefined') {\n resolve();\n }\n\n const scriptTag = document.createElement('script');\n const node = document.getElementsByTagName('script')[0];\n scriptTag.src = src;\n scriptTag.onload = resolve;\n scriptTag.onerror = reject;\n scriptTag.async = true;\n node.parentNode.insertBefore(scriptTag, node);\n });\n\nexport default createScript;\n","/**\n * @module helpers/sortQueue\n * This returns a sorted array to make the callqueue has the correct order\n * @param {array} queue\n * @returns {array} sortedQueue\n */\n\nconst sortQueue = queue => {\n const events = [];\n const setEventAttributes = [];\n const otherCalls = [];\n let sortedQueue = [];\n\n queue.forEach(element => {\n if (/sendEvent/.test(element)) {\n events.push(element);\n } else if (/setEventAttributes/.test(element)) {\n setEventAttributes.push(element);\n } else {\n otherCalls.push(element);\n }\n });\n\n sortedQueue = sortedQueue.concat(setEventAttributes);\n sortedQueue = sortedQueue.concat(otherCalls);\n sortedQueue = sortedQueue.concat(events);\n\n // add the push method from cx.js\n sortedQueue.push = queue.push || {};\n\n return sortedQueue;\n};\n\nexport default sortQueue;\n","const getLangIdFromUrl = langIds => {\n if (typeof langIds !== 'object') {\n return langIds;\n }\n\n const url = document.location.href;\n // we only look up the lang codes in the URL from the settings file\n const langs = Object.keys(langIds).join('|');\n // template literal: /(\\/|=)(fr|nl|en)(\\/|#|\\.|\\?|$)/g\n // works on \"https://www.mediahuis.be/fr/detailpage\" or \"https://fr.mediahuis.be\"\n const regex = new RegExp(`(/|=)(${langs})(/|#|\\\\.|\\\\?|$)`, 'gi');\n const result = regex.exec(url);\n\n return result ? langIds[result[2]] : langIds[Object.keys(langIds)[0]];\n};\n\nexport default getLangIdFromUrl;\n","/*\n * @see https://wiki.cxense.com/display/cust/Event+data\n * Limitation: The maximum allowed identifier length is 64 characters.\n * The valid characters in customer identifiers are digits (0 to 9), \n * characters A to Z, a to z, space \n * and the special characters \"=\", \"@\", \"+\", \"-\", \"_\" and \".\".\n */\nconst clean = str => {\n const len = 64;\n str = str.replace(/[^A-Za-z0-9 =@+\\-_.]/g, '');\n str = str.substring(0, len);\n\n return str;\n};\n\nexport default clean;\n"],"names":["Storage","key","value","type","window","localStorage","setItem","err","sessionStorage","getItem","removeItem","getValueFromObjectList","arr","find","el","obj","objSplitted","property","name","split","length","forEach","val","index","get","document","cookie","ca","decodeURIComponent","i","c","charAt","substring","indexOf","location","search","match","method","slice","pop","dataLayer","data","event","script","querySelector","getAttribute","getValue","local","remote","str","_this","_key","_storage","_del","JSON","parse","source","_remote","_local","Sync","_randomString","set","stringify","del","this","_get","_set","result","strLength","charSet","push","Math","floor","random","join","getCachedSegments","segmentIds","segmentKey","segments","rawSegmentIds","UserSync","ssps","sendRequests","ssp","_getType","cX","callQueue","partner","queryId","getUserSegmentIds","persistedQueryId","callback","userSegmentIds","_appNexusS2s","customerId","_facebook","id","seg","createElement","keyvalues","setAttribute","body","appendChild","fbq","src","queue","events","setEventAttributes","otherCalls","sortedQueue","siteid","langIds","url","href","langs","Object","keys","RegExp","exec","getLangIdFromUrl","extid","Promise","resolve","reject","scriptTag","node","getElementsByTagName","onload","onerror","async","parentNode","insertBefore","shouldPoll","replace","pathname","referrer","useAutoRefreshCheck","element","test","concat","init"],"mappings":"2TAOMA,iBAAAA,QACS,SAACC,EAAKC,EAAOC,MACX,iBAATA,MACEC,OAAOC,cAAgBD,OAAOC,aAAaC,YAE3CF,OAAOC,aAAaC,QAAQL,EAAKC,GAEjC,MAAOK,UAKN,GAAa,mBAATJ,GACLC,OAAOI,gBAAkBJ,OAAOI,eAAeF,YAE/CF,OAAOI,eAAeF,QAAQL,EAAKC,GAEnC,MAAOK,WAON,SAxBLP,QA0BS,SAACC,EAAKE,OACbD,KACS,iBAATC,MACEC,OAAOC,cAAgBD,OAAOC,aAAaI,YAE3CP,EAAQE,OAAOC,aAAaI,QAAQR,GAEpC,MAAOM,UAKN,GAAa,mBAATJ,GACLC,OAAOI,gBAAkBJ,OAAOI,eAAeF,YAE/CJ,EAAQE,OAAOI,eAAeC,QAAQR,EAAKC,GAE3C,MAAOK,WAONL,MAlDLF,QAoDS,SAACC,EAAKE,MACJ,iBAATA,MACEC,OAAOC,cAAgBD,OAAOC,aAAaK,eAE3CN,OAAOC,aAAaK,WAAWT,GAE/B,MAAOM,UAKN,GAAa,mBAATJ,GACLC,OAAOI,gBAAkBJ,OAAOI,eAAeE,eAE/CN,OAAOI,eAAeE,WAAWT,GAEjC,MAAOM,WAON,OC/EX,IAAMI,EAAyB,SAAAC,UA0FtBA,EAAIC,KAAK,SAAAC,SAzFC,SAAAC,OACXC,EACAd,EAAQ,KACRe,EAAWF,EAAIG,YACXH,EAAIZ,UACL,SAEHc,GADAD,EAAcD,EAAIG,KAAKC,MAAM,MACNH,EAAYI,OAAS,GAC5ClB,EAAQE,OAAOY,EAAY,IAC3BA,EAAYK,QAAQ,SAACC,EAAKC,MACpBA,EAAQ,MAERrB,EAAQA,EAAMc,EAAYO,IAC1B,MAAOhB,iBAMV,eACHL,EAAQF,EAAQwB,IAAIT,EAAIG,KAAM,gBAE9BD,GADAD,EAAcD,EAAIG,KAAKC,MAAM,MACNH,EAAYI,OAAS,aAEzC,YACCK,SAASC,QAAUX,EAAIG,aACnBA,EAAUH,EAAIG,SAEdS,EADgBC,mBAAmBH,SAASC,QACzBP,MAAM,KACtBU,EAAI,EAAGA,EAAIF,EAAGP,OAAQS,GAAK,EAAG,SACjCC,EAAIH,EAAGE,GACY,MAAhBC,EAAEC,OAAO,IACdD,EAAIA,EAAEE,UAAU,GAEM,IAApBF,EAAEG,QAAQf,KACZhB,EAAQ4B,EAAEE,UAAUd,EAAKE,OAAQU,EAAEV,mBAKtC,OACHlB,EAAQuB,SAASS,SAASC,UAGfjC,GADTA,EAAQA,EAAMkC,eAAerB,EAAIG,qBAChBhB,EAAM,GAAe,KACtCe,EAAWF,EAAIG,gBAGd,SAEHD,GADAD,EAAcD,EAAIG,KAAKC,MAAM,MACNH,EAAYI,OAAS,OACtCiB,EAASrB,EACZsB,OAAO,GAAG,GACVF,MAAM,+BACTlC,EAAQE,OAAOY,EAAY,IAC3BA,EAAYuB,MACZvB,EAAYK,QAAQ,SAACC,EAAKC,GACpBA,EAAQ,IACVrB,EAAQA,EAAMc,EAAYO,OAG9BrB,EAAQA,EAAMmC,EAAO,IAAIA,EAAO,cAG7B,YACHnC,EAAQE,OAAOoC,UAAU3B,KAAK,SAAA4B,SAAuB,aAAfA,EAAKC,QACzC3B,EAAIG,gBAGH,wBAEKyB,EAASlB,SAASmB,wBAAwB7B,EAAIG,UACpDhB,EAAQyC,GAAUA,EAAOE,aAAa9B,EAAIG,MAC1C,MAAOX,WASI,iBAAbQ,EAAIZ,OACKY,EAAIG,KAAsBH,EAAIZ,OAGnCD,EAAOe,GAIW6B,CAAShC,GAA5BZ,OAAOe,cACdH,EAAGZ,MAAQA,EACXY,EAAGG,SAAWA,EAEG,OAAVf,6BCvFGD,EAAK8C,EAAOC,4BAWjB,eACCC,EAAMjD,EAAQwB,IAAI0B,EAAKC,KAAMD,EAAKE,aACxCF,EAAKG,OAEDJ,EAAK,KACDlC,EAAMuC,KAAKC,MAAMN,MAEnBlC,EAAIyC,SAAWN,EAAKO,eACf1C,EAAIb,aAGR,qBAGF,eACCa,GACJyC,OAAQN,EAAKQ,OACbxD,MAAOyD,EAAKC,wBAGd5D,EAAQ6D,IAAIX,EAAKC,KAAMG,KAAKQ,UAAU/C,GAAMmC,EAAKE,UAE1CrC,EAAIb,sBAGN,WACLF,EAAQ+D,IAAIb,EAAKC,KAAMD,EAAKE,iBApCvBD,KAAOlD,OACPyD,OAASX,OACTU,QAAUT,OACVI,SAAW,6EAITY,KAAKC,QAAUD,KAAKE,4DAgCN,mBACfC,KACFC,EAAY,GACVC,EAAU,uCAGTD,KACLD,EAAOG,KAAKD,EAAQtC,OAAOwC,KAAKC,MAAMD,KAAKE,SAAWJ,EAAQjD,iBAGzD+C,EAAOO,KAAK,MC1DvB,IAAMC,EAAoB,eACpBC,KACEC,EAAa,KAAQC,SAAS,GAE9BC,EAAgB/E,EAAQwB,IAAIqD,EAAW3D,KAAM2D,EAAW1E,aACxC,OAAlB4E,IACFH,EAAatB,KAAKC,MAAMwB,IAKnBH,GCNHI,wBACQC,QACLA,KAAOA,qBAcdC,aAAA,gBACOD,KAAK5D,QAAQ,SAAA8D,GACe,QAA3BH,EAASI,SAASD,IACpB/E,OAAOiF,GAAGC,UAAUhB,MAAM,OAAQa,IACVA,EAAII,SAAUJ,EAAII,SACjCJ,EAAIK,QACbpF,OAAOiF,GAAGC,UAAUhB,MAClB,SACA,WACElE,OAAOiF,GAAGI,mBACRC,iBAAkBP,EAAIK,QACtBG,SAAU,SAAAC,GACRZ,EAASa,aAAaV,EAAIW,WAAYF,SAO1B,aAAhBT,EAAII,QACNP,EAASa,aAAaV,EAAIW,WAAYnB,KACb,aAAhBQ,EAAII,SACbP,EAASe,UAAUZ,EAAIW,WAAYnB,eAtCvCK,aAKc,SAAAG,OACZhF,QACe,iBAARgF,EACThF,EAAO,MACiB,iBAARgF,GAAoBA,EAAIhF,OACxCA,EAAOgF,EAAIhF,MAGNA,MAbL6E,iBA8CkB,SAACgB,EAAIC,MACrBA,EAAI7E,OAAS,EAAG,KACZN,EAAKW,SAASyE,cAAc,OAE5BC,KACNA,EAAU7B,2BAA0B2B,EAAIvB,qBACxCyB,EAAU7B,eAAe0B,GACzBlF,EAAGsF,aAAa,4BAA6BD,EAAUzB,KAAK,MAC5D5D,EAAGsF,aAAa,QAAS,KACzBtF,EAAGsF,aAAa,SAAU,KACtB3E,SAAS4E,MAAM5E,SAAS4E,KAAKC,YAAYxF,QAxD7CkE,cA4De,SAACgB,EAAIC,WACI,IAAf7F,OAAOmG,YAMd1E,EAAI,EAEAA,EAAIoE,EAAI7E,OAAQS,GAHV,GAIZzB,OAAOmG,IAAI,oBAAqBP,EAAI,cAClCpB,WAAYqB,EAAI3D,MAAMT,EAAGA,EALf,SCzDL,eCjBQ2E,ECOHC,EACVC,EACAC,EACAC,EACFC,EFQEC,EGnBiB,SAAAC,MACA,iBAAZA,SACFA,MAGHC,EAAMvF,SAASS,SAAS+E,KAExBC,EAAQC,OAAOC,KAAKL,GAASrC,KAAK,KAIlCP,EADQ,IAAIkD,gBAAgBH,qBAAyB,MACtCI,KAAKN,UAEnB7C,EAAS4C,EAAQ5C,EAAO,IAAM4C,EAAQI,OAAOC,KAAKL,GAAS,IHMnDQ,wBACTC,EAAQ7G,SAIdP,OAAOiF,GAAKjF,OAAOiF,OCxBAmB,EDkBJ,+BCjBf,IAAIiB,QAAQ,SAACC,EAASC,GACI,oBAAblG,UACTiG,QAGIE,EAAYnG,SAASyE,cAAc,UACnC2B,EAAOpG,SAASqG,qBAAqB,UAAU,GACrDF,EAAUpB,IAAMA,EAChBoB,EAAUG,OAASL,EACnBE,EAAUI,QAAUL,EACpBC,EAAUK,OAAQ,EAClBJ,EAAKK,WAAWC,aAAaP,EAAWC,KDe1CzH,OAAOiF,GAAG+C,YAAa,EACvBhI,OAAOiF,GAAGC,UAAYlF,OAAOiF,GAAGC,cAehClF,OAAOiF,GAAGC,UAAUhB,MAAM,YAAawC,IACnCU,GAASA,EAAMtH,MAAO,KAClB8F,EAAWwB,EAAMtH,MIpCfmI,QAAQ,wBAAyB,IACjCrG,UAAU,EAFR,IJsCV5B,OAAOiF,GAAGC,UAAUhB,MAAM,iBAAmB0B,GAAAA,EAAI7F,aAwG/CC,OAAO8B,SAASoG,SAASlG,aAC3BhC,OAAOiF,GAAGC,UAAUhB,MAClB,qBAEEpC,SAAU9B,OAAO8B,SAAS+E,KAC1BsB,SAAU9G,SAAS8G,SACnBC,qBAAqB,KAK3BpI,OAAOiF,GAAGC,WE1JMmB,EF0JgBrG,OAAOiF,GAAGC,UEzJpCoB,KACAC,KACAC,KACFC,KAEJJ,EAAMpF,QAAQ,SAAAoH,GACR,YAAYC,KAAKD,GACnB/B,EAAOpC,KAAKmE,GACH,qBAAqBC,KAAKD,GACnC9B,EAAmBrC,KAAKmE,GAExB7B,EAAWtC,KAAKmE,MAMpB5B,GADAA,GADAA,EAAcA,EAAY8B,OAAOhC,IACPgC,OAAO/B,IACP+B,OAAOjC,IAGrBpC,KAAOmC,EAAMnC,SAElBuC,GFgJP+B"}