{
  "version": 3,
  "sources": ["../src/modules/cookies.js"],
  "sourcesContent": ["// zelvior-runtime/cookies -- auto-answers cookie consent banners with the\n// most private available option, for a small, explicitly curated list of\n// common consent-management platforms (CMPs). ESM source of truth;\n// bundled by build.mjs. Zero dependency on core zelvior.js.\n//\n// Read this before using it: this is NOT a comprehensive solution. Cookie\n// banners are built by dozens of different vendors and countless custom\n// implementations, and there is no reliable way to detect \"a reject\n// button\" in the general case without either a large, constantly-updated\n// selector database (the approach browser extensions dedicated to this\n// single problem take, and even those miss sites) or actually parsing the\n// IAB TCF API when present (partially attempted below, best-effort). This\n// module recognizes a handful of the most common real-world patterns\n// (OneTrust, Cookiebot, Quantcast Choice/IAB TCF, and a generic\n// text-matching fallback) and will silently do nothing on any banner it\n// doesn't recognize -- it does not guess, click blindly, or attempt to\n// interact with anything outside a small, checked set of selectors.\n\nvar handledCount = 0;\nvar lastHandledVendor = null;\n\n// Each entry: a container selector to confirm a banner is actually\n// present, and a reject-button selector to click if found. Checked in\n// order; first match wins per page. Selectors are deliberately specific\n// (real IDs/classes these vendors ship, not vague guesses) to avoid\n// clicking the wrong thing on an unrelated page element.\nvar KNOWN_CMPS = [\n  {\n    name: 'OneTrust',\n    container: '#onetrust-banner-sdk, #onetrust-consent-sdk',\n    reject: '#onetrust-reject-all-handler, .ot-pc-refuse-all-handler',\n  },\n  {\n    name: 'Cookiebot',\n    container: '#CybotCookiebotDialog',\n    reject: '#CybotCookiebotDialogBodyLevelButtonLevelOptinDeclineAll, #CybotCookiebotDialogBodyButtonDecline',\n  },\n  {\n    name: 'Quantcast Choice (IAB TCF)',\n    container: '.qc-cmp2-container',\n    reject: '.qc-cmp2-summary-buttons button[mode=\"secondary\"], button.qc-cmp2-reject-all',\n  },\n  {\n    name: 'Didomi',\n    container: '#didomi-host, .didomi-popup-container',\n    reject: '#didomi-notice-disagree-button, .didomi-components-button--secondary',\n  },\n];\n\nfunction tryKnownCmps(root) {\n  for (var i = 0; i < KNOWN_CMPS.length; i++) {\n    var cmp = KNOWN_CMPS[i];\n    var container = root.querySelector(cmp.container);\n    if (!container) continue;\n    var btn = root.querySelector(cmp.reject);\n    if (btn) {\n      btn.click();\n      return cmp.name;\n    }\n  }\n  return null;\n}\n\n// Generic fallback: look for a visible button/link inside something that\n// looks like a cookie banner (matches on common wording, not just any\n// button on the page) with reject-leaning text. Deliberately\n// conservative -- requires BOTH a cookie-related container heuristic AND\n// reject-leaning button text, to avoid false-positive clicks on unrelated\n// \"decline\"/\"no thanks\" buttons elsewhere on a page.\nvar BANNER_HINT = /cookie|consent|gdpr|privacy.?choice/i;\nvar REJECT_TEXT = /^(reject all|decline all|necessary only|reject|decline|only necessary|essential only)$/i;\n\nfunction tryGenericFallback(root) {\n  var candidates = root.querySelectorAll('[class*=\"cookie\" i], [class*=\"consent\" i], [id*=\"cookie\" i], [id*=\"consent\" i]');\n  for (var i = 0; i < candidates.length; i++) {\n    var el = candidates[i];\n    if (!BANNER_HINT.test(el.className + ' ' + el.id)) continue;\n    var buttons = el.querySelectorAll('button, a[role=\"button\"], [role=\"button\"]');\n    for (var j = 0; j < buttons.length; j++) {\n      var text = (buttons[j].textContent || '').trim();\n      if (REJECT_TEXT.test(text)) {\n        buttons[j].click();\n        return 'generic (' + text + ')';\n      }\n    }\n  }\n  return null;\n}\n\nfunction attempt(root) {\n  var handled = tryKnownCmps(root) || tryGenericFallback(root);\n  if (handled) {\n    handledCount++;\n    lastHandledVendor = handled;\n  }\n  return handled;\n}\n\nvar observer = null;\nvar pollTimer = null;\n\n/**\n * Starts watching for a cookie banner and clicking the most private\n * option as soon as one of the recognized patterns appears, then hides\n * the (now-answered) banner container so it never visibly flashes on\n * screen. Watches for up to `opts.timeout` ms (default 6000) via a\n * MutationObserver (for banners injected after page load) plus an\n * immediate check. Returns a controller with `.stop()`.\n */\nexport function autoRejectCookieBanners(opts) {\n  opts = opts || {};\n  var timeout = typeof opts.timeout === 'number' ? opts.timeout : 6000;\n  var onHandled = opts.onHandled;\n  var stopped = false;\n  var found = false; // distinct from `stopped`: set the moment a banner is handled, so an\n                      // already-in-flight poll() iteration (invoked synchronously, before\n                      // stopScanning()'s effects can prevent it) can't re-run check() and\n                      // double-click the same banner it already handled.\n\n  function check() {\n    if (stopped || found) return;\n    var handled = attempt(document);\n    if (handled) {\n      found = true;\n      if (typeof onHandled === 'function') {\n        try { onHandled(handled); } catch (e) {}\n      }\n      stopScanning();\n    }\n  }\n\n  function stopScanning() {\n    if (observer) { observer.disconnect(); observer = null; }\n    if (pollTimer) { clearTimeout(pollTimer); pollTimer = null; }\n  }\n\n  check(); // banner may already be in the initial HTML\n  if (typeof MutationObserver !== 'undefined') {\n    observer = new MutationObserver(check);\n    observer.observe(document.documentElement, { childList: true, subtree: true });\n  }\n  var deadline = Date.now() + timeout;\n  (function poll() {\n    if (stopped || Date.now() > deadline) { stopScanning(); return; }\n    check();\n    pollTimer = setTimeout(poll, 400);\n  })();\n\n  return {\n    stop: function () { stopped = true; stopScanning(); },\n  };\n}\n\nexport function metrics() {\n  return { handledCount: handledCount, lastHandledVendor: lastHandledVendor };\n}\n"],
  "mappings": ";4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,GAkBA,IAAIK,EAAe,EACfC,EAAoB,KAOpBC,EAAa,CACf,CACE,KAAM,WACN,UAAW,8CACX,OAAQ,yDACV,EACA,CACE,KAAM,YACN,UAAW,wBACX,OAAQ,kGACV,EACA,CACE,KAAM,6BACN,UAAW,qBACX,OAAQ,8EACV,EACA,CACE,KAAM,SACN,UAAW,wCACX,OAAQ,sEACV,CACF,EAEA,SAASC,EAAaC,EAAM,CAC1B,QAASC,EAAI,EAAGA,EAAIH,EAAW,OAAQG,IAAK,CAC1C,IAAIC,EAAMJ,EAAWG,CAAC,EAClBE,EAAYH,EAAK,cAAcE,EAAI,SAAS,EAChD,GAAKC,EACL,KAAIC,EAAMJ,EAAK,cAAcE,EAAI,MAAM,EACvC,GAAIE,EACF,OAAAA,EAAI,MAAM,EACHF,EAAI,KAEf,CACA,OAAO,IACT,CAQA,IAAIG,EAAc,uCACdC,EAAc,0FAElB,SAASC,EAAmBP,EAAM,CAEhC,QADIQ,EAAaR,EAAK,iBAAiB,gFAAgF,EAC9GC,EAAI,EAAGA,EAAIO,EAAW,OAAQP,IAAK,CAC1C,IAAIQ,EAAKD,EAAWP,CAAC,EACrB,GAAKI,EAAY,KAAKI,EAAG,UAAY,IAAMA,EAAG,EAAE,EAEhD,QADIC,EAAUD,EAAG,iBAAiB,2CAA2C,EACpEE,EAAI,EAAGA,EAAID,EAAQ,OAAQC,IAAK,CACvC,IAAIC,GAAQF,EAAQC,CAAC,EAAE,aAAe,IAAI,KAAK,EAC/C,GAAIL,EAAY,KAAKM,CAAI,EACvB,OAAAF,EAAQC,CAAC,EAAE,MAAM,EACV,YAAcC,EAAO,GAEhC,CACF,CACA,OAAO,IACT,CAEA,SAASC,EAAQb,EAAM,CACrB,IAAIc,EAAUf,EAAaC,CAAI,GAAKO,EAAmBP,CAAI,EAC3D,OAAIc,IACFlB,IACAC,EAAoBiB,GAEfA,CACT,CAEA,IAAIC,EAAW,KACXC,EAAY,KAUT,SAASvB,EAAwBwB,EAAM,CAC5CA,EAAOA,GAAQ,CAAC,EAChB,IAAIC,EAAU,OAAOD,EAAK,SAAY,SAAWA,EAAK,QAAU,IAC5DE,EAAYF,EAAK,UACjBG,EAAU,GACVC,EAAQ,GAKZ,SAASC,GAAQ,CACf,GAAI,EAAAF,GAAWC,GACf,KAAIP,EAAUD,EAAQ,QAAQ,EAC9B,GAAIC,EAAS,CAEX,GADAO,EAAQ,GACJ,OAAOF,GAAc,WACvB,GAAI,CAAEA,EAAUL,CAAO,CAAG,OAASS,EAAG,CAAC,CAEzCC,EAAa,CACf,EACF,CAEA,SAASA,GAAe,CAClBT,IAAYA,EAAS,WAAW,EAAGA,EAAW,MAC9CC,IAAa,aAAaA,CAAS,EAAGA,EAAY,KACxD,CAEAM,EAAM,EACF,OAAO,kBAAqB,cAC9BP,EAAW,IAAI,iBAAiBO,CAAK,EACrCP,EAAS,QAAQ,SAAS,gBAAiB,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,GAE/E,IAAIU,EAAW,KAAK,IAAI,EAAIP,EAC5B,OAAC,SAASQ,GAAO,CACf,GAAIN,GAAW,KAAK,IAAI,EAAIK,EAAU,CAAED,EAAa,EAAG,MAAQ,CAChEF,EAAM,EACNN,EAAY,WAAWU,EAAM,GAAG,CAClC,EAAG,EAEI,CACL,KAAM,UAAY,CAAEN,EAAU,GAAMI,EAAa,CAAG,CACtD,CACF,CAEO,SAAS9B,GAAU,CACxB,MAAO,CAAE,aAAcE,EAAc,kBAAmBC,CAAkB,CAC5E",
  "names": ["cookies_exports", "__export", "autoRejectCookieBanners", "metrics", "__toCommonJS", "handledCount", "lastHandledVendor", "KNOWN_CMPS", "tryKnownCmps", "root", "i", "cmp", "container", "btn", "BANNER_HINT", "REJECT_TEXT", "tryGenericFallback", "candidates", "el", "buttons", "j", "text", "attempt", "handled", "observer", "pollTimer", "opts", "timeout", "onHandled", "stopped", "found", "check", "e", "stopScanning", "deadline", "poll"]
}
