@duckduckgo/autoconsent 16.49.0 → 16.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/.agents/skills/optimize-button-patterns/SKILL.md +4 -4
  2. package/.github/workflows/release-labels.yml +2 -6
  3. package/AGENTS.md +1 -1
  4. package/CHANGELOG.md +130 -0
  5. package/build.sh +2 -0
  6. package/data/labelled-button-texts.csv +36 -36
  7. package/dist/addon-firefox/background.bundle.js +4 -1
  8. package/dist/addon-firefox/compact-rules.json +1 -1
  9. package/dist/addon-firefox/content.bundle.js +67 -46
  10. package/dist/addon-firefox/manifest.json +1 -1
  11. package/dist/addon-firefox/rule-index.json +1 -1
  12. package/dist/addon-firefox/rules.json +1 -1
  13. package/dist/addon-mv3/background.bundle.js +4 -1
  14. package/dist/addon-mv3/compact-rules.json +1 -1
  15. package/dist/addon-mv3/content.bundle.js +67 -46
  16. package/dist/addon-mv3/manifest.json +1 -1
  17. package/dist/addon-mv3/rule-index.json +1 -1
  18. package/dist/addon-mv3/rules.json +1 -1
  19. package/dist/autoconsent.cjs.js +67 -46
  20. package/dist/autoconsent.esm.js +67 -46
  21. package/dist/autoconsent.playwright.js +68 -46
  22. package/dist/autoconsent.standalone.js +68 -47
  23. package/dist/heuristics.cjs.js +886 -0
  24. package/dist/heuristics.mjs +847 -0
  25. package/dist/types/eval-snippets.d.ts +2 -0
  26. package/dist/types/heuristic-classify.d.ts +16 -0
  27. package/dist/types/heuristics.d.ts +2 -9
  28. package/dist/types/types.d.ts +3 -5
  29. package/lib/eval-snippets.ts +4 -0
  30. package/lib/heuristic-classify.ts +136 -0
  31. package/lib/heuristic-patterns.ts +33 -16
  32. package/lib/heuristics.ts +3 -124
  33. package/lib/types.ts +3 -5
  34. package/lib/web.ts +1 -1
  35. package/package.json +7 -2
  36. package/playwright/content.ts +5 -0
  37. package/readme.md +12 -0
  38. package/rules/autoconsent/abcacupuncture1.json +34 -0
  39. package/rules/autoconsent/aceodds.json +13 -0
  40. package/rules/autoconsent/allabout-japan.json +42 -0
  41. package/rules/autoconsent/amazon-hiring.json +16 -0
  42. package/rules/autoconsent/avada-cookie-consent.json +43 -0
  43. package/rules/autoconsent/avvio.json +22 -0
  44. package/rules/autoconsent/axeptio.json +22 -6
  45. package/rules/autoconsent/bdirect-booking-engine.json +33 -0
  46. package/rules/autoconsent/berelax.com.json +33 -0
  47. package/rules/autoconsent/bigcrunch.json +39 -0
  48. package/rules/autoconsent/bigid.json +59 -0
  49. package/rules/autoconsent/bluepark.json +31 -0
  50. package/rules/autoconsent/bricklink.json +33 -0
  51. package/rules/autoconsent/burpee-com.json +5 -1
  52. package/rules/autoconsent/bynder.json +33 -0
  53. package/rules/autoconsent/ceneo.json +9 -0
  54. package/rules/autoconsent/cinemaplus.json +9 -0
  55. package/rules/autoconsent/columbia-privacy-notice.json +32 -0
  56. package/rules/autoconsent/complianz-notice.json +1 -1
  57. package/rules/autoconsent/conjointly.json +43 -0
  58. package/rules/autoconsent/cookieconsent2-legacy.json +44 -0
  59. package/rules/autoconsent/cookiesjsr.json +27 -0
  60. package/rules/autoconsent/copaamerica.json +29 -0
  61. package/rules/autoconsent/cornerstone-brands.json +51 -0
  62. package/rules/autoconsent/darkounity.com.json +35 -0
  63. package/rules/autoconsent/dhbbank.json +13 -0
  64. package/rules/autoconsent/duda-cookie-notification.json +41 -0
  65. package/rules/autoconsent/ee-consent-notice.json +40 -0
  66. package/rules/autoconsent/endocrine.org.json +35 -0
  67. package/rules/autoconsent/ezoic.json +2 -2
  68. package/rules/autoconsent/fera-cookies.json +67 -0
  69. package/rules/autoconsent/fis-data-exchange.json +13 -0
  70. package/rules/autoconsent/getproven.json +33 -0
  71. package/rules/autoconsent/givedirectly.json +36 -0
  72. package/rules/autoconsent/godaddy-website-builder-cosmetic.json +13 -0
  73. package/rules/autoconsent/godaddy-website-builder.json +9 -0
  74. package/rules/autoconsent/guesty.json +31 -0
  75. package/rules/autoconsent/gundam-base-entry.json +40 -0
  76. package/rules/autoconsent/hearst-us.json +1 -1
  77. package/rules/autoconsent/indy-systems.json +26 -0
  78. package/rules/autoconsent/ing-nl.json +54 -0
  79. package/rules/autoconsent/iubenda.json +25 -3
  80. package/rules/autoconsent/la7-cmp.json +30 -0
  81. package/rules/autoconsent/laravel-cookie-consent.json +45 -0
  82. package/rules/autoconsent/legislation-gov-uk.json +43 -0
  83. package/rules/autoconsent/lucrin.json +18 -0
  84. package/rules/autoconsent/mackeeper.json +34 -0
  85. package/rules/autoconsent/makitatools.json +41 -0
  86. package/rules/autoconsent/milestone-internet.json +32 -0
  87. package/rules/autoconsent/ndl-go-jp.json +35 -0
  88. package/rules/autoconsent/nhm-ac-uk.json +29 -0
  89. package/rules/autoconsent/npo-ccm.json +42 -0
  90. package/rules/autoconsent/opalcollection-com.json +12 -0
  91. package/rules/autoconsent/orw-cookie-banner.json +42 -0
  92. package/rules/autoconsent/osf-io.json +29 -0
  93. package/rules/autoconsent/palace-company.json +13 -0
  94. package/rules/autoconsent/paypal-us.json +3 -3
  95. package/rules/autoconsent/paypal.json +5 -2
  96. package/rules/autoconsent/paytronix.json +30 -0
  97. package/rules/autoconsent/pitt-edu.json +12 -0
  98. package/rules/autoconsent/pizzapilgrims.co.uk.json +49 -0
  99. package/rules/autoconsent/podimo.json +73 -0
  100. package/rules/autoconsent/publicmobile.json +16 -0
  101. package/rules/autoconsent/rakshaos.json +45 -0
  102. package/rules/autoconsent/rutjes.json +13 -0
  103. package/rules/autoconsent/saturdaysnyc.json +33 -0
  104. package/rules/autoconsent/serpstat-com.json +13 -0
  105. package/rules/autoconsent/shopquarters.json +41 -0
  106. package/rules/autoconsent/shopware.json +71 -0
  107. package/rules/autoconsent/simpleview-cookie-banner.json +27 -0
  108. package/rules/autoconsent/solvhealth-com.json +12 -0
  109. package/rules/autoconsent/spermidinelife-us.json +29 -0
  110. package/rules/autoconsent/squarespace-cookie-banner.json +1 -1
  111. package/rules/autoconsent/squarespace-cookie-notice.json +29 -0
  112. package/rules/autoconsent/store2000-fr.json +17 -0
  113. package/rules/autoconsent/tempest-cookie-notice.json +9 -0
  114. package/rules/autoconsent/termsfeed.json +4 -4
  115. package/rules/autoconsent/texas-instruments.json +17 -0
  116. package/rules/autoconsent/thegrandyork.json +46 -0
  117. package/rules/autoconsent/thenounproject.json +61 -0
  118. package/rules/autoconsent/therealest.json +42 -0
  119. package/rules/autoconsent/tineye.json +35 -0
  120. package/rules/autoconsent/tk-aerztefuehrer.de.json +18 -0
  121. package/rules/autoconsent/toyota.json +16 -5
  122. package/rules/autoconsent/tplink.json +57 -9
  123. package/rules/autoconsent/trust360.json +29 -0
  124. package/rules/autoconsent/uft-cookie-notice.json +15 -0
  125. package/rules/autoconsent/up-cookie-consent.json +53 -0
  126. package/rules/autoconsent/uw-madison-cookieconsent.json +10 -0
  127. package/rules/autoconsent/vowels.json +13 -0
  128. package/rules/autoconsent/wbd-legal-terms.json +32 -0
  129. package/rules/autoconsent/web-rewind.com.json +21 -0
  130. package/rules/autoconsent/wildling-com.json +29 -0
  131. package/rules/autoconsent/worldbank.json +30 -0
  132. package/rules/autoconsent/yuntrack.json +50 -0
  133. package/rules/compact-rules.json +1 -1
  134. package/rules/rule-index.json +1 -1
  135. package/rules/rules.json +1 -1
  136. package/scripts/benchmark-button-classification.ts +18 -3
  137. package/scripts/button-text-benchmark.ts +5 -5
  138. package/tests/abcacupuncture1.spec.ts +3 -0
  139. package/tests/aceodds.spec.ts +3 -0
  140. package/tests/allabout-japan.spec.ts +3 -0
  141. package/tests/amazon-hiring.spec.ts +3 -0
  142. package/tests/avada-cookie-consent.spec.ts +9 -0
  143. package/tests/avvio.spec.ts +8 -0
  144. package/tests/axeptio.spec.ts +11 -4
  145. package/tests/bdirect-booking-engine.spec.ts +9 -0
  146. package/tests/berelax.com.spec.ts +5 -0
  147. package/tests/bigcrunch.spec.ts +16 -0
  148. package/tests/bigid.spec.ts +8 -0
  149. package/tests/bluepark.spec.ts +8 -0
  150. package/tests/bricklink.spec.ts +3 -0
  151. package/tests/burpee-com.spec.ts +2 -0
  152. package/tests/bynder.spec.ts +3 -0
  153. package/tests/ceneo.spec.ts +3 -0
  154. package/tests/cinemaplus.spec.ts +8 -0
  155. package/tests/columbia-privacy-notice.spec.ts +8 -0
  156. package/tests/complianz-notice.spec.ts +7 -3
  157. package/tests/conjointly.spec.ts +3 -0
  158. package/tests/cookieconsent2-legacy.spec.ts +8 -0
  159. package/tests/cookiesjsr.spec.ts +9 -0
  160. package/tests/copaamerica.spec.ts +3 -0
  161. package/tests/cornerstone-brands.spec.ts +8 -0
  162. package/tests/darkounity.com.spec.ts +6 -0
  163. package/tests/dhbbank.spec.ts +6 -0
  164. package/tests/duda-cookie-notification.spec.ts +8 -0
  165. package/tests/ee-consent-notice.spec.ts +9 -0
  166. package/tests/endocrine.org.spec.ts +3 -0
  167. package/tests/ezoic.spec.ts +1 -1
  168. package/tests/fera-cookies.spec.ts +6 -0
  169. package/tests/fis-data-exchange.spec.ts +9 -0
  170. package/tests/getproven.spec.ts +5 -0
  171. package/tests/givedirectly.spec.ts +3 -0
  172. package/tests/godaddy-website-builder-cosmetic.spec.ts +7 -0
  173. package/tests/godaddy-website-builder.spec.ts +8 -0
  174. package/tests/guesty.spec.ts +7 -0
  175. package/tests/gundam-base-entry.spec.ts +3 -0
  176. package/tests/hearst-us.spec.ts +1 -0
  177. package/tests/indy-systems.spec.ts +8 -0
  178. package/tests/ing-nl.spec.ts +6 -0
  179. package/tests/iubenda.spec.ts +5 -0
  180. package/tests/la7-cmp.spec.ts +6 -0
  181. package/tests/laravel-cookie-consent.spec.ts +10 -0
  182. package/tests/legislation-gov-uk.spec.ts +3 -0
  183. package/tests/lucrin.spec.ts +3 -0
  184. package/tests/mackeeper.spec.ts +3 -0
  185. package/tests/makitatools.spec.ts +5 -0
  186. package/tests/milestone-internet.spec.ts +8 -0
  187. package/tests/ndl-go-jp.spec.ts +8 -0
  188. package/tests/nhm-ac-uk.spec.ts +3 -0
  189. package/tests/npo-ccm.spec.ts +17 -0
  190. package/tests/opalcollection-com.spec.ts +3 -0
  191. package/tests/orw-cookie-banner.spec.ts +5 -0
  192. package/tests/osf-io.spec.ts +3 -0
  193. package/tests/palace-company.spec.ts +8 -0
  194. package/tests/paypal-us.spec.ts +2 -3
  195. package/tests/paytronix.spec.ts +7 -0
  196. package/tests/pitt-edu.spec.ts +3 -0
  197. package/tests/pizzapilgrims.co.uk.spec.ts +3 -0
  198. package/tests/podimo.spec.ts +3 -0
  199. package/tests/publicmobile.spec.ts +3 -0
  200. package/tests/rakshaos.spec.ts +9 -0
  201. package/tests/rutjes.spec.ts +3 -0
  202. package/tests/saturdaysnyc.spec.ts +3 -0
  203. package/tests/serpstat-com.spec.ts +3 -0
  204. package/tests/shopquarters.spec.ts +5 -0
  205. package/tests/shopware.spec.ts +8 -0
  206. package/tests/simpleview-cookie-banner.spec.ts +10 -0
  207. package/tests/solvhealth-com.spec.ts +10 -0
  208. package/tests/spermidinelife-us.spec.ts +3 -0
  209. package/tests/squarespace-cookie-notice.spec.ts +9 -0
  210. package/tests/store2000-fr.spec.ts +5 -0
  211. package/tests/tempest-cookie-notice.spec.ts +7 -0
  212. package/tests/termsfeed.spec.ts +4 -0
  213. package/tests/texas-instruments.spec.ts +3 -0
  214. package/tests/thegrandyork.spec.ts +3 -0
  215. package/tests/thenounproject.spec.ts +3 -0
  216. package/tests/therealest.spec.ts +6 -0
  217. package/tests/tineye.spec.ts +3 -0
  218. package/tests/tk-aerztefuehrer.de.spec.ts +6 -0
  219. package/tests/tplink.spec.ts +11 -1
  220. package/tests/trust360.spec.ts +8 -0
  221. package/tests/uft-cookie-notice.spec.ts +3 -0
  222. package/tests/up-cookie-consent.spec.ts +9 -0
  223. package/tests/uw-madison-cookieconsent.spec.ts +7 -0
  224. package/tests/vowels.spec.ts +3 -0
  225. package/tests/wbd-legal-terms.spec.ts +18 -0
  226. package/tests/web-rewind.com.spec.ts +5 -0
  227. package/tests/wildling-com.spec.ts +3 -0
  228. package/tests/worldbank.spec.ts +7 -0
  229. package/tests/yuntrack.spec.ts +6 -0
  230. package/tests-wtr/heuristics/button-classification-accuracy.test.ts +9 -5
  231. package/tests-wtr/heuristics/get-potential-popups.test.ts +28 -0
  232. package/tests-wtr/heuristics/heuristics-utils.test.ts +57 -6
  233. package/tsconfig.build.json +1 -1
  234. package/tsconfig.heuristics.json +10 -0
  235. package/rules/autoconsent/paypal-cookieprefs.json +0 -29
  236. package/tests/paypal-cookieprefs.spec.ts +0 -7
