{"version":3,"file":"cxense.vanderloovg.min.js","sources":["../../src/helpers/createScript.js","../../src/helpers/logger.js","../../src/helpers/sha256.js","../../src/helpers/Storage.js","../../src/helpers/addUserIds.js","../../src/helpers/getValue.js","../../src/setup.js","../../src/helpers/addExternalIds.js","../../src/helpers/getLangIdFromUrl.js","../../src/helpers/asyncAddUserId.js"],"sourcesContent":["const createScript = src =>\n new Promise((resolve, reject) => {\n const id = 'cx';\n\n if (typeof document === 'undefined' || document.getElementById(id)) {\n resolve();\n } else {\n const scriptTag = document.createElement('script');\n const node = document.getElementsByTagName('script')[0];\n scriptTag.src = src;\n scriptTag.id = id;\n scriptTag.onload = resolve;\n scriptTag.onerror = reject;\n scriptTag.async = true;\n node.parentNode.insertBefore(scriptTag, node);\n }\n });\n\nexport default createScript;\n","/* global process */\n\n/**\n * Simple console.log function for not production builds\n *\n */\nconst log = (...args) => {\n if (process.env.NODE_ENV !== 'production') {\n const stack = String(new Error().stack).split('\\n');\n let column = '';\n let lineNumber = '';\n if (stack.length >= 2) {\n const matches = stack[2].match(/(\\d+):(\\d+)\\)?$/);\n if (matches && matches.length >= 3) {\n lineNumber = matches[1];\n column = matches[2];\n }\n }\n\n const limit = 150;\n\n if (args[0].length > limit) {\n args[0] = `${args[0].substring(0, limit)}...`;\n }\n\n /* eslint-disable no-console */\n console.log(\n '%cCxense',\n 'display: inline-block; color: #fff; background: #3bc388; padding: 1px 4px; border-radius: 3px;',\n ...args,\n `L: ${lineNumber}, C: ${column}`\n );\n /* eslint-enable no-console */\n }\n};\n\nexport default log;\n","/* eslint-disable no-multi-assign */\n/* eslint-disable no-bitwise */\nconst sha256 = ascii => {\n const rightRotate = (value, amount) =>\n (value >>> amount) | (value << (32 - amount));\n\n const mathPow = Math.pow;\n const maxWord = mathPow(2, 32);\n const lengthProperty = 'length';\n let i; // Used as a counter across the whole file\n let j; // Used as a counter across the whole file\n let result = '';\n\n const words = [];\n const asciiBitLength = ascii[lengthProperty] * 8;\n\n //* caching results is optional - remove/add slash from front of this line to toggle\n // Initial hash value: first 32 bits of the fractional parts of the square roots of the first 8 primes\n // (we actually calculate the first 64, but extra values are just ignored)\n let hash = (sha256.h = sha256.h || []);\n // Round constants: first 32 bits of the fractional parts of the cube roots of the first 64 primes\n const k = (sha256.k = sha256.k || []);\n let primeCounter = k[lengthProperty];\n\n /* /\n\tvar hash = [], k = [];\n\tvar primeCounter = 0;\n\t//*/\n\n const isComposite = {};\n for (let candidate = 2; primeCounter < 64; candidate += 1) {\n if (!isComposite[candidate]) {\n for (i = 0; i < 313; i += candidate) {\n isComposite[i] = candidate;\n }\n hash[primeCounter] = (mathPow(candidate, 0.5) * maxWord) | 0;\n k[primeCounter] = (mathPow(candidate, 1 / 3) * maxWord) | 0;\n primeCounter += 1;\n }\n }\n\n ascii += '\\x80'; // Append Ƈ' bit (plus zero padding)\n while (ascii[lengthProperty] % 64 - 56) ascii += '\\x00'; // More zero padding\n for (i = 0; i < ascii[lengthProperty]; i += 1) {\n j = ascii.charCodeAt(i);\n if (j >> 8) return; // ASCII check: only accept characters in range 0-255\n words[i >> 2] |= j << (((3 - i) % 4) * 8);\n }\n words[words[lengthProperty]] = (asciiBitLength / maxWord) | 0;\n words[words[lengthProperty]] = asciiBitLength;\n\n // process each chunk\n for (j = 0; j < words[lengthProperty]; ) {\n const w = words.slice(j, (j += 16)); // The message is expanded into 64 words as part of the iteration\n const oldHash = hash;\n // This is now the undefinedworking hash\", often labelled as variables a...g\n // (we have to truncate as well, otherwise extra entries at the end accumulate\n hash = hash.slice(0, 8);\n\n for (i = 0; i < 64; i += 1) {\n // eslint-disable-next-line no-unused-vars\n const i2 = i + j;\n // Expand the message into 64 words\n // Used below if\n const w15 = w[i - 15];\n const w2 = w[i - 2];\n\n // Iterate\n const a = hash[0];\n const e = hash[4];\n const temp1 =\n hash[7] +\n (rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25)) + // S1\n ((e & hash[5]) ^ (~e & hash[6])) + // ch\n k[i] +\n // Expand the message schedule if needed\n (w[i] =\n i < 16\n ? w[i]\n : (w[i - 16] +\n (rightRotate(w15, 7) ^ rightRotate(w15, 18) ^ (w15 >>> 3)) + // s0\n w[i - 7] +\n (rightRotate(w2, 17) ^ rightRotate(w2, 19) ^ (w2 >>> 10))) | // s1\n 0);\n // This is only used once, so *could* be moved below, but it only saves 4 bytes and makes things unreadble\n const temp2 =\n (rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22)) + // S0\n ((a & hash[1]) ^ (a & hash[2]) ^ (hash[1] & hash[2])); // maj\n\n hash = [(temp1 + temp2) | 0].concat(hash); // We don't bother trimming off the extra ones, they're harmless as long as we're truncating when we do the slice()\n hash[4] = (hash[4] + temp1) | 0;\n }\n\n for (i = 0; i < 8; i += 1) {\n hash[i] = (hash[i] + oldHash[i]) | 0;\n }\n }\n\n for (i = 0; i < 8; i += 1) {\n for (j = 3; j + 1; j -= 1) {\n const b = (hash[i] >> (j * 8)) & 255;\n result += (b < 16 ? 0 : '') + b.toString(16);\n }\n }\n // eslint-disable-next-line consistent-return\n return result;\n};\n\nexport default sha256;\n","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);\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 getValue from './getValue';\nimport sha256 from './sha256';\nimport log from './logger';\n\nconst addUserIds = dmps => {\n if (!dmps) dmps = [];\n let parsedId = {};\n let parsedIds = [];\n\n const clean = str => {\n // @see https://docs.piano.io/event-data/\n const len = 64;\n\n str = str.replace(/[^A-Za-z0-9 =@+\\-_.|]/g, '');\n str = str.substring(0, len);\n\n return str;\n };\n\n if (dmps.length) {\n dmps.forEach(dmp => {\n dmp.ids.forEach(id => {\n parsedId = getValue(id);\n if (parsedId.value) {\n parsedId = {\n ...parsedId,\n value: id.hash ? sha256(parsedId.value) : clean(parsedId.value),\n prefix: id.prefix ? id.prefix : dmp.prefix,\n };\n parsedIds.push(parsedId);\n }\n });\n dmp.parsedIds = parsedIds;\n parsedIds = [];\n });\n } else {\n log('Warning: no DMP defined, configuring empty one');\n }\n\n return dmps;\n};\nexport default addUserIds;\n","import log from './logger';\nimport Storage from './Storage';\n\nconst getValue = obj => {\n let split;\n let value = null;\n let key = obj.name;\n switch (obj.type) {\n case 'object':\n split = obj.name.split('.');\n key = split[split.length - 1];\n value = window[split[0]];\n split.forEach((val, index) => {\n if (index > 0) {\n try {\n value = value[split[index]];\n } catch (err) {\n log(err);\n }\n }\n });\n break;\n case 'localStorage':\n value = Storage.get(obj.name, 'localStorage');\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 }\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 case 'static':\n split = obj.name.split(':');\n if (split.length > 1) {\n key = split[0];\n value = split[1];\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 { key, value };\n};\n\nexport default getValue;\n","/* eslint-disable promise/always-return */\n/* eslint-disable promise/catch-or-return */\n/* eslint-disable promise/no-nesting */\n/* eslint-disable radix */\nimport createScript from './helpers/createScript';\nimport getAllKeyValues from './helpers/getAllKeyValues';\nimport getLangIdFromUrl from './helpers/getLangIdFromUrl';\nimport getRegioFromCookie from './helpers/getRegioFromCookie';\nimport funnelEvents from './adapters/funnelEvents';\nimport Storage from './helpers/Storage';\nimport addUserIds from './helpers/addUserIds';\nimport asyncAddUserId from './helpers/asyncAddUserId';\nimport log from './helpers/logger';\nimport addExternalIds from './helpers/addExternalIds';\nimport getSegments from './helpers/getSegments';\nimport videoEvents from './adapters/videoEvents';\nimport cookieSyncs from './helpers/cookieSyncs';\nimport segmentSyncs from './helpers/segmentSyncs';\n\nconst dmps = addUserIds(DMP);\n// temp async hack\nconst idPromise = asyncAddUserId(dmps);\nconst cXContext = { dmp: undefined, loaded: false, resolveTrigger: undefined };\nconst triggerPromise = new Promise(resolve => {\n cXContext.resolveTrigger = resolve;\n});\nconst persist = PERSIST;\nconst cached = persist\n ? parseInt(Storage.get(persist.cache.name, persist.cache.type))\n : 0;\nconst cxjs = CONVERSION\n ? 'https://cdn.cxense.com/cx.cce.js'\n : 'https://cdn.cxense.com/cx.js';\nconst siteid = getLangIdFromUrl(CXENSE_SITE_ID);\n\n// init cx.js\nwindow.cX = window.cX || CXINIT;\ncreateScript(cxjs);\nwindow.cX.shouldPoll = false;\nwindow.cX.callQueue = window.cX.callQueue || [];\nif (CONVERSION) {\n window.cX.CCE = window.cX.CCE || {};\n window.cX.CCE.callQueue = window.cX.CCE.callQueue || [];\n}\n\nconst fire = (dmp, event) => {\n let location = window.location.href;\n\n // Single Page Application\n if (event) {\n window.cX.callQueue.push(['initializePage']);\n log('initializePage');\n // this is for goplay app\n if (event.detail) {\n location = event.detail.url;\n }\n }\n\n // setSiteId\n window.cX.callQueue.push(['setSiteId', siteid]);\n\n addExternalIds(dmp);\n\n if (CUSTOM) {\n // setCustomParameters\n const cp = getAllKeyValues(CUSTOM);\n if (cp) {\n window.cX.callQueue.push(['setCustomParameters', cp]);\n }\n }\n\n // async actions which require the cX to be ready\n window.cX.callQueue.push([\n 'invoke',\n () => {\n // start invoke\n // query string parameters to fetch from the URL\n if (URLARGS) {\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 // end invoke\n },\n ]);\n\n // next 3 adapters use a default pqid from MH\n if (MH_SHOP)\n // webshop events\n funnelEvents();\n\n if (MH_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\n // stuff that needs to be stored so it can be reused in adserving\n // TODO: DMP is a dependency of PERSIST, should be merged in 1 object\n if (PERSIST) {\n if (!cached) {\n cookieSyncs(SYNC);\n segmentSyncs(dmp);\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 getSegments(dmp);\n },\n ]);\n // use cache flag to perform some actions only once per session\n Storage.set(persist.cache.name, 1, persist.cache.type);\n }\n\n // Send Page View Event\n if (window.location.pathname.match(FILTER)) {\n const options = {\n location,\n referrer: document.referrer,\n useAutoRefreshCheck: false,\n };\n CONVERSION\n ? window.cX.CCE.callQueue.push(['sendPageViewEvent', options])\n : window.cX.callQueue.push(['sendPageViewEvent', options]);\n }\n\n // Run CCE widget\n if (CONVERSION) {\n window.cX.CCE.callQueue.push(['run', CONVERSION]);\n }\n};\n\nidPromise\n .then(dmp => {\n cXContext.dmp = dmp;\n if (TRIGGER) {\n const trigger = TRIGGER;\n triggerPromise.then(() => {\n cXContext.loaded = true;\n fire(dmp);\n });\n // tell website this library is ready\n document.dispatchEvent(new CustomEvent(trigger.out));\n log(`sending '${trigger.out}' event`);\n }\n if (!TRIGGER || TRIGGER.hybrid) {\n log(`fire`);\n fire(dmp, false);\n }\n // SBS video events\n if (VIDEO) {\n videoEvents();\n }\n return false;\n })\n .catch();\n\n// run on content reload\nif (TRIGGER) {\n const trigger = TRIGGER;\n\n const cb = () => {\n if (cXContext.loaded) {\n fire(cXContext.dmp);\n } else {\n cXContext.resolveTrigger();\n }\n };\n // run this script as a pageview\n document.addEventListener(trigger.in, cb);\n log(`listen to '${trigger.in}' for fire`);\n\n // this is for logouts\n const clear = () => {\n Storage.del(persist.cache.name);\n log(`heard '${trigger.clear}' and cleared cache`);\n };\n // requested by Androme\n const close = () => {\n document.removeEventListener(trigger.in, cb);\n document.removeEventListener(trigger.clear, clear);\n document.removeEventListener(trigger.close, close);\n log(`heard '${trigger.close}' and deafened`);\n };\n if (trigger.clear) {\n document.addEventListener(trigger.clear, clear);\n log(`listen to '${trigger.clear}' for cache clear`);\n }\n if (trigger.close) {\n document.addEventListener(trigger.close, close);\n log(`listen to '${trigger.close}' for cleanup`);\n }\n}\n","import log from './logger';\n\nconst addExternalIds = dmps => {\n dmps.forEach(dmp => {\n // Check and assign default values if necessary\n if (!dmp.prefix) {\n log('ERROR: dmp.prefix is not defined'); // TODO make actual console log error\n }\n\n if (dmp.parsedIds) {\n dmp.parsedIds.forEach(pid => {\n window.cX.callQueue.push([\n 'addExternalId',\n { id: pid.value, type: pid.prefix },\n ]);\n log(`add externalId ${pid.value} on ${pid.prefix}`);\n });\n }\n });\n};\n\nexport default addExternalIds;\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","import log from './logger';\n\nconst asyncAddUserId = dmp => {\n let newDmp;\n if (\n dmp &&\n dmp.length &&\n dmp[0].ids &&\n dmp[0].ids[0] &&\n dmp[0].ids[0].type &&\n dmp[0].ids[0].type === 'auth0'\n ) {\n try {\n const auth0SdkId = window.__NEXT_DATA__.runtimeConfig.AUTH0_CLIENT_ID;\n newDmp = window.CIAM.getUserInfo(auth0SdkId)\n .then(result => {\n dmp[0].parsedIds.push({ key: 'auth0', value: result.sub });\n return dmp;\n })\n .catch(error => {\n log('Auth0-SDK Error: ', error);\n });\n } catch (error) {\n log(error);\n }\n } else {\n newDmp = Promise.resolve(dmp);\n }\n return newDmp;\n};\nexport default asyncAddUserId;\n"],"names":["log","sha256","ascii","i","j","rightRotate","value","amount","mathPow","Math","pow","maxWord","lengthProperty","result","words","asciiBitLength","hash","h","k","primeCounter","isComposite","candidate","charCodeAt","w","slice","oldHash","w15","w2","a","e","temp1","concat","b","toString","Storage","key","type","window","localStorage","setItem","err","sessionStorage","getItem","removeItem","parsedId","parsedIds","dmps","length","forEach","dmp","ids","id","obj","split","name","val","index","get","document","cookie","ca","decodeURIComponent","c","charAt","substring","indexOf","location","search","match","script","querySelector","getAttribute","replace","prefix","push","fire","event","href","cX","callQueue","detail","url","siteid","pid","pathname","options","referrer","useAutoRefreshCheck","langIds","src","idPromise","auth0SdkId","__NEXT_DATA__","runtimeConfig","AUTH0_CLIENT_ID","newDmp","CIAM","getUserInfo","then","sub","catch","error","Promise","resolve","langs","Object","keys","join","RegExp","exec","reject","scriptTag","node","getElementById","createElement","getElementsByTagName","onload","onerror","async","parentNode","insertBefore","shouldPoll"],"mappings":"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"}