1/** 2 * Cookie-баннеÑ: одна ÑÑÑока Ð²Ð½Ð¸Ð·Ñ ÑкÑана. 3 * RU (без ÑзÑкового пÑеÑикÑа в URL): accept-only, ÑÑÑлки на полиÑÐ¸ÐºÑ Ð¸ пÑавила загÑÑзки. 4 * Ðокали (/en|/es|/de|/it|/fr|/pt|/ja|/ko|/pl|/nl/): GDPR-Ñежим, Accept + Reject; на reject 5 * ÑÑавим opt-out Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ñики (best-effort). 6 * Show once -> вÑÐ±Ð¾Ñ ÑÐ¾Ñ ÑанÑеÑÑÑ Ð² localStorage + cookie на 1 год. 7 * Ðока Ð±Ð°Ð½Ð½ÐµÑ Ð²Ð¸Ð´ÐµÐ½, задаÑÑ --fm-marquee-h = Ñвоей вÑÑоÑе: chat.js Ð¿Ð¾Ð´Ð½Ð¸Ð¼Ð°ÐµÑ ÐºÐ½Ð¾Ð¿ÐºÑ ÑаÑа на ÑÑÑ Ð²ÐµÐ»Ð¸ÑинÑ. 8 * 9 * ÐÐ»Ñ ÑеÑÑа: оÑкÑÑÑÑ URL Ñ ?cookietest=1 (Ð±Ð°Ð½Ð½ÐµÑ Ð¿Ð¾ÑвиÑÑÑ Ð½ÐµÑмоÑÑÑ Ð½Ð° вÑбоÑ). 10 * ÐаÑÑомизаÑиÑ: window.GdfCookieConsent (опÑионалÑно, пеÑеопÑеделÑÐµÑ ÑÑÑоки). 11 * 2026-09-03: каÑÑоÑка в 4-5 ÑÑÑок (до 21% ÑкÑана ÑелеÑона) ÑжаÑа до полоÑÑ Ð² 1-2 ÑÑÑоки. 12 */ 13(function () { 14 if (window.__gdfCookieConsentLoaded) return; 15 window.__gdfCookieConsentLoaded = true; 16 17 var KEY = 'gdf_cookie_consent_v1'; 18 var forceShow = /(?:[?&])cookietest=1\b/.test(location.search); 19 20 // --- locale detection by first URL segment --- 21 var seg = (location.pathname.split('/')[1] || '').toLowerCase(); 22 var LOC = (['en', 'es', 'de', 'it', 'fr', 'pt', 'ja', 'ko', 'pl', 'nl'].indexOf(seg) !== -1) ? seg : 'ru'; 23 // ТÑл-ÑÑÑаниÑÑ Ð½ÐµÑÑÑ Ð»Ð¾ÐºÐ°Ð»Ñ Ð² ?lang= (пÑÑÑ Ð²Ñегда /tools/..., без ÑзÑкового ÑегменÑа). 24 if (LOC === 'ru' && /^\/tools\//.test(location.pathname)) { 25 var _ql = ((location.search.match(/[?&]lang=([a-z]{2})\b/i) || [])[1] || '').toLowerCase(); 26 if (['en', 'es', 'de', 'it', 'fr', 'pt', 'ja', 'ko', 'pl', 'nl'].indexOf(_ql) !== -1) LOC = _ql; 27 } 28 var isGdpr = (LOC !== 'ru'); 29 30 // GA4 / Yandex ids for opt-out on reject (site1) 31 var GA4 = 'G-H8EVRNCXPK'; 32 var YA = '95584902'; 33 34 if (!forceShow) { 35 var ls = null; 36 try { ls = localStorage.getItem(KEY); } catch (e) { /* localStorage blocked */ } 37 if (ls === 'accepted' || ls === 'rejected') { if (ls === 'rejected') applyOptOut(); return; } 38 if (document.cookie.indexOf(KEY + '=accepted') !== -1) { 39 try { localStorage.setItem(KEY, 'accepted'); } catch (e) {} 40 return; 41 } 42 if (document.cookie.indexOf(KEY + '=rejected') !== -1) { 43 try { localStorage.setItem(KEY, 'rejected'); } catch (e) {} 44 applyOptOut(); return; 45 } 46 } 47 48 // РендеÑ: «text linkText · rulesLinkText». rulesText пÑÑÑой; еÑли задаÑÑ ÑÑÑÐ¾ÐºÑ (ÑеÑез GdfCookieConsent), 49 // веÑнÑÑÑÑ Ð¿Ñежний ÑоÑÐ¼Ð°Ñ Â«text link. rulesText rulesLink.». 50 var DICT = { 51 ru: { 52 text: 'ÐÑполÑзÑем cookie.', linkText: 'ÐодÑобнее', linkHref: '/privacy/', accept: 'Ðкей', reject: null, 53 rulesText: '', rulesLinkText: 'ÐÑавила загÑÑзки', rulesLinkHref: '/pravila-zagruzki/', 54 aria: 'Уведомление об иÑполÑзовании cookie' 55 }, 56 en: { 57 text: 'We use cookies for analytics and preferences.', linkText: 'Privacy Policy', linkHref: '/en/privacy/', accept: 'Accept', reject: 'Reject', 58 rulesText: '', rulesLinkText: 'Content Policy', rulesLinkHref: '/content-policy/', 59 aria: 'Cookie notice' 60 }, 61 es: { 62 text: 'Usamos cookies para analÃtica y preferencias.', linkText: 'PolÃtica de Privacidad', linkHref: '/es/privacy/', accept: 'Aceptar', reject: 'Rechazar', 63 rulesText: '', rulesLinkText: 'Normas de contenido', rulesLinkHref: '/content-policy/', 64 aria: 'Aviso de cookies' 65 }, 66 de: { 67 text: 'Wir nutzen Cookies für Analyse und Einstellungen.', linkText: 'Datenschutz', linkHref: '/de/privacy/', accept: 'Akzeptieren', reject: 'Ablehnen', 68 rulesText: '', rulesLinkText: 'Inhaltsrichtlinie', rulesLinkHref: '/content-policy/', 69 aria: 'Cookie-Hinweis' 70 }, 71 it: { 72 text: 'Usiamo i cookie per analisi e preferenze.', linkText: 'Privacy', linkHref: '/it/privacy/', accept: 'Accetta', reject: 'Rifiuta', 73 rulesText: '', rulesLinkText: 'Norme sui contenuti', rulesLinkHref: '/content-policy/', 74 aria: 'Avviso sui cookie' 75 }, 76 fr: {
77 text: 'Nous utilisons des cookies (analyse, préférences).', linkText: 'Confidentialité', linkHref: '/fr/privacy/', accept: 'Accepter', reject: 'Refuser', 78 rulesText: '', rulesLinkText: 'Règles de contenu', rulesLinkHref: '/content-policy/', 79 aria: 'Avis sur les cookies' 80 }, 81 pt: { 82 text: 'Usamos cookies para análise e preferências.', linkText: 'Privacidade', linkHref: '/en/privacy/', accept: 'Aceitar', reject: 'Recusar', 83 rulesText: '', rulesLinkText: 'Regras de conteúdo', rulesLinkHref: '/content-policy/', 84 aria: 'Aviso de cookies' 85 }, 86 ja: { 87 text: 'Cookieã使ç¨ãã¦ãã¾ãï¼åæã»è¨å®ã®è¨æ¶ï¼ã', linkText: 'ãã©ã¤ãã·ã¼ããªã·ã¼', linkHref: '/en/privacy/', accept: '許å¯ãã', reject: 'æå¦ãã', 88 rulesText: '', rulesLinkText: 'ã³ã³ãã³ãããªã·ã¼', rulesLinkHref: '/content-policy/', 89 aria: 'Cookieã«é¢ãããç¥ãã' 90 }, 91 ko: { 92 text: 'ì¿ í¤ë¥¼ ì¬ì©í©ëë¤(ë¶ì·ì¤ì 기ìµ).', linkText: 'ê°ì¸ì ë³´ ì²ë¦¬ë°©ì¹¨', linkHref: '/en/privacy/', accept: 'íì©', reject: 'ê±°ë¶', 93 rulesText: '', rulesLinkText: 'ì½í ì¸ ì ì± ', rulesLinkHref: '/content-policy/', 94 aria: 'ì¿ í¤ ìë´' 95 }, 96 pl: { 97 text: 'Używamy cookie do analityki i zapamiÄtywania ustawieÅ.', linkText: 'Polityka prywatnoÅci', linkHref: '/en/privacy/', accept: 'AkceptujÄ', reject: 'OdrzuÄ', 98 rulesText: '', rulesLinkText: 'Zasady treÅci', rulesLinkHref: '/content-policy/', 99 aria: 'Informacja o plikach cookie' 100 }, 101 nl: { 102 text: 'We gebruiken cookies voor analyse en voorkeuren.', linkText: 'Privacybeleid', linkHref: '/en/privacy/', accept: 'Accepteren', reject: 'Weigeren', 103 rulesText: '', rulesLinkText: 'Inhoudsbeleid', rulesLinkHref: '/content-policy/', 104 aria: 'Cookiemelding' 105 } 106 }; 107 108 var cfg = Object.assign({}, DICT[LOC], window.GdfCookieConsent || {}); 109 110 if (document.readyState === 'loading') { 111 document.addEventListener('DOMContentLoaded', mount, { once: true }); 112 } else { 113 mount(); 114 } 115 116 function mount() { 117 if (document.querySelector('.gdf-cookie')) return; 118 if (!document.body) return; 119 120 var style = document.createElement('style'); 121 style.textContent = 122 '.gdf-cookie{position:fixed;left:0;right:0;bottom:0;margin:0;background:#1a2333;color:#fff;padding:7px 14px;padding-bottom:calc(7px + env(safe-area-inset-bottom,0px));box-shadow:0 -3px 14px rgba(0,0,0,.2);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;font-size:13px;line-height:1.35;display:flex;align-items:center;justify-content:center;gap:12px;z-index:2147483646;animation:gdfCookieIn .3s ease-out}' + 123 '.gdf-cookie p{margin:0;flex:0 1 auto;min-width:0;color:#fff}' + 124 '.gdf-cookie a{color:#7fc4ff;text-decoration:underline;white-space:nowrap}' + 125 '.gdf-cookie-btns{display:flex;gap:6px;flex:0 0 auto}' + 126 '.gdf-cookie button{background:#0a4dad;color:#fff;border:0;border-radius:6px;padding:6px 14px;font-size:13px;line-height:1.2;font-weight:600;cursor:pointer;white-space:nowrap;transition:background .15s;font-family:inherit}' + 127 '.gdf-cookie button:hover{background:#073d8a}' + 128 '.gdf-cookie button:active{transform:scale(.98)}' + 129 '.gdf-cookie button.gdf-cookie-reject{background:transparent;border:1px solid #5b6b86;color:#cdd7e6}' + 130 '.gdf-cookie button.gdf-cookie-reject:hover{background:rgba(255,255,255,.06)}' + 131 '@keyframes gdfCookieIn{from{transform:translateY(100%)}to{transform:translateY(0)}}' + 132 '@media(max-width:520px){.gdf-cookie{font-size:12px;padding:6px 10px;padding-bottom:calc(6px + env(safe-area-inset-bottom,0px));gap:8px;justify-content:space-between}.gdf-cookie button{padding:6px 12px;font-size:12px}}'; 133 (document.head || document.documentElement).appendChild(style); 134 135 var bar = document.createElement('div'); 136 bar.className = 'gdf-cookie'; 137 bar.setAttribute('role', 'dialog'); 138 bar.setAttribute('aria-label', cfg.aria); 139 var p = document.createElement('p');
140 p.appendChild(document.createTextNode(cfg.text + ' ')); 141 var a = document.createElement('a'); 142 a.href = cfg.linkHref; 143 a.textContent = cfg.linkText; 144 p.appendChild(a); 145 if (cfg.rulesLinkHref) { 146 var a2 = document.createElement('a'); a2.href = cfg.rulesLinkHref; a2.textContent = cfg.rulesLinkText; 147 if (cfg.rulesText) { 148 p.appendChild(document.createTextNode('. ' + cfg.rulesText + ' ')); 149 p.appendChild(a2); 150 p.appendChild(document.createTextNode('.')); 151 } else { 152 p.appendChild(document.createTextNode(' · ')); 153 p.appendChild(a2); 154 } 155 } else { 156 p.appendChild(document.createTextNode('.')); 157 } 158 bar.appendChild(p); 159 160 var btns = document.createElement('div'); 161 btns.className = 'gdf-cookie-btns'; 162 if (cfg.reject) { 163 var rbtn = document.createElement('button'); 164 rbtn.type = 'button'; 165 rbtn.className = 'gdf-cookie-reject'; 166 rbtn.textContent = cfg.reject; 167 rbtn.addEventListener('click', reject); 168 btns.appendChild(rbtn); 169 } 170 var btn = document.createElement('button'); 171 btn.type = 'button'; 172 btn.textContent = cfg.accept; 173 btn.addEventListener('click', accept); 174 btns.appendChild(btn); 175 bar.appendChild(btns); 176 177 document.body.appendChild(bar); 178 lift(); 179 window.addEventListener('resize', lift); 180 } 181 182 // ÐоднÑÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ ÑаÑа (chat.js: bottom = 24px + var(--fm-marquee-h)) над полоÑой. 183 function lift() { 184 var bar = document.querySelector('.gdf-cookie'); 185 try { 186 if (bar) document.documentElement.style.setProperty('--fm-marquee-h', bar.offsetHeight + 'px'); 187 else document.documentElement.style.removeProperty('--fm-marquee-h'); 188 } catch (e) {} 189 } 190 191 function save(val) { 192 try { localStorage.setItem(KEY, val); } catch (e) {} 193 var oneYear = 60 * 60 * 24 * 365; 194 document.cookie = KEY + '=' + val + '; max-age=' + oneYear + '; path=/; SameSite=Lax'; 195 } 196 197 function dismiss() { 198 var bar = document.querySelector('.gdf-cookie'); 199 window.removeEventListener('resize', lift); 200 try { document.documentElement.style.removeProperty('--fm-marquee-h'); } catch (e) {} 201 if (bar) { 202 bar.style.transition = 'opacity .25s, transform .25s'; 203 bar.style.opacity = '0'; 204 bar.style.transform = 'translateY(100%)'; 205 setTimeout(function () { bar.remove(); }, 280); 206 } 207 } 208 209 function accept() { save('accepted'); dismiss(); } 210 211 function reject() { save('rejected'); applyOptOut(); dismiss(); } 212 213 // best-effort opt-out of non-essential analytics after a reject (GDPR) 214 function applyOptOut() { 215 try { 216 window['ga-disable-' + GA4] = true; 217 document.cookie = 'ga-disable-' + GA4 + '=true; max-age=31536000; path=/; SameSite=Lax'; 218 window['disableYaCounter' + YA] = true; 219 } catch (e) {} 220 } 221})();
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.