{"id":4934,"date":"2026-03-04T06:31:19","date_gmt":"2026-03-04T05:31:19","guid":{"rendered":"https:\/\/ba.be\/?p=4934"},"modified":"2026-03-04T07:04:02","modified_gmt":"2026-03-04T06:04:02","slug":"sovereignty-eng","status":"publish","type":"post","link":"https:\/\/ba.be\/en\/lab-en\/sovereignty-eng\/","title":{"rendered":"Digital Sovereignty Inspector"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"4934\" class=\"elementor elementor-4934 elementor-4933\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-40763e0 e-flex e-con-boxed e-con e-parent\" data-id=\"40763e0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f39bcc8 e-flex e-con-boxed e-con e-parent\" data-id=\"f39bcc8\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-429cada elementor-widget elementor-widget-text-editor\" data-id=\"429cada\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-path-to-node=\"1\"><b data-path-to-node=\"1\" data-index-in-node=\"0\">Take the test: How dependent is your organization on American tech giants?<\/b><\/h3><p data-path-to-node=\"2\">In recent years, many organizations have made important choices regarding their digital infrastructure. Often, they have, consciously or unconsciously, opted for American providers.<\/p><p data-path-to-node=\"3\">Curious about where your organization stands? Enter your domain name and discover immediately where your email and website are hosted. Based on this, we provide an indicative score of your digital sovereignty.<\/p><p data-path-to-node=\"4\">You can read more about why this is important\u00a0<span style=\"background-color: #f4f7fa;\">\u00a0<\/span><a style=\"--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 \/ 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; background-color: #f4f7fa; color: #2e82b5; border: 0px solid #e5e7eb;\" href=\"https:\/\/ba.be\/2-the-bad\/digitalesovereiniteit-1\/\">here<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3d7298c e-flex e-con-boxed e-con e-parent\" data-id=\"3d7298c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9d93aa4 elementor-widget elementor-widget-html\" data-id=\"9d93aa4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<html lang=\"nl\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Digitale Soevereiniteit Analyse - ba.be<\/title>\n    <script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n    <style>\n        :root {\n            --babe-blue: #005eb8;\n            --babe-light: #f4f7fa;\n        }\n        body {\n            background-color: var(--babe-light);\n            color: #333;\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n        }\n        .babe-header {\n            background-color: var(--babe-light);\n            color: white;\n        }\n        .card {\n            background: white;\n            border-radius: 8px;\n            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n            border-top: 5px solid var(--babe-light);\n        }\n        #scoreProgress {\n            transition: stroke-dashoffset 1.2s ease-in-out, color 0.5s ease;\n        }\n        .status-badge-us {\n            background-color: #c53030;\n            color: white;\n            padding: 3px 10px;\n            border-radius: 4px;\n            font-weight: 800;\n            font-size: 10px;\n            letter-spacing: 0.05em;\n        }\n        .status-badge-eu {\n            background-color: #2f855a;\n            color: white;\n            padding: 3px 10px;\n            border-radius: 4px;\n            font-weight: 800;\n            font-size: 10px;\n        }\n        .finding-critical {\n            border-left: 5px solid #c53030;\n            background: #fff5f5;\n        }\n        #app { display: none; }\n    <\/style>\n<\/head>\n<body>\n\n    <!-- \n        (c) ba.be Jan Guldentops ( j@ba.be ) \n    -->\n\n    <!-- Lock screen -->\n    <div id=\"lock-screen\" class=\"min-h-screen flex items-center justify-center p-4 bg-gray-200\">\n        <div class=\"card p-12 max-w-lg text-center\">\n            <h1 class=\"text-4xl font-black text-[#005eb8] mb-4\" id=\"lock-title\">TOEGANG GEWEIGERD<\/h1>\n            <p class=\"text-gray-600 mb-6 font-medium\" id=\"lock-msg\">Deze tool is exclusief beschikbaar voor gebruik via de domeinen van ba.be.<\/p>\n            <div class=\"p-4 bg-gray-100 rounded text-xs text-gray-500 italic\" id=\"lock-sub\">\n                De referer check kon uw herkomst niet verifi\u00ebren als een geautoriseerd ba.be domein.\n            <\/div>\n            <p class=\"mt-8 text-[10px] text-gray-400\">&copy; ba.be - Jan Guldentops<\/p>\n        <\/div>\n    <\/div>\n\n    <!-- Hoofdapplicatie -->\n    <div id=\"app\" class=\"min-h-screen pb-12\">\n        <main class=\"max-w-6xl mx-auto px-4\">\n            <!-- Zoeksectie -->\n            <div class=\"card p-8 mb-10\">\n                <div class=\"flex flex-col md:flex-row gap-4\">\n                    <input type=\"text\" id=\"domainInput\" placeholder=\"...\" \n                        class=\"flex-1 p-4 border-2 border-gray-200 rounded-lg focus:border-blue-500 outline-none text-xl font-medium transition-all\">\n                    <button onclick=\"startAnalyse()\" id=\"btn-analyse\"\n                        class=\"bg-[#005eb8] hover:bg-blue-700 text-white font-black py-4 px-10 rounded-lg shadow-lg transform active:scale-95 transition-all uppercase tracking-widest\">\n                        ...\n                    <\/button>\n                <\/div>\n                <p id=\"error-message\" class=\"text-red-600 font-bold text-center mt-4 hidden\"><\/p>\n            <\/div>\n\n            <!-- Resultaten -->\n            <div id=\"resultsArea\" class=\"hidden animate-fade-in\">\n                <div class=\"grid grid-cols-1 lg:grid-cols-3 gap-8 mb-10\">\n                    <div class=\"card p-8 flex flex-col items-center justify-center\">\n                        <h3 class=\"text-gray-400 uppercase text-xs font-black tracking-widest mb-4\" id=\"label-score\">...<\/h3>\n                        <div class=\"relative flex items-center justify-center scale-110\">\n                            <svg class=\"w-40 h-40\">\n                                <circle cx=\"80\" cy=\"80\" r=\"74\" stroke=\"#edf2f7\" stroke-width=\"12\" fill=\"transparent\" \/>\n                                <circle id=\"scoreProgress\" cx=\"80\" cy=\"80\" r=\"74\" stroke=\"currentColor\" stroke-width=\"12\" fill=\"transparent\" \n                                    stroke-dasharray=\"464.7\" stroke-dashoffset=\"464.7\" class=\"transform -rotate-90 origin-center\" \/>\n                            <\/svg>\n                            <span id=\"scoreText\" class=\"absolute text-4xl font-black\">0%<\/span>\n                        <\/div>\n                        <div id=\"scoreLabelBox\" class=\"mt-6 px-4 py-1 rounded text-white text-xs font-bold uppercase tracking-widest\"><\/div>\n                        <p id=\"scoreMessage\" class=\"mt-2 font-bold text-sm text-center px-4\"><\/p>\n                    <\/div>\n\n                    <div class=\"card p-8 lg:col-span-2\">\n                        <h3 class=\"text-gray-400 uppercase text-xs font-black tracking-widest mb-6\" id=\"label-samenvatting\">...<\/h3>\n                        <ul id=\"summaryList\" class=\"space-y-4\"><\/ul>\n                    <\/div>\n                <\/div>\n\n                <div class=\"grid grid-cols-1 md:grid-cols-2 gap-8\">\n                    <div class=\"card p-6\">\n                        <h2 class=\"text-lg font-black mb-4 border-b pb-2 flex justify-between items-center\">\n                            <span id=\"label-mail\">...<\/span>\n                        <\/h2>\n                        <div id=\"mx-details\" class=\"space-y-2\"><\/div>\n                    <\/div>\n                    <div class=\"card p-6\">\n                        <h2 class=\"text-lg font-black mb-4 border-b pb-2 flex justify-between items-center\">\n                            <span id=\"label-host\">...<\/span>\n                        <\/h2>\n                        <div id=\"web-details\" class=\"space-y-2\"><\/div>\n                    <\/div>\n                <\/div>\n                \n                <div class=\"card p-6 mt-8\">\n                    <h2 class=\"text-lg font-black mb-4 border-b pb-2\" id=\"label-spf-detail\">...<\/h2>\n                    <div id=\"spf-details\" class=\"space-y-4\"><\/div>\n                <\/div>\n            <\/div>\n\n            <div id=\"loader\" class=\"hidden flex flex-col items-center py-20\">\n                <div class=\"animate-spin rounded-full h-16 w-16 border-t-4 border-b-4 border-[#005eb8]\"><\/div>\n                <p class=\"mt-6 text-gray-500 font-bold animate-pulse\" id=\"label-loading\">...<\/p>\n            <\/div>\n        <\/main>\n\n        <\/div>\n\n    <script>\n        \/**\n         * CONFIGURATIE & VARIABELEN\n         * (c) ba.be Jan Guldentops\n         *\/\n        \n        const TALEN = {\n            en: {\n                subtitle: \"Legal audit based on Cloud Act risks\",\n                btnAnalyse: \"Start Sovereignty Check\",\n                placeholder: \"Enter domain (e.g., apple.com)\",\n                scoreLabel: \"Sovereignty Score\",\n                samenvatting: \"Risk Audit Results\",\n                loading: \"Analyzing ownership and jurisdiction...\",\n                msgHigh: \"FULLY SOVEREIGN\",\n                msgMed: \"COMPROMISED\",\n                msgLow: \"NO SOVEREIGNTY\",\n                subHigh: \"You have full control over your data infrastructure.\",\n                subMed: \"A core sector (Mail or Hosting) is hosted by a US company.\",\n                subLow: \"Mail and Hosting are both at a US company.\",\n                noRecords: \"No records found.\",\n                error: \"Analysis failed. Check the domain.\",\n                lMail: \"Email & SPF\",\n                lHost: \"Webhosting & CNAME\",\n                lSPF: \"SPF Records Detail\",\n                lUS: \"US JURISDICTION\",\n                lEU: \"INDEPENDENT\",\n                lUSOwn: \"US OWNED\",\n                footer: \"<strong>Absolute Scoring:<\/strong> This tool uses binary logic. 50% of the score depends on mail infrastructure (MX\/SPF) and 50% on hosting (IP Org\/CNAME). When both are in the hands of US entities, sovereignty is impossible to guarantee under the <strong>US Cloud Act<\/strong>, resulting in a score of <strong>0%<\/strong>.\",\n                lockTitle: \"ACCESS DENIED\",\n                lockMsg: \"This tool is exclusively available via ba.be domains.\",\n                lockSub: \"The referer check could not verify your origin.\"\n            },\n            nl: {\n                subtitle: \"Juridische audit op basis van Cloud Act risico's\",\n                btnAnalyse: \"Start Sovereignty Check\",\n                placeholder: \"Voer domeinnaam in (bv. vlaanderen.be)\",\n                scoreLabel: \"Soevereiniteit Score\",\n                samenvatting: \"Resultaten Risk-audit\",\n                loading: \"Analyseren van eigendomsrechten en jurisdictie...\",\n                msgHigh: \"VOLLEDIG SOEVEREIN\",\n                msgMed: \"GECOMPROMITTEERD\",\n                msgLow: \"GEEN SOEVEREINITEIT\",\n                subHigh: \"U heeft volledige controle over uw data-infrastructuur.\",\n                subMed: \"Een kernactiviteiten (Mail of Hosting) is in handen van een Amerikaans bedrijf.\",\n                subLow: \"Mail en Hosting zijn beide juridisch onderworpen aan de Amerikaase wetgeving.\",\n                noRecords: \"Geen records gevonden.\",\n                error: \"Analyse mislukt. Controleer het domein.\",\n                lMail: \"E-mail & SPF\",\n                lHost: \"Webhosting & CNAME\",\n                lSPF: \"SPF Records Detail\",\n                lUS: \"US JURISDICTIE\",\n                lEU: \"ONAFHANKELIJK\",\n                lUSOwn: \"US OWNED\",\n                footer: \"<strong>Absolute Scoring:<\/strong> Deze tool hanteert een binaire logica. 50% van de score hangt af van de mail-infrastructuur (MX\/SPF) en 50% van de hosting (IP Org\/CNAME). Wanneer beide in handen zijn van Amerikaanse entiteiten, is de soevereiniteit onmogelijk te garanderen onder de <strong>US Cloud Act<\/strong>, wat resulteert in een score van <strong>0%<\/strong>.\",\n                lockTitle: \"TOEGANG GEWEIGERD\",\n                lockMsg: \"Deze tool is exclusief beschikbaar voor gebruik via de domeinen van ba.be.\",\n                lockSub: \"De referer check kon uw herkomst niet verifi\u00ebren.\"\n            },\n            fr: {\n                subtitle: \"Audit juridique bas\u00e9 sur les risques du Cloud Act\",\n                btnAnalyse: \"D\u00e9marrer l'audit\",\n                placeholder: \"Entrez le domaine (ex. belgium.be)\",\n                scoreLabel: \"Score de souverainet\u00e9\",\n                samenvatting: \"R\u00e9sultats de l'audit des risques\",\n                loading: \"Analyse de la propri\u00e9t\u00e9 et de la juridiction...\",\n                msgHigh: \"PLEINEMENT SOUVERAIN\",\n                msgMed: \"COMPROMIS\",\n                msgLow: \"AUCUNE SOUVERAINET\u00c9\",\n                subHigh: \"Vous avez le contr\u00f4le total de votre infrastructure.\",\n                subMed: \"Un secteur cl\u00e9 (Mail ou H\u00e9bergement) estsoumis juridiqueement des US.\",\n                subLow: \"Le mail et l'h\u00e9bergement sont tous deux soumis juridiquement aux US.\",\n                noRecords: \"Aucun enregistrement trouv\u00e9.\",\n                error: \"\u00c9chec de l'analyse. V\u00e9rifiez le domaine.\",\n                lMail: \"E-mail & SPF\",\n                lHost: \"H\u00e9bergement & CNAME\",\n                lSPF: \"D\u00e9tails des enregistrements SPF\",\n                lUS: \"JURIDICTION US\",\n                lEU: \"IND\u00c9PENDANT\",\n                lUSOwn: \"PROPRI\u00c9T\u00c9 US\",\n                footer: \"<strong>Scoring Absolu :<\/strong> Cet outil utilise une logique binaire. 50% du score d\u00e9pend de l'infrastructure mail (MX\/SPF) et 50% de l'h\u00e9bergement (IP Org\/CNAME). Lorsque les deux sont aux mains d'entit\u00e9s am\u00e9ricaines, la souverainet\u00e9 est impossible \u00e0 garantir sous le <strong>US Cloud Act<\/strong>, ce qui donne un score de <strong>0%<\/strong>.\",\n                lockTitle: \"ACC\u00c8S REFUS\u00c9\",\n                lockMsg: \"Cet outil est exclusivement disponible via les domaines ba.be.\",\n                lockSub: \"Le contr\u00f4le du referer n'a pas pu v\u00e9rifier votre origine.\"\n            }\n        };\n\n        \/\/ Detect language from browser\n        const getPreferredLang = () => {\n            const browserLang = (navigator.language || 'en').split('-')[0].toLowerCase();\n            return TALEN[browserLang] ? browserLang : 'en';\n        };\n\n        const CURRENT_LANG = getPreferredLang();\n        const t = TALEN[CURRENT_LANG];\n\n        const ALLOWED_REFERRER_PATTERN = \/(^|\\.)ba\\.be$\/;\n\n        const US_HYPERSCALERS = [\n            { name: 'Microsoft', patterns: ['outlook.com', 'microsoft', 'azure', 'onmicrosoft', 'lync', 'protection.outlook.com', 'edgecompute.app', 'sharepoint.com'] },\n            { name: 'Google', patterns: ['google.com', 'googlemail', 'googledomains', 'aspmx.l.google.com', '_spf.google.com', 'googleusercontent.com', 'appspot.com', 'google'] },\n            { name: 'Amazon', patterns: ['amazonaws.com', 'amazon.com', 'cloudfront.net', 'aws.com'] },\n            { name: 'Akamai', patterns: ['akamai', 'akamaiedge', 'edgesuite', 'edgekey', 'akam.net', 'akam-'] },\n            { name: 'Cloudflare', patterns: ['cloudflare.com', 'cloudflare.net'] },\n            { name: 'Fastly', patterns: ['fastly.net', 'fastly.com'] },\n            { name: 'Vercel \/ Netlify', patterns: ['vercel', 'netlify'] },\n            { name: 'Salesforce \/ Heroku', patterns: ['salesforce.com', 'heroku'] },\n            { name: 'DigitalOcean', patterns: ['digitalocean'] },\n            { name: 'SendGrid \/ Mailchimp', patterns: ['sendgrid', 'mailchimp', 'mcsv.net'] }\n        ];\n\n        let state = { score: 100, findings: [], mxRecords: [], spfRecords: [], aRecords: [], cnameRecords: [], ipOrgs: {} };\n\n        \/**\n         * ACCESS CONTROL\n         *\/\n        function checkAccess() {\n            const referrer = document.referrer;\n            if (!referrer || referrer === \"\") {\n                \/\/ Return true for local\/canvas preview usually, but strictly speaking:\n                return true; \n            }\n            try {\n                const url = new URL(referrer);\n                if (ALLOWED_REFERRER_PATTERN.test(url.hostname)) {\n                    return true;\n                }\n            } catch (e) {}\n            showLockScreen();\n            return false;\n        }\n\n        function showLockScreen() {\n            document.getElementById('app').style.display = 'none';\n            document.getElementById('lock-screen').style.display = 'flex';\n        }\n\n        \/**\n         * CORE LOGIC\n         *\/\n        async function fetchDNS(domain, type) {\n            try {\n                const response = await fetch(`https:\/\/dns.google\/resolve?name=${domain}&type=${type}`);\n                const data = await response.json();\n                return data.Answer || [];\n            } catch { return []; }\n        }\n\n        async function fetchIPOrg(ip) {\n            try {\n                const response = await fetch(`https:\/\/rdap.db.ripe.net\/ip\/${ip}`);\n                if (!response.ok) return \"UNKNOWN\";\n                const data = await response.json();\n                return (data.name || data.handle || \"UNKNOWN\").toUpperCase();\n            } catch { return \"ERROR\"; }\n        }\n\n        function checkForUS(content) {\n            if (!content) return null;\n            const lowerContent = content.toLowerCase();\n            return US_HYPERSCALERS.find(provider => \n                provider.patterns.some(p => lowerContent.includes(p.toLowerCase()))\n            );\n        }\n\n        async function startAnalyse() {\n            const domainInput = document.getElementById('domainInput');\n            const domain = domainInput.value.trim();\n            if (!domain) return;\n            document.getElementById('error-message').classList.add('hidden');\n            document.getElementById('loader').classList.remove('hidden');\n            document.getElementById('resultsArea').classList.add('hidden');\n\n            try {\n                state = { score: 100, findings: [], mxRecords: [], spfRecords: [], aRecords: [], cnameRecords: [], ipOrgs: {} };\n                const wwwDomain = domain.startsWith('www.') ? domain : `www.${domain}`;\n\n                const [mx, txt, a, cname, cnameWww] = await Promise.all([\n                    fetchDNS(domain, 'MX'), fetchDNS(domain, 'TXT'), fetchDNS(domain, 'A'), fetchDNS(domain, 'CNAME'), fetchDNS(wwwDomain, 'CNAME')\n                ]);\n\n                state.mxRecords = mx;\n                state.spfRecords = txt.filter(r => r.data.includes('v=spf1'));\n                state.aRecords = a;\n                state.cnameRecords = [...new Set([...cname.map(c => c.data), ...cnameWww.map(c => c.data)])];\n\n                for (const record of state.aRecords) {\n                    state.ipOrgs[record.data] = await fetchIPOrg(record.data);\n                }\n\n                performEvaluation();\n                renderResults();\n                document.getElementById('loader').classList.add('hidden');\n                document.getElementById('resultsArea').classList.remove('hidden');\n            } catch {\n                document.getElementById('loader').classList.add('hidden');\n                document.getElementById('error-message').classList.remove('hidden');\n            }\n        }\n\n        function performEvaluation() {\n            let mailComp = false;\n            let hostComp = false;\n\n            state.mxRecords.forEach(r => {\n                const p = checkForUS(r.data);\n                if (p && !mailComp) {\n                    state.findings.push(`MX: ${p.name}`);\n                    mailComp = true;\n                }\n            });\n\n            state.spfRecords.forEach(r => {\n                const mechanisms = r.data.toLowerCase().split(\/\\s+\/);\n                mechanisms.forEach(mech => {\n                    if (mech.includes('include:')) {\n                        const target = mech.split(':')[1] || \"\";\n                        const p = checkForUS(target);\n                        if (p && !mailComp) {\n                            state.findings.push(`SPF include: ${p.name}`);\n                            mailComp = true;\n                        }\n                    }\n                });\n            });\n\n            Object.entries(state.ipOrgs).forEach(([ip, org]) => {\n                const p = checkForUS(org);\n                if (p && !hostComp) {\n                    state.findings.push(`HOST: ${org}`);\n                    hostComp = true;\n                }\n            });\n\n            state.cnameRecords.forEach(data => {\n                const p = checkForUS(data);\n                if (p && !hostComp) {\n                    state.findings.push(`CNAME: ${p.name}`);\n                    hostComp = true;\n                }\n            });\n\n            state.score = 100 - (mailComp ? 50 : 0) - (hostComp ? 50 : 0);\n            state.findings = [...new Set(state.findings)];\n        }\n\n        function renderResults() {\n            const st = document.getElementById('scoreText');\n            const sc = document.getElementById('scoreProgress');\n            const sm = document.getElementById('scoreMessage');\n            const sl = document.getElementById('scoreLabelBox');\n\n            st.innerText = `${state.score}%`;\n            sc.style.strokeDashoffset = 464.7 - (state.score \/ 100) * 464.7;\n\n            if (state.score === 100) {\n                sc.style.color = '#38a169'; sm.innerText = t.subHigh; sl.innerText = t.msgHigh; sl.className = \"mt-6 px-4 py-1 rounded text-white text-xs font-bold uppercase tracking-widest bg-green-600\";\n            } else if (state.score === 50) {\n                sc.style.color = '#dd6b20'; sm.innerText = t.subMed; sl.innerText = t.msgMed; sl.className = \"mt-6 px-4 py-1 rounded text-white text-xs font-bold uppercase tracking-widest bg-orange-500\";\n            } else {\n                sc.style.color = '#c53030'; sm.innerText = t.subLow; sl.innerText = t.msgLow; sl.className = \"mt-6 px-4 py-1 rounded text-white text-xs font-bold uppercase tracking-widest bg-red-700\";\n            }\n\n            const list = document.getElementById('summaryList');\n            list.innerHTML = state.findings.length ? '' : `<li class=\"text-green-600 font-bold bg-green-50 p-4 rounded border-l-4 border-green-500 text-xs\">${t.noRecords}<\/li>`;\n            state.findings.forEach(f => {\n                list.innerHTML += `<li class=\"finding-critical p-3 rounded text-gray-800 font-medium text-xs flex gap-2\"><span>\u26a0\ufe0f<\/span> ${f}<\/li>`;\n            });\n\n            document.getElementById('mx-details').innerHTML = state.mxRecords.map(r => `\n                <div class=\"p-2 bg-gray-50 border rounded flex justify-between items-center text-[10px] mb-1 font-mono\">\n                    <span class=\"truncate w-3\/4\">${r.data}<\/span>\n                    ${checkForUS(r.data) ? `<span class=\"status-badge-us\">${t.lUS}<\/span>` : `<span class=\"status-badge-eu\">${t.lEU}<\/span>`}\n                <\/div>`).join('') || t.noRecords;\n\n            let webHtml = '';\n            state.cnameRecords.forEach(c => {\n                const p = checkForUS(c);\n                webHtml += `<div class=\"p-2 bg-blue-50 border rounded flex justify-between items-center text-[10px] mb-1 font-mono\">\n                    <span class=\"truncate w-3\/4\">CNAME: ${c}<\/span>\n                    ${p ? `<span class=\"status-badge-us\">${t.lUS}<\/span>` : ''}\n                <\/div>`;\n            });\n            state.aRecords.forEach(r => {\n                const org = state.ipOrgs[r.data];\n                const p = checkForUS(org);\n                webHtml += `<div class=\"p-2 bg-gray-50 border rounded flex justify-between items-center text-[10px] mb-1 font-mono\">\n                    <span>IP: ${r.data}<br><span class=\"text-[9px] text-gray-400\">ORG: ${org}<\/span><\/span>\n                    ${p ? `<span class=\"status-badge-us\">${t.lUSOwn}<\/span>` : `<span class=\"status-badge-eu\">EU OWNED<\/span>`}\n                <\/div>`;\n            });\n            document.getElementById('web-details').innerHTML = webHtml || t.noRecords;\n\n            document.getElementById('spf-details').innerHTML = state.spfRecords.map(r => {\n                const parts = r.data.replace(\/\"\/g, '').split(\/\\s+\/);\n                const partHtml = parts.map(part => {\n                    if (part.startsWith('include:')) {\n                        const target = part.replace('include:', '');\n                        const p = checkForUS(target);\n                        return p ? `<span class=\"text-red-600 font-bold underline\" title=\"${p.name}\">${part}<\/span>` : `<span class=\"text-green-700 font-bold\">${part}<\/span>`;\n                    }\n                    return part;\n                }).join(' ');\n                return `<div class=\"p-3 bg-gray-50 border rounded text-[10px] font-mono break-all leading-relaxed\">${partHtml}<\/div>`;\n            }).join('') || t.noRecords;\n        }\n\n        \/**\n         * INITIALIZATION\n         *\/\n        window.addEventListener('DOMContentLoaded', () => {\n            document.getElementById('app').style.display = 'block';\n            document.getElementById('lock-screen').style.display = 'none';\n            \/\/ Apply translations\n            \/\/document.getElementById('header-subtitle').innerText = t.subtitle;\n            document.getElementById('btn-analyse').innerText = t.btnAnalyse;\n            document.getElementById('domainInput').placeholder = t.placeholder;\n            document.getElementById('label-score').innerText = t.scoreLabel;\n            document.getElementById('label-samenvatting').innerText = t.samenvatting;\n            document.getElementById('label-loading').innerText = t.loading;\n            document.getElementById('label-mail').innerText = t.lMail;\n            document.getElementById('label-host').innerText = t.lHost;\n            document.getElementById('label-spf-detail').innerText = t.lSPF;\n            document.getElementById('footer-text').innerHTML = t.footer;\n            document.getElementById('currentYear').innerText = new Date().getFullYear();\n            \n            document.getElementById('lock-title').innerText = t.lockTitle;\n            document.getElementById('lock-msg').innerText = t.lockMsg;\n            document.getElementById('lock-sub').innerText = t.lockSub;\n        });\n    <\/script>\n<\/body>\n<\/html>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5ab51fb e-flex e-con-boxed e-con e-parent\" data-id=\"5ab51fb\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b969e68 elementor-widget elementor-widget-text-editor\" data-id=\"b969e68\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>(c) version 0.1b March 3, 2026 Jan Guldentops ( j@ba.be ) &#8211; BA N.V.<\/strong><\/p><p data-path-to-node=\"2\">Please note: this test is currently in beta. The results are based on our own observations and the public DNS records of the domain. While these results are not set in stone and an occasional error may occur, they provide a clear indication of how intertwined an organization is with American providers.<\/p><p data-path-to-node=\"3\">We continue to develop and improve this software.<\/p><p data-path-to-node=\"4\">Feedback or collaboration? Notice an error or have a great idea for an expansion? Would you like to perform a structural test for a specific sector (such as all schools, SMEs in West Flanders, Germany, or another group)?<\/p><p data-path-to-node=\"5\">Please feel free to <a href=\"mailto:jan.guldentops@ba.be?subject=Digital%20sovereignty%20test\">contact<\/a>\u00a0us.<\/p><p data-path-to-node=\"4\"><em><strong>This software was created with the support of the European Union as part of the <a href=\"https:\/\/ba.be\/1-the-good\/cyberveilig\/\">CYSSME<\/a> project. CYSSME helps small businesses become cyber-secure and resilient, free of charge.<\/strong><\/em><\/p><p data-path-to-node=\"4\">\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7a4f8d0 e-grid e-con-boxed e-con e-parent\" data-id=\"7a4f8d0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-223d22d elementor-widget elementor-widget-image\" data-id=\"223d22d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/ba.be\/wp-content\/uploads\/2025\/08\/cyssme.jpg\" class=\"attachment-medium size-medium wp-image-4545\" alt=\"\" srcset=\"https:\/\/ba.be\/wp-content\/uploads\/2025\/08\/cyssme.jpg 300w, https:\/\/ba.be\/wp-content\/uploads\/2025\/08\/cyssme-150x150.jpg 150w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-64f9da8 elementor-widget elementor-widget-image\" data-id=\"64f9da8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/ba.be\/wp-content\/uploads\/2025\/08\/eccc-300x300.jpg\" class=\"attachment-medium size-medium wp-image-4542\" alt=\"\" srcset=\"https:\/\/ba.be\/wp-content\/uploads\/2025\/08\/eccc-300x300.jpg 300w, https:\/\/ba.be\/wp-content\/uploads\/2025\/08\/eccc-150x150.jpg 150w, https:\/\/ba.be\/wp-content\/uploads\/2025\/08\/eccc.jpg 450w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Take the test: How dependent is your organization on American tech giants? In recent years, many organizations have made important choices regarding their digital infrastructure. Often, they have, consciously or [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[75,85],"tags":[120,118,119],"class_list":["post-4934","post","type-post","status-publish","format-standard","hentry","category-lab","category-ongecategoriseerd","tag-digitalcolonialism","tag-digitalesfuture","tag-digitalsovereignty"],"_links":{"self":[{"href":"https:\/\/ba.be\/en\/wp-json\/wp\/v2\/posts\/4934","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ba.be\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ba.be\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ba.be\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ba.be\/en\/wp-json\/wp\/v2\/comments?post=4934"}],"version-history":[{"count":6,"href":"https:\/\/ba.be\/en\/wp-json\/wp\/v2\/posts\/4934\/revisions"}],"predecessor-version":[{"id":4960,"href":"https:\/\/ba.be\/en\/wp-json\/wp\/v2\/posts\/4934\/revisions\/4960"}],"wp:attachment":[{"href":"https:\/\/ba.be\/en\/wp-json\/wp\/v2\/media?parent=4934"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ba.be\/en\/wp-json\/wp\/v2\/categories?post=4934"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ba.be\/en\/wp-json\/wp\/v2\/tags?post=4934"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}