["<!-- Facebook Pixel Code -->\n    <script>\n        function getFBCookie(cname) {\n            let name = cname + \"=\";\n            let decodedCookie = decodeURIComponent(document.cookie);\n            let ca = decodedCookie.split(';');\n            for (let i = 0; i < ca.length; i++) {\n                let c = ca[i];\n                while (c.charAt(0) == ' ') {\n                    c = c.substring(1);\n                }\n                if (c.indexOf(name) == 0) {\n                    return c.substring(name.length, c.length);\n                }\n            }\n            return \"\";\n        }\n\n        function getUrlParameter(param) {\n            const urlParams = new URLSearchParams(window.location.search);\n            return urlParams.get(param);\n        }\n\n                    // Transitional cleanup until cookies are expirex. Safe to delete this whole block after 2026-07-23.\n            document.cookie.split(';').forEach(function (cookie) {\n                let cookieName = cookie.split('=')[0].trim();\n                if (cookieName.indexOf('fb_event_') === 0) {\n                    document.cookie = cookieName + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';\n                }\n            });\n        \n                \n        !function (f, b, e, v, n, t, s) {\n            if (f.fbq) return;\n            n = f.fbq = function () {\n                n.callMethod ?\n                    n.callMethod.apply(n, arguments) : n.queue.push(arguments);\n            };\n            if (!f._fbq) f._fbq = n;\n            n.push = n;\n            n.loaded = !0;\n            n.version = \"2.0\";\n            n.queue = [];\n            t = b.createElement(e);\n            t.async = !0;\n            t.src = v;\n            s = b.getElementsByTagName(e)[0];\n            s.parentNode.insertBefore(t, s);\n        }(window, document, \"script\",\n            \"https://connect.facebook.net/en_US/fbevents.js\");\n\n        fbq(\"init\", '1028206313134043');\n                let eventTime = Date.now();\n        let fbp = getFBCookie('_fbp');\n        let fbc = getFBCookie('_fbc');\n\n                        let txId = getUrlParameter('form_submission_id') ?? eventTime;\n\n                    let event = getUrlParameter('form_submission_id') ? 'Lead' : 'PageView';\n        \n                    eventID = `page.${event}.tx_${txId}`;\n        \n                        let post = {\n              domain: 'shop.beusinkmarketing.nl',\n              conversion_type: 'PageView',\n              url: window.location.href,\n              event_id: eventID,\n              event_time: eventTime,\n            };\n\n            if (getUrlParameter(\"pagese\")) {\n              post.email = getUrlParameter(\"pagese\");\n            }\n\n            if (getUrlParameter(\"pagesf\")) {\n              post.first_name = getUrlParameter(\"pagesf\");\n            }\n\n            if (getUrlParameter(\"pagesl\")) {\n              post.last_name = getUrlParameter(\"pagesl\");\n            }\n\n            if (fbp !== \"\") {\n              post.fbp = fbp;\n            }\n\n            if (fbc !== \"\") {\n              post.fbc = fbc;\n            }\n\n            const url = 'https://shop.beusinkmarketing.nl/client/facebook-conversion/events';\n            let xhr = new XMLHttpRequest();\n            xhr.open(\"POST\", url, true);\n            xhr.setRequestHeader(\"Content-type\", \"application/json; charset=UTF-8\");\n            xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n            xhr.send(JSON.stringify(post));\n        \n        if (event) {\n            let eventStorageKey = 'fb_event_' + eventID;\n            let eventTracked = false;\n            try {\n                eventTracked = localStorage.getItem(eventStorageKey) !== null;\n            } catch (e) {\n                // localStorage may be unavailable (private mode / disabled storage); fire anyway.\n            }\n\n            if (!eventTracked) {\n                let fbData = {};\n\n                if (fbp !== \"\") {\n                    fbData.fbp = fbp;\n                }\n\n                if (fbc !== \"\") {\n                    fbData.fbc = fbc;\n                }\n\n                \n                fbq(\"track\", 'PageView', fbData, { eventID: eventID });\n\n                try {\n                    localStorage.setItem(eventStorageKey, eventTime.toString());\n\n                    // eventID is unique per page load for non `Purchase` events (PageView,AddToCart etc), so we cap\n                    // the amount of keys because frequent testing the same page would break the localStorage quota\n                    const fbEventKeys = Object.keys(localStorage)\n                        .filter(key => key.indexOf('fb_event_') === 0)\n                        .map(key => ({ key: key, timestamp: parseInt(localStorage.getItem(key), 10) || 0 }))\n                        .sort((a, b) => b.timestamp - a.timestamp);\n                    fbEventKeys.slice(50).forEach(entry => localStorage.removeItem(entry.key));\n                } catch (e) {\n                    // Ignore storage failures (quota / private mode).\n                }\n            }\n        }\n\n    </script>\n    <!-- End Facebook Pixel Code -->\n",{"name":"fb","location":"head","consentType":"statistical","content":"<!-- Facebook Pixel Code -->\n    <script>\n        function getFBCookie(cname) {\n            let name = cname + \"=\";\n            let decodedCookie = decodeURIComponent(document.cookie);\n            let ca = decodedCookie.split(';');\n            for (let i = 0; i < ca.length; i++) {\n                let c = ca[i];\n                while (c.charAt(0) == ' ') {\n                    c = c.substring(1);\n                }\n                if (c.indexOf(name) == 0) {\n                    return c.substring(name.length, c.length);\n                }\n            }\n            return \"\";\n        }\n\n        function getUrlParameter(param) {\n            const urlParams = new URLSearchParams(window.location.search);\n            return urlParams.get(param);\n        }\n\n                    // Transitional cleanup until cookies are expirex. Safe to delete this whole block after 2026-07-23.\n            document.cookie.split(';').forEach(function (cookie) {\n                let cookieName = cookie.split('=')[0].trim();\n                if (cookieName.indexOf('fb_event_') === 0) {\n                    document.cookie = cookieName + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';\n                }\n            });\n        \n                \n        !function (f, b, e, v, n, t, s) {\n            if (f.fbq) return;\n            n = f.fbq = function () {\n                n.callMethod ?\n                    n.callMethod.apply(n, arguments) : n.queue.push(arguments);\n            };\n            if (!f._fbq) f._fbq = n;\n            n.push = n;\n            n.loaded = !0;\n            n.version = \"2.0\";\n            n.queue = [];\n            t = b.createElement(e);\n            t.async = !0;\n            t.src = v;\n            s = b.getElementsByTagName(e)[0];\n            s.parentNode.insertBefore(t, s);\n        }(window, document, \"script\",\n            \"https://connect.facebook.net/en_US/fbevents.js\");\n\n        fbq(\"init\", '1028206313134043');\n                let eventTime = Date.now();\n        let fbp = getFBCookie('_fbp');\n        let fbc = getFBCookie('_fbc');\n\n                        let txId = getUrlParameter('form_submission_id') ?? eventTime;\n\n                    let event = getUrlParameter('form_submission_id') ? 'Lead' : 'PageView';\n        \n                    eventID = `page.${event}.tx_${txId}`;\n        \n                        let post = {\n              domain: 'shop.beusinkmarketing.nl',\n              conversion_type: 'PageView',\n              url: window.location.href,\n              event_id: eventID,\n              event_time: eventTime,\n            };\n\n            if (getUrlParameter(\"pagese\")) {\n              post.email = getUrlParameter(\"pagese\");\n            }\n\n            if (getUrlParameter(\"pagesf\")) {\n              post.first_name = getUrlParameter(\"pagesf\");\n            }\n\n            if (getUrlParameter(\"pagesl\")) {\n              post.last_name = getUrlParameter(\"pagesl\");\n            }\n\n            if (fbp !== \"\") {\n              post.fbp = fbp;\n            }\n\n            if (fbc !== \"\") {\n              post.fbc = fbc;\n            }\n\n            const url = 'https://shop.beusinkmarketing.nl/client/facebook-conversion/events';\n            let xhr = new XMLHttpRequest();\n            xhr.open(\"POST\", url, true);\n            xhr.setRequestHeader(\"Content-type\", \"application/json; charset=UTF-8\");\n            xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n            xhr.send(JSON.stringify(post));\n        \n        if (event) {\n            let eventStorageKey = 'fb_event_' + eventID;\n            let eventTracked = false;\n            try {\n                eventTracked = localStorage.getItem(eventStorageKey) !== null;\n            } catch (e) {\n                // localStorage may be unavailable (private mode / disabled storage); fire anyway.\n            }\n\n            if (!eventTracked) {\n                let fbData = {};\n\n                if (fbp !== \"\") {\n                    fbData.fbp = fbp;\n                }\n\n                if (fbc !== \"\") {\n                    fbData.fbc = fbc;\n                }\n\n                \n                fbq(\"track\", 'PageView', fbData, { eventID: eventID });\n\n                try {\n                    localStorage.setItem(eventStorageKey, eventTime.toString());\n\n                    // eventID is unique per page load for non `Purchase` events (PageView,AddToCart etc), so we cap\n                    // the amount of keys because frequent testing the same page would break the localStorage quota\n                    const fbEventKeys = Object.keys(localStorage)\n                        .filter(key => key.indexOf('fb_event_') === 0)\n                        .map(key => ({ key: key, timestamp: parseInt(localStorage.getItem(key), 10) || 0 }))\n                        .sort((a, b) => b.timestamp - a.timestamp);\n                    fbEventKeys.slice(50).forEach(entry => localStorage.removeItem(entry.key));\n                } catch (e) {\n                    // Ignore storage failures (quota / private mode).\n                }\n            }\n        }\n\n    </script>\n    <!-- End Facebook Pixel Code -->\n","attributes":null}]