1<!doctype html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5
5<script src="https://web.cmp.usercentrics.eu/modules/autoblocker.js"></script>
5 6
6<script 7 id="usercentrics-cmp" 8 src="https://web.cmp.usercentrics.eu/ui/loader.js" 9 data-settings-id="ckYwpWFuHSjzav" 10 async 11 ></script>
11 12
12<script> 13 (function setupUsercentricsFlags() { 14 const localHosts = new Set(["localhost", "127.0.0.1"]); 15 const isLocalHost = localHosts.has(window.location.hostname); 16 const disableByEnv = "false" === "true"; 17 window.__DISABLE_USERCENTRICS__ = disableByEnv || isLocalHost; 18 })(); 19 </script>
19 20 <link rel="icon" type="image/svg+xml" href="/favicon.ico" /> 21 <link rel="preconnect" href="https://fonts.googleapis.com" /> 22 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 23 <!-- <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap" rel="stylesheet"> --> 24 <link 25 rel="preload" 26 href="https://fonts.gstatic.com/s/montserrat/v15/JTUSjIg1_i6t8kCHKm459Wlhzg.ttf" 27 as="font" 28 type="font/ttf" 29 crossorigin 30 /> 31 <link 32 rel="preload" 33 href="https://fonts.gstatic.com/s/montserrat/v15/JTURjIg1_i6t8kCHKm45_dJE3gnD_g.woff2" 34 as="font" 35 type="font/woff2" 36 crossorigin 37 /> 38 <style> 39 @font-face { 40 font-family: "Montserrat"; 41 font-style: normal; 42 font-weight: 400; 43 src: url(https://fonts.gstatic.com/s/montserrat/v15/JTUSjIg1_i6t8kCHKm459Wlhzg.ttf) 44 format("truetype"); 45 } 46 47 @font-face { 48 font-family: "Montserrat"; 49 font-style: normal; 50 font-weight: 700; 51 src: url(https://fonts.gstatic.com/s/montserrat/v15/JTURjIg1_i6t8kCHKm45_dJE3gnD_g.woff2) 52 format("woff2"); 53 } 54 </style> 55 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 56 <meta 57 name="description" 58 content="Når det handler om dig og dine ønsker. Hvis du overvejer en bank med hjertet på rette sted, er vi altid klar til en uforpligtende snak." 59 /> 60 <title>Hvidbjerg Bank</title> 61 62 <!-- Google tag (gtag.js) -->
vendor: 96 bytes, lines 62-65
62 63 <script 64 async 65 src="https://www.googletagmanager.com/gtag/js?id=
65G-SEVPLN82G2
vendor: 78 bytes, lines 65-68
65" 66 data-usercentrics="Google Analytics" 67 ></script> 68
68<script> 69 window.dataLayer = window.dataLayer || []; 70 function gtag() { 71 dataLayer.push(arguments); 72 } 73 74 const GA_MEASUREMENT_ID = "G-SEVPLN82G2"; 75 const IS_USERCENTRICS_DISABLED = window.__DISABLE_USERCENTRICS__ === true; 76 const IS_DEBUG_GA = 77 window.location.hostname !== "hvidbjergbank.dk" && 78 window.location.hostname !== "www.hvidbjergbank.dk"; 79 let hasInitializedGA = false; 80 81 function debugGA(...args) { 82 if (IS_DEBUG_GA) { 83 console.log("[ga-consent]", ...args); 84 } 85 } 86 87 // Always start from denied; consent updates are applied later. 88 gtag("js", new Date()); 89 gtag("consent", "default", { 90 ad_storage: "denied", 91 ad_user_data: "denied", 92 ad_personalization: "denied", 93 analytics_storage: "denied", 94 }); 95 96 function initGAOnce() { 97 if (hasInitializedGA) return; 98 hasInitializedGA = true; 99 gtag("config", GA_MEASUREMENT_ID); 100 window.__GA4_ENABLED__ = true; 101 debugGA("Initialized GA config after consent"); 102 } 103 104 function setGrantedAndInitGA() { 105 gtag("consent", "update", { 106 analytics_storage: "granted", 107 }); 108 initGAOnce(); 109 } 110 111 function isAnalyticsServiceAccepted(service) { 112 const name = (service?.name || "").toLowerCase(); 113 const templateId = (service?.templateId || "").toLowerCase(); 114 const category = (service?.categorySlug || "").toLowerCase(); 115 const isAnalyticsService = 116 name.includes("google analytics") || 117 name.includes("google tag manager") || 118 templateId.includes("google-analytics") || 119 templateId.includes("google-tag-manager") || 120 category.includes("analytics"); 121 return ( 122 isAnalyticsService && 123 (service?.consent?.status === true || 124 service?.consentStatus === true) 125 ); 126 } 127 128 function normalizeList(rawValue) { 129 if (Array.isArray(rawValue)) return rawValue; 130 if (rawValue && typeof rawValue === "object") return Object.values(rawValue); 131 return []; 132 } 133 134 function isAnalyticsCategoryAccepted(categories) { 135 return categories.some((category) => { 136 const slug = (category?.slug || category?.id || "").toLowerCase(); 137 const name = (category?.name || "").toLowerCase(); 138 const isAccepted = 139 category?.consent?.status === true || 140 category?.consentStatus === true || 141 category?.status === true || 142 category?.isConsentGranted === true; 143 const isAnalyticsCategory = 144 slug.includes("analytics") || 145 slug.includes("statistics") || 146 name.includes("analytics") || 147 name.includes("statistik"); 148 return isAccepted && isAnalyticsCategory; 149 }); 150 } 151 152 async function checkAnalyticsConsent() { 153 try { 154 const rawServices = await window.UC_UI?.getServicesBaseInfo?.(); 155 const rawCategories = await window.UC_UI?.getCategoriesBaseInfo?.(); 156 const services = normalizeList(rawServices); 157 const categories = normalizeList(rawCategories); 158 const hasServiceConsent = services.some(isAnalyticsServiceAccepted); 159 const hasCategoryConsent = isAnalyticsCategoryAccepted(categories); 160 const hasConsent = hasServiceConsent || hasCategoryConsent; 161 debugGA("Consent check", { 162 hasConsent, 163 hasServiceConsent, 164 hasCategoryConsent, 165 servicesCount: services.length, 166 categoriesCount: categories.length, 167 }); 168 if (hasConsent) { 169 setGrantedAndInitGA(); 170 } 171 } catch (error) { 172 debugGA("Consent check failed", error); 173 } 174 } 175 176 function setupConsentListeners() { 177 ["UC_UI_INITIALIZED", "UC_UI_CMP_EVENT", "UC_CONSENT"].forEach( 178 (eventName) => { 179 window.addEventListener(eventName, () => { 180 void checkAnalyticsConsent(); 181 }); 182 }, 183 ); 184 } 185 186 if (IS_USERCENTRICS_DISABLED) { 187 debugGA("Usercentrics disabled on local host"); 188 setGrantedAndInitGA(); 189 } else { 190 setupConsentListeners(); 191 void checkAnalyticsConsent(); 192 193 // Fallback for late-loaded CMP scripts. 194 let retryCount = 0; 195 const consentRetry = setInterval(() => { 196 retryCount += 1; 197 void checkAnalyticsConsent(); 198 if (hasInitializedGA || retryCount >= 20) { 199 clearInterval(consentRetry); 200 debugGA("Stopped consent polling", { 201 hasInitializedGA, 202 retryCount, 203 }); 204 } 205 }, 500); 206 } 207 </script>
207 208 209 <link href="/css/view.css" rel="stylesheet" /> 210 <link href="/css/smartmenu-core.css" rel="stylesheet" /> 211 <link href="/css/smartmenu-clean.css" rel="stylesheet" /> 212 <link href="/css/main.css" rel="stylesheet" /> 213 <link href="/css/style.min.css" rel="stylesheet" /> 214 <link href="/css/fontawesome.css" rel="stylesheet" /> 215 <link href="/css/index.css" rel="stylesheet" /> 216 <link href="/css/layout.css" rel="stylesheet" /> 217
217<script type="module" data-uc-allowed="true" crossorigin src="/assets/index-4rn3rTTF.js"></script>
217 218 <link rel="modulepreload" crossorigin href="/assets/react-vendor-Dw_yU8dF.js"> 219 <link rel="modulepreload" crossorigin href="/assets/react-router-vendor-BkIVIVUe.js"> 220 <link rel="modulepreload" crossorigin href="/assets/axios-vendor-C_srwYrI.js"> 221 </head> 222 223 <body> 224 <div id="root"></div> 225
225<script src="/js/addon.js" data-uc-allowed="true"></script>
225 226 </body> 227</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.