@@ -372,6 +372,8 @@ var snippets = {
372
372
  EVAL_COOKIEFIRST_1: () => document.querySelectorAll("button[data-cookiefirst-accent-color=true][role=checkbox]:not([disabled])").forEach((i) => i.getAttribute("aria-checked") === "true" && i.click()) || true,
373
373
  EVAL_COOKIEINFORMATION_0: () => CookieInformation.declineAllCategories() || true,
374
374
  EVAL_COOKIEINFORMATION_1: () => CookieInformation.submitAllCategories() || true,
375
+ // turn the single-button form into a decline submission, same fields as the CMP's own decline form
376
+ EVAL_EE_CONSENT_DECLINE_0: () => document.querySelectorAll('#cookieConsentFormAccept input[name^="ee:cookies_"]').forEach((i) => i.value = "n") || true,
375
377
  EVAL_ETSY_0: () => document.querySelectorAll(".gdpr-overlay-body input").forEach((toggle) => {
376
378
  toggle.checked = false;
377
379
  }) || true,
@@ -458,7 +460,8 @@ var snippets = {
458
460
  EVAL_USERCENTRICS_API_5: () => UC_UI.areAllConsentsAccepted() === true,
459
461
  EVAL_USERCENTRICS_API_6: () => UC_UI.areAllConsentsAccepted() === false,
460
462
  EVAL_USERCENTRICS_BUTTON_0: () => JSON.parse(localStorage.getItem("usercentrics")).consents.every((c) => c.isEssential || !c.consentStatus),
461
- EVAL_WAITROSE_0: () => Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e) => e.click()) || true
463
+ EVAL_WAITROSE_0: () => Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e) => e.click()) || true,
464
+ EVAL_WBD_LTP_CLOSE: () => document.querySelector("dialog#ltp-dialog").close() || true
462
465
  };
463
466
  function getFunctionBody(snippetFunc) {
464
467
  const snippetStr = snippetFunc.toString();
@@ -474,7 +477,8 @@ var DETECT_PATTERNS = [
474
477
  // "only necessary" is probably too broad
475
478
  /(?:by continuing.{0,100}cookie)|(?:cookie.{0,100}by continuing)/gi,
476
479
  /(?:by continuing.{0,100}privacy)|(?:privacy.{0,100}by continuing)/gi,
477
- /we (?:use|serve)(?: optional| essential)? cookies/gi,
480
+ // a single qualifier is common: "optional", "essential", "necessary", "analytics", ...
481
+ /we (?:use|serve)(?: \w+)? cookies/gi,
478
482
  /we are using cookies/gi,
479
483
  /use of cookies/gi,
480
484
  /website uses cookies to enhance your browsing experience/gi,
@@ -618,7 +622,10 @@ var DETECT_PATTERNS = [
618
622
  // "файлы cookie" / "cookie-файлы" / "куки-файлы" in any phrasing
619
623
  /(?:файл[а-яё]*[\s-]+(?:cookie|куки)|(?:cookie|куки)[\s-]+файл[а-яё]*)/gi,
620
624
  // Italian (IT)
621
- /usiamo.{0,20}cookie/gi
625
+ /usiamo.{0,20}cookie/gi,
626
+ // Japanese (JA)
627
+ // e.g. "当サイトはCookieを使用しています", "クッキー(Cookie)を利用しています"
628
+ /(?:cookie|クッキー).{0,10}を(?:使用|利用)/gi
622
629
  ];
623
630
  var REJECT_PATTERNS_ENGLISH = [
624
631
  // e.g. "reject", "reject all", "reject all cookies", "deny all", "refuse cookies", "decline",
@@ -634,8 +641,9 @@ var REJECT_PATTERNS_ENGLISH = [
634
641
  /^\s*(i\s+)?(want\s+to\s+)?(only\s+)?(use|accept|allow|keep|enable|choose|continue\s+with|i\s+confirm)\s*(only\s+)?(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s*(cookies)?\s*(continue|only)?\s*$/is,
635
642
  /^\s*(i\s+)?(want\s+to\s+)?only\s+(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s*(cookies)?\s*(continue|only)?\s*$/is,
636
643
  /^\s*(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s+((cookies\s+)?only|only\s+cookies)\s*$/is,
637
- // e.g. "do not sell or share my personal information", "opt out of sale ..." (CCPA)
638
- /do\s+not\s+sell|opt\s+out\s+of\s+sale/is,
644
+ // e.g. "do not sell or share my personal information", "do not share my personal information", "opt out of sale ..." (CCPA)
645
+ // "do not sell page" is a link; "do not sellcookie settings" is two concatenated buttons
646
+ /do\s+not\s+sell(?!\s*(page|cookie settings))|do\s+not\s+share\s+my\s+(personal\s+)?(information|info|data)|opt\s+out\s+of\s+sale/is,
639
647
  // e.g. "opt-out of sale/share or targeted advertising", "opt-out of advertising/social media cookies"
640
648
  /^opt[ -]?out of /is,
641
649
  // e.g. "reject all except strictly necessary", "reject all (except necessary cookies)"
@@ -646,7 +654,6 @@ var REJECT_PATTERNS_ENGLISH = [
646
654
  /^no,? thank(s| you)$/is,
647
655
  /^opt[ -]out$/is,
648
656
  "dont enable",
649
- "withdraw consent",
650
657
  "i do not agree"
651
658
  ];
652
659
  var REJECT_PATTERNS_DUTCH = [
@@ -673,9 +680,10 @@ var REJECT_PATTERNS_DUTCH = [
673
680
  var REJECT_PATTERNS_FRENCH = [
674
681
  // refuser / rejeter / interdire / décliner (reject verbs, any position)
675
682
  // "refuser et s'abonner" / "refuser et payer" are excluded via BUTTON_NEVER_MATCH_PATTERNS
676
- /(^|\s)(refus|rejet|rejeter|interdire|interdis|déclin|declin)/is,
683
+ // skip English prose such as "cookies that you can refuse"
684
+ /^(?!.*\bcan refuse\b)(.*\s)?(refus|rejet|rejeter|interdire|interdis|déclin|declin)/is,
677
685
  // only necessary / essential / technical / functional
678
- /(uniquement|seulement|indispensable|strictement nécessaire|que les cookies\s+(nécessaires|techniques|essentiels|indispensables|fonctionnels))/is,
686
+ /^(?=.*(cookie|nécessaire|essentiel|techni|requis|obligatoire|fonctionnel|indispensable|sdk)).*(uniquement|seulement|indispensable|strictement nécessaire|que les cookies\s+(nécessaires|techniques|essentiels|indispensables|fonctionnels))/is,
679
687
  // continue/proceed without accepting; refuse everything; disable purposes
680
688
  /(sans accepter|ne pas accepter|je naccepte rien|je désactive)/is,
681
689
  // "non" / "non, merci"
@@ -733,7 +741,7 @@ var REJECT_PATTERNS_SPANISH = [
733
741
  // "solo/sólo/no, sólo ... necessary/essential"
734
742
  /^(no,?\s+)?(solo|sólo|només)\s+(usar\s+|las?\s+|los\s+|lo\s+)?.{0,20}(necesari|esencial|estrictamente)/is,
735
743
  // refusals / opt-outs
736
- /^(no acept|no consentir|no permitir|no estoy de acuerdo|no,? gracias|sin consentimiento|revocar consentimiento|continuar sin aceptar|prefiero rechazarlas|descartar todas)/is,
744
+ /^(no acept|no consentir|no permitir|no estoy de acuerdo|no,? gracias|sin consentimiento|continuar sin aceptar|prefiero rechazarlas|descartar todas)/is,
737
745
  "acceptar nom\xE9s les necess\xE0ries",
738
746
  "nom\xE9s sutilitzen cookies quan \xE9s necessari",
739
747
  "pulsa aqu\xED para desactivar las cookies opcionales"
@@ -782,6 +790,12 @@ var REJECT_PATTERNS_RUSSIAN = [
782
790
  ];
783
791
  var REJECT_PATTERNS_TURKISH = ["reddet", "\xE7erezleri reddet"];
784
792
  var REJECT_PATTERNS_INDONESIAN = ["tolak cookie"];
793
+ var REJECT_PATTERNS_JAPANESE = [
794
+ // e.g. "拒否", "すべて拒否", "全て拒否する", "cookieを拒否"
795
+ /^(すべて|全て)?\s?(の)?(cookie|クッキー)?\s?(を)?拒否(する)?$/i,
796
+ "\u540C\u610F\u3057\u306A\u3044",
797
+ "\u540C\u610F\u3057\u307E\u305B\u3093"
798
+ ];
785
799
  var REJECT_PATTERNS = [
786
800
  ...REJECT_PATTERNS_ENGLISH,
787
801
  ...REJECT_PATTERNS_DUTCH,
@@ -799,9 +813,13 @@ var REJECT_PATTERNS = [
799
813
  ...REJECT_PATTERNS_POLISH,
800
814
  ...REJECT_PATTERNS_RUSSIAN,
801
815
  ...REJECT_PATTERNS_TURKISH,
802
- ...REJECT_PATTERNS_INDONESIAN
816
+ ...REJECT_PATTERNS_INDONESIAN,
817
+ ...REJECT_PATTERNS_JAPANESE
803
818
  ];
804
819
  var BUTTON_NEVER_MATCH_PATTERNS = [
820
+ // text of several concatenated buttons, or popup body text rather than a button
821
+ /accept all.*reject all|reject all.*accept all/is,
822
+ /^.{300,}$/s,
805
823
  /pay|subscribe/is,
806
824
  /abonneer/is,
807
825
  /abonnier/is,
@@ -842,8 +860,10 @@ var SETTINGS_PATTERNS = [
842
860
  // Multilingual "open customization" patterns: a customization verb next to a
843
861
  // cookie/preference/settings/options/details/purposes noun (both word orders).
844
862
  // The negative lookahead avoids policy links and save/confirm/accept phrases (those are accept/acknowledge/other).
845
- /^(?!.*\b(policy|policies|notice|statement|impressum|richtlinie|beleid|politique|política|polityk|speichern|guardar|opslaan|zapisz|enregistrer|sauvegarder|bevestig|bestätig|confirm|save|submit|akzeptier|accept|zaakcept)\b)(customi[sz]e|manage|adjust|configure|personali[sz]e|let me choose|edit|change|set|select|view|see|review|update|open|show|choose|anpassen|verwalten|konfigurieren|bearbeiten|öffnen|anzeigen|einblenden|festlegen|auswählen|wählen|aanpassen|beheren|instellen|wijzig\w*|personaliseren|personaliseer|kies|bekijk|toon|personnaliser|paramétrer|gérer|configurer|choisir|afficher|définir|modifier|configurar|personalizar|gestionar|administrar|ajustar|seleccionar|modificar|establecer|dostosuj|zarządzaj|personalizuj|ustaw\w*|zmień|pokaż|wybierz)\b.{0,20}(cookies?|preferences?|settings?|options?|choices?|controls?|details?|purposes?|services?|consent|einstellung\w*|optionen|präferenzen|einzelheiten|zwecke|dienste|datenschutz\w*|auswahl|voorkeur\w*|instelling\w*|opties|diensten|préférences|paramètres|réglages|choix|détails|finalités|témoins|preferencia\w*|opciones|ajustes|configuraci\w*|detalles|servicios|elección|preferencj\w*|ustawie\w*|opcje|szczegół\w*|cele|galetes)\b/is,
846
- /^(?!.*\b(policy|policies|notice|statement|impressum|richtlinie|beleid|politique|política|polityk|speichern|guardar|opslaan|zapisz|enregistrer|sauvegarder|bevestig|bestätig|confirm|save|submit|akzeptier|accept|zaakcept)\b)(cookies?|preferences?|settings?|options?|choices?|controls?|details?|purposes?|services?|consent|einstellung\w*|optionen|präferenzen|einzelheiten|zwecke|dienste|datenschutz\w*|auswahl|voorkeur\w*|instelling\w*|opties|diensten|préférences|paramètres|réglages|choix|détails|finalités|témoins|preferencia\w*|opciones|ajustes|configuraci\w*|detalles|servicios|elección|preferencj\w*|ustawie\w*|opcje|szczegół\w*|cele|galetes)\b.{0,15}(customi[sz]e|manage|adjust|configure|personali[sz]e|let me choose|edit|change|set|select|view|see|review|update|open|show|choose|anpassen|verwalten|konfigurieren|bearbeiten|öffnen|anzeigen|einblenden|festlegen|auswählen|wählen|aanpassen|beheren|instellen|wijzig\w*|personaliseren|personaliseer|kies|bekijk|toon|personnaliser|paramétrer|gérer|configurer|choisir|afficher|définir|modifier|configurar|personalizar|gestionar|administrar|ajustar|seleccionar|modificar|establecer|dostosuj|zarządzaj|personalizuj|ustaw\w*|zmień|pokaż|wybierz)\b/is,
863
+ /^(?!.*\b(policy|policies|notice|statement|impressum|\w*richtlinie\w*|\w*erklärung|page|beschrijving|privacy$|beleid|politique|política|polityk|speichern|guardar|opslaan|zapisz|enregistrer|sauvegarder|bevestig|bestätig|confirm|save|submit|akzeptier|accept|zaakcept)\b)(customi[sz]e|manage|adjust|configure|personali[sz]e|let me choose|edit|change|set|select|view|see|review|update|open|show|choose|anpassen|verwalten|konfigurieren|bearbeiten|öffnen|anzeigen|einblenden|einstellen|festlegen|auswählen|wählen|aanpassen|beheren|instellen|wijzig\w*|personaliseren|personaliseer|kies|bekijk|toon|personnaliser|paramétrer|gérer|configurer|choisir|afficher|définir|modifier|configurar|personalizar|gestionar|administrar|ajustar|seleccionar|modificar|establecer|dostosuj|zarządzaj|personalizuj|ustaw\w*|zmień|pokaż|wybierz)\b.{0,20}(cookies?|preferences?|settings?|options?|choices?|controls?|details?|purposes?|services?|consent|einstellung\w*|optionen|präferenzen|einzelheiten|zwecke|dienste|datenschutz\w*|auswahl|voorkeur\w*|instelling\w*|opties|diensten|préférences|paramètres|réglages|choix|détails|finalités|témoins|preferencia\w*|opciones|ajustes|configuraci\w*|detalles|servicios|elección|preferencj\w*|ustawie\w*|opcje|szczegół\w*|cele|galetes)\b/is,
864
+ /^(?!.*\b(policy|policies|notice|statement|impressum|\w*richtlinie\w*|\w*erklärung|page|beschrijving|privacy$|beleid|politique|política|polityk|speichern|guardar|opslaan|zapisz|enregistrer|sauvegarder|bevestig|bestätig|confirm|save|submit|akzeptier|accept|zaakcept)\b)(cookies?|preferences?|settings?|options?|choices?|controls?|details?|purposes?|services?|consent|einstellung\w*|optionen|präferenzen|einzelheiten|zwecke|dienste|datenschutz\w*|auswahl|voorkeur\w*|instelling\w*|opties|diensten|préférences|paramètres|réglages|choix|détails|finalités|témoins|preferencia\w*|opciones|ajustes|configuraci\w*|detalles|servicios|elección|preferencj\w*|ustawie\w*|opcje|szczegół\w*|cele|galetes)\b(.{0,14}\W)?(customi[sz]e|manage|adjust|configure|personali[sz]e|let me choose|edit|change|set|select|view|see|review|update|open|show|choose|anpassen|verwalten|konfigurieren|bearbeiten|öffnen|anzeigen|einblenden|einstellen|festlegen|auswählen|wählen|aanpassen|beheren|instellen|wijzig\w*|personaliseren|personaliseer|kies|bekijk|toon|personnaliser|paramétrer|gérer|configurer|choisir|afficher|définir|modifier|configurar|personalizar|gestionar|administrar|ajustar|seleccionar|modificar|establecer|dostosuj|zarządzaj|personalizuj|ustaw\w*|zmień|pokaż|wybierz)\b/is,
865
+ // settings noun + cookies, e.g. "paramètres des cookies", "ajustes de cookies", "instellingen voor cookies en diensten"
866
+ /^(paramètres|préférences|réglages|ajustes|opciones|elección|preferencias|instellingen)( (de|des|les|voor|van))? cookies( (et des|en|y) (services|diensten|servicios))?$/is,
847
867
  "settings",
848
868
  "preferences",
849
869
  /customi(s|z)e/is,
@@ -857,8 +877,8 @@ var SETTINGS_PATTERNS = [
857
877
  "cookieconsent preferences",
858
878
  /privacy choices/is,
859
879
  /^(privacy|cookie|custom) settings$/is,
860
- /^cookies? (settings|preferences|setting)$/is,
861
- /(manage|customize|customise|opt-out|edit).*(cookies|preferences|settings|options)/is,
880
+ /^cookies? (settings|preferences|setting)(?!.*\bdo not\b)/is,
881
+ /^(?!.*\bpolic(y|ies)\b).*(manage|customize|customise|opt-out|edit).*(cookies|preferences|settings|options)/is,
862
882
  "cookie consent options",
863
883
  "privacy controls",
864
884
  // German
@@ -1029,7 +1049,7 @@ var ACCEPT_PATTERNS = [
1029
1049
  "yes",
1030
1050
  /accept all above/is,
1031
1051
  "close and accept",
1032
- /accept all$/is,
1052
+ /(^|\s)accept all$/is,
1033
1053
  "im ok with that",
1034
1054
  // Spanish (ES)
1035
1055
  /^acept(ar|o)( cookies)?$/,
@@ -1055,6 +1075,8 @@ var ACCEPT_PATTERNS = [
1055
1075
  "accepta",
1056
1076
  "accepta totes les cookies",
1057
1077
  "accepta-ho tot",
1078
+ // FR/CA "d'accord" / "d'acord"
1079
+ /^dac?cord( fermer)?$/is,
1058
1080
  "accepta-les totes",
1059
1081
  "acceptar galetes",
1060
1082
  "acceptar i tancar",
@@ -1096,7 +1118,6 @@ var ACCEPT_PATTERNS = [
1096
1118
  "akceptuj\u0119!",
1097
1119
  "ok, zgadzam si\u0119",
1098
1120
  "potwierdzam wszystkie",
1099
- "przejd\u017A do serwisu",
1100
1121
  "tak",
1101
1122
  "tak, zgadzam si\u0119 na wszystkie pliki cookie",
1102
1123
  "tak, zgadzam si\u0119",
@@ -1167,8 +1188,6 @@ var ACKNOWLEDGE_PATTERNS = [
1167
1188
  "seguir",
1168
1189
  "vale",
1169
1190
  "\xA1vamos!",
1170
- // Catalan (CA)
1171
- "dacord",
1172
1191
  // Polish (PL)
1173
1192
  "kontynuuj",
1174
1193
  "ok, zrozumia\u0142em",
@@ -1192,10 +1211,8 @@ var ACKNOWLEDGE_PATTERNS = [
1192
1211
  "\u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C"
1193
1212
  ];
1194
1213
 
1195
- // lib/heuristics.ts
1196
- var BUTTON_LIKE_ELEMENT_SELECTOR = 'button, input[type="button"], input[type="submit"], a, [role="button"], [class*="button"]';
1214
+ // lib/heuristic-classify.ts
1197
1215
  var TEXT_LIMIT = 1e5;
1198
- var POPUP_SEARCH_MAX_TIME = 100;
1199
1216
  function checkHeuristicPatterns(allText, detectPatterns = DETECT_PATTERNS) {
1200
1217
  allText = allText.slice(0, TEXT_LIMIT);
1201
1218
  const patterns = [];
@@ -1213,31 +1230,6 @@ function checkHeuristicPatterns(allText, detectPatterns = DETECT_PATTERNS) {
1213
1230
  }
1214
1231
  return { patterns, snippets: snippets2 };
1215
1232
  }
1216
- function getActionablePopups(mode = "reject", timeout = POPUP_SEARCH_MAX_TIME) {
1217
- const acceptedLevels = mode === "tier2" ? ["reject", "tier1", "tier2"] : mode === "tier1" ? ["reject", "tier1"] : ["reject"];
1218
- if (acceptedLevels.length === 0) {
1219
- return [];
1220
- }
1221
- const popups = getPotentialPopups(timeout);
1222
- const result = popups.reduce((acc, popup) => {
1223
- const popupText = popup.text?.trim();
1224
- if (popupText) {
1225
- if (isExcludedPopup(popupText)) {
1226
- return acc;
1227
- }
1228
- const { patterns } = checkHeuristicPatterns(popupText);
1229
- if (patterns.length > 0) {
1230
- classifyButtons(popup.buttons);
1231
- popup.regexClassification = classifyPopup(popup.buttons);
1232
- acc.push({
1233
- ...popup
1234
- });
1235
- }
1236
- }
1237
- return acc;
1238
- }, []);
1239
- return result.filter((popup) => popup.regexClassification !== void 0 && acceptedLevels.includes(popup.regexClassification)).sort((a, b) => (a.regexClassification ?? "") > (b.regexClassification ?? "") ? 1 : -1);
1240
- }
1241
1233
  function classifyButtons(buttons) {
1242
1234
  for (const button of buttons) {
1243
1235
  button.regexClassification = classifyButtonTextRegex(button.text);
@@ -1308,6 +1300,35 @@ function classifyButtonTextRegex(buttonText) {
1308
1300
  }
1309
1301
  return "other";
1310
1302
  }
1303
+
1304
+ // lib/heuristics.ts
1305
+ var BUTTON_LIKE_ELEMENT_SELECTOR = 'button, input[type="button"], input[type="submit"], a, [role="button"], [class*="button"]';
1306
+ var POPUP_SEARCH_MAX_TIME = 100;
1307
+ function getActionablePopups(mode = "reject", timeout = POPUP_SEARCH_MAX_TIME) {
1308
+ const acceptedLevels = mode === "tier2" ? ["reject", "tier1", "tier2"] : mode === "tier1" ? ["reject", "tier1"] : ["reject"];
1309
+ if (acceptedLevels.length === 0) {
1310
+ return [];
1311
+ }
1312
+ const popups = getPotentialPopups(timeout);
1313
+ const result = popups.reduce((acc, popup) => {
1314
+ const popupText = popup.text?.trim();
1315
+ if (popupText) {
1316
+ if (isExcludedPopup(popupText)) {
1317
+ return acc;
1318
+ }
1319
+ const { patterns } = checkHeuristicPatterns(popupText);
1320
+ if (patterns.length > 0) {
1321
+ classifyButtons(popup.buttons);
1322
+ popup.regexClassification = classifyPopup(popup.buttons);
1323
+ acc.push({
1324
+ ...popup
1325
+ });
1326
+ }
1327
+ }
1328
+ return acc;
1329
+ }, []);
1330
+ return result.filter((popup) => popup.regexClassification !== void 0 && acceptedLevels.includes(popup.regexClassification)).sort((a, b) => (a.regexClassification ?? "") > (b.regexClassification ?? "") ? 1 : -1);
1331
+ }
1311
1332
  function getPotentialPopups(timeout = POPUP_SEARCH_MAX_TIME) {
1312
1333
  const isFramed = !isTopFrame();
1313
1334
  if (isFramed && window.parent && window.parent !== window.top) {
@@ -342,6 +342,8 @@ var snippets = {
342
342
  EVAL_COOKIEFIRST_1: () => document.querySelectorAll("button[data-cookiefirst-accent-color=true][role=checkbox]:not([disabled])").forEach((i) => i.getAttribute("aria-checked") === "true" && i.click()) || true,
343
343
  EVAL_COOKIEINFORMATION_0: () => CookieInformation.declineAllCategories() || true,
344
344
  EVAL_COOKIEINFORMATION_1: () => CookieInformation.submitAllCategories() || true,
345
+ // turn the single-button form into a decline submission, same fields as the CMP's own decline form
346
+ EVAL_EE_CONSENT_DECLINE_0: () => document.querySelectorAll('#cookieConsentFormAccept input[name^="ee:cookies_"]').forEach((i) => i.value = "n") || true,
345
347
  EVAL_ETSY_0: () => document.querySelectorAll(".gdpr-overlay-body input").forEach((toggle) => {
346
348
  toggle.checked = false;
347
349
  }) || true,
@@ -428,7 +430,8 @@ var snippets = {
428
430
  EVAL_USERCENTRICS_API_5: () => UC_UI.areAllConsentsAccepted() === true,
429
431
  EVAL_USERCENTRICS_API_6: () => UC_UI.areAllConsentsAccepted() === false,
430
432
  EVAL_USERCENTRICS_BUTTON_0: () => JSON.parse(localStorage.getItem("usercentrics")).consents.every((c) => c.isEssential || !c.consentStatus),
431
- EVAL_WAITROSE_0: () => Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e) => e.click()) || true
433
+ EVAL_WAITROSE_0: () => Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e) => e.click()) || true,
434
+ EVAL_WBD_LTP_CLOSE: () => document.querySelector("dialog#ltp-dialog").close() || true
432
435
  };
433
436
  function getFunctionBody(snippetFunc) {
434
437
  const snippetStr = snippetFunc.toString();
@@ -444,7 +447,8 @@ var DETECT_PATTERNS = [
444
447
  // "only necessary" is probably too broad
445
448
  /(?:by continuing.{0,100}cookie)|(?:cookie.{0,100}by continuing)/gi,
446
449
  /(?:by continuing.{0,100}privacy)|(?:privacy.{0,100}by continuing)/gi,
447
- /we (?:use|serve)(?: optional| essential)? cookies/gi,
450
+ // a single qualifier is common: "optional", "essential", "necessary", "analytics", ...
451
+ /we (?:use|serve)(?: \w+)? cookies/gi,
448
452
  /we are using cookies/gi,
449
453
  /use of cookies/gi,
450
454
  /website uses cookies to enhance your browsing experience/gi,
@@ -588,7 +592,10 @@ var DETECT_PATTERNS = [
588
592
  // "файлы cookie" / "cookie-файлы" / "куки-файлы" in any phrasing
589
593
  /(?:файл[а-яё]*[\s-]+(?:cookie|куки)|(?:cookie|куки)[\s-]+файл[а-яё]*)/gi,
590
594
  // Italian (IT)
591
- /usiamo.{0,20}cookie/gi
595
+ /usiamo.{0,20}cookie/gi,
596
+ // Japanese (JA)
597
+ // e.g. "当サイトはCookieを使用しています", "クッキー(Cookie)を利用しています"
598
+ /(?:cookie|クッキー).{0,10}を(?:使用|利用)/gi
592
599
  ];
593
600
  var REJECT_PATTERNS_ENGLISH = [
594
601
  // e.g. "reject", "reject all", "reject all cookies", "deny all", "refuse cookies", "decline",
@@ -604,8 +611,9 @@ var REJECT_PATTERNS_ENGLISH = [
604
611
  /^\s*(i\s+)?(want\s+to\s+)?(only\s+)?(use|accept|allow|keep|enable|choose|continue\s+with|i\s+confirm)\s*(only\s+)?(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s*(cookies)?\s*(continue|only)?\s*$/is,
605
612
  /^\s*(i\s+)?(want\s+to\s+)?only\s+(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s*(cookies)?\s*(continue|only)?\s*$/is,
606
613
  /^\s*(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s+((cookies\s+)?only|only\s+cookies)\s*$/is,
607
- // e.g. "do not sell or share my personal information", "opt out of sale ..." (CCPA)
608
- /do\s+not\s+sell|opt\s+out\s+of\s+sale/is,
614
+ // e.g. "do not sell or share my personal information", "do not share my personal information", "opt out of sale ..." (CCPA)
615
+ // "do not sell page" is a link; "do not sellcookie settings" is two concatenated buttons
616
+ /do\s+not\s+sell(?!\s*(page|cookie settings))|do\s+not\s+share\s+my\s+(personal\s+)?(information|info|data)|opt\s+out\s+of\s+sale/is,
609
617
  // e.g. "opt-out of sale/share or targeted advertising", "opt-out of advertising/social media cookies"
610
618
  /^opt[ -]?out of /is,
611
619
  // e.g. "reject all except strictly necessary", "reject all (except necessary cookies)"
@@ -616,7 +624,6 @@ var REJECT_PATTERNS_ENGLISH = [
616
624
  /^no,? thank(s| you)$/is,
617
625
  /^opt[ -]out$/is,
618
626
  "dont enable",
619
- "withdraw consent",
620
627
  "i do not agree"
621
628
  ];
622
629
  var REJECT_PATTERNS_DUTCH = [
@@ -643,9 +650,10 @@ var REJECT_PATTERNS_DUTCH = [
643
650
  var REJECT_PATTERNS_FRENCH = [
644
651
  // refuser / rejeter / interdire / décliner (reject verbs, any position)
645
652
  // "refuser et s'abonner" / "refuser et payer" are excluded via BUTTON_NEVER_MATCH_PATTERNS
646
- /(^|\s)(refus|rejet|rejeter|interdire|interdis|déclin|declin)/is,
653
+ // skip English prose such as "cookies that you can refuse"
654
+ /^(?!.*\bcan refuse\b)(.*\s)?(refus|rejet|rejeter|interdire|interdis|déclin|declin)/is,
647
655
  // only necessary / essential / technical / functional
648
- /(uniquement|seulement|indispensable|strictement nécessaire|que les cookies\s+(nécessaires|techniques|essentiels|indispensables|fonctionnels))/is,
656
+ /^(?=.*(cookie|nécessaire|essentiel|techni|requis|obligatoire|fonctionnel|indispensable|sdk)).*(uniquement|seulement|indispensable|strictement nécessaire|que les cookies\s+(nécessaires|techniques|essentiels|indispensables|fonctionnels))/is,
649
657
  // continue/proceed without accepting; refuse everything; disable purposes
650
658
  /(sans accepter|ne pas accepter|je naccepte rien|je désactive)/is,
651
659
  // "non" / "non, merci"
@@ -703,7 +711,7 @@ var REJECT_PATTERNS_SPANISH = [
703
711
  // "solo/sólo/no, sólo ... necessary/essential"
704
712
  /^(no,?\s+)?(solo|sólo|només)\s+(usar\s+|las?\s+|los\s+|lo\s+)?.{0,20}(necesari|esencial|estrictamente)/is,
705
713
  // refusals / opt-outs
706
- /^(no acept|no consentir|no permitir|no estoy de acuerdo|no,? gracias|sin consentimiento|revocar consentimiento|continuar sin aceptar|prefiero rechazarlas|descartar todas)/is,
714
+ /^(no acept|no consentir|no permitir|no estoy de acuerdo|no,? gracias|sin consentimiento|continuar sin aceptar|prefiero rechazarlas|descartar todas)/is,
707
715
  "acceptar nom\xE9s les necess\xE0ries",
708
716
  "nom\xE9s sutilitzen cookies quan \xE9s necessari",
709
717
  "pulsa aqu\xED para desactivar las cookies opcionales"
@@ -752,6 +760,12 @@ var REJECT_PATTERNS_RUSSIAN = [
752
760
  ];
753
761
  var REJECT_PATTERNS_TURKISH = ["reddet", "\xE7erezleri reddet"];
754
762
  var REJECT_PATTERNS_INDONESIAN = ["tolak cookie"];
763
+ var REJECT_PATTERNS_JAPANESE = [
764
+ // e.g. "拒否", "すべて拒否", "全て拒否する", "cookieを拒否"
765
+ /^(すべて|全て)?\s?(の)?(cookie|クッキー)?\s?(を)?拒否(する)?$/i,
766
+ "\u540C\u610F\u3057\u306A\u3044",
767
+ "\u540C\u610F\u3057\u307E\u305B\u3093"
768
+ ];
755
769
  var REJECT_PATTERNS = [
756
770
  ...REJECT_PATTERNS_ENGLISH,
757
771
  ...REJECT_PATTERNS_DUTCH,
@@ -769,9 +783,13 @@ var REJECT_PATTERNS = [
769
783
  ...REJECT_PATTERNS_POLISH,
770
784
  ...REJECT_PATTERNS_RUSSIAN,
771
785
  ...REJECT_PATTERNS_TURKISH,
772
- ...REJECT_PATTERNS_INDONESIAN
786
+ ...REJECT_PATTERNS_INDONESIAN,
787
+ ...REJECT_PATTERNS_JAPANESE
773
788
  ];
774
789
  var BUTTON_NEVER_MATCH_PATTERNS = [
790
+ // text of several concatenated buttons, or popup body text rather than a button
791
+ /accept all.*reject all|reject all.*accept all/is,
792
+ /^.{300,}$/s,
775
793
  /pay|subscribe/is,
776
794
  /abonneer/is,
777
795
  /abonnier/is,
@@ -812,8 +830,10 @@ var SETTINGS_PATTERNS = [
812
830
  // Multilingual "open customization" patterns: a customization verb next to a
813
831
  // cookie/preference/settings/options/details/purposes noun (both word orders).
814
832
  // The negative lookahead avoids policy links and save/confirm/accept phrases (those are accept/acknowledge/other).
815
- /^(?!.*\b(policy|policies|notice|statement|impressum|richtlinie|beleid|politique|política|polityk|speichern|guardar|opslaan|zapisz|enregistrer|sauvegarder|bevestig|bestätig|confirm|save|submit|akzeptier|accept|zaakcept)\b)(customi[sz]e|manage|adjust|configure|personali[sz]e|let me choose|edit|change|set|select|view|see|review|update|open|show|choose|anpassen|verwalten|konfigurieren|bearbeiten|öffnen|anzeigen|einblenden|festlegen|auswählen|wählen|aanpassen|beheren|instellen|wijzig\w*|personaliseren|personaliseer|kies|bekijk|toon|personnaliser|paramétrer|gérer|configurer|choisir|afficher|définir|modifier|configurar|personalizar|gestionar|administrar|ajustar|seleccionar|modificar|establecer|dostosuj|zarządzaj|personalizuj|ustaw\w*|zmień|pokaż|wybierz)\b.{0,20}(cookies?|preferences?|settings?|options?|choices?|controls?|details?|purposes?|services?|consent|einstellung\w*|optionen|präferenzen|einzelheiten|zwecke|dienste|datenschutz\w*|auswahl|voorkeur\w*|instelling\w*|opties|diensten|préférences|paramètres|réglages|choix|détails|finalités|témoins|preferencia\w*|opciones|ajustes|configuraci\w*|detalles|servicios|elección|preferencj\w*|ustawie\w*|opcje|szczegół\w*|cele|galetes)\b/is,
816
- /^(?!.*\b(policy|policies|notice|statement|impressum|richtlinie|beleid|politique|política|polityk|speichern|guardar|opslaan|zapisz|enregistrer|sauvegarder|bevestig|bestätig|confirm|save|submit|akzeptier|accept|zaakcept)\b)(cookies?|preferences?|settings?|options?|choices?|controls?|details?|purposes?|services?|consent|einstellung\w*|optionen|präferenzen|einzelheiten|zwecke|dienste|datenschutz\w*|auswahl|voorkeur\w*|instelling\w*|opties|diensten|préférences|paramètres|réglages|choix|détails|finalités|témoins|preferencia\w*|opciones|ajustes|configuraci\w*|detalles|servicios|elección|preferencj\w*|ustawie\w*|opcje|szczegół\w*|cele|galetes)\b.{0,15}(customi[sz]e|manage|adjust|configure|personali[sz]e|let me choose|edit|change|set|select|view|see|review|update|open|show|choose|anpassen|verwalten|konfigurieren|bearbeiten|öffnen|anzeigen|einblenden|festlegen|auswählen|wählen|aanpassen|beheren|instellen|wijzig\w*|personaliseren|personaliseer|kies|bekijk|toon|personnaliser|paramétrer|gérer|configurer|choisir|afficher|définir|modifier|configurar|personalizar|gestionar|administrar|ajustar|seleccionar|modificar|establecer|dostosuj|zarządzaj|personalizuj|ustaw\w*|zmień|pokaż|wybierz)\b/is,
833
+ /^(?!.*\b(policy|policies|notice|statement|impressum|\w*richtlinie\w*|\w*erklärung|page|beschrijving|privacy$|beleid|politique|política|polityk|speichern|guardar|opslaan|zapisz|enregistrer|sauvegarder|bevestig|bestätig|confirm|save|submit|akzeptier|accept|zaakcept)\b)(customi[sz]e|manage|adjust|configure|personali[sz]e|let me choose|edit|change|set|select|view|see|review|update|open|show|choose|anpassen|verwalten|konfigurieren|bearbeiten|öffnen|anzeigen|einblenden|einstellen|festlegen|auswählen|wählen|aanpassen|beheren|instellen|wijzig\w*|personaliseren|personaliseer|kies|bekijk|toon|personnaliser|paramétrer|gérer|configurer|choisir|afficher|définir|modifier|configurar|personalizar|gestionar|administrar|ajustar|seleccionar|modificar|establecer|dostosuj|zarządzaj|personalizuj|ustaw\w*|zmień|pokaż|wybierz)\b.{0,20}(cookies?|preferences?|settings?|options?|choices?|controls?|details?|purposes?|services?|consent|einstellung\w*|optionen|präferenzen|einzelheiten|zwecke|dienste|datenschutz\w*|auswahl|voorkeur\w*|instelling\w*|opties|diensten|préférences|paramètres|réglages|choix|détails|finalités|témoins|preferencia\w*|opciones|ajustes|configuraci\w*|detalles|servicios|elección|preferencj\w*|ustawie\w*|opcje|szczegół\w*|cele|galetes)\b/is,
834
+ /^(?!.*\b(policy|policies|notice|statement|impressum|\w*richtlinie\w*|\w*erklärung|page|beschrijving|privacy$|beleid|politique|política|polityk|speichern|guardar|opslaan|zapisz|enregistrer|sauvegarder|bevestig|bestätig|confirm|save|submit|akzeptier|accept|zaakcept)\b)(cookies?|preferences?|settings?|options?|choices?|controls?|details?|purposes?|services?|consent|einstellung\w*|optionen|präferenzen|einzelheiten|zwecke|dienste|datenschutz\w*|auswahl|voorkeur\w*|instelling\w*|opties|diensten|préférences|paramètres|réglages|choix|détails|finalités|témoins|preferencia\w*|opciones|ajustes|configuraci\w*|detalles|servicios|elección|preferencj\w*|ustawie\w*|opcje|szczegół\w*|cele|galetes)\b(.{0,14}\W)?(customi[sz]e|manage|adjust|configure|personali[sz]e|let me choose|edit|change|set|select|view|see|review|update|open|show|choose|anpassen|verwalten|konfigurieren|bearbeiten|öffnen|anzeigen|einblenden|einstellen|festlegen|auswählen|wählen|aanpassen|beheren|instellen|wijzig\w*|personaliseren|personaliseer|kies|bekijk|toon|personnaliser|paramétrer|gérer|configurer|choisir|afficher|définir|modifier|configurar|personalizar|gestionar|administrar|ajustar|seleccionar|modificar|establecer|dostosuj|zarządzaj|personalizuj|ustaw\w*|zmień|pokaż|wybierz)\b/is,
835
+ // settings noun + cookies, e.g. "paramètres des cookies", "ajustes de cookies", "instellingen voor cookies en diensten"
836
+ /^(paramètres|préférences|réglages|ajustes|opciones|elección|preferencias|instellingen)( (de|des|les|voor|van))? cookies( (et des|en|y) (services|diensten|servicios))?$/is,
817
837
  "settings",
818
838
  "preferences",
819
839
  /customi(s|z)e/is,
@@ -827,8 +847,8 @@ var SETTINGS_PATTERNS = [
827
847
  "cookieconsent preferences",
828
848
  /privacy choices/is,
829
849
  /^(privacy|cookie|custom) settings$/is,
830
- /^cookies? (settings|preferences|setting)$/is,
831
- /(manage|customize|customise|opt-out|edit).*(cookies|preferences|settings|options)/is,
850
+ /^cookies? (settings|preferences|setting)(?!.*\bdo not\b)/is,
851
+ /^(?!.*\bpolic(y|ies)\b).*(manage|customize|customise|opt-out|edit).*(cookies|preferences|settings|options)/is,
832
852
  "cookie consent options",
833
853
  "privacy controls",
834
854
  // German
@@ -999,7 +1019,7 @@ var ACCEPT_PATTERNS = [
999
1019
  "yes",
1000
1020
  /accept all above/is,
1001
1021
  "close and accept",
1002
- /accept all$/is,
1022
+ /(^|\s)accept all$/is,
1003
1023
  "im ok with that",
1004
1024
  // Spanish (ES)
1005
1025
  /^acept(ar|o)( cookies)?$/,
@@ -1025,6 +1045,8 @@ var ACCEPT_PATTERNS = [
1025
1045
  "accepta",
1026
1046
  "accepta totes les cookies",
1027
1047
  "accepta-ho tot",
1048
+ // FR/CA "d'accord" / "d'acord"
1049
+ /^dac?cord( fermer)?$/is,
1028
1050
  "accepta-les totes",
1029
1051
  "acceptar galetes",
1030
1052
  "acceptar i tancar",
@@ -1066,7 +1088,6 @@ var ACCEPT_PATTERNS = [
1066
1088
  "akceptuj\u0119!",
1067
1089
  "ok, zgadzam si\u0119",
1068
1090
  "potwierdzam wszystkie",
1069
- "przejd\u017A do serwisu",
1070
1091
  "tak",
1071
1092
  "tak, zgadzam si\u0119 na wszystkie pliki cookie",
1072
1093
  "tak, zgadzam si\u0119",
@@ -1137,8 +1158,6 @@ var ACKNOWLEDGE_PATTERNS = [
1137
1158
  "seguir",
1138
1159
  "vale",
1139
1160
  "\xA1vamos!",
1140
- // Catalan (CA)
1141
- "dacord",
1142
1161
  // Polish (PL)
1143
1162
  "kontynuuj",
1144
1163
  "ok, zrozumia\u0142em",
@@ -1162,10 +1181,8 @@ var ACKNOWLEDGE_PATTERNS = [
1162
1181
  "\u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C"
1163
1182
  ];
1164
1183
 
1165
- // lib/heuristics.ts
1166
- var BUTTON_LIKE_ELEMENT_SELECTOR = 'button, input[type="button"], input[type="submit"], a, [role="button"], [class*="button"]';
1184
+ // lib/heuristic-classify.ts
1167
1185
  var TEXT_LIMIT = 1e5;
1168
- var POPUP_SEARCH_MAX_TIME = 100;
1169
1186
  function checkHeuristicPatterns(allText, detectPatterns = DETECT_PATTERNS) {
1170
1187
  allText = allText.slice(0, TEXT_LIMIT);
1171
1188
  const patterns = [];
@@ -1183,31 +1200,6 @@ function checkHeuristicPatterns(allText, detectPatterns = DETECT_PATTERNS) {
1183
1200
  }
1184
1201
  return { patterns, snippets: snippets2 };
1185
1202
  }
1186
- function getActionablePopups(mode = "reject", timeout = POPUP_SEARCH_MAX_TIME) {
1187
- const acceptedLevels = mode === "tier2" ? ["reject", "tier1", "tier2"] : mode === "tier1" ? ["reject", "tier1"] : ["reject"];
1188
- if (acceptedLevels.length === 0) {
1189
- return [];
1190
- }
1191
- const popups = getPotentialPopups(timeout);
1192
- const result = popups.reduce((acc, popup) => {
1193
- const popupText = popup.text?.trim();
1194
- if (popupText) {
1195
- if (isExcludedPopup(popupText)) {
1196
- return acc;
1197
- }
1198
- const { patterns } = checkHeuristicPatterns(popupText);
1199
- if (patterns.length > 0) {
1200
- classifyButtons(popup.buttons);
1201
- popup.regexClassification = classifyPopup(popup.buttons);
1202
- acc.push({
1203
- ...popup
1204
- });
1205
- }
1206
- }
1207
- return acc;
1208
- }, []);
1209
- return result.filter((popup) => popup.regexClassification !== void 0 && acceptedLevels.includes(popup.regexClassification)).sort((a, b) => (a.regexClassification ?? "") > (b.regexClassification ?? "") ? 1 : -1);
1210
- }
1211
1203
  function classifyButtons(buttons) {
1212
1204
  for (const button of buttons) {
1213
1205
  button.regexClassification = classifyButtonTextRegex(button.text);
@@ -1278,6 +1270,35 @@ function classifyButtonTextRegex(buttonText) {
1278
1270
  }
1279
1271
  return "other";
1280
1272
  }
1273
+
1274
+ // lib/heuristics.ts
1275
+ var BUTTON_LIKE_ELEMENT_SELECTOR = 'button, input[type="button"], input[type="submit"], a, [role="button"], [class*="button"]';
1276
+ var POPUP_SEARCH_MAX_TIME = 100;
1277
+ function getActionablePopups(mode = "reject", timeout = POPUP_SEARCH_MAX_TIME) {
1278
+ const acceptedLevels = mode === "tier2" ? ["reject", "tier1", "tier2"] : mode === "tier1" ? ["reject", "tier1"] : ["reject"];
1279
+ if (acceptedLevels.length === 0) {
1280
+ return [];
1281
+ }
1282
+ const popups = getPotentialPopups(timeout);
1283
+ const result = popups.reduce((acc, popup) => {
1284
+ const popupText = popup.text?.trim();
1285
+ if (popupText) {
1286
+ if (isExcludedPopup(popupText)) {
1287
+ return acc;
1288
+ }
1289
+ const { patterns } = checkHeuristicPatterns(popupText);
1290
+ if (patterns.length > 0) {
1291
+ classifyButtons(popup.buttons);
1292
+ popup.regexClassification = classifyPopup(popup.buttons);
1293
+ acc.push({
1294
+ ...popup
1295
+ });
1296
+ }
1297
+ }
1298
+ return acc;
1299
+ }, []);
1300
+ return result.filter((popup) => popup.regexClassification !== void 0 && acceptedLevels.includes(popup.regexClassification)).sort((a, b) => (a.regexClassification ?? "") > (b.regexClassification ?? "") ? 1 : -1);
1301
+ }
1281
1302
  function getPotentialPopups(timeout = POPUP_SEARCH_MAX_TIME) {
1282
1303
  const isFramed = !isTopFrame();
1283
1304
  if (isFramed && window.parent && window.parent !== window.top) {