From 87ba24eea817f1b3b51b4f4bc7c4ba072e1f2296 Mon Sep 17 00:00:00 2001 From: Carmelo Messina Date: Tue, 25 Jun 2024 12:01:03 +0200 Subject: [PATCH] Eyeo Adblock for Cromite: #1187 Remove "More blocking options" in ad blocking options Fix json destination Update to snippets v1.4.0 --- build/patches/Eyeo-Adblock-for-Cromite.patch | 5041 ++++-------------- 1 file changed, 951 insertions(+), 4090 deletions(-) diff --git a/build/patches/Eyeo-Adblock-for-Cromite.patch b/build/patches/Eyeo-Adblock-for-Cromite.patch index 6a98cc43..5cd98ad0 100644 --- a/build/patches/Eyeo-Adblock-for-Cromite.patch +++ b/build/patches/Eyeo-Adblock-for-Cromite.patch @@ -48,10 +48,10 @@ deactivation of all pop-ups (default disabled) .../AdblockCustomFiltersFragment.java | 7 +- .../settings/AdblockCustomItemFragment.java | 20 +- .../settings/AdblockFilterListsAdapter.java | 6 + - .../settings/AdblockSettingsFragment.java | 50 +- + .../settings/AdblockSettingsFragment.java | 51 +- components/adblock/content/browser/BUILD.gn | 18 +- .../adblock_controller_factory_base.cc | 5 +- - .../browser/adblock_url_loader_factory.cc | 63 +- + .../browser/adblock_url_loader_factory.cc | 65 +- .../browser/adblock_url_loader_factory.h | 7 +- .../browser/adblock_webcontents_observer.cc | 25 +- .../browser/adblock_webcontents_observer.h | 5 +- @@ -69,7 +69,7 @@ deactivation of all pop-ups (default disabled) .../adblock/core/adblock_controller_impl.cc | 10 +- components/adblock/core/adblock_switches.cc | 1 - components/adblock/core/adblock_switches.h | 1 - - .../adblock/core/adblock_telemetry_service.cc | 258 -- + .../adblock/core/adblock_telemetry_service.cc | 258 - .../adblock/core/adblock_telemetry_service.h | 120 - components/adblock/core/common/BUILD.gn | 8 - .../adblock/core/common/adblock_constants.cc | 2 - @@ -85,7 +85,7 @@ deactivation of all pop-ups (default disabled) .../core/converter/parser/test/test_rules.txt | 21 + .../core/converter/parser/url_filter.cc | 10 +- .../converter/parser/url_filter_options.cc | 21 +- - .../serializer/flatbuffer_serializer.cc | 75 +- + .../serializer/flatbuffer_serializer.cc | 82 +- components/adblock/core/features.cc | 3 +- components/adblock/core/hash/schema_hash.h | 10 + .../adblock/core/sitekey_storage_impl.cc | 7 + @@ -116,22 +116,21 @@ deactivation of all pop-ups (default disabled) components/resources/BUILD.gn | 1 - components/resources/adblock_resources.grdp | 3 - components/resources/adblocking/.gitignore | 2 +- - components/resources/adblocking/BUILD.gn | 30 +- + components/resources/adblocking/BUILD.gn | 34 +- .../adblocking/elemhide_for_selector.jst | 2 +- .../resources/adblocking/elemhideemu.jst | 2 + - .../snippets/dist/isolated-first-xpath3.jst | 62 + - .../dist/isolated-first-xpath3.source.jst | 3696 +++++++++++++++++ - .../snippets/dist/isolated-first.jst | 65 + - .../snippets/dist/isolated-first.source.jst | 3624 ++++++++++++++++ + .../snippets/dist/isolated-first.jst | 66 + + .../snippets/dist/isolated-first.source.jst | 4215 +++++++++++++++++ .../websockets/websocket_connector_impl.cc | 6 +- .../public/browser/content_browser_client.cc | 4 +- .../public/browser/content_browser_client.h | 4 +- + content/public/common/isolated_world_ids.h | 6 +- .../about_flags_cc/Stricter-popup-blocker.inc | 14 + .../blink/renderer/core/css/style_engine.cc | 8 + .../blink/renderer/core/css/style_engine.h | 1 + .../renderer/core/exported/web_document.cc | 15 +- .../definitions/adblock_private.d.ts | 14 + - 121 files changed, 9294 insertions(+), 1291 deletions(-) + 120 files changed, 6140 insertions(+), 1299 deletions(-) create mode 100644 chrome/browser/resources/settings/adblock_page/adblock_page.html create mode 100644 chrome/browser/resources/settings/adblock_page/adblock_page.ts rename components/adblock/android/java/res/xml/{adblock_preferences.xml => eyeo_adblock_preferences.xml} (56%) @@ -142,10 +141,8 @@ deactivation of all pop-ups (default disabled) create mode 100644 components/adblock/core/converter/parser/test/test_rules.txt create mode 100644 components/adblock/core/hash/schema_hash.h create mode 100644 components/content_settings/core/browser/bromite_content_settings/ads.inc - create mode 100644 components/resources/adblocking/snippets/dist/isolated-first-xpath3.jst - create mode 100644 components/resources/adblocking/snippets/dist/isolated-first-xpath3.source.jst - create mode 100755 components/resources/adblocking/snippets/dist/isolated-first.jst - create mode 100755 components/resources/adblocking/snippets/dist/isolated-first.source.jst + create mode 100644 components/resources/adblocking/snippets/dist/isolated-first.jst + create mode 100644 components/resources/adblocking/snippets/dist/isolated-first.source.jst create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Stricter-popup-blocker.inc diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml @@ -2462,7 +2459,7 @@ diff --git a/components/adblock/android/java/src/org/chromium/components/adblock private static final String SETTINGS_ENABLED_KEY = "fragment_adblock_settings_enabled_key"; private static final String SETTINGS_FILTER_LISTS_KEY = "fragment_adblock_settings_filter_lists_key"; -@@ -49,27 +63,49 @@ public class AdblockSettingsFragment +@@ -49,27 +63,48 @@ public class AdblockSettingsFragment private long mOnOffTogleTimestamp; private void bindPreferences() { @@ -2486,8 +2483,8 @@ diff --git a/components/adblock/android/java/src/org/chromium/components/adblock private boolean areMoreOptionsEnabled() { - return UserPrefs.get(Profile.getLastUsedRegularProfile()) -+ return UserPrefs.get(ProfileManager.getLastUsedRegularProfile()) - .getBoolean(Pref.ADBLOCK_MORE_OPTIONS_ENABLED); +- .getBoolean(Pref.ADBLOCK_MORE_OPTIONS_ENABLED); ++ return false; } private void applyAdblockEnabled(boolean enabledValue) { @@ -2515,7 +2512,7 @@ diff --git a/components/adblock/android/java/src/org/chromium/components/adblock boolean enabled = AdblockController.getInstance().isEnabled(); mAdblockEnabled.setChecked(enabled); mAdblockEnabled.setOnPreferenceChangeListener(this); -@@ -95,7 +131,7 @@ public class AdblockSettingsFragment +@@ -95,7 +130,7 @@ public class AdblockSettingsFragment mOnOffTogleTimestamp = now; if (mOnOffClickCount >= ON_OFF_TOGGLE_COUNT_TO_ENABLE_MORE_OPTIONS) { @@ -2524,7 +2521,7 @@ diff --git a/components/adblock/android/java/src/org/chromium/components/adblock .setBoolean(Pref.ADBLOCK_MORE_OPTIONS_ENABLED, true); } } -@@ -107,7 +143,7 @@ public class AdblockSettingsFragment +@@ -107,7 +142,7 @@ public class AdblockSettingsFragment @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { @@ -2533,7 +2530,7 @@ diff --git a/components/adblock/android/java/src/org/chromium/components/adblock bindPreferences(); synchronizePreferences(); } -@@ -126,6 +162,8 @@ public class AdblockSettingsFragment +@@ -126,6 +161,8 @@ public class AdblockSettingsFragment maybeEnableMoreOptions(); applyAdblockEnabled((Boolean) newValue); @@ -2606,19 +2603,22 @@ diff --git a/components/adblock/content/browser/adblock_controller_factory_base. diff --git a/components/adblock/content/browser/adblock_url_loader_factory.cc b/components/adblock/content/browser/adblock_url_loader_factory.cc --- a/components/adblock/content/browser/adblock_url_loader_factory.cc +++ b/components/adblock/content/browser/adblock_url_loader_factory.cc -@@ -81,6 +81,9 @@ ContentType ToAdblockResourceType(const network::ResourceRequest& request) { +@@ -80,7 +80,9 @@ ContentType ToAdblockResourceType(const network::ResourceRequest& request) { + case network::mojom::RequestDestination::kWorker: case network::mojom::RequestDestination::kSharedWorker: case network::mojom::RequestDestination::kServiceWorker: - case network::mojom::RequestDestination::kJson: +- case network::mojom::RequestDestination::kJson: + case network::mojom::RequestDestination::kSharedStorageWorklet: + case network::mojom::RequestDestination::kAudioWorklet: + case network::mojom::RequestDestination::kPaintWorklet: return ContentType::Script; case network::mojom::RequestDestination::kImage: return ContentType::Image; -@@ -102,10 +105,8 @@ ContentType ToAdblockResourceType(const network::ResourceRequest& request) { +@@ -101,11 +103,10 @@ ContentType ToAdblockResourceType(const network::ResourceRequest& request) { + return ContentType::Other; case network::mojom::RequestDestination::kWebBundle: return ContentType::WebBundle; ++ case network::mojom::RequestDestination::kJson: case network::mojom::RequestDestination::kReport: - case network::mojom::RequestDestination::kAudioWorklet: case network::mojom::RequestDestination::kDictionary: @@ -4496,7 +4496,7 @@ diff --git a/components/adblock/core/converter/serializer/flatbuffer_serializer. #include "components/adblock/core/common/adblock_constants.h" #include "components/adblock/core/common/regex_filter_pattern.h" #include "components/adblock/core/converter/parser/filter_classifier.h" -@@ -28,6 +29,60 @@ +@@ -28,6 +29,67 @@ namespace adblock { @@ -4509,16 +4509,19 @@ diff --git a/components/adblock/core/converter/serializer/flatbuffer_serializer. + u"race", + + // Conditional Hiding Snippets ++ u"hide-if-classifies", + u"hide-if-contains", + u"hide-if-contains-image", + u"hide-if-contains-similar-text", + u"hide-if-contains-visible-text", + u"hide-if-contains-and-matches-style", -+ u"hide-if-matches-computed-xpath", -+ u"hide-if-graph-matches", ++ //u"hide-if-matches-computed-xpath", (deprecated) ++ //u"hide-if-graph-matches", (deprecated) + u"hide-if-has-and-matches-style", + u"hide-if-labelled-by", + u"hide-if-matches-xpath", ++ u"hide-if-matches-xpath3", ++ u"hide-if-matches-computed-xpath", + u"hide-if-shadow-contains", + + // Behavioral Snippets @@ -4529,13 +4532,17 @@ diff --git a/components/adblock/core/converter/serializer/flatbuffer_serializer. + u"abort-on-iframe-property-write", + u"cookie-remover", + u"freeze-element", -+ // u"json-override", // unsupported ++ // u"json-override", (unsupported) + u"json-prune", + u"override-property-read", + // u"simulate-event-poc", (deprecated) -+ // u"simulate-mouse-event", // unsupported ++ // u"simulate-mouse-event", (unsupported) + u"prevent-listener", -+ u"strip-fetch-query-parameter" ++ u"skip-video", ++ // u"strip-fetch-query-parameter", (unsupported) ++ ++ // Performance Snippets ++ u"race" + }; + + const char16_t* kAllowedPropertyReadValues[] = { @@ -4557,7 +4564,7 @@ diff --git a/components/adblock/core/converter/serializer/flatbuffer_serializer. class Buffer : public FlatbufferData { public: explicit Buffer(flatbuffers::DetachedBuffer&& buffer) -@@ -118,9 +173,25 @@ void FlatbufferSerializer::SerializeContentFilter( +@@ -118,9 +180,25 @@ void FlatbufferSerializer::SerializeContentFilter( void FlatbufferSerializer::SerializeSnippetFilter( const SnippetFilter snippet_filter) { if (!allow_privileged_) { @@ -4584,7 +4591,7 @@ diff --git a/components/adblock/core/converter/serializer/flatbuffer_serializer. std::vector> offsets; offsets.reserve(snippet_filter.snippet_script.size()); -@@ -141,7 +212,7 @@ void FlatbufferSerializer::SerializeSnippetFilter( +@@ -141,7 +219,7 @@ void FlatbufferSerializer::SerializeSnippetFilter( void FlatbufferSerializer::SerializeUrlFilter(const UrlFilter url_filter) { const auto& options = url_filter.options; if (!allow_privileged_ && options.Headers().has_value()) { @@ -5536,6 +5543,19 @@ diff --git a/components/resources/adblocking/BUILD.gn b/components/resources/adb action("prepare_snippets_deps") { script = "//tools/eyeo/snippets_deps.py" inputs = ["//components/resources/adblocking/snippets/dist"] +@@ -73,10 +45,10 @@ copy("copy_snippets_lib") { + ] + + if (is_debug) { +- sources = [ "//components/resources/adblocking/snippets/dist/isolated-first-xpath3.source.jst" ] ++ sources = [ "//components/resources/adblocking/snippets/dist/isolated-first.source.jst" ] + } else { + sources = +- [ "//components/resources/adblocking/snippets/dist/isolated-first-xpath3.jst" ] ++ [ "//components/resources/adblocking/snippets/dist/isolated-first.jst" ] + } + outputs = [ "${target_gen_dir}/snippets.jst" ] + } diff --git a/components/resources/adblocking/elemhide_for_selector.jst b/components/resources/adblocking/elemhide_for_selector.jst --- a/components/resources/adblocking/elemhide_for_selector.jst +++ b/components/resources/adblocking/elemhide_for_selector.jst @@ -5561,3785 +5581,17 @@ diff --git a/components/resources/adblocking/elemhideemu.jst b/components/resour elemHideEmulation.apply(elemHidingEmulatedPatterns); +})() -diff --git a/components/resources/adblocking/snippets/dist/isolated-first-xpath3.jst b/components/resources/adblocking/snippets/dist/isolated-first-xpath3.jst -new file mode 100644 ---- /dev/null -+++ b/components/resources/adblocking/snippets/dist/isolated-first-xpath3.jst -@@ -0,0 +1,62 @@ -+(e, ...t) => { -+/*! -+ * This file is part of eyeo's Anti-Circumvention Snippets module (@eyeo/snippets), -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * @eyeo/snippets is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * @eyeo/snippets is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with @eyeo/snippets. If not, see . -+ */ -+ ((environment, ...filters) => { -+const e=Proxy,{apply:t,bind:n,call:o}=Function,r=o.bind(t),i=o.bind(n),s=o.bind(o),a={get:(e,t)=>i(o,e[t])},c=t=>new e(t,a),l={get:(e,t)=>i(e[t],e)},u=t=>new e(t,l),{assign:d,defineProperties:h,freeze:f,getOwnPropertyDescriptor:p,getOwnPropertyDescriptors:w,getPrototypeOf:m}=u(Object),{hasOwnProperty:g}=c({}),{species:b}=Symbol,y={get(e,t){const n=e[t];class o extends n{}const r=w(n.prototype);delete r.constructor,f(h(o.prototype,r));const i=w(n);return delete i.length,delete i.prototype,i[b]={value:o},f(h(o,i))}},v=t=>new e(t,y),S="undefined"!=typeof environment?environment:{};"undefined"==typeof globalThis&&(window.globalThis=window);const{apply:k,ownKeys:E}=u(Reflect),x="world"in S,M=x&&"ISOLATED"===S.world,C=x&&"MAIN"===S.world,T="object"==typeof chrome&&!!chrome.runtime,W="object"==typeof browser&&!!browser.runtime,L=!C&&(M||T||W),O=e=>L?e:P(e,R(e)),{create:P,defineProperties:D,defineProperty:N,freeze:A,getOwnPropertyDescriptor:I,getOwnPropertyDescriptors:R}=u(Object),V=u(globalThis),$=L?globalThis:v(globalThis),{Map:H,RegExp:_,Set:j,WeakMap:X,WeakSet:F}=$,q=(e,t,n=null)=>{const o=E(t);for(const r of E(e)){if(o.includes(r))continue;const i=I(e,r);if(n&&"value"in i){const{value:e}=i;"function"==typeof e&&(i.value=n(e))}N(t,r,i)}},B=e=>{const t=$[e];class n extends t{}const{toString:o,valueOf:r}=t.prototype;D(n.prototype,{toString:{value:o},valueOf:{value:r}});const i=e.toLowerCase(),s=e=>function(){const t=k(e,this,arguments);return typeof t===i?new n(t):t};return q(t,n,s),q(t.prototype,n.prototype,s),n},z=A({frozen:new X,hidden:new F,iframePropertiesToAbort:{read:new j,write:new j},abortedIframes:new X}),U=new _("^[A-Z]");var G=new Proxy(new H([["chrome",L&&(T&&chrome||W&&browser)||void 0],["isExtensionContext",L],["variables",z],["console",O(console)],["document",globalThis.document],["performance",O(performance)],["JSON",O(JSON)],["Map",H],["Math",O(Math)],["Number",L?Number:B("Number")],["RegExp",_],["Set",j],["String",L?String:B("String")],["WeakMap",X],["WeakSet",F],["MouseEvent",MouseEvent]]),{get(e,t){if(e.has(t))return e.get(t);let n=globalThis[t];return"function"==typeof n&&(n=(U.test(t)?$:V)[t]),e.set(t,n),n},has:(e,t)=>e.has(t)});const J={WeakSet:WeakSet,WeakMap:WeakMap,WeakValue:class{has(){return!1}set(){}}},{apply:Q}=Reflect;const{Map:Y,WeakMap:K,WeakSet:Z,setTimeout:ee}=G;let te=!0,ne=e=>{e.clear(),te=!te};var oe=function(e){const{WeakSet:t,WeakMap:n,WeakValue:o}=this||J,r=new t,i=new n,s=new o;return function(t){if(r.has(t))return t;if(i.has(t))return i.get(t);if(s.has(t))return s.get(t);const n=Q(e,this,arguments);return r.add(n),n!==t&&("object"==typeof t&&t?i:s).set(t,n),n}}.bind({WeakMap:K,WeakSet:Z,WeakValue:class extends Y{set(e,t){return te&&(te=!te,ee(ne,0,this)),super.set(e,t)}}});const{concat:re,includes:ie,join:se,reduce:ae,unshift:ce}=c([]),le=v(globalThis),{Map:ue,WeakMap:de}=le,he=new ue,fe=t=>{const n=(e=>{const t=[];let n=e;for(;n;){if(he.has(n))ce(t,he.get(n));else{const e=w(n);he.set(n,e),ce(t,e)}n=m(n)}return ce(t,{}),r(d,null,t)})("function"==typeof t?t.prototype:t),o={get(e,t){if(t in n){const{value:o,get:r}=n[t];if(r)return s(r,e);if("function"==typeof o)return i(o,e)}return e[t]},set(e,t,o){if(t in n){const{set:r}=n[t];if(r)return s(r,e,o),!0}return e[t]=o,!0}};return t=>new e(t,o)},{isExtensionContext:pe,Array:we,Number:me,String:ge,Object:be}=G,{isArray:ye}=we,{getOwnPropertyDescriptor:ve,setPrototypeOf:Se}=be,{toString:ke}=be.prototype,{slice:Ee}=ge.prototype,{get:xe}=ve(Node.prototype,"nodeType"),Me=pe?{}:{Attr:fe(Attr),CanvasRenderingContext2D:fe(CanvasRenderingContext2D),CSSStyleDeclaration:fe(CSSStyleDeclaration),Document:fe(Document),Element:fe(Element),HTMLCanvasElement:fe(HTMLCanvasElement),HTMLElement:fe(HTMLElement),HTMLImageElement:fe(HTMLImageElement),HTMLScriptElement:fe(HTMLScriptElement),MutationRecord:fe(MutationRecord),Node:fe(Node),ShadowRoot:fe(ShadowRoot),get CSS2Properties(){return Me.CSSStyleDeclaration}},Ce=(e,t)=>{if("Element"!==t&&t in Me)return Me[t](e);if(ye(e))return Se(e,we.prototype);const n=(e=>s(Ee,s(ke,e),8,-1))(e);if(n in Me)return Me[n](e);if(n in G)return Se(e,G[n].prototype);if("nodeType"in e)switch(s(xe,e)){case 1:if(!(t in Me))throw new Error("unknown hint "+t);return Me[t](e);case 2:return Me.Attr(e);case 3:return Me.Node(e);case 9:return Me.Document(e)}throw new Error("unknown brand "+n)};var Te=pe?e=>e===window||e===globalThis?G:e:oe(((e,t="Element")=>{if(e===window||e===globalThis)return G;switch(typeof e){case"object":return e&&Ce(e,t);case"string":return new ge(e);case"number":return new me(e);default:throw new Error("unsupported value")}}));let{document:We,getComputedStyle:Le,isExtensionContext:Oe,variables:Pe,Array:De,MutationObserver:Ne,Object:Ae,XPathEvaluator:Ie,XPathExpression:Re,XPathResult:Ve}=Te(window),{querySelectorAll:$e}=We,He=$e&&i($e,We);const{assign:_e,setPrototypeOf:je}=Ae;class Xe extends Re{evaluate(...e){return je(r(super.evaluate,this,e),Ve.prototype)}}class Fe extends Ie{createExpression(...e){return je(r(super.createExpression,this,e),Xe.prototype)}}function qe(e){if(Pe.hidden.has(e))return;!function(e){Oe&&"function"==typeof checkElement&&checkElement(e)}(e),Pe.hidden.add(e);let{style:t}=Te(e),n=Te(t,"CSSStyleDeclaration"),o=Te([]),{debugCSSProperties:r}=S;for(let[e,t]of r||[["display","none"]])n.setProperty(e,t,"important"),o.push([e,n.getPropertyValue(e)]);new Ne((()=>{for(let[e,t]of o){let o=n.getPropertyValue(e),r=n.getPropertyPriority(e);o==t&&"important"==r||n.setProperty(e,t,"important")}})).observe(e,{attributes:!0,attributeFilter:["style"]})}function Be(e){let t=e;if(t.startsWith("xpath(")&&t.endsWith(")")){let e=t.slice(6,-1),n=(new Fe).createExpression(e,null),o=Ve.ORDERED_NODE_SNAPSHOT_TYPE;return e=>{if(!e)return;let t=n.evaluate(We,o,null),{snapshotLength:r}=t;for(let n=0;nHe(e).forEach(t)}function ze(e,t,n,o){let r;null==n&&(n=t);const i=()=>{for(const i of He(n)){const n=Te(i).closest(t);n&&e(i,n)&&(r(),qe(n),"function"==typeof o&&o(n))}};return _e(new Ne(i),{race(e){r=e,this.observe(We,{childList:!0,characterData:!0,subtree:!0}),i()}})}function Ue(e,t,n){let o=Te(t,"CSSStyleDeclaration");if("none"==o.getPropertyValue("display"))return!1;let r=o.getPropertyValue("visibility");if("hidden"==r||"collapse"==r)return!1;if(!n||e==n)return!0;let i=Te(e).parentElement;return!i||Ue(i,Le(i),n)}function Ge(e){let t=Le(e),{cssText:n}=t;if(n)return n;for(let e of t)n+=`${e}: ${t[e]}; `;return Te(n).trim()}let{Math:Je,RegExp:Qe}=Te(window);function Ye(e){let{length:t}=e;if(t>1&&"/"===e[0]){let n="/"===e[t-1];if(n||t>2&&Te(e).endsWith("/i")){let t=[Te(e).slice(1,n?-1:-2)];return n||t.push("i"),new Qe(...t)}}return new Qe(Te(e).replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))}let Ke=!1;function Ze(){return Ke}const{console:et}=Te(window),tt=()=>{};function nt(...e){Ze()&&Te(e).unshift("%c DEBUG","font-weight: bold"),et.log(...e)}function ot(e){return i(Ze()?nt:tt,null,e)}let{Array:rt,Error:it,Map:st,parseInt:at}=Te(window),ct=null,lt=null;function ut(e,t){if(null===ct)return tt;let n=ct,{participants:o}=n;return o.set(r,t),r;function r(){if(n.winners<1)return;if(ot("race")(`${e} won the race`),n===ct)lt.push(r);else if(o.delete(r),--n.winners<1){for(let e of o.values())e();o.clear()}}}const dt={get(e,t){const n=e;for(;!g(e,t);)e=m(e);const{get:o,set:i}=p(e,t);return function(){return arguments.length?r(i,n,arguments):s(o,n)}}};var ht;function ft(e,t,n){var o,r;n?"load"===n?(e("Waiting until window.load"),window.onload=()=>{e("Window.load fired."),t()}):"loading"===n||"interactive"===n||"complete"===n?(e("Waiting document state until :",n),document.onreadystatechange=()=>{e("Document state changed:",document.readyState),document.readyState===n&&t()}):(e("Waiting until ",n," event is triggered on document"),(o=document,r=n,new Promise((e=>{const t=()=>{o.removeEventListener(r,t),e()};o.addEventListener(r,t)}))).then((()=>{e(n," is triggered on document, starting the snippet"),t()})).catch((t=>{e("There was an error while waiting for the event.",t)}))):t()}Te(window),ht=window,new e(ht,dt),Te(/^\d+$/);let{MutationObserver:pt,WeakSet:wt,getComputedStyle:mt}=Te(window);let{clearTimeout:gt,fetch:bt,getComputedStyle:yt,setTimeout:vt,Map:St,MutationObserver:kt,Uint8Array:Et}=Te(window);let xt=new St;function Mt(e,{as:t="arrayBuffer",cleanup:n=6e4}={}){let o=t+":"+e,r=xt.get(o)||{remove:()=>xt.delete(o),result:null,timer:0};return gt(r.timer),r.timer=vt(r.remove,n),r.result||(r.result=bt(e).then((e=>e[t]())).catch(r.remove),xt.set(o,r)),r.result}function Ct(e){return e.reduce(((e,t)=>e+function(e,t=2){let n=Te(e).toString(16);return n.length{const n=e.length+1,o=t.length+1,r=[[0]];let i=0,s=0;for(;++i"{mark(){},end(){}}"};function zt(e,t=10){return Bt}let{MutationObserver:Ut,WeakSet:Gt}=Te(window);const{ELEMENT_NODE:Jt}=Node;let{MutationObserver:Qt,WeakSet:Yt}=Te(window);const{ELEMENT_NODE:Kt}=Node;let{parseInt:Zt,setTimeout:en,Error:tn,MouseEvent:nn,MutationObserver:on,WeakSet:rn}=Te(window);let{parseInt:sn,setTimeout:an,Error:cn,MouseEvent:ln,MutationObserver:un,WeakSet:dn}=Te(window);const hn=["auxclick","click","dblclick","gotpointercapture","lostpointercapture","mouseenter","mousedown","mouseleave","mousemove","mouseout","mouseover","mouseup","pointerdown","pointerenter","pointermove","pointerover","pointerout","pointerup","pointercancel","pointerleave"];const fn={log:nt,race:function(e,t="1"){switch(e){case"start":ct={winners:at(t,10)||1,participants:new st},lt=new rt;break;case"end":case"finish":case"stop":ct=null;for(let e of lt)e();lt=null;break;default:throw new it(`Invalid action: ${e}`)}},debug:function(){Ke=!0},"hide-if-matches-xpath":function(e,t){const{mark:n,end:o}=zt(),r=ot("hide-if-matches-xpath"),i=t=>{const i=Be(`xpath(${e})`),s=new Gt,a=()=>{n(),i((t=>{if(s.has(t))return!1;s.add(t),l(),Te(t).nodeType===Jt?qe(t):Te(t).textContent="",r("Matched: ",t," for selector: ",e)})),o()},c=new Ut(a),l=ut("hide-if-matches-xpath",(()=>c.disconnect()));c.observe(t,{characterData:!0,childList:!0,subtree:!0}),a()};if(t){let e,n=0;const o=Be(`xpath(${t})`),r=()=>{o((e=>{i(e),n++})),n>0&&e.disconnect()};e=new Ut(r),e.observe(document,{characterData:!0,childList:!0,subtree:!0}),r()}else i(document)},"hide-if-matches-computed-xpath":function(e,t,n,o){const{mark:r,end:i}=zt(),s=ot("hide-if-matches-computed-xpath");if(!t||!e)return void s("No query or searchQuery provided.");const a=t=>{const n=(t=>e.replace("{{}}",t))(t);s("Starting hiding elements that match query: ",n);const o=Be(`xpath(${n})`),a=new Yt,c=()=>{r(),o((t=>{if(a.has(t))return!1;a.add(t),u(),Te(t).nodeType===Kt?qe(t):Te(t).textContent="",s("Matched: ",t," for selector: ",e)})),i()},l=new Qt(c),u=ut("hide-if-matches-computed-xpath",(()=>l.disconnect()));l.observe(document,{characterData:!0,childList:!0,subtree:!0}),c()},c=Ye(n);ft(s,(()=>{if(t){s("Started searching for: ",t);const e=new Yt;let n;const o=Be(`xpath(${t})`),r=()=>{o((t=>{if(e.has(t))return!1;if(e.add(t),s("Found node: ",t),t.innerHTML){s("Searching in: ",t.innerHTML);const e=t.innerHTML.match(c);if(e&&e.length){let t="";t=e[1]?e[1]:e[0],s("Matched search query: ",t),a(t)}}}))};n=new Qt(r),n.observe(document,{characterData:!0,childList:!0,subtree:!0}),r()}}),o)},"hide-if-contains":function(e,t="*",n=null){const o=ot("hide-if-contains");let r=Ye(e);const i=ze((e=>r.test(Te(e).textContent)),t,n,(e=>{o("Matched: ",e," for selector: ",t,n)}));i.race(ut("hide-if-contains",(()=>{i.disconnect()})))},"hide-if-contains-similar-text":function(e,t,n=null,o=0,r=0){const i=new Ot,s=ot("hide-if-contains-similar-text"),a=Te(e),{length:c}=a,l=c+Tt(o)||0,u=Te([...a]).sort(),d=Tt(r)||1/0;null==n&&(n=t),s("Looking for similar text: "+a);const h=()=>{for(const e of He(n)){if(i.has(e))continue;i.add(e);const{innerText:n}=Te(e),r=Pt(d,n.length-l+1);for(let i=0;if.disconnect()));f.observe(document,{childList:!0,characterData:!0,subtree:!0}),h()},"hide-if-contains-visible-text":function(e,t,n=null,...o){let r=Te([]);const i=new At([["-snippet-box-margin","2"],["-disable-bg-color-check","false"],["-check-is-contained","false"]]);for(let e of o){e=Te(e);let t=e.indexOf(":");if(t<0)continue;let n=e.slice(0,t).trim().toString(),o=e.slice(t+1).trim().toString();n&&o&&(i.has(n)?i.set(n,o):r.push([n,o]))}let s=Te([["opacity","0"],["font-size","0px"],["color","rgba(0, 0, 0, 0)"]]),a=new At(s.concat(r));function c(e,t,{bgColorCheck:n=!0}={}){t||(t=Nt(e)),t=Te(t);for(const[e,n]of a){if(Ye(n).test(t.getPropertyValue(e)))return!1}let o=t.getPropertyValue("color");return!n||t.getPropertyValue("background-color")!=o}function l(e,t,{bgColorCheck:n=!0}={}){let o=Nt(e,t);if(!Ue(e,o)||!c(e,o,{bgColorCheck:n}))return"";let{content:r}=Te(o);if(r&&"none"!==r){let t=Te([]);return r=Te(r).trim().replace(/(["'])(?:(?=(\\?))\2.)*?\1/g,(e=>""+(t.push(Te(e).slice(1,-1))-1))),r=r.replace(/\s*attr\(\s*([^\s,)]+)[^)]*?\)\s*/g,((t,n)=>Te(e).getAttribute(n)||"")),r.replace(/\x01(\d+)/g,((e,n)=>t[n]))}return""}function u(e,t,{boxMargin:n=2}={}){const o=Te(e).getBoundingClientRect(),r=Te(t).getBoundingClientRect(),i=r.left-n,s=r.right+n,a=r.top-n,c=r.bottom+n;return i<=o.left&&o.left<=s&&a<=o.top&&o.top<=c&&a<=o.bottom&&o.bottom<=c&&i<=o.right&&o.right<=s}function d(e,t,n,o,r,{boxMargin:i=2,bgColorCheck:s,checkIsContained:a}={}){let h=!n;if(h&&(n=Nt(e)),!Ue(e,n,h&&t))return"";o||"hidden"!==Te(n).getPropertyValue("overflow-x")&&"hidden"!==Te(n).getPropertyValue("overflow-y")||(o=e);let f=l(e,":before",{bgColorCheck:s});for(let t of Te(e).childNodes)switch(Te(t).nodeType){case Vt:f+=d(t,e,Nt(t),o,r,{boxMargin:i,bgColorCheck:s,checkIsContained:a});break;case $t:if(o)u(e,o,{boxMargin:i})&&c(e,n,{bgColorCheck:s})&&(f+=Te(t).nodeValue);else if(c(e,n,{bgColorCheck:s})){if(a&&!u(e,r,{boxMargin:i}))continue;f+=Te(t).nodeValue}}return f+l(e,":after",{bgColorCheck:s})}const h=i.get("-snippet-box-margin"),f=Rt(h)||0,p=!("true"===i.get("-disable-bg-color-check")),w="true"===i.get("-check-is-contained");let m=Ye(e),g=new It;const b=ze(((e,t)=>{if(g.has(e))return!1;g.add(e);let n=d(e,t,null,null,e,{boxMargin:f,bgColorCheck:p,checkIsContained:w}),o=m.test(n);return Ze()&&n.length&&nt(o,m,n),o}),t,n);b.race(ut("hide-if-contains-visible-text",(()=>{b.disconnect()})))},"hide-if-contains-and-matches-style":function(e,t="*",n=null,o=null,r=null,i,s=null,a=null){const c=ot("hide-if-contains-and-matches-style"),l=new wt;null==n&&(n=t);const u=Ye(e),d=o?Ye(o):null,h=r?Ye(r):null,f=()=>{const e=()=>{if(!(s&&window.innerWidtha))for(const e of He(n))if(!l.has(e)&&u.test(Te(e).textContent))if(!h||h.test(Ge(e))){const n=Te(e).closest(t);if(!n)continue;!d||d.test(Ge(n))?(r(),qe(n),l.add(e),c("Matched: ",n,"which contains: ",e," for params: ",...arguments)):c("In this element the searchStyle matched but style didn't:\n",n,mt(n),...arguments)}else c("In this element the searchStyle didn't match:\n",e,mt(e),...arguments)},o=new pt(e),r=ut("hide-if-contains-and-matches-style",(()=>o.disconnect()));o.observe(document,{childList:!0,characterData:!0,subtree:!0}),e()};ft(c,f,i)},"hide-if-has-and-matches-style":function(e,t="*",n=null,o=null,r=null,i=null,s=null,a=null){const c=ot("hide-if-has-and-matches-style"),l=new _t;null==n&&(n=t);const u=o?Ye(o):null,d=r?Ye(r):null,h=()=>{const o=()=>{if(!(s&&window.innerWidtha))for(const o of He(n))if(!l.has(o))if(!Te(o).querySelector(e)||d&&!d.test(Ge(o)))c("In this element the searchStyle didn't match:\n",o,jt(o),...arguments);else{const e=Te(o).closest(t);!e||u&&!u.test(Ge(e))?c("In this element the searchStyle matched but style didn't:\n",e,jt(e),...arguments):(i(),qe(e),l.add(o),c("Matched: ",e,"which contains: ",o," for params: ",...arguments))}},r=new Ht(o),i=ut("hide-if-has-and-matches-style",(()=>r.disconnect()));r.observe(document,{childList:!0,subtree:!0}),o()};ft(c,h,i)},"hide-if-labelled-by":function(e,t,n=null){let o=null==n,r=Ye(e),i=new qt,s=()=>{for(let e of He(t)){let t=o?e:Te(e).closest(n);if(!t||!Ue(e,Xt(e),t))continue;let s=Te(e).getAttribute("aria-labelledby"),a=()=>{i.has(t)||r.test(Te(e).getAttribute("aria-label")||"")&&(c(),i.add(t),qe(t))};if(s)for(let e of Te(s).split(/\s+/)){let n=Te(document).getElementById(e);n?!i.has(n)&&r.test(n.innerText)&&(c(),i.add(n),qe(t)):a()}else a()}},a=new Ft(s),c=ut("hide-if-labelled-by",(()=>a.disconnect()));a.observe(document,{characterData:!0,childList:!0,subtree:!0}),s()},"hide-if-contains-image":function(e,t,n){null==n&&(n=t);let o=Ye(e);const r=ot("hide-if-contains-image");let i=()=>{for(let e of He(n)){let n=yt(e),i=Te(n["background-image"]).match(/^url\("(.*)"\)$/);i&&Mt(i[1]).then((n=>{if(o.test(Ct(new Et(n)))){let n=Te(e).closest(t);n&&(a(),qe(n),r("Matched: ",n," for:",...arguments))}}))}},s=new kt(i),a=ut("hide-if-contains-image",(()=>s.disconnect()));s.observe(document,{childList:!0,subtree:!0}),i()},"simulate-event-poc":function(e,t,n="0"){if(!e)throw new tn("[simulate-event snippet]: No event type provided.");if(!t)throw new tn("[simulate-event snippet]: No selector provided.");let o=Be(t),r=Zt(n,10),i=new rn;function s(){o((t=>{i.has(t)||(i.add(t),en((()=>{Te(t).dispatchEvent(new nn(e,{bubbles:!0,cancelable:!0}))}),r))}))}new on(s).observe(document,{childList:!0,subtree:!0}),s()},"simulate-mouse-event":function(...e){const t=ot("simulate-mouse-event");if(e.length<1)throw new cn("[simulate-mouse-event snippet]: No selector provided.");e.length>7&&(e=e.slice(0,7));const n=Te([]);function o(){return n.forEach((e=>{if(!e.found){(function(e){let t=e;if(t.startsWith("xpath(")&&t.endsWith(")")){let t=Be(e);return()=>{let e=Te([]);return t((t=>e.push(t))),e}}return()=>De.from(He(e))})(e.selector)().length>0&&(e.found=!0)}})),n.every((e=>e.found))}function r(e,n,o){e&&n&&("click"===n&&e.click?(e.click(),t("Clicked on this node:\n",e,"\nwith a delay of",o,"ms")):(e.dispatchEvent(new ln(n,{bubbles:!0,cancelable:!0})),t("A",n,"event was dispatched with a delay of",o,"ms on this node:\n",e)))}Te(e).forEach((e=>{const o=function(e){if(!e)return null;const n={selector:"",continue:!1,trigger:!1,event:"click",delay:"500",clicked:!1,found:!1},o=e.split("$");let r=[];o.length>=2&&(r=o[1].toLowerCase().split(",")),[n.selector]=o;for(const e of r)if("trigger"===e)n.trigger=!0;else if("continue"===e)n.continue=!0;else if(e.startsWith("event")){const t=e.toLowerCase().split("=");t[1]?n.event=t[1]:n.event="click"}else if(e.startsWith("delay")){const t=e.toLowerCase().split("=");t[1]?n.delay=t[1]:n.delay="500"}return hn.includes(n.event)||t(n.event," might be misspelled, check for typos.\n","These are the supported events:",hn),n}(e);n.push(o)}));let i=!1;const[s]=n.slice(-1);s.trigger=!0;let a=new dn;function c(){if(i||(i=o()),i)for(const e of n){const t=Be(e.selector),n=sn(e.delay,10);e.trigger&&t((t=>{a.has(t)||(a.add(t),e.continue?setInterval((()=>{r(t,e.event,e.delay)}),n):an((()=>{r(t,e.event,e.delay)}),n))}))}}new un(c).observe(document,{childList:!0,subtree:!0}),c()}};let{MutationObserver:pn}=Te(window);const{ELEMENT_NODE:wn}=Node;fn["hide-if-matches-xpath3"]=function(e,t){let{mark:n,end:o}=zt();function r(){return fontoxpath.evaluateXPathToNodes(e,document,null,null,{language:fontoxpath.evaluateXPath.XQUERY_3_1_LANGUAGE})}let i=ot("hide-if-matches-xpath3");const s=t=>{const s=new WeakSet,a=()=>{n();const t=r();for(const n of Te(t)){if(s.has(n))return!1;s.add(n),l(),Te(n).nodeType===wn?qe(n):Te(n).textContent="",i("Matched: ",n," for selector: ",e)}o()},c=new pn(a),l=ut("hide-if-matches-xpath3",(()=>c.disconnect()));c.observe(t,{characterData:!0,childList:!0,subtree:!0}),a()};if(t){let e,t=0;const n=r(),o=()=>{for(const e of Te(n))s(e),t++;t>0&&e.disconnect()};e=new pn(o),e.observe(document,{characterData:!0,childList:!0,subtree:!0}),o()}else s(document)}; -+const snippets=fn; -+let context; -+for (const [name, ...args] of filters) { -+if (snippets.hasOwnProperty(name)) { -+try { context = snippets[name].apply(context, args); } -+catch (error) { console.error(error); } -+} -+} -+context = void 0; -+})(e, ...t); -+ -+const callback = (environment, ...filters) => { -+const e=Proxy,{apply:t,bind:r,call:n}=Function,o=n.bind(t),i=n.bind(r),s=n.bind(n),a={get:(e,t)=>i(n,e[t])},l=t=>new e(t,a),c=(t,r)=>new e(t,{apply:(e,t,n)=>o(r,t,n)}),u={get:(e,t)=>i(e[t],e)},f=t=>new e(t,u),{assign:p,defineProperties:d,freeze:h,getOwnPropertyDescriptor:w,getOwnPropertyDescriptors:g,getPrototypeOf:y}=f(Object),{hasOwnProperty:m}=l({}),{species:b}=Symbol,v={get(e,t){const r=e[t];class n extends r{}const o=g(r.prototype);delete o.constructor,h(d(n.prototype,o));const i=g(r);return delete i.length,delete i.prototype,i[b]={value:n},h(d(n,i))}},E=t=>new e(t,v),S="undefined"!=typeof environment?environment:{};"undefined"==typeof globalThis&&(window.globalThis=window);const{apply:M,ownKeys:T}=f(Reflect),x="world"in S,O=x&&"ISOLATED"===S.world,P=x&&"MAIN"===S.world,j="object"==typeof chrome&&!!chrome.runtime,N="object"==typeof browser&&!!browser.runtime,L=!P&&(O||j||N),k=e=>L?e:C(e,H(e)),{create:C,defineProperties:A,defineProperty:W,freeze:$,getOwnPropertyDescriptor:D,getOwnPropertyDescriptors:H}=f(Object),z=f(globalThis),R=L?globalThis:E(globalThis),{Map:F,RegExp:I,Set:J,WeakMap:V,WeakSet:B}=R,U=(e,t,r=null)=>{const n=T(t);for(const o of T(e)){if(n.includes(o))continue;const i=D(e,o);if(r&&"value"in i){const{value:e}=i;"function"==typeof e&&(i.value=r(e))}W(t,o,i)}},_=e=>{const t=R[e];class r extends t{}const{toString:n,valueOf:o}=t.prototype;A(r.prototype,{toString:{value:n},valueOf:{value:o}});const i=e.toLowerCase(),s=e=>function(){const t=M(e,this,arguments);return typeof t===i?new r(t):t};return U(t,r,s),U(t.prototype,r.prototype,s),r},X=$({frozen:new V,hidden:new B,iframePropertiesToAbort:{read:new J,write:new J},abortedIframes:new V}),q=new I("^[A-Z]");var G=new Proxy(new F([["chrome",L&&(j&&chrome||N&&browser)||void 0],["isExtensionContext",L],["variables",X],["console",k(console)],["document",globalThis.document],["performance",k(performance)],["JSON",k(JSON)],["Map",F],["Math",k(Math)],["Number",L?Number:_("Number")],["RegExp",I],["Set",J],["String",L?String:_("String")],["WeakMap",V],["WeakSet",B],["MouseEvent",MouseEvent]]),{get(e,t){if(e.has(t))return e.get(t);let r=globalThis[t];return"function"==typeof r&&(r=(q.test(t)?R:z)[t]),e.set(t,r),r},has:(e,t)=>e.has(t)});const K={WeakSet:WeakSet,WeakMap:WeakMap,WeakValue:class{has(){return!1}set(){}}},{apply:Y}=Reflect;const{Map:Z,WeakMap:Q,WeakSet:ee,setTimeout:te}=G;let re=!0,ne=e=>{e.clear(),re=!re};var oe=function(e){const{WeakSet:t,WeakMap:r,WeakValue:n}=this||K,o=new t,i=new r,s=new n;return function(t){if(o.has(t))return t;if(i.has(t))return i.get(t);if(s.has(t))return s.get(t);const r=Y(e,this,arguments);return o.add(r),r!==t&&("object"==typeof t&&t?i:s).set(t,r),r}}.bind({WeakMap:Q,WeakSet:ee,WeakValue:class extends Z{set(e,t){return re&&(re=!re,te(ne,0,this)),super.set(e,t)}}});const{concat:ie,includes:se,join:ae,reduce:le,unshift:ce}=l([]),ue=E(globalThis),{Map:fe,WeakMap:pe}=ue,de=new fe,he=t=>{const r=(e=>{const t=[];let r=e;for(;r;){if(de.has(r))ce(t,de.get(r));else{const e=g(r);de.set(r,e),ce(t,e)}r=y(r)}return ce(t,{}),o(p,null,t)})("function"==typeof t?t.prototype:t),n={get(e,t){if(t in r){const{value:n,get:o}=r[t];if(o)return s(o,e);if("function"==typeof n)return i(n,e)}return e[t]},set(e,t,n){if(t in r){const{set:o}=r[t];if(o)return s(o,e,n),!0}return e[t]=n,!0}};return t=>new e(t,n)},{isExtensionContext:we,Array:ge,Number:ye,String:me,Object:be}=G,{isArray:ve}=ge,{getOwnPropertyDescriptor:Ee,setPrototypeOf:Se}=be,{toString:Me}=be.prototype,{slice:Te}=me.prototype,{get:xe}=Ee(Node.prototype,"nodeType"),Oe=we?{}:{Attr:he(Attr),CanvasRenderingContext2D:he(CanvasRenderingContext2D),CSSStyleDeclaration:he(CSSStyleDeclaration),Document:he(Document),Element:he(Element),HTMLCanvasElement:he(HTMLCanvasElement),HTMLElement:he(HTMLElement),HTMLImageElement:he(HTMLImageElement),HTMLScriptElement:he(HTMLScriptElement),MutationRecord:he(MutationRecord),Node:he(Node),ShadowRoot:he(ShadowRoot),get CSS2Properties(){return Oe.CSSStyleDeclaration}},Pe=(e,t)=>{if("Element"!==t&&t in Oe)return Oe[t](e);if(ve(e))return Se(e,ge.prototype);const r=(e=>s(Te,s(Me,e),8,-1))(e);if(r in Oe)return Oe[r](e);if(r in G)return Se(e,G[r].prototype);if("nodeType"in e)switch(s(xe,e)){case 1:if(!(t in Oe))throw new Error("unknown hint "+t);return Oe[t](e);case 2:return Oe.Attr(e);case 3:return Oe.Node(e);case 9:return Oe.Document(e)}throw new Error("unknown brand "+r)};var je=we?e=>e===window||e===globalThis?G:e:oe(((e,t="Element")=>{if(e===window||e===globalThis)return G;switch(typeof e){case"object":return e&&Pe(e,t);case"string":return new me(e);case"number":return new ye(e);default:throw new Error("unsupported value")}}));const Ne={get(e,t){const r=e;for(;!m(e,t);)e=y(e);const{get:n,set:i}=w(e,t);return function(){return arguments.length?o(i,r,arguments):s(n,r)}}},Le=t=>new e(t,Ne);let ke=!1;function Ce(){return ke}const{console:Ae}=je(window),We=()=>{};function $e(...e){Ce()&&je(e).unshift("%c DEBUG","font-weight: bold"),Ae.log(...e)}function De(e){return i(Ce()?$e:We,null,e)}let{Math:He,RegExp:ze}=je(window);function Re(e){let{length:t}=e;if(t>1&&"/"===e[0]){let r="/"===e[t-1];if(r||t>2&&je(e).endsWith("/i")){let t=[je(e).slice(1,r?-1:-2)];return r||t.push("i"),new ze(...t)}}return new ze(je(e).replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))}function Fe(){return je(He.floor(2116316160*He.random()+60466176)).toString(36)}let{parseFloat:Ie,variables:Je,Array:Ve,Error:Be,Map:Ue,Object:_e,ReferenceError:Xe,Set:qe,WeakMap:Ge}=je(window),{onerror:Ke}=Le(window),Ye=Node.prototype,Ze=Element.prototype,Qe=null;function et(e,t,r,n=!0){let o=je(t),i=o.indexOf(".");if(-1==i){let o=_e.getOwnPropertyDescriptor(e,t);if(o&&!o.configurable)return;let i=_e.assign({},r,{configurable:n});if(!o&&!i.get&&i.set){let r=e[t];i.get=()=>r}return void _e.defineProperty(e,t,i)}let s=o.slice(0,i).toString();t=o.slice(i+1).toString();let a=e[s];!a||"object"!=typeof a&&"function"!=typeof a||et(a,t,r);let l=_e.getOwnPropertyDescriptor(e,s);if(l&&!l.configurable)return;Qe||(Qe=new Ge),Qe.has(e)||Qe.set(e,new Ue);let c=Qe.get(e);if(c.has(s))return void c.get(s).set(t,r);let u=new Ue([[t,r]]);c.set(s,u),_e.defineProperty(e,s,{get:()=>a,set(e){if(a=e,a&&("object"==typeof a||"function"==typeof a))for(let[e,t]of u)et(a,e,t)},configurable:n})}function tt(e){let t=Ke();Ke(((...r)=>{let n=r.length&&r[0];return!("string"!=typeof n||!je(n).includes(e))||("function"==typeof t?o(t,this,r):void 0)}))}function rt(e,t,r,n=!0){let o=De(e);if(!r)return void o("no property to abort on read");let i=Fe();o(`aborting on ${r} access`),et(t,r,{get:function(){throw o(`${r} access aborted`),new Xe(i)},set(){}},n),tt(i)}function nt(e,t,r,n=!0){let o=De(e);if(!r)return void o("no property to abort on write");let i=Fe();o(`aborting when setting ${r}`),et(t,r,{set:function(){throw o(`setting ${r} aborted`),new Xe(i)}},n),tt(i)}function ot(e,t=!1,r=!1){let n=Je.abortedIframes,i=Je.iframePropertiesToAbort;for(let o of Ve.from(window.frames))if(n.has(o))for(let i of e)t&&n.get(o).read.add(i),r&&n.get(o).write.add(i);for(let n of e)t&&i.read.add(n),r&&i.write.add(n);function a(){for(let e of Ve.from(window.frames)){n.has(e)||n.set(e,{read:new qe(i.read),write:new qe(i.write)});let t=n.get(e).read;if(t.size>0){let r=Ve.from(t);t.clear();for(let t of r)rt("abort-on-iframe-property-read",e,t)}let r=n.get(e).write;if(r.size>0){let t=Ve.from(r);r.clear();for(let r of t)nt("abort-on-iframe-property-write",e,r)}}}a(),n.has(document)||(n.set(document,!0),function(e){let t;function r(e,t){for(let r of t){et(e,r,n(e,r))}}function n(t,r){let n=t[r];return{get:()=>function(...t){let r;return r=o(n,this,t),e&&e(),r}}}function i(t,r){let n=_e.getOwnPropertyDescriptor(t,r),{set:o}=n||{};return{set(t){let r;return r=s(o,this,t),e&&e(),r}}}r(Ye,["appendChild","insertBefore","replaceChild"]),r(Ze,["append","prepend","replaceWith","after","before","insertAdjacentElement","insertAdjacentHTML"]),t=i(Ze,"innerHTML"),et(Ze,"innerHTML",t),t=i(Ze,"outerHTML"),et(Ze,"outerHTML",t)}(a))}let{Object:it}=window;function st(e,t){if(!(e instanceof it))return;let r=e,n=je(t).split(".");if(0===n.length)return;for(let e=0;e{};case"trueFunc":return()=>!0;case"falseFunc":return()=>!1;case"emptyArray":return[];case"emptyObj":return{};case"undefined":return;case"":return e;default:if(at.test(e))return Ie(e);throw new Be(`[override-property-read snippet]: Value "${e}" is not valid.`)}}let{HTMLScriptElement:ct,Object:ut,ReferenceError:ft}=je(window),pt=ut.getPrototypeOf(ct);let{Error:dt}=je(window),{cookie:ht}=Le(document);let{document:wt,getComputedStyle:gt,isExtensionContext:yt,variables:mt,Array:bt,MutationObserver:vt,Object:Et,XPathEvaluator:St,XPathExpression:Mt,XPathResult:Tt}=je(window),{querySelectorAll:xt}=wt,Ot=xt&&i(xt,wt);const{assign:Pt,setPrototypeOf:jt}=Et;class Nt extends Mt{evaluate(...e){return jt(o(super.evaluate,this,e),Tt.prototype)}}class Lt extends St{createExpression(...e){return jt(o(super.createExpression,this,e),Nt.prototype)}}function kt(e){if(mt.hidden.has(e))return;!function(e){yt&&"function"==typeof checkElement&&checkElement(e)}(e),mt.hidden.add(e);let{style:t}=je(e),r=je(t,"CSSStyleDeclaration"),n=je([]),{debugCSSProperties:o}=S;for(let[e,t]of o||[["display","none"]])r.setProperty(e,t,"important"),n.push([e,r.getPropertyValue(e)]);new vt((()=>{for(let[e,t]of n){let n=r.getPropertyValue(e),o=r.getPropertyPriority(e);n==t&&"important"==o||r.setProperty(e,t,"important")}})).observe(e,{attributes:!0,attributeFilter:["style"]})}function Ct(e){let t=e;if(t.startsWith("xpath(")&&t.endsWith(")")){let t=function(e){let t=e;if(t.startsWith("xpath(")&&t.endsWith(")")){let e=t.slice(6,-1),r=(new Lt).createExpression(e,null),n=Tt.ORDERED_NODE_SNAPSHOT_TYPE;return e=>{if(!e)return;let t=r.evaluate(wt,n,null),{snapshotLength:o}=t;for(let r=0;rOt(e).forEach(t)}(e);return()=>{let e=je([]);return t((t=>e.push(t))),e}}return()=>bt.from(Ot(e))}let{ELEMENT_NODE:At,TEXT_NODE:Wt,prototype:$t}=Node,{prototype:Dt}=Element,{prototype:Ht}=HTMLElement,{console:zt,variables:Rt,DOMParser:Ft,Error:It,MutationObserver:Jt,Object:Vt,ReferenceError:Bt}=je(window),{getOwnPropertyDescriptor:Ut}=Vt;function _t(e,t){return We}je(window);const{Map:Xt,MutationObserver:qt,Object:Gt,Set:Kt,WeakSet:Yt}=je(window);let Zt=Element.prototype,{attachShadow:Qt}=Zt,er=new Yt,tr=new Xt,rr=null;const{Error:nr,JSON:or,Map:ir,Object:sr}=je(window);let ar=null;let{Error:lr,JSON:cr,Map:ur,Object:fr}=je(window),pr=null;let{Error:dr}=je(window);let{Error:hr,Map:wr,Object:gr,console:yr}=je(window),{toString:mr}=Function.prototype,br=EventTarget.prototype,{addEventListener:vr}=br,Er=null;let Sr,{URL:Mr,fetch:Tr}=je(window),{delete:xr,has:Or}=l(URLSearchParams.prototype);const Pr={"abort-current-inline-script":function(e,t=null){const r=De("abort-current-inline-script"),n=t?Re(t):null,o=Fe(),i=je(document).currentScript;let a=window;const l=je(e).split("."),c=je(l).pop();for(let e of je(l))if(a=a[e],!a||"object"!=typeof a&&"function"!=typeof a)return void r(l," is not found");const{get:u,set:f}=ut.getOwnPropertyDescriptor(a,c)||{};let p=a[c];void 0===p&&r("The property",c,"doesn't exist yet. Check typos.");const d=()=>{const e=je(document).currentScript;if(e instanceof pt&&""==je(e,"HTMLScriptElement").src&&e!=i&&(!n||n.test(je(e).textContent)))throw r(l," is aborted \n",e),new ft(o)};et(a,c,{get(){return d(),u?s(u,this):p},set(e){d(),f?s(f,this,e):p=e}}),tt(o)},"abort-on-iframe-property-read":function(...e){ot(e,!0,!1)},"abort-on-iframe-property-write":function(...e){ot(e,!1,!0)},"abort-on-property-read":function(e,t){rt("abort-on-property-read",window,e,!("false"===t))},"abort-on-property-write":function(e,t){nt("abort-on-property-write",window,e,!("false"===t))},"cookie-remover":function(e){if(!e)throw new dt("[cookie-remover snippet]: No cookie to remove.");let t=De("cookie-remover"),r=Re(e);if(je(/^http|^about/).test(location.protocol)){t("Parsing cookies for matches");for(const e of je(je(ht()).split(";").filter((e=>r.test(je(e).split("=")[0]))))){let r=je(location.hostname),n=je(e).split("=")[0],o="expires=Thu, 01 Jan 1970 00:00:00 GMT",i="path=/",s="domain="+r.slice(r.indexOf(".")+1);ht(`${je(n).trim()}=;${o};${i};${s}`),t(`Set expiration date on ${n}`)}}else t("Snippet only works for http or https and about.")},debug:function(){ke=!0},"freeze-element":function(e,t="",...r){let n,i,a=!1,l=!1,c=je(r).filter((e=>!h(e))),u=je(r).filter((e=>h(e))).map(Re),f=Fe(),p=Ct(e);!function(){let r=je(t).split("+");1===r.length&&""===r[0]&&(r=[]);for(let t of r)switch(t){case"subtree":a=!0;break;case"abort":l=!0;break;default:throw new It("[freeze] Unknown option passed to the snippet. [selector]: "+e+" [option]: "+t)}}();let d={selector:e,shouldAbort:l,rid:f,exceptionSelectors:c,regexExceptions:u,changeId:0};function h(e){return e.length>=2&&"/"==e[0]&&"/"==e[e.length-1]}function w(){i=p(),g(i,!1)}function g(e,t=!0){for(let r of e)Rt.frozen.has(r)||(Rt.frozen.set(r,d),!t&&a&&new Jt((e=>{for(let t of je(e))g(je(t,"MutationRecord").addedNodes)})).observe(r,{childList:!0,subtree:!0}),a&&je(r).nodeType===At&&g(je(r).childNodes))}function y(e,...t){$e(`[freeze][${e}] `,...t)}function m(e,t,r,n){let o=n.selector,i=n.changeId,s="string"==typeof e,a=n.shouldAbort?"aborting":"watching";switch(zt.groupCollapsed(`[freeze][${i}] ${a}: ${o}`),r){case"appendChild":case"append":case"prepend":case"insertBefore":case"replaceChild":case"insertAdjacentElement":case"insertAdjacentHTML":case"insertAdjacentText":case"innerHTML":case"outerHTML":y(i,s?"text: ":"node: ",e),y(i,"added to node: ",t);break;case"replaceWith":case"after":case"before":y(i,s?"text: ":"node: ",e),y(i,"added to node: ",je(t).parentNode);break;case"textContent":case"innerText":case"nodeValue":y(i,"content of node: ",t),y(i,"changed to: ",e)}y(i,`using the function "${r}"`),zt.groupEnd(),n.changeId++}function b(e,t){if(t)for(let r of t)if(r.test(e))return!0;return!1}function v(e){throw new Bt(e)}function E(e,t,r,n){let o=new Ft,{body:i}=je(o.parseFromString(e,"text/html")),s=S(je(i).childNodes,t,r,n);return je(s).map((e=>{switch(je(e).nodeType){case At:return je(e).outerHTML;case Wt:return je(e).textContent;default:return""}})).join("")}function S(e,t,r,n){let o=je([]);for(let i of e)M(i,t,r,n)&&o.push(i);return o}function M(e,t,r,n){let o=n.shouldAbort,i=n.regexExceptions,s=n.exceptionSelectors,a=n.rid;if("string"==typeof e){let s=e;return!!b(s,i)||(Ce()&&m(s,t,r,n),o&&v(a),Ce())}let l=e;switch(je(l).nodeType){case At:return!!function(e,t){if(t){let r=je(e);for(let e of t)if(r.matches(e))return!0}return!1}(l,s)||(o&&(Ce()&&m(l,t,r,n),v(a)),!!Ce()&&(kt(l),m(l,t,r,n),!0));case Wt:return!!b(je(l).textContent,i)||(Ce()&&m(l,t,r,n),o&&v(a),!1);default:return!0}}function T(e,t,r,n){let i=Ut(e,t)||{},a=i.get&&s(i.get,e)||i.value;if(a)return{get:()=>function(...e){if(r(this)){let r=n(this);if(r){let n=e[0];if(!M(n,this,t,r))return n}}return o(a,this,e)}}}function x(e,t,r,n){let i=Ut(e,t)||{},a=i.get&&s(i.get,e)||i.value;if(a)return{get:()=>function(...e){if(!r(this))return o(a,this,e);let i=n(this);if(!i)return o(a,this,e);let s=S(e,this,t,i);return s.length>0?o(a,this,s):void 0}}}function O(e,t,r,n){let i=Ut(e,t)||{},a=i.get&&s(i.get,e)||i.value;if(a)return{get:()=>function(...e){let[i,l]=e,c="afterbegin"===i||"beforeend"===i;if(r(this,c)){let e=n(this,c);if(e){let r,n=c?this:je(this).parentNode;switch(t){case"insertAdjacentElement":if(!M(l,n,t,e))return l;break;case"insertAdjacentHTML":return r=E(l,n,t,e),r?s(a,this,i,r):void 0;case"insertAdjacentText":if(!M(l,n,t,e))return}}}return o(a,this,e)}}}function P(e,t,r,n){let o=Ut(e,t)||{},{set:i}=o;if(i)return{set(e){if(!r(this))return s(i,this,e);let o=n(this);if(!o)return s(i,this,e);let a=E(e,this,t,o);return a?s(i,this,a):void 0}}}function j(e,t,r,n){let o=Ut(e,t)||{},{set:i}=o;if(i)return{set(e){if(!r(this))return s(i,this,e);let o=n(this);return o?M(e,this,t,o)?s(i,this,e):void 0:s(i,this,e)}}}Rt.frozen.has(document)||(Rt.frozen.set(document,!0),function(){let e;function t(e){return e&&Rt.frozen.has(e)}function r(e){try{return e&&(Rt.frozen.has(e)||Rt.frozen.has(je(e).parentNode))}catch(e){return!1}}function n(e,t){try{return e&&(Rt.frozen.has(e)&&t||Rt.frozen.has(je(e).parentNode)&&!t)}catch(e){return!1}}function o(e){return Rt.frozen.get(e)}function i(e){try{if(Rt.frozen.has(e))return Rt.frozen.get(e);let t=je(e).parentNode;return Rt.frozen.get(t)}catch(e){}}function s(e,t){try{if(Rt.frozen.has(e)&&t)return Rt.frozen.get(e);let r=je(e).parentNode;return Rt.frozen.get(r)}catch(e){}}e=T($t,"appendChild",t,o),et($t,"appendChild",e),e=T($t,"insertBefore",t,o),et($t,"insertBefore",e),e=T($t,"replaceChild",t,o),et($t,"replaceChild",e),e=x(Dt,"append",t,o),et(Dt,"append",e),e=x(Dt,"prepend",t,o),et(Dt,"prepend",e),e=x(Dt,"replaceWith",r,i),et(Dt,"replaceWith",e),e=x(Dt,"after",r,i),et(Dt,"after",e),e=x(Dt,"before",r,i),et(Dt,"before",e),e=O(Dt,"insertAdjacentElement",n,s),et(Dt,"insertAdjacentElement",e),e=O(Dt,"insertAdjacentHTML",n,s),et(Dt,"insertAdjacentHTML",e),e=O(Dt,"insertAdjacentText",n,s),et(Dt,"insertAdjacentText",e),e=P(Dt,"innerHTML",t,o),et(Dt,"innerHTML",e),e=P(Dt,"outerHTML",r,i),et(Dt,"outerHTML",e),e=j($t,"textContent",t,o),et($t,"textContent",e),e=j(Ht,"innerText",t,o),et(Ht,"innerText",e),e=j($t,"nodeValue",t,o),et($t,"nodeValue",e)}()),n=new Jt(w),n.observe(document,{childList:!0,subtree:!0}),w()},"hide-if-shadow-contains":function(e,t="*"){let r=`${e}\\${t}`;tr.has(r)||tr.set(r,[Re(e),t,_t()]);const n=De("hide-if-shadow-contain");rr||(rr=new qt((e=>{let t=new Kt;for(let{target:r}of je(e)){let e=je(r).parentNode;for(;e;)[r,e]=[e,je(r).parentNode];if(!er.has(r)&&!t.has(r)){t.add(r);for(let[e,t,o]of tr.values())if(e.test(je(r).textContent)){let e=je(r.host).closest(t);e&&(o(),je(r).appendChild(document.createElement("style")).textContent=":host {display: none !important}",kt(e),er.add(r),n("Hiding: ",e," for params: ",...arguments))}}}})),Gt.defineProperty(Zt,"attachShadow",{value:c(Qt,(function(){let e=o(Qt,this,arguments);return n("attachShadow is called for: ",e),rr.observe(e,{childList:!0,characterData:!0,subtree:!0}),e}))}))},"json-override":function(e,t,r="",n=""){if(!e)throw new nr("[json-override snippet]: Missing paths to override.");if(void 0===t)throw new nr("[json-override snippet]: No value to override with.");if(!ar){let e=De("json-override"),{parse:t}=or;ar=new ir,sr.defineProperty(window.JSON,"parse",{value:c(t,(function(r){let n=o(t,this,arguments);for(let{prune:t,needle:o,filter:i,value:s}of ar.values())if(!i||i.test(r)){if(je(o).some((e=>!st(n,e))))return n;for(let r of t){let t=st(n,r);void 0!==t&&(e(`Found ${r} replaced it with ${s}`),t[0][t[1]]=lt(s))}}return n}))}),e("Wrapped JSON.parse for override")}ar.set(e,{prune:je(e).split(/ +/),needle:r.length?je(r).split(/ +/):[],filter:n?Re(n):null,value:t})},"json-prune":function(e,t=""){if(!e)throw new lr("Missing paths to prune");if(!pr){let e=De("json-prune"),{parse:t}=cr;pr=new ur,fr.defineProperty(window.JSON,"parse",{value:c(t,(function(){let r=o(t,this,arguments);for(let{prune:t,needle:n}of pr.values()){if(je(n).some((e=>!st(r,e))))return r;for(let n of t){let t=st(r,n);void 0!==t&&(e(`Found ${n} and deleted`),delete t[0][t[1]])}}return r}))}),e("Wrapped JSON.parse for prune")}pr.set(e,{prune:je(e).split(/ +/),needle:t.length?je(t).split(/ +/):[]})},"override-property-read":function(e,t){if(!e)throw new dr("[override-property-read snippet]: No property to override.");if(void 0===t)throw new dr("[override-property-read snippet]: No value to override with.");let r=De("override-property-read"),n=lt(t);r(`Overriding ${e}.`),et(window,e,{get:()=>(r(`${e} override done.`),n),set(){}})},"prevent-listener":function(e,t,r){if(!e)throw new hr("[prevent-listener snippet]: No event type.");if(!Er){Er=new wr;let e=De("[prevent]");gr.defineProperty(br,"addEventListener",{value:c(vr,(function(t,r){for(let{evt:n,handlers:o,selectors:i}of Er.values()){if(!n.test(t))continue;let a=this instanceof Element;for(let l=0;lc.test(s(mr,"function"==typeof r?r:r.handleEvent));if((!c||f())&&(!u||a&&je(this).matches(u)))return void(Ce()&&(yr.groupCollapsed("DEBUG [prevent] was successful"),e(`type: ${t} matching ${n}`),e("handler:",r),c&&e(`matching ${c}`),u&&e("on element: ",this,` matching ${u}`),e("was prevented from being added"),yr.groupEnd()))}}return o(vr,this,arguments)}))}),e("Wrapped addEventListener")}Er.has(e)||Er.set(e,{evt:Re(e),handlers:[],selectors:[]});let{handlers:n,selectors:i}=Er.get(e);n.push(t?Re(t):null),i.push(r)},"strip-fetch-query-parameter":function(e,t=null){const r=De("strip-fetch-query-parameter");Sr||(Sr=new Map,window.fetch=c(Tr,((...e)=>{let[t]=e;if("string"==typeof t){let n=new Mr(t);for(let[o,i]of Sr)i&&!i.test(t)||Or(n.searchParams,o)&&(r(`${o} has been stripped from url ${t}`),xr(n.searchParams,o),e[0]=n.href)}return o(Tr,self,e)}))),Sr.set(e,t&&Re(t))},trace:function(...e){o($e,null,e)}}; -+const snippets=Pr; -+let context; -+for (const [name, ...args] of filters) { -+if (snippets.hasOwnProperty(name)) { -+try { context = snippets[name].apply(context, args); } -+catch (error) { console.error(error); } -+} -+} -+context = void 0; -+}; -+const graph = new Map([["abort-current-inline-script",null],["abort-on-iframe-property-read",null],["abort-on-iframe-property-write",null],["abort-on-property-read",null],["abort-on-property-write",null],["cookie-remover",null],["debug",null],["freeze-element",null],["hide-if-shadow-contains",null],["json-override",null],["json-prune",null],["override-property-read",null],["prevent-listener",null],["strip-fetch-query-parameter",null],["trace",null]]); -+callback.get = snippet => graph.get(snippet); -+callback.has = snippet => graph.has(snippet); -+ -+ if (t.every(([name]) => !callback.has(name))) return; -+ const append = () => { -+ URL.revokeObjectURL( -+ Object.assign( -+ document.documentElement.appendChild(document.createElement("script")), -+ {async: false, src: URL.createObjectURL(new Blob([ -+ "(" + callback + ")(..." + JSON.stringify([e, ...t]) + ")" -+ ]))} -+ ).src -+ ); -+ }; -+ try { append(); } -+ catch (_) { -+ document.addEventListener("readystatechange", append, {once:true}); -+ } -+} -\ No newline at end of file -diff --git a/components/resources/adblocking/snippets/dist/isolated-first-xpath3.source.jst b/components/resources/adblocking/snippets/dist/isolated-first-xpath3.source.jst -new file mode 100644 ---- /dev/null -+++ b/components/resources/adblocking/snippets/dist/isolated-first-xpath3.source.jst -@@ -0,0 +1,3696 @@ -+(e, ...t) => { -+/*! -+ * snippets v0.8.1 (https://gitlab.com/eyeo/anti-cv/snippets/-/tree/5f54b58f039a604088d65991f2829a9a081832f6/dist) -+ * This file is part of eyeo's Anti-Circumvention Snippets module (@eyeo/snippets), -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * @eyeo/snippets is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * @eyeo/snippets is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with @eyeo/snippets. If not, see . -+ */ -+ ((environment, ...filters) => { -+ /*! -+ * This file is part of eyeo's Anti-Circumvention Snippets module (@eyeo/snippets), -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * @eyeo/snippets is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * @eyeo/snippets is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with @eyeo/snippets. If not, see . -+ */ -+ const $$1 = Proxy; -+ -+ const {apply: a, bind: b, call: c} = Function; -+ const apply$2 = c.bind(a); -+ const bind = c.bind(b); -+ const call = c.bind(c); -+ -+ const callerHandler = { -+ get(target, name) { -+ return bind(c, target[name]); -+ } -+ }; -+ -+ const caller = target => new $$1(target, callerHandler); -+ -+ const handler$2 = { -+ get(target, name) { -+ return bind(target[name], target); -+ } -+ }; -+ -+ const bound = target => new $$1(target, handler$2); -+ -+ const { -+ assign: assign$1, -+ defineProperties: defineProperties$1, -+ freeze: freeze$1, -+ getOwnPropertyDescriptor: getOwnPropertyDescriptor$2, -+ getOwnPropertyDescriptors: getOwnPropertyDescriptors$1, -+ getPrototypeOf -+ } = bound(Object); -+ -+ const {hasOwnProperty} = caller({}); -+ -+ const {species} = Symbol; -+ -+ const handler$1 = { -+ get(target, name) { -+ const Native = target[name]; -+ class Secure extends Native {} -+ -+ const proto = getOwnPropertyDescriptors$1(Native.prototype); -+ delete proto.constructor; -+ freeze$1(defineProperties$1(Secure.prototype, proto)); -+ -+ const statics = getOwnPropertyDescriptors$1(Native); -+ delete statics.length; -+ delete statics.prototype; -+ statics[species] = {value: Secure}; -+ return freeze$1(defineProperties$1(Secure, statics)); -+ } -+ }; -+ -+ const secure = target => new $$1(target, handler$1); -+ -+ const libEnvironment = typeof environment !== "undefined" ? environment : -+ {}; -+ -+ if (typeof globalThis === "undefined") -+ window.globalThis = window; -+ -+ const {apply: apply$1, ownKeys} = bound(Reflect); -+ -+ const worldEnvDefined = "world" in libEnvironment; -+ const isIsolatedWorld = worldEnvDefined && libEnvironment.world === "ISOLATED"; -+ const isMainWorld = worldEnvDefined && libEnvironment.world === "MAIN"; -+ const isChrome = typeof chrome === "object" && !!chrome.runtime; -+ const isOtherThanChrome = typeof browser === "object" && !!browser.runtime; -+ const isExtensionContext$2 = !isMainWorld && -+ (isIsolatedWorld || isChrome || isOtherThanChrome); -+ const copyIfExtension = value => isExtensionContext$2 ? -+ value : -+ create(value, getOwnPropertyDescriptors(value)); -+ -+ const { -+ create, -+ defineProperties, -+ defineProperty, -+ freeze, -+ getOwnPropertyDescriptor: getOwnPropertyDescriptor$1, -+ getOwnPropertyDescriptors -+ } = bound(Object); -+ -+ const invokes = bound(globalThis); -+ const classes = isExtensionContext$2 ? globalThis : secure(globalThis); -+ const {Map: Map$5, RegExp: RegExp$1, Set, WeakMap: WeakMap$3, WeakSet: WeakSet$b} = classes; -+ -+ const augment = (source, target, method = null) => { -+ const known = ownKeys(target); -+ for (const key of ownKeys(source)) { -+ if (known.includes(key)) -+ continue; -+ -+ const descriptor = getOwnPropertyDescriptor$1(source, key); -+ if (method && "value" in descriptor) { -+ const {value} = descriptor; -+ if (typeof value === "function") -+ descriptor.value = method(value); -+ } -+ defineProperty(target, key, descriptor); -+ } -+ }; -+ -+ const primitive = name => { -+ const Super = classes[name]; -+ class Class extends Super {} -+ const {toString, valueOf} = Super.prototype; -+ defineProperties(Class.prototype, { -+ toString: {value: toString}, -+ valueOf: {value: valueOf} -+ }); -+ const type = name.toLowerCase(); -+ const method = callback => function() { -+ const result = apply$1(callback, this, arguments); -+ return typeof result === type ? new Class(result) : result; -+ }; -+ augment(Super, Class, method); -+ augment(Super.prototype, Class.prototype, method); -+ return Class; -+ }; -+ -+ const variables$1 = freeze({ -+ frozen: new WeakMap$3(), -+ hidden: new WeakSet$b(), -+ iframePropertiesToAbort: { -+ read: new Set(), -+ write: new Set() -+ }, -+ abortedIframes: new WeakMap$3() -+ }); -+ -+ const startsCapitalized = new RegExp$1("^[A-Z]"); -+ -+ var env = new Proxy(new Map$5([ -+ -+ ["chrome", ( -+ isExtensionContext$2 && ( -+ (isChrome && chrome) || -+ (isOtherThanChrome && browser) -+ ) -+ ) || void 0], -+ ["isExtensionContext", isExtensionContext$2], -+ ["variables", variables$1], -+ -+ ["console", copyIfExtension(console)], -+ ["document", globalThis.document], -+ ["performance", copyIfExtension(performance)], -+ ["JSON", copyIfExtension(JSON)], -+ ["Map", Map$5], -+ ["Math", copyIfExtension(Math)], -+ ["Number", isExtensionContext$2 ? Number : primitive("Number")], -+ ["RegExp", RegExp$1], -+ ["Set", Set], -+ ["String", isExtensionContext$2 ? String : primitive("String")], -+ ["WeakMap", WeakMap$3], -+ ["WeakSet", WeakSet$b], -+ -+ ["MouseEvent", MouseEvent] -+ ]), { -+ get(map, key) { -+ if (map.has(key)) -+ return map.get(key); -+ -+ let value = globalThis[key]; -+ if (typeof value === "function") -+ value = (startsCapitalized.test(key) ? classes : invokes)[key]; -+ -+ map.set(key, value); -+ return value; -+ }, -+ has(map, key) { -+ return map.has(key); -+ } -+ }); -+ -+ class WeakValue { -+ has() { return false; } -+ set() {} -+ } -+ -+ const helpers = {WeakSet, WeakMap, WeakValue}; -+ const {apply} = Reflect; -+ -+ function transformOnce (callback) { const {WeakSet, WeakMap, WeakValue} = (this || helpers); -+ const ws = new WeakSet; -+ const wm = new WeakMap; -+ const wv = new WeakValue; -+ return function (any) { -+ if (ws.has(any)) -+ return any; -+ -+ if (wm.has(any)) -+ return wm.get(any); -+ -+ if (wv.has(any)) -+ return wv.get(any); -+ -+ const value = apply(callback, this, arguments); -+ ws.add(value); -+ if (value !== any) -+ (typeof any === 'object' && any ? wm : wv).set(any, value); -+ return value; -+ }; -+ } -+ -+ const {Map: Map$4, WeakMap: WeakMap$2, WeakSet: WeakSet$a, setTimeout: setTimeout$3} = env; -+ -+ let cleanup = true; -+ let cleanUpCallback = map => { -+ map.clear(); -+ cleanup = !cleanup; -+ }; -+ -+ var transformer = transformOnce.bind({ -+ WeakMap: WeakMap$2, -+ WeakSet: WeakSet$a, -+ -+ WeakValue: class extends Map$4 { -+ set(key, value) { -+ if (cleanup) { -+ cleanup = !cleanup; -+ setTimeout$3(cleanUpCallback, 0, this); -+ } -+ return super.set(key, value); -+ } -+ } -+ }); -+ -+ const {concat, includes, join, reduce, unshift} = caller([]); -+ -+ const globals = secure(globalThis); -+ -+ const { -+ Map: Map$3, -+ WeakMap: WeakMap$1 -+ } = globals; -+ -+ const map = new Map$3; -+ const descriptors = target => { -+ const chain = []; -+ let current = target; -+ while (current) { -+ if (map.has(current)) -+ unshift(chain, map.get(current)); -+ else { -+ const descriptors = getOwnPropertyDescriptors$1(current); -+ map.set(current, descriptors); -+ unshift(chain, descriptors); -+ } -+ current = getPrototypeOf(current); -+ } -+ unshift(chain, {}); -+ return apply$2(assign$1, null, chain); -+ }; -+ -+ const chain = source => { -+ const target = typeof source === 'function' ? source.prototype : source; -+ const chained = descriptors(target); -+ const handler = { -+ get(target, key) { -+ if (key in chained) { -+ const {value, get} = chained[key]; -+ if (get) -+ return call(get, target); -+ if (typeof value === 'function') -+ return bind(value, target); -+ } -+ return target[key]; -+ }, -+ set(target, key, value) { -+ if (key in chained) { -+ const {set} = chained[key]; -+ if (set) { -+ call(set, target, value); -+ return true; -+ } -+ } -+ target[key] = value; -+ return true; -+ } -+ }; -+ return target => new $$1(target, handler); -+ }; -+ -+ const { -+ isExtensionContext: isExtensionContext$1, -+ Array: Array$2, -+ Number: Number$1, -+ String: String$1, -+ Object: Object$2 -+ } = env; -+ -+ const {isArray} = Array$2; -+ const {getOwnPropertyDescriptor, setPrototypeOf: setPrototypeOf$1} = Object$2; -+ -+ const {toString} = Object$2.prototype; -+ const {slice} = String$1.prototype; -+ const getBrand = value => call(slice, call(toString, value), 8, -1); -+ -+ const {get: nodeType} = getOwnPropertyDescriptor(Node.prototype, "nodeType"); -+ -+ const chained = isExtensionContext$1 ? {} : { -+ Attr: chain(Attr), -+ CanvasRenderingContext2D: chain(CanvasRenderingContext2D), -+ CSSStyleDeclaration: chain(CSSStyleDeclaration), -+ Document: chain(Document), -+ Element: chain(Element), -+ HTMLCanvasElement: chain(HTMLCanvasElement), -+ HTMLElement: chain(HTMLElement), -+ HTMLImageElement: chain(HTMLImageElement), -+ HTMLScriptElement: chain(HTMLScriptElement), -+ MutationRecord: chain(MutationRecord), -+ Node: chain(Node), -+ ShadowRoot: chain(ShadowRoot), -+ -+ get CSS2Properties() { -+ return chained.CSSStyleDeclaration; -+ } -+ }; -+ -+ const upgrade = (value, hint) => { -+ if (hint !== "Element" && hint in chained) -+ return chained[hint](value); -+ -+ if (isArray(value)) -+ return setPrototypeOf$1(value, Array$2.prototype); -+ -+ const brand = getBrand(value); -+ if (brand in chained) -+ return chained[brand](value); -+ -+ if (brand in env) -+ return setPrototypeOf$1(value, env[brand].prototype); -+ -+ if ("nodeType" in value) { -+ switch (call(nodeType, value)) { -+ case 1: -+ if (!(hint in chained)) -+ throw new Error("unknown hint " + hint); -+ return chained[hint](value); -+ case 2: -+ return chained.Attr(value); -+ case 3: -+ return chained.Node(value); -+ case 9: -+ return chained.Document(value); -+ } -+ } -+ -+ throw new Error("unknown brand " + brand); -+ }; -+ -+ var $ = isExtensionContext$1 ? -+ value => (value === window || value === globalThis ? env : value) : -+ transformer((value, hint = "Element") => { -+ if (value === window || value === globalThis) -+ return env; -+ -+ switch (typeof value) { -+ case "object": -+ return value && upgrade(value, hint); -+ -+ case "string": -+ return new String$1(value); -+ -+ case "number": -+ return new Number$1(value); -+ -+ default: -+ throw new Error("unsupported value"); -+ } -+ }); -+ -+ let { -+ document: document$1, -+ getComputedStyle: getComputedStyle$5, -+ isExtensionContext, -+ variables, -+ Array: Array$1, -+ MutationObserver: MutationObserver$a, -+ Object: Object$1, -+ XPathEvaluator, -+ XPathExpression, -+ XPathResult -+ } = $(window); -+ -+ let {querySelectorAll} = document$1; -+ let $$ = querySelectorAll && bind(querySelectorAll, document$1); -+ -+ const {assign, setPrototypeOf} = Object$1; -+ -+ class $XPathExpression extends XPathExpression { -+ evaluate(...args) { -+ return setPrototypeOf( -+ apply$2(super.evaluate, this, args), -+ XPathResult.prototype -+ ); -+ } -+ } -+ -+ class $XPathEvaluator extends XPathEvaluator { -+ createExpression(...args) { -+ return setPrototypeOf( -+ apply$2(super.createExpression, this, args), -+ $XPathExpression.prototype -+ ); -+ } -+ } -+ -+ function hideElement(element) { -+ if (variables.hidden.has(element)) -+ return; -+ -+ notifyElementHidden(element); -+ -+ variables.hidden.add(element); -+ -+ let {style} = $(element); -+ let $style = $(style, "CSSStyleDeclaration"); -+ let properties = $([]); -+ let {debugCSSProperties} = libEnvironment; -+ -+ for (let [key, value] of (debugCSSProperties || [["display", "none"]])) { -+ $style.setProperty(key, value, "important"); -+ properties.push([key, $style.getPropertyValue(key)]); -+ } -+ -+ new MutationObserver$a(() => { -+ for (let [key, value] of properties) { -+ let propertyValue = $style.getPropertyValue(key); -+ let propertyPriority = $style.getPropertyPriority(key); -+ if (propertyValue != value || propertyPriority != "important") -+ $style.setProperty(key, value, "important"); -+ } -+ }).observe(element, {attributes: true, -+ attributeFilter: ["style"]}); -+ } -+ -+ function notifyElementHidden(element) { -+ if (isExtensionContext && typeof checkElement === "function") -+ checkElement(element); -+ } -+ -+ function initQueryAndApply(selector) { -+ let $selector = selector; -+ if ($selector.startsWith("xpath(") && -+ $selector.endsWith(")")) { -+ let xpathQuery = $selector.slice(6, -1); -+ let evaluator = new $XPathEvaluator(); -+ let expression = evaluator.createExpression(xpathQuery, null); -+ -+ let flag = XPathResult.ORDERED_NODE_SNAPSHOT_TYPE; -+ -+ return cb => { -+ if (!cb) -+ return; -+ let result = expression.evaluate(document$1, flag, null); -+ let {snapshotLength} = result; -+ for (let i = 0; i < snapshotLength; i++) -+ cb(result.snapshotItem(i)); -+ }; -+ } -+ return cb => $$(selector).forEach(cb); -+ } -+ -+ function initQueryAll(selector) { -+ let $selector = selector; -+ if ($selector.startsWith("xpath(") && -+ $selector.endsWith(")")) { -+ let queryAndApply = initQueryAndApply(selector); -+ return () => { -+ let elements = $([]); -+ queryAndApply(e => elements.push(e)); -+ return elements; -+ }; -+ } -+ return () => Array$1.from($$(selector)); -+ } -+ -+ function hideIfMatches(match, selector, searchSelector, onHideCallback) { -+ if (searchSelector == null) -+ searchSelector = selector; -+ -+ let won; -+ const callback = () => { -+ for (const element of $$(searchSelector)) { -+ const closest = $(element).closest(selector); -+ if (closest && match(element, closest)) { -+ won(); -+ hideElement(closest); -+ if (typeof onHideCallback === "function") -+ onHideCallback(closest); -+ } -+ } -+ }; -+ return assign( -+ new MutationObserver$a(callback), -+ { -+ race(win) { -+ won = win; -+ this.observe(document$1, {childList: true, -+ characterData: true, -+ subtree: true}); -+ callback(); -+ } -+ } -+ ); -+ } -+ -+ function isVisible(element, style, closest) { -+ let $style = $(style, "CSSStyleDeclaration"); -+ if ($style.getPropertyValue("display") == "none") -+ return false; -+ -+ let visibility = $style.getPropertyValue("visibility"); -+ if (visibility == "hidden" || visibility == "collapse") -+ return false; -+ -+ if (!closest || element == closest) -+ return true; -+ -+ let parent = $(element).parentElement; -+ if (!parent) -+ return true; -+ -+ return isVisible(parent, getComputedStyle$5(parent), closest); -+ } -+ -+ function getComputedCSSText(element) { -+ let style = getComputedStyle$5(element); -+ let {cssText} = style; -+ -+ if (cssText) -+ return cssText; -+ -+ for (let property of style) -+ cssText += `${property}: ${style[property]}; `; -+ -+ return $(cssText).trim(); -+ } -+ -+ let {Math: Math$2, RegExp} = $(window); -+ -+ function regexEscape(string) { -+ return $(string).replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&"); -+ } -+ -+ function toRegExp(pattern) { -+ let {length} = pattern; -+ -+ if (length > 1 && pattern[0] === "/") { -+ let isCaseSensitive = pattern[length - 1] === "/"; -+ -+ if (isCaseSensitive || (length > 2 && $(pattern).endsWith("/i"))) { -+ let args = [$(pattern).slice(1, isCaseSensitive ? -1 : -2)]; -+ if (!isCaseSensitive) -+ args.push("i"); -+ -+ return new RegExp(...args); -+ } -+ } -+ -+ return new RegExp(regexEscape(pattern)); -+ } -+ -+ let debugging = false; -+ -+ function debug() { -+ return debugging; -+ } -+ -+ function setDebug() { -+ debugging = true; -+ } -+ -+ const {console: console$1} = $(window); -+ -+ const noop = () => {}; -+ -+ function log(...args) { -+ if (debug()) -+ $(args).unshift("%c DEBUG", "font-weight: bold"); -+ -+ console$1.log(...args); -+ } -+ -+ function getDebugger(name) { -+ return bind(debug() ? log : noop, null, name); -+ } -+ -+ let {Array, Error: Error$3, Map: Map$2, parseInt: parseInt$2} = $(window); -+ -+ let stack = null; -+ let won = null; -+ -+ function race(action, winners = "1") { -+ switch (action) { -+ case "start": -+ stack = { -+ winners: parseInt$2(winners, 10) || 1, -+ participants: new Map$2() -+ }; -+ won = new Array(); -+ break; -+ case "end": -+ case "finish": -+ case "stop": -+ stack = null; -+ for (let win of won) -+ win(); -+ won = null; -+ break; -+ default: -+ throw new Error$3(`Invalid action: ${action}`); -+ } -+ } -+ -+ function raceWinner(name, lose) { -+ -+ if (stack === null) -+ return noop; -+ -+ let current = stack; -+ let {participants} = current; -+ participants.set(win, lose); -+ -+ return win; -+ -+ function win() { -+ -+ if (current.winners < 1) -+ return; -+ -+ let debugLog = getDebugger("race"); -+ debugLog(`${name} won the race`); -+ -+ if (current === stack) { -+ won.push(win); -+ } -+ else { -+ participants.delete(win); -+ if (--current.winners < 1) { -+ for (let looser of participants.values()) -+ looser(); -+ -+ participants.clear(); -+ } -+ } -+ } -+ } -+ -+ function hideIfContains(search, selector = "*", searchSelector = null) { -+ const debugLog = getDebugger("hide-if-contains"); -+ const onHideCallback = node => { -+ debugLog("Matched: ", node, " for selector: ", selector, searchSelector); -+ }; -+ let re = toRegExp(search); -+ -+ const mo = hideIfMatches(element => re.test($(element).textContent), -+ selector, -+ searchSelector, -+ onHideCallback); -+ mo.race(raceWinner( -+ "hide-if-contains", -+ () => { -+ mo.disconnect(); -+ } -+ )); -+ } -+ -+ const handler = { -+ get(target, name) { -+ const context = target; -+ while (!hasOwnProperty(target, name)) -+ target = getPrototypeOf(target); -+ const {get, set} = getOwnPropertyDescriptor$2(target, name); -+ return function () { -+ return arguments.length ? -+ apply$2(set, context, arguments) : -+ call(get, context); -+ }; -+ } -+ }; -+ -+ const accessor = target => new $$1(target, handler); -+ -+ $(window); -+ -+ accessor(window); -+ -+ $(/^\d+$/); -+ -+ function getPromiseFromEvent(item, event) { -+ return new Promise( -+ resolve => { -+ const listener = () => { -+ item.removeEventListener(event, listener); -+ resolve(); -+ }; -+ item.addEventListener(event, listener); -+ } -+ ); -+ } -+ -+ function waitUntilEvent( -+ debugLog, -+ mainLogic, -+ waitUntil) { -+ if (waitUntil) { -+ -+ if (waitUntil === "load") { -+ debugLog("Waiting until window.load"); -+ -+ window.onload = () => { -+ debugLog("Window.load fired."); -+ mainLogic(); -+ }; -+ } -+ -+ else if (waitUntil === "loading" || -+ waitUntil === "interactive" || -+ waitUntil === "complete") { -+ debugLog("Waiting document state until :", waitUntil); -+ -+ document.onreadystatechange = () => { -+ debugLog("Document state changed:", document.readyState); -+ if (document.readyState === waitUntil) -+ mainLogic(); -+ }; -+ } -+ -+ else { -+ debugLog("Waiting until ", waitUntil, " event is triggered on document"); -+ getPromiseFromEvent(document, waitUntil).then(() => { -+ debugLog(waitUntil, " is triggered on document, starting the snippet"); -+ mainLogic(); -+ }).catch(err => { -+ debugLog("There was an error while waiting for the event.", err); -+ }); -+ } -+ } -+ else { -+ -+ mainLogic(); -+ } -+ } -+ -+ let {MutationObserver: MutationObserver$9, WeakSet: WeakSet$9, getComputedStyle: getComputedStyle$4} = $(window); -+ -+ function hideIfContainsAndMatchesStyle(search, -+ selector = "*", -+ searchSelector = null, -+ style = null, -+ searchStyle = null, -+ waitUntil, -+ windowWidthMin = null, -+ windowWidthMax = null -+ ) { -+ const debugLog = getDebugger("hide-if-contains-and-matches-style"); -+ const hiddenMap = new WeakSet$9(); -+ if (searchSelector == null) -+ searchSelector = selector; -+ -+ const searchRegExp = toRegExp(search); -+ -+ const styleRegExp = style ? toRegExp(style) : null; -+ const searchStyleRegExp = searchStyle ? toRegExp(searchStyle) : null; -+ const mainLogic = () => { -+ const callback = () => { -+ if ((windowWidthMin && window.innerWidth < windowWidthMin) || -+ (windowWidthMax && window.innerWidth > windowWidthMax) -+ ) -+ return; -+ for (const element of $$(searchSelector)) { -+ if (hiddenMap.has(element)) -+ continue; -+ if (searchRegExp.test($(element).textContent)) { -+ if (!searchStyleRegExp || -+ searchStyleRegExp.test(getComputedCSSText(element))) { -+ const closest = $(element).closest(selector); -+ if (!closest) -+ continue; -+ if (!styleRegExp || styleRegExp.test(getComputedCSSText(closest))) { -+ win(); -+ hideElement(closest); -+ hiddenMap.add(element); -+ debugLog("Matched: ", -+ closest, -+ "which contains: ", -+ element, -+ " for params: ", -+ ...arguments); -+ } -+ else { -+ debugLog( -+ "In this element the searchStyle matched but style didn't:\n", -+ closest, -+ getComputedStyle$4(closest), -+ ...arguments); -+ } -+ } -+ else { -+ debugLog( -+ "In this element the searchStyle didn't match:\n", -+ element, -+ getComputedStyle$4(element), -+ ...arguments); -+ } -+ } -+ } -+ }; -+ -+ const mo = new MutationObserver$9(callback); -+ const win = raceWinner( -+ "hide-if-contains-and-matches-style", -+ () => mo.disconnect() -+ ); -+ mo.observe(document, {childList: true, characterData: true, subtree: true}); -+ callback(); -+ }; -+ waitUntilEvent(debugLog, mainLogic, waitUntil); -+ } -+ -+ let { -+ clearTimeout, -+ fetch, -+ getComputedStyle: getComputedStyle$3, -+ setTimeout: setTimeout$2, -+ Map: Map$1, -+ MutationObserver: MutationObserver$8, -+ Uint8Array -+ } = $(window); -+ -+ function hideIfContainsImage(search, selector, searchSelector) { -+ if (searchSelector == null) -+ searchSelector = selector; -+ -+ let searchRegExp = toRegExp(search); -+ -+ const debugLog = getDebugger("hide-if-contains-image"); -+ -+ let callback = () => { -+ for (let element of $$(searchSelector)) { -+ let style = getComputedStyle$3(element); -+ let match = $(style["background-image"]).match(/^url\("(.*)"\)$/); -+ if (match) { -+ fetchContent(match[1]).then(content => { -+ if (searchRegExp.test(uint8ArrayToHex(new Uint8Array(content)))) { -+ let closest = $(element).closest(selector); -+ if (closest) { -+ win(); -+ hideElement(closest); -+ debugLog("Matched: ", closest, " for:", ...arguments); -+ } -+ } -+ }); -+ } -+ } -+ }; -+ -+ let mo = new MutationObserver$8(callback); -+ let win = raceWinner( -+ "hide-if-contains-image", -+ () => mo.disconnect() -+ ); -+ mo.observe(document, {childList: true, subtree: true}); -+ callback(); -+ } -+ -+ let fetchContentMap = new Map$1(); -+ -+ function fetchContent(url, {as = "arrayBuffer", cleanup = 60000} = {}) { -+ -+ let uid = as + ":" + url; -+ let details = fetchContentMap.get(uid) || { -+ remove: () => fetchContentMap.delete(uid), -+ result: null, -+ timer: 0 -+ }; -+ clearTimeout(details.timer); -+ details.timer = setTimeout$2(details.remove, cleanup); -+ if (!details.result) { -+ details.result = fetch(url).then(res => res[as]()).catch(details.remove); -+ fetchContentMap.set(uid, details); -+ } -+ return details.result; -+ } -+ -+ function toHex(number, length = 2) { -+ let hex = $(number).toString(16); -+ -+ if (hex.length < length) -+ hex = $("0").repeat(length - hex.length) + hex; -+ -+ return hex; -+ } -+ -+ function uint8ArrayToHex(uint8Array) { -+ return uint8Array.reduce((hex, byte) => hex + toHex(byte), ""); -+ } -+ -+ const {parseFloat: parseFloat$1, Math: Math$1, MutationObserver: MutationObserver$7, WeakSet: WeakSet$8} = $(window); -+ const {min} = Math$1; -+ -+ const ld = (a, b) => { -+ const len1 = a.length + 1; -+ const len2 = b.length + 1; -+ const d = [[0]]; -+ let i = 0; -+ let I = 0; -+ -+ while (++i < len2) -+ d[0][i] = i; -+ -+ i = 0; -+ while (++i < len1) { -+ const c = a[I]; -+ let j = 0; -+ let J = 0; -+ d[i] = [i]; -+ while (++j < len2) { -+ d[i][j] = min(d[I][j] + 1, d[i][J] + 1, d[I][J] + (c != b[J])); -+ ++J; -+ } -+ ++I; -+ } -+ return d[len1 - 1][len2 - 1]; -+ }; -+ -+ function hideIfContainsSimilarText( -+ search, selector, -+ searchSelector = null, -+ ignoreChars = 0, -+ maxSearches = 0 -+ ) { -+ const visitedNodes = new WeakSet$8(); -+ const debugLog = getDebugger("hide-if-contains-similar-text"); -+ const $search = $(search); -+ const {length} = $search; -+ const chars = length + parseFloat$1(ignoreChars) || 0; -+ const find = $([...$search]).sort(); -+ const guard = parseFloat$1(maxSearches) || Infinity; -+ -+ if (searchSelector == null) -+ searchSelector = selector; -+ -+ debugLog("Looking for similar text: " + $search); -+ -+ const callback = () => { -+ for (const element of $$(searchSelector)) { -+ if (visitedNodes.has(element)) -+ continue; -+ -+ visitedNodes.add(element); -+ const {innerText} = $(element); -+ const loop = min(guard, innerText.length - chars + 1); -+ for (let i = 0; i < loop; i++) { -+ const str = $(innerText).substr(i, chars); -+ const distance = ld(find, $([...str]).sort()) - ignoreChars; -+ if (distance <= 0) { -+ const closest = $(element).closest(selector); -+ debugLog("Found similar text: " + $search, closest); -+ if (closest) { -+ win(); -+ hideElement(closest); -+ break; -+ } -+ } -+ } -+ } -+ }; -+ -+ let mo = new MutationObserver$7(callback); -+ let win = raceWinner( -+ "hide-if-contains-similar-text", -+ () => mo.disconnect() -+ ); -+ mo.observe(document, {childList: true, characterData: true, subtree: true}); -+ callback(); -+ } -+ -+ let {getComputedStyle: getComputedStyle$2, Map, WeakSet: WeakSet$7, parseFloat} = $(window); -+ -+ const {ELEMENT_NODE: ELEMENT_NODE$3, TEXT_NODE} = Node; -+ -+ function hideIfContainsVisibleText(search, selector, -+ searchSelector = null, -+ ...attributes) { -+ let entries = $([]); -+ const optionalParameters = new Map([ -+ ["-snippet-box-margin", "2"], -+ ["-disable-bg-color-check", "false"], -+ ["-check-is-contained", "false"] -+ ]); -+ -+ for (let attr of attributes) { -+ attr = $(attr); -+ let markerIndex = attr.indexOf(":"); -+ if (markerIndex < 0) -+ continue; -+ -+ let key = attr.slice(0, markerIndex).trim().toString(); -+ let value = attr.slice(markerIndex + 1).trim().toString(); -+ -+ if (key && value) { -+ if (optionalParameters.has(key)) -+ optionalParameters.set(key, value); -+ else -+ entries.push([key, value]); -+ } -+ } -+ -+ let defaultEntries = $([ -+ ["opacity", "0"], -+ ["font-size", "0px"], -+ -+ ["color", "rgba(0, 0, 0, 0)"] -+ ]); -+ -+ let attributesMap = new Map(defaultEntries.concat(entries)); -+ -+ function isTextVisible(element, style, {bgColorCheck = true} = {}) { -+ if (!style) -+ style = getComputedStyle$2(element); -+ -+ style = $(style); -+ -+ for (const [key, value] of attributesMap) { -+ let valueAsRegex = toRegExp(value); -+ if (valueAsRegex.test(style.getPropertyValue(key))) -+ return false; -+ } -+ -+ let color = style.getPropertyValue("color"); -+ if (bgColorCheck && style.getPropertyValue("background-color") == color) -+ return false; -+ -+ return true; -+ } -+ -+ function getPseudoContent(element, pseudo, {bgColorCheck = true} = {}) { -+ let style = getComputedStyle$2(element, pseudo); -+ if (!isVisible(element, style) || -+ !isTextVisible(element, style, {bgColorCheck})) -+ return ""; -+ -+ let {content} = $(style); -+ if (content && content !== "none") { -+ let strings = $([]); -+ -+ content = $(content).trim().replace( -+ /(["'])(?:(?=(\\?))\2.)*?\1/g, -+ value => `\x01${strings.push($(value).slice(1, -1)) - 1}` -+ ); -+ -+ content = content.replace( -+ /\s*attr\(\s*([^\s,)]+)[^)]*?\)\s*/g, -+ (_, name) => $(element).getAttribute(name) || "" -+ ); -+ -+ return content.replace( -+ /\x01(\d+)/g, -+ (_, index) => strings[index]); -+ } -+ return ""; -+ } -+ -+ function isContained(childNode, parentNode, {boxMargin = 2} = {}) { -+ const child = $(childNode).getBoundingClientRect(); -+ const parent = $(parentNode).getBoundingClientRect(); -+ const stretchedParent = { -+ left: parent.left - boxMargin, -+ right: parent.right + boxMargin, -+ top: parent.top - boxMargin, -+ bottom: parent.bottom + boxMargin -+ }; -+ return ( -+ (stretchedParent.left <= child.left && -+ child.left <= stretchedParent.right && -+ stretchedParent.top <= child.top && -+ child.top <= stretchedParent.bottom) && -+ (stretchedParent.top <= child.bottom && -+ child.bottom <= stretchedParent.bottom && -+ stretchedParent.left <= child.right && -+ child.right <= stretchedParent.right) -+ ); -+ } -+ -+ function getVisibleContent(element, -+ closest, -+ style, -+ parentOverflowNode, -+ originalElement, -+ { -+ boxMargin = 2, -+ bgColorCheck, -+ checkIsContained -+ } = {}) { -+ let checkClosest = !style; -+ if (checkClosest) -+ style = getComputedStyle$2(element); -+ -+ if (!isVisible(element, style, checkClosest && closest)) -+ return ""; -+ -+ if (!parentOverflowNode && -+ ( -+ $(style).getPropertyValue("overflow-x") === "hidden" || -+ $(style).getPropertyValue("overflow-y") === "hidden" -+ ) -+ ) -+ parentOverflowNode = element; -+ -+ let text = getPseudoContent(element, ":before", {bgColorCheck}); -+ for (let node of $(element).childNodes) { -+ switch ($(node).nodeType) { -+ case ELEMENT_NODE$3: -+ text += getVisibleContent(node, -+ element, -+ getComputedStyle$2(node), -+ parentOverflowNode, -+ originalElement, -+ { -+ boxMargin, -+ bgColorCheck, -+ checkIsContained -+ } -+ ); -+ break; -+ case TEXT_NODE: -+ -+ if (parentOverflowNode) { -+ if (isContained(element, parentOverflowNode, {boxMargin}) && -+ isTextVisible(element, style, {bgColorCheck})) -+ text += $(node).nodeValue; -+ } -+ else if (isTextVisible(element, style, {bgColorCheck})) { -+ if (checkIsContained && -+ !isContained(element, originalElement, {boxMargin})) -+ continue; -+ text += $(node).nodeValue; -+ } -+ break; -+ } -+ } -+ return text + getPseudoContent(element, ":after", {bgColorCheck}); -+ } -+ const boxMarginStr = optionalParameters.get("-snippet-box-margin"); -+ const boxMargin = parseFloat(boxMarginStr) || 0; -+ -+ const bgColorCheckStr = optionalParameters.get("-disable-bg-color-check"); -+ const bgColorCheck = !(bgColorCheckStr === "true"); -+ -+ const checkIsContainedStr = optionalParameters.get("-check-is-contained"); -+ const checkIsContained = (checkIsContainedStr === "true"); -+ -+ let re = toRegExp(search); -+ let seen = new WeakSet$7(); -+ -+ const mo = hideIfMatches( -+ (element, closest) => { -+ if (seen.has(element)) -+ return false; -+ -+ seen.add(element); -+ let text = getVisibleContent(element, closest, null, null, element, { -+ boxMargin, -+ bgColorCheck, -+ checkIsContained -+ } -+ ); -+ let result = re.test(text); -+ if (debug() && text.length) -+ log(result, re, text); -+ return result; -+ }, -+ selector, -+ searchSelector -+ ); -+ mo.race(raceWinner( -+ "hide-if-contains-visible-text", -+ () => { -+ mo.disconnect(); -+ } -+ )); -+ } -+ -+ let {MutationObserver: MutationObserver$6, WeakSet: WeakSet$6, getComputedStyle: getComputedStyle$1} = $(window); -+ -+ function hideIfHasAndMatchesStyle(search, -+ selector = "*", -+ searchSelector = null, -+ style = null, -+ searchStyle = null, -+ waitUntil = null, -+ windowWidthMin = null, -+ windowWidthMax = null -+ ) { -+ const debugLog = getDebugger("hide-if-has-and-matches-style"); -+ const hiddenMap = new WeakSet$6(); -+ if (searchSelector == null) -+ searchSelector = selector; -+ -+ const styleRegExp = style ? toRegExp(style) : null; -+ const searchStyleRegExp = searchStyle ? toRegExp(searchStyle) : null; -+ const mainLogic = () => { -+ const callback = () => { -+ if ((windowWidthMin && window.innerWidth < windowWidthMin) || -+ (windowWidthMax && window.innerWidth > windowWidthMax) -+ ) -+ return; -+ for (const element of $$(searchSelector)) { -+ if (hiddenMap.has(element)) -+ continue; -+ if ($(element).querySelector(search) && -+ (!searchStyleRegExp || -+ searchStyleRegExp.test(getComputedCSSText(element)))) { -+ const closest = $(element).closest(selector); -+ if (closest && (!styleRegExp || -+ styleRegExp.test(getComputedCSSText(closest)))) { -+ win(); -+ hideElement(closest); -+ hiddenMap.add(element); -+ debugLog("Matched: ", -+ closest, -+ "which contains: ", -+ element, -+ " for params: ", -+ ...arguments); -+ } -+ else { -+ debugLog( -+ "In this element the searchStyle matched but style didn't:\n", -+ closest, -+ getComputedStyle$1(closest), -+ ...arguments); -+ } -+ } -+ else { -+ debugLog( -+ "In this element the searchStyle didn't match:\n", -+ element, -+ getComputedStyle$1(element), -+ ...arguments); -+ } -+ } -+ }; -+ -+ const mo = new MutationObserver$6(callback); -+ const win = raceWinner( -+ "hide-if-has-and-matches-style", -+ () => mo.disconnect() -+ ); -+ mo.observe(document, {childList: true, subtree: true}); -+ callback(); -+ }; -+ waitUntilEvent(debugLog, mainLogic, waitUntil); -+ } -+ -+ let {getComputedStyle, MutationObserver: MutationObserver$5, WeakSet: WeakSet$5} = $(window); -+ -+ function hideIfLabelledBy(search, selector, searchSelector = null) { -+ let sameSelector = searchSelector == null; -+ -+ let searchRegExp = toRegExp(search); -+ -+ let matched = new WeakSet$5(); -+ -+ let callback = () => { -+ for (let node of $$(selector)) { -+ let closest = sameSelector ? -+ node : -+ $(node).closest(searchSelector); -+ if (!closest || !isVisible(node, getComputedStyle(node), closest)) -+ continue; -+ -+ let attr = $(node).getAttribute("aria-labelledby"); -+ let fallback = () => { -+ if (matched.has(closest)) -+ return; -+ -+ if (searchRegExp.test( -+ $(node).getAttribute("aria-label") || "" -+ )) { -+ win(); -+ matched.add(closest); -+ hideElement(closest); -+ } -+ }; -+ -+ if (attr) { -+ for (let label of $(attr).split(/\s+/)) { -+ let target = $(document).getElementById(label); -+ if (target) { -+ if (!matched.has(target) && searchRegExp.test(target.innerText)) { -+ win(); -+ matched.add(target); -+ hideElement(closest); -+ } -+ } -+ else { -+ fallback(); -+ } -+ } -+ } -+ else { -+ fallback(); -+ } -+ } -+ }; -+ -+ let mo = new MutationObserver$5(callback); -+ let win = raceWinner( -+ "hide-if-labelled-by", -+ () => mo.disconnect() -+ ); -+ mo.observe(document, {characterData: true, childList: true, subtree: true}); -+ callback(); -+ } -+ -+ $(window); -+ -+ const noopProfile = { -+ mark() {}, -+ end() {}, -+ toString() { -+ return "{mark(){},end(){}}"; -+ } -+ }; -+ -+ function profile(id, rate = 10) { -+ return noopProfile; -+ } -+ -+ let {MutationObserver: MutationObserver$4, WeakSet: WeakSet$4} = $(window); -+ -+ const {ELEMENT_NODE: ELEMENT_NODE$2} = Node; -+ -+ function hideIfMatchesXPath(query, scopeQuery) { -+ const {mark, end} = profile(); -+ const debugLog = getDebugger("hide-if-matches-xpath"); -+ -+ const startHidingMutationObserver = scopeNode => { -+ const queryAndApply = initQueryAndApply(`xpath(${query})`); -+ const seenMap = new WeakSet$4(); -+ const callback = () => { -+ mark(); -+ queryAndApply(node => { -+ if (seenMap.has(node)) -+ return false; -+ seenMap.add(node); -+ win(); -+ if ($(node).nodeType === ELEMENT_NODE$2) -+ hideElement(node); -+ else -+ $(node).textContent = ""; -+ debugLog("Matched: ", node, " for selector: ", query); -+ }); -+ end(); -+ }; -+ const mo = new MutationObserver$4(callback); -+ const win = raceWinner( -+ "hide-if-matches-xpath", -+ () => mo.disconnect() -+ ); -+ mo.observe( -+ scopeNode, {characterData: true, childList: true, subtree: true}); -+ callback(); -+ }; -+ -+ if (scopeQuery) { -+ -+ let count = 0; -+ let scopeMutationObserver; -+ const scopeQueryAndApply = initQueryAndApply(`xpath(${scopeQuery})`); -+ const findMutationScopeNodes = () => { -+ scopeQueryAndApply(scopeNode => { -+ -+ startHidingMutationObserver(scopeNode); -+ count++; -+ }); -+ if (count > 0) -+ scopeMutationObserver.disconnect(); -+ }; -+ scopeMutationObserver = new MutationObserver$4(findMutationScopeNodes); -+ scopeMutationObserver.observe( -+ document, {characterData: true, childList: true, subtree: true} -+ ); -+ findMutationScopeNodes(); -+ } -+ else { -+ -+ startHidingMutationObserver(document); -+ } -+ } -+ -+ let {MutationObserver: MutationObserver$3, WeakSet: WeakSet$3} = $(window); -+ -+ const {ELEMENT_NODE: ELEMENT_NODE$1} = Node; -+ -+ function hideIfMatchesComputedXPath(query, searchQuery, searchRegex, -+ waitUntil) { -+ const {mark, end} = profile(); -+ const debugLog = getDebugger("hide-if-matches-computed-xpath"); -+ -+ if (!searchQuery || !query) { -+ debugLog("No query or searchQuery provided."); -+ return; -+ } -+ -+ const computeQuery = foundText => query.replace("{{}}", foundText); -+ -+ const startHidingMutationObserver = foundText => { -+ const computedQuery = computeQuery(foundText); -+ debugLog("Starting hiding elements that match query: ", computedQuery); -+ const queryAndApply = initQueryAndApply(`xpath(${computedQuery})`); -+ const seenMap = new WeakSet$3(); -+ const callback = () => { -+ mark(); -+ queryAndApply(node => { -+ if (seenMap.has(node)) -+ return false; -+ seenMap.add(node); -+ win(); -+ if ($(node).nodeType === ELEMENT_NODE$1) -+ hideElement(node); -+ else -+ $(node).textContent = ""; -+ debugLog("Matched: ", node, " for selector: ", query); -+ }); -+ end(); -+ }; -+ const mo = new MutationObserver$3(callback); -+ const win = raceWinner( -+ "hide-if-matches-computed-xpath", -+ () => mo.disconnect() -+ ); -+ mo.observe( -+ document, {characterData: true, childList: true, subtree: true}); -+ callback(); -+ }; -+ -+ const re = toRegExp(searchRegex); -+ -+ const mainLogic = () => { -+ if (searchQuery) { -+ debugLog("Started searching for: ", searchQuery); -+ const seenMap = new WeakSet$3(); -+ let searchMO; -+ const searchQueryAndApply = initQueryAndApply(`xpath(${searchQuery})`); -+ const findMutationSearchNodes = () => { -+ searchQueryAndApply(searchNode => { -+ if (seenMap.has(searchNode)) -+ return false; -+ seenMap.add(searchNode); -+ debugLog("Found node: ", searchNode); -+ if (searchNode.innerHTML) { -+ debugLog("Searching in: ", searchNode.innerHTML); -+ const foundTextArr = searchNode.innerHTML.match(re); -+ if (foundTextArr && foundTextArr.length) { -+ let foundText = ""; -+ -+ foundTextArr[1] ? foundText = foundTextArr[1] : -+ foundText = foundTextArr[0]; -+ debugLog("Matched search query: ", foundText); -+ startHidingMutationObserver(foundText); -+ } -+ } -+ }); -+ }; -+ -+ searchMO = new MutationObserver$3(findMutationSearchNodes); -+ searchMO.observe( -+ document, {characterData: true, childList: true, subtree: true} -+ ); -+ findMutationSearchNodes(); -+ } -+ }; -+ -+ waitUntilEvent(debugLog, mainLogic, waitUntil); -+ } -+ -+ let { -+ parseInt: parseInt$1, -+ setTimeout: setTimeout$1, -+ Error: Error$2, -+ MouseEvent: MouseEvent$2, -+ MutationObserver: MutationObserver$2, -+ WeakSet: WeakSet$2 -+ } = $(window); -+ -+ function simulateEvent(event, selector, delay = "0") { -+ if (!event) -+ throw new Error$2("[simulate-event snippet]: No event type provided."); -+ if (!selector) -+ throw new Error$2("[simulate-event snippet]: No selector provided."); -+ -+ let queryAndApply = initQueryAndApply(selector); -+ let delayInMiliseconds = parseInt$1(delay, 10); -+ let dispatchedNodes = new WeakSet$2(); -+ -+ let observer = new MutationObserver$2(findNodesAndDispatchEvents); -+ observer.observe(document, {childList: true, subtree: true}); -+ findNodesAndDispatchEvents(); -+ -+ function findNodesAndDispatchEvents() { -+ queryAndApply(node => { -+ if (!dispatchedNodes.has(node)) { -+ dispatchedNodes.add(node); -+ setTimeout$1(() => { -+ $(node).dispatchEvent( -+ new MouseEvent$2(event, {bubbles: true, cancelable: true}) -+ ); -+ }, delayInMiliseconds); -+ } -+ }); -+ } -+ } -+ -+ let { -+ parseInt, -+ setTimeout, -+ Error: Error$1, -+ MouseEvent: MouseEvent$1, -+ MutationObserver: MutationObserver$1, -+ WeakSet: WeakSet$1 -+ } = $(window); -+ -+ const VALID_TYPES = ["auxclick", "click", "dblclick", "gotpointercapture", -+ "lostpointercapture", "mouseenter", "mousedown", -+ "mouseleave", "mousemove", "mouseout", "mouseover", -+ "mouseup", "pointerdown", "pointerenter", -+ "pointermove", "pointerover", "pointerout", -+ "pointerup", "pointercancel", "pointerleave"]; -+ -+ function simulateMouseEvent(...selectors) { -+ const debugLog = getDebugger("simulate-mouse-event"); -+ const MAX_ARGS = 7; -+ if (selectors.length < 1) -+ throw new Error$1("[simulate-mouse-event snippet]: No selector provided."); -+ if (selectors.length > MAX_ARGS) { -+ -+ selectors = selectors.slice(0, MAX_ARGS); -+ } -+ function parseArg(theRule) { -+ if (!theRule) -+ return null; -+ -+ const result = { -+ selector: "", -+ continue: false, -+ trigger: false, -+ event: "click", -+ delay: "500", -+ clicked: false, -+ found: false -+ }; -+ const textArr = theRule.split("$"); -+ let options = []; -+ if (textArr.length >= 2) -+ options = textArr[1].toLowerCase().split(","); -+ -+ [result.selector] = textArr; -+ -+ for (const option of options) { -+ if (option === "trigger") { -+ result.trigger = true; -+ } -+ else if (option === "continue") { -+ result.continue = true; -+ } -+ else if (option.startsWith("event")) { -+ const event = option.toLowerCase().split("="); -+ event[1] ? result.event = event[1] : result.event = "click"; -+ } -+ else if (option.startsWith("delay")) { -+ const delay = option.toLowerCase().split("="); -+ delay[1] ? result.delay = delay[1] : result.delay = "500"; -+ } -+ } -+ if (!VALID_TYPES.includes(result.event)) { -+ debugLog(result.event, -+ " might be misspelled, check for typos.\n", -+ "These are the supported events:", -+ VALID_TYPES); -+ } -+ return result; -+ } -+ -+ const parsedArgs = $([]); -+ -+ $(selectors).forEach(rule => { -+ const parsedRule = parseArg(rule); -+ parsedArgs.push(parsedRule); -+ }); -+ -+ function checkIfAllSelectorsFound() { -+ parsedArgs.forEach(arg => { -+ if (!arg.found) { -+ const queryAll = initQueryAll(arg.selector); -+ const elems = queryAll(); -+ if (elems.length > 0) -+ arg.found = true; -+ } -+ }); -+ return parsedArgs.every(arg => arg.found); -+ } -+ -+ function triggerEvent(node, event, delay) { -+ -+ if (!node || !event) -+ return; -+ -+ if (event === "click" && node.click) { -+ node.click(); -+ debugLog( -+ "Clicked on this node:\n", node, "\nwith a delay of", delay, "ms" -+ ); -+ } -+ else { -+ node.dispatchEvent( -+ new MouseEvent$1(event, {bubbles: true, cancelable: true}) -+ ); -+ debugLog( -+ "A", -+ event, -+ "event was dispatched with a delay of", -+ delay, -+ "ms on this node:\n", -+ node -+ ); -+ } -+ } -+ let allFound = false; -+ -+ const [last] = parsedArgs.slice(-1); -+ last.trigger = true; -+ -+ let dispatchedNodes = new WeakSet$1(); -+ -+ let observer = new MutationObserver$1(findNodesAndDispatchEvents); -+ observer.observe(document, {childList: true, subtree: true}); -+ findNodesAndDispatchEvents(); -+ -+ function findNodesAndDispatchEvents() { -+ -+ if (!allFound) -+ allFound = checkIfAllSelectorsFound(); -+ if (allFound) { -+ for (const parsedRule of parsedArgs) { -+ const queryAndApply = initQueryAndApply(parsedRule.selector); -+ const delayInMiliseconds = parseInt(parsedRule.delay, 10); -+ if (parsedRule.trigger) { -+ queryAndApply(node => { -+ if (!dispatchedNodes.has(node)) { -+ dispatchedNodes.add(node); -+ if (parsedRule.continue) { -+ setInterval(() => { -+ triggerEvent(node, parsedRule.event, parsedRule.delay); -+ }, delayInMiliseconds); -+ } -+ else { -+ setTimeout(() => { -+ triggerEvent(node, parsedRule.event, parsedRule.delay); -+ }, delayInMiliseconds); -+ } -+ } -+ }); -+ } -+ } -+ } -+ } -+ } -+ -+ const snippets = { -+ log, -+ race, -+ "debug": setDebug, -+ "hide-if-matches-xpath": hideIfMatchesXPath, -+ "hide-if-matches-computed-xpath": hideIfMatchesComputedXPath, -+ "hide-if-contains": hideIfContains, -+ "hide-if-contains-similar-text": hideIfContainsSimilarText, -+ "hide-if-contains-visible-text": hideIfContainsVisibleText, -+ "hide-if-contains-and-matches-style": hideIfContainsAndMatchesStyle, -+ "hide-if-has-and-matches-style": hideIfHasAndMatchesStyle, -+ "hide-if-labelled-by": hideIfLabelledBy, -+ "hide-if-contains-image": hideIfContainsImage, -+ "simulate-event-poc": simulateEvent, -+ "simulate-mouse-event": simulateMouseEvent -+ }; -+ -+ let {MutationObserver} = $(window); -+ -+ const {ELEMENT_NODE} = Node; -+ -+ function hideIfMatchesXPath3(query, scopeQuery) { -+ let {mark, end} = profile(); -+ -+ function queryNodes() { -+ return fontoxpath.evaluateXPathToNodes(query, document, null, null, { -+ language: fontoxpath.evaluateXPath.XQUERY_3_1_LANGUAGE -+ }); -+ } -+ -+ let debugLog = getDebugger("hide-if-matches-xpath3"); -+ -+ const startHidingMutationObserver = scopeNode => { -+ const seenMap = new WeakSet(); -+ const callback = () => { -+ mark(); -+ -+ const nodes = queryNodes(); -+ for (const node of $(nodes)) { -+ if (seenMap.has(node)) -+ return false; -+ seenMap.add(node); -+ win(); -+ if ($(node).nodeType === ELEMENT_NODE) -+ hideElement(node); -+ else -+ $(node).textContent = ""; -+ debugLog("Matched: ", node, " for selector: ", query); -+ } -+ end(); -+ }; -+ -+ const mo = new MutationObserver(callback); -+ const win = raceWinner( -+ "hide-if-matches-xpath3", -+ () => mo.disconnect() -+ ); -+ mo.observe( -+ scopeNode, {characterData: true, childList: true, subtree: true}); -+ callback(); -+ }; -+ -+ if (scopeQuery) { -+ -+ let count = 0; -+ let scopeMutationObserver; -+ const scopeNodes = queryNodes(); -+ const findMutationScopeNodes = () => { -+ for (const scopeNode of $(scopeNodes)) { -+ -+ startHidingMutationObserver(scopeNode); -+ count++; -+ } -+ if (count > 0) -+ scopeMutationObserver.disconnect(); -+ }; -+ -+ scopeMutationObserver = new MutationObserver(findMutationScopeNodes); -+ scopeMutationObserver.observe( -+ document, {characterData: true, childList: true, subtree: true} -+ ); -+ findMutationScopeNodes(); -+ } -+ else { -+ -+ startHidingMutationObserver(document); -+ } -+ } -+ -+ snippets["hide-if-matches-xpath3"] = hideIfMatchesXPath3; -+ let context; -+ for (const [name, ...args] of filters) { -+ if (snippets.hasOwnProperty(name)) { -+ try { context = snippets[name].apply(context, args); } -+ catch (error) { console.error(error); } -+ } -+ } -+ context = void 0; -+})(e, ...t); -+ -+const callback = (environment, ...filters) => { -+ /*! -+ * This file is part of eyeo's Anti-Circumvention Snippets module (@eyeo/snippets), -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * @eyeo/snippets is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * @eyeo/snippets is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with @eyeo/snippets. If not, see . -+ */ -+ const $$1 = Proxy; -+ -+ const {apply: a, bind: b, call: c} = Function; -+ const apply$2 = c.bind(a); -+ const bind = c.bind(b); -+ const call = c.bind(c); -+ -+ const callerHandler = { -+ get(target, name) { -+ return bind(c, target[name]); -+ } -+ }; -+ -+ const caller = target => new $$1(target, callerHandler); -+ -+ const proxy = (source, target) => new $$1(source, { -+ apply: (_, self, args) => apply$2(target, self, args) -+ }); -+ -+ const handler$2 = { -+ get(target, name) { -+ return bind(target[name], target); -+ } -+ }; -+ -+ const bound = target => new $$1(target, handler$2); -+ -+ const { -+ assign: assign$1, -+ defineProperties: defineProperties$1, -+ freeze: freeze$1, -+ getOwnPropertyDescriptor: getOwnPropertyDescriptor$3, -+ getOwnPropertyDescriptors: getOwnPropertyDescriptors$1, -+ getPrototypeOf -+ } = bound(Object); -+ -+ const {hasOwnProperty} = caller({}); -+ -+ const {species} = Symbol; -+ -+ const handler$1 = { -+ get(target, name) { -+ const Native = target[name]; -+ class Secure extends Native {} -+ -+ const proto = getOwnPropertyDescriptors$1(Native.prototype); -+ delete proto.constructor; -+ freeze$1(defineProperties$1(Secure.prototype, proto)); -+ -+ const statics = getOwnPropertyDescriptors$1(Native); -+ delete statics.length; -+ delete statics.prototype; -+ statics[species] = {value: Secure}; -+ return freeze$1(defineProperties$1(Secure, statics)); -+ } -+ }; -+ -+ const secure = target => new $$1(target, handler$1); -+ -+ const libEnvironment = typeof environment !== "undefined" ? environment : -+ {}; -+ -+ if (typeof globalThis === "undefined") -+ window.globalThis = window; -+ -+ const {apply: apply$1, ownKeys} = bound(Reflect); -+ -+ const worldEnvDefined = "world" in libEnvironment; -+ const isIsolatedWorld = worldEnvDefined && libEnvironment.world === "ISOLATED"; -+ const isMainWorld = worldEnvDefined && libEnvironment.world === "MAIN"; -+ const isChrome = typeof chrome === "object" && !!chrome.runtime; -+ const isOtherThanChrome = typeof browser === "object" && !!browser.runtime; -+ const isExtensionContext$2 = !isMainWorld && -+ (isIsolatedWorld || isChrome || isOtherThanChrome); -+ const copyIfExtension = value => isExtensionContext$2 ? -+ value : -+ create(value, getOwnPropertyDescriptors(value)); -+ -+ const { -+ create, -+ defineProperties, -+ defineProperty, -+ freeze, -+ getOwnPropertyDescriptor: getOwnPropertyDescriptor$2, -+ getOwnPropertyDescriptors -+ } = bound(Object); -+ -+ const invokes = bound(globalThis); -+ const classes = isExtensionContext$2 ? globalThis : secure(globalThis); -+ const {Map: Map$8, RegExp: RegExp$1, Set: Set$2, WeakMap: WeakMap$4, WeakSet: WeakSet$3} = classes; -+ -+ const augment = (source, target, method = null) => { -+ const known = ownKeys(target); -+ for (const key of ownKeys(source)) { -+ if (known.includes(key)) -+ continue; -+ -+ const descriptor = getOwnPropertyDescriptor$2(source, key); -+ if (method && "value" in descriptor) { -+ const {value} = descriptor; -+ if (typeof value === "function") -+ descriptor.value = method(value); -+ } -+ defineProperty(target, key, descriptor); -+ } -+ }; -+ -+ const primitive = name => { -+ const Super = classes[name]; -+ class Class extends Super {} -+ const {toString, valueOf} = Super.prototype; -+ defineProperties(Class.prototype, { -+ toString: {value: toString}, -+ valueOf: {value: valueOf} -+ }); -+ const type = name.toLowerCase(); -+ const method = callback => function() { -+ const result = apply$1(callback, this, arguments); -+ return typeof result === type ? new Class(result) : result; -+ }; -+ augment(Super, Class, method); -+ augment(Super.prototype, Class.prototype, method); -+ return Class; -+ }; -+ -+ const variables$3 = freeze({ -+ frozen: new WeakMap$4(), -+ hidden: new WeakSet$3(), -+ iframePropertiesToAbort: { -+ read: new Set$2(), -+ write: new Set$2() -+ }, -+ abortedIframes: new WeakMap$4() -+ }); -+ -+ const startsCapitalized = new RegExp$1("^[A-Z]"); -+ -+ var env = new Proxy(new Map$8([ -+ -+ ["chrome", ( -+ isExtensionContext$2 && ( -+ (isChrome && chrome) || -+ (isOtherThanChrome && browser) -+ ) -+ ) || void 0], -+ ["isExtensionContext", isExtensionContext$2], -+ ["variables", variables$3], -+ -+ ["console", copyIfExtension(console)], -+ ["document", globalThis.document], -+ ["performance", copyIfExtension(performance)], -+ ["JSON", copyIfExtension(JSON)], -+ ["Map", Map$8], -+ ["Math", copyIfExtension(Math)], -+ ["Number", isExtensionContext$2 ? Number : primitive("Number")], -+ ["RegExp", RegExp$1], -+ ["Set", Set$2], -+ ["String", isExtensionContext$2 ? String : primitive("String")], -+ ["WeakMap", WeakMap$4], -+ ["WeakSet", WeakSet$3], -+ -+ ["MouseEvent", MouseEvent] -+ ]), { -+ get(map, key) { -+ if (map.has(key)) -+ return map.get(key); -+ -+ let value = globalThis[key]; -+ if (typeof value === "function") -+ value = (startsCapitalized.test(key) ? classes : invokes)[key]; -+ -+ map.set(key, value); -+ return value; -+ }, -+ has(map, key) { -+ return map.has(key); -+ } -+ }); -+ -+ class WeakValue { -+ has() { return false; } -+ set() {} -+ } -+ -+ const helpers = {WeakSet, WeakMap, WeakValue}; -+ const {apply} = Reflect; -+ -+ function transformOnce (callback) { const {WeakSet, WeakMap, WeakValue} = (this || helpers); -+ const ws = new WeakSet; -+ const wm = new WeakMap; -+ const wv = new WeakValue; -+ return function (any) { -+ if (ws.has(any)) -+ return any; -+ -+ if (wm.has(any)) -+ return wm.get(any); -+ -+ if (wv.has(any)) -+ return wv.get(any); -+ -+ const value = apply(callback, this, arguments); -+ ws.add(value); -+ if (value !== any) -+ (typeof any === 'object' && any ? wm : wv).set(any, value); -+ return value; -+ }; -+ } -+ -+ const {Map: Map$7, WeakMap: WeakMap$3, WeakSet: WeakSet$2, setTimeout} = env; -+ -+ let cleanup = true; -+ let cleanUpCallback = map => { -+ map.clear(); -+ cleanup = !cleanup; -+ }; -+ -+ var transformer = transformOnce.bind({ -+ WeakMap: WeakMap$3, -+ WeakSet: WeakSet$2, -+ -+ WeakValue: class extends Map$7 { -+ set(key, value) { -+ if (cleanup) { -+ cleanup = !cleanup; -+ setTimeout(cleanUpCallback, 0, this); -+ } -+ return super.set(key, value); -+ } -+ } -+ }); -+ -+ const {concat, includes, join, reduce, unshift} = caller([]); -+ -+ const globals = secure(globalThis); -+ -+ const { -+ Map: Map$6, -+ WeakMap: WeakMap$2 -+ } = globals; -+ -+ const map = new Map$6; -+ const descriptors = target => { -+ const chain = []; -+ let current = target; -+ while (current) { -+ if (map.has(current)) -+ unshift(chain, map.get(current)); -+ else { -+ const descriptors = getOwnPropertyDescriptors$1(current); -+ map.set(current, descriptors); -+ unshift(chain, descriptors); -+ } -+ current = getPrototypeOf(current); -+ } -+ unshift(chain, {}); -+ return apply$2(assign$1, null, chain); -+ }; -+ -+ const chain = source => { -+ const target = typeof source === 'function' ? source.prototype : source; -+ const chained = descriptors(target); -+ const handler = { -+ get(target, key) { -+ if (key in chained) { -+ const {value, get} = chained[key]; -+ if (get) -+ return call(get, target); -+ if (typeof value === 'function') -+ return bind(value, target); -+ } -+ return target[key]; -+ }, -+ set(target, key, value) { -+ if (key in chained) { -+ const {set} = chained[key]; -+ if (set) { -+ call(set, target, value); -+ return true; -+ } -+ } -+ target[key] = value; -+ return true; -+ } -+ }; -+ return target => new $$1(target, handler); -+ }; -+ -+ const { -+ isExtensionContext: isExtensionContext$1, -+ Array: Array$2, -+ Number: Number$1, -+ String: String$1, -+ Object: Object$9 -+ } = env; -+ -+ const {isArray} = Array$2; -+ const {getOwnPropertyDescriptor: getOwnPropertyDescriptor$1, setPrototypeOf: setPrototypeOf$1} = Object$9; -+ -+ const {toString: toString$1} = Object$9.prototype; -+ const {slice} = String$1.prototype; -+ const getBrand = value => call(slice, call(toString$1, value), 8, -1); -+ -+ const {get: nodeType} = getOwnPropertyDescriptor$1(Node.prototype, "nodeType"); -+ -+ const chained = isExtensionContext$1 ? {} : { -+ Attr: chain(Attr), -+ CanvasRenderingContext2D: chain(CanvasRenderingContext2D), -+ CSSStyleDeclaration: chain(CSSStyleDeclaration), -+ Document: chain(Document), -+ Element: chain(Element), -+ HTMLCanvasElement: chain(HTMLCanvasElement), -+ HTMLElement: chain(HTMLElement), -+ HTMLImageElement: chain(HTMLImageElement), -+ HTMLScriptElement: chain(HTMLScriptElement), -+ MutationRecord: chain(MutationRecord), -+ Node: chain(Node), -+ ShadowRoot: chain(ShadowRoot), -+ -+ get CSS2Properties() { -+ return chained.CSSStyleDeclaration; -+ } -+ }; -+ -+ const upgrade = (value, hint) => { -+ if (hint !== "Element" && hint in chained) -+ return chained[hint](value); -+ -+ if (isArray(value)) -+ return setPrototypeOf$1(value, Array$2.prototype); -+ -+ const brand = getBrand(value); -+ if (brand in chained) -+ return chained[brand](value); -+ -+ if (brand in env) -+ return setPrototypeOf$1(value, env[brand].prototype); -+ -+ if ("nodeType" in value) { -+ switch (call(nodeType, value)) { -+ case 1: -+ if (!(hint in chained)) -+ throw new Error("unknown hint " + hint); -+ return chained[hint](value); -+ case 2: -+ return chained.Attr(value); -+ case 3: -+ return chained.Node(value); -+ case 9: -+ return chained.Document(value); -+ } -+ } -+ -+ throw new Error("unknown brand " + brand); -+ }; -+ -+ var $ = isExtensionContext$1 ? -+ value => (value === window || value === globalThis ? env : value) : -+ transformer((value, hint = "Element") => { -+ if (value === window || value === globalThis) -+ return env; -+ -+ switch (typeof value) { -+ case "object": -+ return value && upgrade(value, hint); -+ -+ case "string": -+ return new String$1(value); -+ -+ case "number": -+ return new Number$1(value); -+ -+ default: -+ throw new Error("unsupported value"); -+ } -+ }); -+ -+ const handler = { -+ get(target, name) { -+ const context = target; -+ while (!hasOwnProperty(target, name)) -+ target = getPrototypeOf(target); -+ const {get, set} = getOwnPropertyDescriptor$3(target, name); -+ return function () { -+ return arguments.length ? -+ apply$2(set, context, arguments) : -+ call(get, context); -+ }; -+ } -+ }; -+ -+ const accessor = target => new $$1(target, handler); -+ -+ let debugging = false; -+ -+ function debug() { -+ return debugging; -+ } -+ -+ function setDebug() { -+ debugging = true; -+ } -+ -+ const {console: console$3} = $(window); -+ -+ const noop = () => {}; -+ -+ function log(...args) { -+ if (debug()) -+ $(args).unshift("%c DEBUG", "font-weight: bold"); -+ -+ console$3.log(...args); -+ } -+ -+ function getDebugger(name) { -+ return bind(debug() ? log : noop, null, name); -+ } -+ -+ let {Math: Math$1, RegExp} = $(window); -+ -+ function regexEscape(string) { -+ return $(string).replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&"); -+ } -+ -+ function toRegExp(pattern) { -+ let {length} = pattern; -+ -+ if (length > 1 && pattern[0] === "/") { -+ let isCaseSensitive = pattern[length - 1] === "/"; -+ -+ if (isCaseSensitive || (length > 2 && $(pattern).endsWith("/i"))) { -+ let args = [$(pattern).slice(1, isCaseSensitive ? -1 : -2)]; -+ if (!isCaseSensitive) -+ args.push("i"); -+ -+ return new RegExp(...args); -+ } -+ } -+ -+ return new RegExp(regexEscape(pattern)); -+ } -+ -+ function randomId() { -+ -+ return $(Math$1.floor(Math$1.random() * 2116316160 + 60466176)).toString(36); -+ } -+ -+ let { -+ parseFloat, -+ variables: variables$2, -+ Array: Array$1, -+ Error: Error$7, -+ Map: Map$5, -+ Object: Object$8, -+ ReferenceError: ReferenceError$2, -+ Set: Set$1, -+ WeakMap: WeakMap$1 -+ } = $(window); -+ -+ let {onerror} = accessor(window); -+ -+ let NodeProto$1 = Node.prototype; -+ let ElementProto$2 = Element.prototype; -+ -+ let propertyAccessors = null; -+ -+ function wrapPropertyAccess(object, property, descriptor, -+ setConfigurable = true) { -+ let $property = $(property); -+ let dotIndex = $property.indexOf("."); -+ if (dotIndex == -1) { -+ -+ let currentDescriptor = Object$8.getOwnPropertyDescriptor(object, property); -+ if (currentDescriptor && !currentDescriptor.configurable) -+ return; -+ -+ let newDescriptor = Object$8.assign({}, descriptor, { -+ configurable: setConfigurable -+ }); -+ -+ if (!currentDescriptor && !newDescriptor.get && newDescriptor.set) { -+ let propertyValue = object[property]; -+ newDescriptor.get = () => propertyValue; -+ } -+ -+ Object$8.defineProperty(object, property, newDescriptor); -+ return; -+ } -+ -+ let name = $property.slice(0, dotIndex).toString(); -+ property = $property.slice(dotIndex + 1).toString(); -+ let value = object[name]; -+ if (value && (typeof value == "object" || typeof value == "function")) -+ wrapPropertyAccess(value, property, descriptor); -+ -+ let currentDescriptor = Object$8.getOwnPropertyDescriptor(object, name); -+ if (currentDescriptor && !currentDescriptor.configurable) -+ return; -+ -+ if (!propertyAccessors) -+ propertyAccessors = new WeakMap$1(); -+ -+ if (!propertyAccessors.has(object)) -+ propertyAccessors.set(object, new Map$5()); -+ -+ let properties = propertyAccessors.get(object); -+ if (properties.has(name)) { -+ properties.get(name).set(property, descriptor); -+ return; -+ } -+ -+ let toBeWrapped = new Map$5([[property, descriptor]]); -+ properties.set(name, toBeWrapped); -+ Object$8.defineProperty(object, name, { -+ get: () => value, -+ set(newValue) { -+ value = newValue; -+ if (value && (typeof value == "object" || typeof value == "function")) { -+ -+ for (let [prop, desc] of toBeWrapped) -+ wrapPropertyAccess(value, prop, desc); -+ } -+ }, -+ configurable: setConfigurable -+ }); -+ } -+ -+ function overrideOnError(magic) { -+ let prev = onerror(); -+ onerror((...args) => { -+ let message = args.length && args[0]; -+ if (typeof message == "string" && $(message).includes(magic)) -+ return true; -+ if (typeof prev == "function") -+ return apply$2(prev, this, args); -+ }); -+ } -+ -+ function abortOnRead(loggingPrefix, context, property, -+ setConfigurable = true) { -+ let debugLog = getDebugger(loggingPrefix); -+ -+ if (!property) { -+ debugLog("no property to abort on read"); -+ return; -+ } -+ -+ let rid = randomId(); -+ -+ function abort() { -+ debugLog(`${property} access aborted`); -+ throw new ReferenceError$2(rid); -+ } -+ -+ debugLog(`aborting on ${property} access`); -+ -+ wrapPropertyAccess(context, -+ property, -+ {get: abort, set() {}}, -+ setConfigurable); -+ overrideOnError(rid); -+ } -+ -+ function abortOnWrite(loggingPrefix, context, property, -+ setConfigurable = true) { -+ let debugLog = getDebugger(loggingPrefix); -+ -+ if (!property) { -+ debugLog("no property to abort on write"); -+ return; -+ } -+ -+ let rid = randomId(); -+ -+ function abort() { -+ debugLog(`setting ${property} aborted`); -+ throw new ReferenceError$2(rid); -+ } -+ -+ debugLog(`aborting when setting ${property}`); -+ -+ wrapPropertyAccess(context, property, {set: abort}, setConfigurable); -+ overrideOnError(rid); -+ } -+ -+ function abortOnIframe( -+ properties, -+ abortRead = false, -+ abortWrite = false -+ ) { -+ let abortedIframes = variables$2.abortedIframes; -+ let iframePropertiesToAbort = variables$2.iframePropertiesToAbort; -+ -+ for (let frame of Array$1.from(window.frames)) { -+ if (abortedIframes.has(frame)) { -+ for (let property of properties) { -+ if (abortRead) -+ abortedIframes.get(frame).read.add(property); -+ if (abortWrite) -+ abortedIframes.get(frame).write.add(property); -+ } -+ } -+ } -+ -+ for (let property of properties) { -+ if (abortRead) -+ iframePropertiesToAbort.read.add(property); -+ if (abortWrite) -+ iframePropertiesToAbort.write.add(property); -+ } -+ -+ queryAndProxyIframe(); -+ if (!abortedIframes.has(document)) { -+ abortedIframes.set(document, true); -+ addHooksOnDomAdditions(queryAndProxyIframe); -+ } -+ -+ function queryAndProxyIframe() { -+ for (let frame of Array$1.from(window.frames)) { -+ -+ if (!abortedIframes.has(frame)) { -+ abortedIframes.set(frame, { -+ read: new Set$1(iframePropertiesToAbort.read), -+ write: new Set$1(iframePropertiesToAbort.write) -+ }); -+ } -+ -+ let readProps = abortedIframes.get(frame).read; -+ if (readProps.size > 0) { -+ let props = Array$1.from(readProps); -+ readProps.clear(); -+ for (let property of props) -+ abortOnRead("abort-on-iframe-property-read", frame, property); -+ } -+ -+ let writeProps = abortedIframes.get(frame).write; -+ if (writeProps.size > 0) { -+ let props = Array$1.from(writeProps); -+ writeProps.clear(); -+ for (let property of props) -+ abortOnWrite("abort-on-iframe-property-write", frame, property); -+ } -+ } -+ } -+ } -+ -+ function addHooksOnDomAdditions(endCallback) { -+ let descriptor; -+ -+ wrapAccess(NodeProto$1, ["appendChild", "insertBefore", "replaceChild"]); -+ wrapAccess(ElementProto$2, ["append", "prepend", "replaceWith", "after", -+ "before", "insertAdjacentElement", -+ "insertAdjacentHTML"]); -+ -+ descriptor = getInnerHTMLDescriptor(ElementProto$2, "innerHTML"); -+ wrapPropertyAccess(ElementProto$2, "innerHTML", descriptor); -+ -+ descriptor = getInnerHTMLDescriptor(ElementProto$2, "outerHTML"); -+ wrapPropertyAccess(ElementProto$2, "outerHTML", descriptor); -+ -+ function wrapAccess(prototype, names) { -+ for (let name of names) { -+ let desc = getAppendChildDescriptor(prototype, name); -+ wrapPropertyAccess(prototype, name, desc); -+ } -+ } -+ -+ function getAppendChildDescriptor(target, property) { -+ let currentValue = target[property]; -+ return { -+ get() { -+ return function(...args) { -+ let result; -+ result = apply$2(currentValue, this, args); -+ endCallback && endCallback(); -+ return result; -+ }; -+ } -+ }; -+ } -+ -+ function getInnerHTMLDescriptor(target, property) { -+ let desc = Object$8.getOwnPropertyDescriptor(target, property); -+ let {set: prevSetter} = desc || {}; -+ return { -+ set(val) { -+ let result; -+ result = call(prevSetter, this, val); -+ endCallback && endCallback(); -+ return result; -+ } -+ }; -+ } -+ } -+ -+ let {Object: NativeObject} = window; -+ function findOwner(root, path) { -+ if (!(root instanceof NativeObject)) -+ return; -+ -+ let object = root; -+ let chain = $(path).split("."); -+ -+ if (chain.length === 0) -+ return; -+ -+ for (let i = 0; i < chain.length - 1; i++) { -+ let prop = chain[i]; -+ -+ if (!hasOwnProperty(object, prop)) -+ return; -+ -+ object = object[prop]; -+ -+ if (!(object instanceof NativeObject)) -+ return; -+ } -+ -+ let prop = chain[chain.length - 1]; -+ -+ if (hasOwnProperty(object, prop)) -+ return [object, prop]; -+ } -+ -+ const decimals = $(/^\d+$/); -+ -+ function overrideValue(value) { -+ switch (value) { -+ case "false": -+ return false; -+ case "true": -+ return true; -+ case "null": -+ return null; -+ case "noopFunc": -+ return () => {}; -+ case "trueFunc": -+ return () => true; -+ case "falseFunc": -+ return () => false; -+ case "emptyArray": -+ return []; -+ case "emptyObj": -+ return {}; -+ case "undefined": -+ return void 0; -+ case "": -+ return value; -+ default: -+ if (decimals.test(value)) -+ return parseFloat(value); -+ -+ throw new Error$7("[override-property-read snippet]: " + -+ `Value "${value}" is not valid.`); -+ } -+ } -+ -+ let {HTMLScriptElement: HTMLScriptElement$1, Object: Object$7, ReferenceError: ReferenceError$1} = $(window); -+ let Script = Object$7.getPrototypeOf(HTMLScriptElement$1); -+ -+ function abortCurrentInlineScript(api, search = null) { -+ const debugLog = getDebugger("abort-current-inline-script"); -+ const re = search ? toRegExp(search) : null; -+ -+ const rid = randomId(); -+ const us = $(document).currentScript; -+ -+ let object = window; -+ const path = $(api).split("."); -+ const name = $(path).pop(); -+ -+ for (let node of $(path)) { -+ object = object[node]; -+ if ( -+ !object || !(typeof object == "object" || typeof object == "function")) { -+ debugLog(path, " is not found"); -+ return; -+ } -+ } -+ -+ const {get: prevGetter, set: prevSetter} = -+ Object$7.getOwnPropertyDescriptor(object, name) || {}; -+ -+ let currentValue = object[name]; -+ if (typeof currentValue === "undefined") -+ debugLog("The property", name, "doesn't exist yet. Check typos."); -+ -+ const abort = () => { -+ const element = $(document).currentScript; -+ if (element instanceof Script && -+ $(element, "HTMLScriptElement").src == "" && -+ element != us && -+ (!re || re.test($(element).textContent))) { -+ debugLog(path, " is aborted \n", element); -+ throw new ReferenceError$1(rid); -+ } -+ }; -+ -+ const descriptor = { -+ get() { -+ abort(); -+ -+ if (prevGetter) -+ return call(prevGetter, this); -+ -+ return currentValue; -+ }, -+ set(value) { -+ abort(); -+ -+ if (prevSetter) -+ call(prevSetter, this, value); -+ else -+ currentValue = value; -+ } -+ }; -+ -+ wrapPropertyAccess(object, name, descriptor); -+ -+ overrideOnError(rid); -+ } -+ -+ function abortOnIframePropertyRead(...properties) { -+ abortOnIframe(properties, true, false); -+ } -+ -+ function abortOnIframePropertyWrite(...properties) { -+ abortOnIframe(properties, false, true); -+ } -+ -+ function abortOnPropertyRead(property, setConfigurable) { -+ const configurableFlag = !(setConfigurable === "false"); -+ abortOnRead("abort-on-property-read", window, property, configurableFlag); -+ } -+ -+ function abortOnPropertyWrite(property, setConfigurable) { -+ const configurableFlag = !(setConfigurable === "false"); -+ abortOnWrite("abort-on-property-write", window, property, configurableFlag); -+ } -+ -+ let {Error: Error$6} = $(window); -+ let {cookie: documentCookies} = accessor(document); -+ -+ function cookieRemover(cookie) { -+ if (!cookie) -+ throw new Error$6("[cookie-remover snippet]: No cookie to remove."); -+ -+ let debugLog = getDebugger("cookie-remover"); -+ let re = toRegExp(cookie); -+ -+ if (!$(/^http|^about/).test(location.protocol)) { -+ debugLog("Snippet only works for http or https and about."); -+ return; -+ } -+ -+ debugLog("Parsing cookies for matches"); -+ -+ for (const pair of $(getCookieMatches())) { -+ let $hostname = $(location.hostname); -+ let name = $(pair).split("=")[0]; -+ let expires = "expires=Thu, 01 Jan 1970 00:00:00 GMT"; -+ let path = "path=/"; -+ let domain = "domain=" + $hostname.slice($hostname.indexOf(".") + 1); -+ -+ documentCookies(`${$(name).trim()}=;${expires};${path};${domain}`); -+ -+ debugLog(`Set expiration date on ${name}`); -+ } -+ -+ function getCookieMatches() { -+ const arr = $(documentCookies()).split(";"); -+ return arr.filter(str => re.test($(str).split("=")[0])); -+ } -+ } -+ -+ let { -+ document: document$1, -+ getComputedStyle, -+ isExtensionContext, -+ variables: variables$1, -+ Array, -+ MutationObserver: MutationObserver$2, -+ Object: Object$6, -+ XPathEvaluator, -+ XPathExpression, -+ XPathResult -+ } = $(window); -+ -+ let {querySelectorAll} = document$1; -+ let $$ = querySelectorAll && bind(querySelectorAll, document$1); -+ -+ const {assign, setPrototypeOf} = Object$6; -+ -+ class $XPathExpression extends XPathExpression { -+ evaluate(...args) { -+ return setPrototypeOf( -+ apply$2(super.evaluate, this, args), -+ XPathResult.prototype -+ ); -+ } -+ } -+ -+ class $XPathEvaluator extends XPathEvaluator { -+ createExpression(...args) { -+ return setPrototypeOf( -+ apply$2(super.createExpression, this, args), -+ $XPathExpression.prototype -+ ); -+ } -+ } -+ -+ function hideElement(element) { -+ if (variables$1.hidden.has(element)) -+ return; -+ -+ notifyElementHidden(element); -+ -+ variables$1.hidden.add(element); -+ -+ let {style} = $(element); -+ let $style = $(style, "CSSStyleDeclaration"); -+ let properties = $([]); -+ let {debugCSSProperties} = libEnvironment; -+ -+ for (let [key, value] of (debugCSSProperties || [["display", "none"]])) { -+ $style.setProperty(key, value, "important"); -+ properties.push([key, $style.getPropertyValue(key)]); -+ } -+ -+ new MutationObserver$2(() => { -+ for (let [key, value] of properties) { -+ let propertyValue = $style.getPropertyValue(key); -+ let propertyPriority = $style.getPropertyPriority(key); -+ if (propertyValue != value || propertyPriority != "important") -+ $style.setProperty(key, value, "important"); -+ } -+ }).observe(element, {attributes: true, -+ attributeFilter: ["style"]}); -+ } -+ -+ function notifyElementHidden(element) { -+ if (isExtensionContext && typeof checkElement === "function") -+ checkElement(element); -+ } -+ -+ function initQueryAndApply(selector) { -+ let $selector = selector; -+ if ($selector.startsWith("xpath(") && -+ $selector.endsWith(")")) { -+ let xpathQuery = $selector.slice(6, -1); -+ let evaluator = new $XPathEvaluator(); -+ let expression = evaluator.createExpression(xpathQuery, null); -+ -+ let flag = XPathResult.ORDERED_NODE_SNAPSHOT_TYPE; -+ -+ return cb => { -+ if (!cb) -+ return; -+ let result = expression.evaluate(document$1, flag, null); -+ let {snapshotLength} = result; -+ for (let i = 0; i < snapshotLength; i++) -+ cb(result.snapshotItem(i)); -+ }; -+ } -+ return cb => $$(selector).forEach(cb); -+ } -+ -+ function initQueryAll(selector) { -+ let $selector = selector; -+ if ($selector.startsWith("xpath(") && -+ $selector.endsWith(")")) { -+ let queryAndApply = initQueryAndApply(selector); -+ return () => { -+ let elements = $([]); -+ queryAndApply(e => elements.push(e)); -+ return elements; -+ }; -+ } -+ return () => Array.from($$(selector)); -+ } -+ -+ let {ELEMENT_NODE, TEXT_NODE, prototype: NodeProto} = Node; -+ let {prototype: ElementProto$1} = Element; -+ let {prototype: HTMLElementProto} = HTMLElement; -+ -+ let { -+ console: console$2, -+ variables, -+ DOMParser, -+ Error: Error$5, -+ MutationObserver: MutationObserver$1, -+ Object: Object$5, -+ ReferenceError -+ } = $(window); -+ -+ let {getOwnPropertyDescriptor} = Object$5; -+ -+ function freezeElement(selector, options = "", ...exceptions) { -+ let observer; -+ let subtree = false; -+ let shouldAbort = false; -+ let exceptionSelectors = $(exceptions).filter(e => !isRegex(e)); -+ let regexExceptions = $(exceptions).filter(e => isRegex(e)).map(toRegExp); -+ let rid = randomId(); -+ let targetNodes; -+ let queryAll = initQueryAll(selector); -+ -+ checkOptions(); -+ let data = { -+ selector, -+ shouldAbort, -+ rid, -+ exceptionSelectors, -+ regexExceptions, -+ changeId: 0 -+ }; -+ if (!variables.frozen.has(document)) { -+ variables.frozen.set(document, true); -+ proxyNativeProperties(); -+ } -+ observer = new MutationObserver$1(searchAndAttach); -+ observer.observe(document, {childList: true, subtree: true}); -+ searchAndAttach(); -+ -+ function isRegex(s) { -+ return s.length >= 2 && s[0] == "/" && s[s.length - 1] == "/"; -+ } -+ -+ function checkOptions() { -+ let optionsChunks = $(options).split("+"); -+ if (optionsChunks.length === 1 && optionsChunks[0] === "") -+ optionsChunks = []; -+ for (let chunk of optionsChunks) { -+ switch (chunk) { -+ case "subtree": -+ subtree = true; -+ break; -+ case "abort": -+ shouldAbort = true; -+ break; -+ default: -+ throw new Error$5("[freeze] Unknown option passed to the snippet." + -+ " [selector]: " + selector + -+ " [option]: " + chunk); -+ } -+ } -+ } -+ -+ function proxyNativeProperties() { -+ let descriptor; -+ -+ descriptor = getAppendChildDescriptor( -+ NodeProto, "appendChild", isFrozen, getSnippetData -+ ); -+ wrapPropertyAccess(NodeProto, "appendChild", descriptor); -+ -+ descriptor = getAppendChildDescriptor( -+ NodeProto, "insertBefore", isFrozen, getSnippetData -+ ); -+ wrapPropertyAccess(NodeProto, "insertBefore", descriptor); -+ -+ descriptor = getAppendChildDescriptor( -+ NodeProto, "replaceChild", isFrozen, getSnippetData -+ ); -+ wrapPropertyAccess(NodeProto, "replaceChild", descriptor); -+ -+ descriptor = getAppendDescriptor( -+ ElementProto$1, "append", isFrozen, getSnippetData -+ ); -+ wrapPropertyAccess(ElementProto$1, "append", descriptor); -+ -+ descriptor = getAppendDescriptor( -+ ElementProto$1, "prepend", isFrozen, getSnippetData -+ ); -+ wrapPropertyAccess(ElementProto$1, "prepend", descriptor); -+ -+ descriptor = getAppendDescriptor( -+ ElementProto$1, -+ "replaceWith", -+ isFrozenOrHasFrozenParent, -+ getSnippetDataFromNodeOrParent -+ ); -+ wrapPropertyAccess(ElementProto$1, "replaceWith", descriptor); -+ -+ descriptor = getAppendDescriptor( -+ ElementProto$1, -+ "after", -+ isFrozenOrHasFrozenParent, -+ getSnippetDataFromNodeOrParent -+ ); -+ wrapPropertyAccess(ElementProto$1, "after", descriptor); -+ -+ descriptor = getAppendDescriptor( -+ ElementProto$1, -+ "before", -+ isFrozenOrHasFrozenParent, -+ getSnippetDataFromNodeOrParent -+ ); -+ wrapPropertyAccess(ElementProto$1, "before", descriptor); -+ -+ descriptor = getInsertAdjacentDescriptor( -+ ElementProto$1, -+ "insertAdjacentElement", -+ isFrozenAndInsideTarget, -+ getSnippetDataBasedOnTarget -+ ); -+ wrapPropertyAccess(ElementProto$1, "insertAdjacentElement", descriptor); -+ -+ descriptor = getInsertAdjacentDescriptor( -+ ElementProto$1, -+ "insertAdjacentHTML", -+ isFrozenAndInsideTarget, -+ getSnippetDataBasedOnTarget -+ ); -+ wrapPropertyAccess(ElementProto$1, "insertAdjacentHTML", descriptor); -+ -+ descriptor = getInsertAdjacentDescriptor( -+ ElementProto$1, -+ "insertAdjacentText", -+ isFrozenAndInsideTarget, -+ getSnippetDataBasedOnTarget -+ ); -+ wrapPropertyAccess(ElementProto$1, "insertAdjacentText", descriptor); -+ -+ descriptor = getInnerHTMLDescriptor( -+ ElementProto$1, "innerHTML", isFrozen, getSnippetData -+ ); -+ wrapPropertyAccess(ElementProto$1, "innerHTML", descriptor); -+ -+ descriptor = getInnerHTMLDescriptor( -+ ElementProto$1, -+ "outerHTML", -+ isFrozenOrHasFrozenParent, -+ getSnippetDataFromNodeOrParent -+ ); -+ wrapPropertyAccess(ElementProto$1, "outerHTML", descriptor); -+ -+ descriptor = getTextContentDescriptor( -+ NodeProto, "textContent", isFrozen, getSnippetData -+ ); -+ wrapPropertyAccess(NodeProto, "textContent", descriptor); -+ -+ descriptor = getTextContentDescriptor( -+ HTMLElementProto, "innerText", isFrozen, getSnippetData -+ ); -+ wrapPropertyAccess(HTMLElementProto, "innerText", descriptor); -+ -+ descriptor = getTextContentDescriptor( -+ NodeProto, "nodeValue", isFrozen, getSnippetData -+ ); -+ wrapPropertyAccess(NodeProto, "nodeValue", descriptor); -+ -+ function isFrozen(node) { -+ return node && variables.frozen.has(node); -+ } -+ -+ function isFrozenOrHasFrozenParent(node) { -+ try { -+ return node && -+ (variables.frozen.has(node) || -+ variables.frozen.has($(node).parentNode)); -+ } -+ catch (error) { -+ return false; -+ } -+ } -+ -+ function isFrozenAndInsideTarget(node, isInsideTarget) { -+ try { -+ return node && -+ (variables.frozen.has(node) && isInsideTarget || -+ variables.frozen.has($(node).parentNode) && -+ !isInsideTarget); -+ } -+ catch (error) { -+ return false; -+ } -+ } -+ -+ function getSnippetData(node) { -+ return variables.frozen.get(node); -+ } -+ -+ function getSnippetDataFromNodeOrParent(node) { -+ try { -+ if (variables.frozen.has(node)) -+ return variables.frozen.get(node); -+ let parent = $(node).parentNode; -+ return variables.frozen.get(parent); -+ } -+ catch (error) {} -+ } -+ -+ function getSnippetDataBasedOnTarget(node, isInsideTarget) { -+ try { -+ if (variables.frozen.has(node) && isInsideTarget) -+ return variables.frozen.get(node); -+ let parent = $(node).parentNode; -+ return variables.frozen.get(parent); -+ } -+ catch (error) {} -+ } -+ } -+ -+ function searchAndAttach() { -+ targetNodes = queryAll(); -+ markNodes(targetNodes, false); -+ } -+ -+ function markNodes(nodes, isChild = true) { -+ for (let node of nodes) { -+ if (!variables.frozen.has(node)) { -+ variables.frozen.set(node, data); -+ if (!isChild && subtree) { -+ new MutationObserver$1(mutationsList => { -+ for (let mutation of $(mutationsList)) -+ markNodes($(mutation, "MutationRecord").addedNodes); -+ }).observe(node, {childList: true, subtree: true}); -+ } -+ if (subtree && $(node).nodeType === ELEMENT_NODE) -+ markNodes($(node).childNodes); -+ } -+ } -+ } -+ -+ function logPrefixed(id, ...args) { -+ log(`[freeze][${id}] `, ...args); -+ } -+ -+ function logChange(nodeOrDOMString, target, property, snippetData) { -+ let targetSelector = snippetData.selector; -+ let chgId = snippetData.changeId; -+ let isDOMString = typeof nodeOrDOMString == "string"; -+ let action = snippetData.shouldAbort ? "aborting" : "watching"; -+ console$2.groupCollapsed(`[freeze][${chgId}] ${action}: ${targetSelector}`); -+ switch (property) { -+ case "appendChild": -+ case "append": -+ case "prepend": -+ case "insertBefore": -+ case "replaceChild": -+ case "insertAdjacentElement": -+ case "insertAdjacentHTML": -+ case "insertAdjacentText": -+ case "innerHTML": -+ case "outerHTML": -+ logPrefixed(chgId, -+ isDOMString ? "text: " : "node: ", -+ nodeOrDOMString); -+ logPrefixed(chgId, "added to node: ", target); -+ break; -+ case "replaceWith": -+ case "after": -+ case "before": -+ logPrefixed(chgId, -+ isDOMString ? "text: " : "node: ", -+ nodeOrDOMString); -+ logPrefixed(chgId, "added to node: ", $(target).parentNode); -+ break; -+ case "textContent": -+ case "innerText": -+ case "nodeValue": -+ logPrefixed(chgId, "content of node: ", target); -+ logPrefixed(chgId, "changed to: ", nodeOrDOMString); -+ break; -+ } -+ logPrefixed(chgId, `using the function "${property}"`); -+ console$2.groupEnd(); -+ snippetData.changeId++; -+ } -+ -+ function isExceptionNode(element, expSelectors) { -+ if (expSelectors) { -+ let $element = $(element); -+ for (let exception of expSelectors) { -+ if ($element.matches(exception)) -+ return true; -+ } -+ } -+ return false; -+ } -+ -+ function isExceptionText(string, regExceptions) { -+ if (regExceptions) { -+ for (let exception of regExceptions) { -+ if (exception.test(string)) -+ return true; -+ } -+ } -+ return false; -+ } -+ -+ function abort(id) { -+ throw new ReferenceError(id); -+ } -+ -+ function checkHTML(htmlText, parent, property, snippetData) { -+ let domparser = new DOMParser(); -+ let {body} = $(domparser.parseFromString(htmlText, "text/html")); -+ let nodes = $(body).childNodes; -+ let accepted = checkMultiple(nodes, parent, property, snippetData); -+ let content = $(accepted).map(node => { -+ switch ($(node).nodeType) { -+ case ELEMENT_NODE: -+ return $(node).outerHTML; -+ case TEXT_NODE: -+ return $(node).textContent; -+ default: -+ return ""; -+ } -+ }); -+ return content.join(""); -+ } -+ -+ function checkMultiple(nodesOrDOMStrings, parent, property, snippetData) { -+ let accepted = $([]); -+ for (let nodeOrDOMString of nodesOrDOMStrings) { -+ if (checkShouldInsert(nodeOrDOMString, parent, property, snippetData)) -+ accepted.push(nodeOrDOMString); -+ } -+ return accepted; -+ } -+ -+ function checkShouldInsert(nodeOrDOMString, parent, property, snippetData) { -+ let aborting = snippetData.shouldAbort; -+ let regExceptions = snippetData.regexExceptions; -+ let expSelectors = snippetData.exceptionSelectors; -+ let id = snippetData.rid; -+ if (typeof nodeOrDOMString == "string") { -+ let domString = nodeOrDOMString; -+ if (isExceptionText(domString, regExceptions)) -+ return true; -+ if (debug()) -+ logChange(domString, parent, property, snippetData); -+ if (aborting) -+ abort(id); -+ return debug(); -+ } -+ -+ let node = nodeOrDOMString; -+ switch ($(node).nodeType) { -+ case ELEMENT_NODE: -+ if (isExceptionNode(node, expSelectors)) -+ return true; -+ if (aborting) { -+ if (debug()) -+ logChange(node, parent, property, snippetData); -+ abort(id); -+ } -+ if (debug()) { -+ hideElement(node); -+ logChange(node, parent, property, snippetData); -+ return true; -+ } -+ return false; -+ case TEXT_NODE: -+ if (isExceptionText($(node).textContent, regExceptions)) -+ return true; -+ if (debug()) -+ logChange(node, parent, property, snippetData); -+ if (aborting) -+ abort(id); -+ return false; -+ default: -+ return true; -+ } -+ } -+ -+ function getAppendChildDescriptor(target, property, shouldValidate, -+ getSnippetData) { -+ let desc = getOwnPropertyDescriptor(target, property) || {}; -+ let origin = desc.get && call(desc.get, target) || desc.value; -+ if (!origin) -+ return; -+ -+ return { -+ get() { -+ return function(...args) { -+ if (shouldValidate(this)) { -+ let snippetData = getSnippetData(this); -+ if (snippetData) { -+ let incomingNode = args[0]; -+ if (!checkShouldInsert(incomingNode, this, property, snippetData)) -+ return incomingNode; -+ } -+ } -+ return apply$2(origin, this, args); -+ }; -+ } -+ }; -+ } -+ -+ function getAppendDescriptor( -+ target, property, shouldValidate, getSnippetData -+ ) { -+ let desc = getOwnPropertyDescriptor(target, property) || {}; -+ let origin = desc.get && call(desc.get, target) || desc.value; -+ if (!origin) -+ return; -+ return { -+ get() { -+ return function(...nodesOrDOMStrings) { -+ if (!shouldValidate(this)) -+ return apply$2(origin, this, nodesOrDOMStrings); -+ -+ let snippetData = getSnippetData(this); -+ if (!snippetData) -+ return apply$2(origin, this, nodesOrDOMStrings); -+ -+ let accepted = checkMultiple( -+ nodesOrDOMStrings, this, property, snippetData -+ ); -+ if (accepted.length > 0) -+ return apply$2(origin, this, accepted); -+ }; -+ } -+ }; -+ } -+ -+ function getInsertAdjacentDescriptor( -+ target, property, shouldValidate, getSnippetData -+ ) { -+ let desc = getOwnPropertyDescriptor(target, property) || {}; -+ let origin = desc.get && call(desc.get, target) || desc.value; -+ if (!origin) -+ return; -+ -+ return { -+ get() { -+ return function(...args) { -+ let [position, value] = args; -+ let isInsideTarget = -+ position === "afterbegin" || position === "beforeend"; -+ if (shouldValidate(this, isInsideTarget)) { -+ let snippetData = getSnippetData(this, isInsideTarget); -+ if (snippetData) { -+ let parent = isInsideTarget ? -+ this : -+ $(this).parentNode; -+ let finalValue; -+ switch (property) { -+ case "insertAdjacentElement": -+ if (!checkShouldInsert(value, parent, property, snippetData)) -+ return value; -+ break; -+ -+ case "insertAdjacentHTML": -+ finalValue = checkHTML(value, parent, property, snippetData); -+ if (finalValue) -+ return call(origin, this, position, finalValue); -+ -+ return; -+ -+ case "insertAdjacentText": -+ if (!checkShouldInsert(value, parent, property, snippetData)) -+ return; -+ break; -+ } -+ } -+ } -+ return apply$2(origin, this, args); -+ }; -+ } -+ }; -+ } -+ -+ function getInnerHTMLDescriptor( -+ target, property, shouldValidate, getSnippetData -+ ) { -+ let desc = getOwnPropertyDescriptor(target, property) || {}; -+ let {set: prevSetter} = desc; -+ if (!prevSetter) -+ return; -+ -+ return { -+ set(htmlText) { -+ if (!shouldValidate(this)) -+ return call(prevSetter, this, htmlText); -+ -+ let snippetData = getSnippetData(this); -+ if (!snippetData) -+ return call(prevSetter, this, htmlText); -+ let finalValue = checkHTML(htmlText, this, property, snippetData); -+ if (finalValue) -+ return call(prevSetter, this, finalValue); -+ } -+ }; -+ } -+ -+ function getTextContentDescriptor( -+ target, property, shouldValidate, getSnippetData -+ ) { -+ let desc = getOwnPropertyDescriptor(target, property) || {}; -+ let {set: prevSetter} = desc; -+ if (!prevSetter) -+ return; -+ -+ return { -+ set(domString) { -+ if (!shouldValidate(this)) -+ return call(prevSetter, this, domString); -+ -+ let snippetData = getSnippetData(this); -+ if (!snippetData) -+ return call(prevSetter, this, domString); -+ if (checkShouldInsert(domString, this, property, snippetData)) -+ return call(prevSetter, this, domString); -+ } -+ }; -+ } -+ } -+ -+ $(window); -+ -+ function raceWinner(name, lose) { -+ -+ return noop; -+ } -+ -+ const {Map: Map$4, MutationObserver, Object: Object$4, Set, WeakSet: WeakSet$1} = $(window); -+ -+ let ElementProto = Element.prototype; -+ let {attachShadow} = ElementProto; -+ -+ let hiddenShadowRoots = new WeakSet$1(); -+ let searches = new Map$4(); -+ let observer = null; -+ -+ function hideIfShadowContains(search, selector = "*") { -+ -+ let key = `${search}\\${selector}`; -+ if (!searches.has(key)) { -+ searches.set(key, [toRegExp(search), selector, raceWinner() -+ ]); -+ } -+ -+ const debugLog = getDebugger("hide-if-shadow-contain"); -+ -+ if (!observer) { -+ observer = new MutationObserver(records => { -+ let visited = new Set(); -+ for (let {target} of $(records)) { -+ -+ let parent = $(target).parentNode; -+ while (parent) -+ [target, parent] = [parent, $(target).parentNode]; -+ -+ if (hiddenShadowRoots.has(target)) -+ continue; -+ -+ if (visited.has(target)) -+ continue; -+ -+ visited.add(target); -+ for (let [re, selfOrParent, win] of searches.values()) { -+ if (re.test($(target).textContent)) { -+ let closest = $(target.host).closest(selfOrParent); -+ if (closest) { -+ win(); -+ -+ $(target).appendChild( -+ document.createElement("style") -+ ).textContent = ":host {display: none !important}"; -+ -+ hideElement(closest); -+ -+ hiddenShadowRoots.add(target); -+ debugLog("Hiding: ", closest, " for params: ", ...arguments); -+ } -+ } -+ } -+ } -+ }); -+ -+ Object$4.defineProperty(ElementProto, "attachShadow", { -+ -+ value: proxy(attachShadow, function() { -+ -+ let root = apply$2(attachShadow, this, arguments); -+ debugLog("attachShadow is called for: ", root); -+ -+ observer.observe(root, { -+ childList: true, -+ characterData: true, -+ subtree: true -+ }); -+ -+ return root; -+ }) -+ }); -+ } -+ } -+ -+ const {Error: Error$4, JSON: JSON$2, Map: Map$3, Object: Object$3} = $(window); -+ -+ let paths$1 = null; -+ -+ function jsonOverride(rawOverridePaths, value, -+ rawNeedlePaths = "", filter = "") { -+ if (!rawOverridePaths) -+ throw new Error$4("[json-override snippet]: Missing paths to override."); -+ -+ if (typeof value == "undefined") -+ throw new Error$4("[json-override snippet]: No value to override with."); -+ -+ if (!paths$1) { -+ let debugLog = getDebugger("json-override"); -+ -+ let {parse} = JSON$2; -+ paths$1 = new Map$3(); -+ -+ Object$3.defineProperty(window.JSON, "parse", { -+ value: proxy(parse, function(str) { -+ let result = apply$2(parse, this, arguments); -+ -+ for (let {prune, needle, filter: flt, value: val} of paths$1.values()) { -+ if (flt && !flt.test(str)) -+ continue; -+ -+ if ($(needle).some(path => !findOwner(result, path))) -+ return result; -+ -+ for (let path of prune) { -+ let details = findOwner(result, path); -+ if (typeof details != "undefined") { -+ debugLog(`Found ${path} replaced it with ${val}`); -+ details[0][details[1]] = overrideValue(val); -+ } -+ } -+ } -+ -+ return result; -+ }) -+ }); -+ debugLog("Wrapped JSON.parse for override"); -+ } -+ -+ paths$1.set(rawOverridePaths, { -+ prune: $(rawOverridePaths).split(/ +/), -+ needle: rawNeedlePaths.length ? $(rawNeedlePaths).split(/ +/) : [], -+ filter: filter ? toRegExp(filter) : null, -+ value -+ }); -+ } -+ -+ let {Error: Error$3, JSON: JSON$1, Map: Map$2, Object: Object$2} = $(window); -+ -+ let paths = null; -+ -+ function jsonPrune(rawPrunePaths, rawNeedlePaths = "") { -+ if (!rawPrunePaths) -+ throw new Error$3("Missing paths to prune"); -+ -+ if (!paths) { -+ let debugLog = getDebugger("json-prune"); -+ -+ let {parse} = JSON$1; -+ paths = new Map$2(); -+ -+ Object$2.defineProperty(window.JSON, "parse", { -+ value: proxy(parse, function() { -+ let result = apply$2(parse, this, arguments); -+ -+ for (let {prune, needle} of paths.values()) { -+ if ($(needle).some(path => !findOwner(result, path))) -+ return result; -+ -+ for (let path of prune) { -+ let details = findOwner(result, path); -+ if (typeof details != "undefined") { -+ debugLog(`Found ${path} and deleted`); -+ delete details[0][details[1]]; -+ } -+ } -+ } -+ -+ return result; -+ }) -+ }); -+ debugLog("Wrapped JSON.parse for prune"); -+ } -+ -+ paths.set(rawPrunePaths, { -+ prune: $(rawPrunePaths).split(/ +/), -+ needle: rawNeedlePaths.length ? $(rawNeedlePaths).split(/ +/) : [] -+ }); -+ } -+ -+ let {Error: Error$2} = $(window); -+ -+ function overridePropertyRead(property, value) { -+ if (!property) { -+ throw new Error$2("[override-property-read snippet]: " + -+ "No property to override."); -+ } -+ if (typeof value === "undefined") { -+ throw new Error$2("[override-property-read snippet]: " + -+ "No value to override with."); -+ } -+ -+ let debugLog = getDebugger("override-property-read"); -+ -+ let cValue = overrideValue(value); -+ -+ let newGetter = () => { -+ debugLog(`${property} override done.`); -+ return cValue; -+ }; -+ -+ debugLog(`Overriding ${property}.`); -+ -+ wrapPropertyAccess(window, property, {get: newGetter, set() {}}); -+ } -+ -+ let {Error: Error$1, Map: Map$1, Object: Object$1, console: console$1} = $(window); -+ -+ let {toString} = Function.prototype; -+ let EventTargetProto = EventTarget.prototype; -+ let {addEventListener} = EventTargetProto; -+ -+ let events = null; -+ -+ function preventListener(event, eventHandler, selector) { -+ if (!event) -+ throw new Error$1("[prevent-listener snippet]: No event type."); -+ -+ if (!events) { -+ events = new Map$1(); -+ -+ let debugLog = getDebugger("[prevent]"); -+ -+ Object$1.defineProperty(EventTargetProto, "addEventListener", { -+ value: proxy(addEventListener, function(type, listener) { -+ for (let {evt, handlers, selectors} of events.values()) { -+ -+ if (!evt.test(type)) -+ continue; -+ -+ let isElement = this instanceof Element; -+ -+ for (let i = 0; i < handlers.length; i++) { -+ let handler = handlers[i]; -+ let sel = selectors[i]; -+ -+ let handlerMatch = () => handler.test( -+ call( -+ toString, -+ typeof listener === "function" ? -+ listener : listener.handleEvent -+ ) -+ ); -+ -+ if ( -+ (handler && !handlerMatch()) || -+ (sel && !(isElement && $(this).matches(sel))) -+ ) -+ continue; -+ -+ if (debug()) { -+ console$1.groupCollapsed("DEBUG [prevent] was successful"); -+ debugLog(`type: ${type} matching ${evt}`); -+ debugLog("handler:", listener); -+ if (handler) -+ debugLog(`matching ${handler}`); -+ if (sel) -+ debugLog("on element: ", this, ` matching ${sel}`); -+ debugLog("was prevented from being added"); -+ console$1.groupEnd(); -+ } -+ return; -+ } -+ } -+ return apply$2(addEventListener, this, arguments); -+ }) -+ }); -+ -+ debugLog("Wrapped addEventListener"); -+ } -+ -+ if (!events.has(event)) -+ events.set(event, {evt: toRegExp(event), handlers: [], selectors: []}); -+ -+ let {handlers, selectors} = events.get(event); -+ -+ handlers.push(eventHandler ? toRegExp(eventHandler) : null); -+ selectors.push(selector); -+ } -+ -+ let {URL, fetch} = $(window); -+ -+ let {delete: deleteParam, has: hasParam} = caller(URLSearchParams.prototype); -+ -+ let parameters; -+ -+ function stripFetchQueryParameter(name, urlPattern = null) { -+ const debugLog = getDebugger("strip-fetch-query-parameter"); -+ -+ if (!parameters) { -+ parameters = new Map(); -+ window.fetch = proxy(fetch, (...args) => { -+ let [source] = args; -+ if (typeof source === "string") { -+ let url = new URL(source); -+ for (let [key, reg] of parameters) { -+ if (!reg || reg.test(source)) { -+ if (hasParam(url.searchParams, key)) { -+ debugLog(`${key} has been stripped from url ${source}`); -+ deleteParam(url.searchParams, key); -+ args[0] = url.href; -+ } -+ } -+ } -+ } -+ return apply$2(fetch, self, args); -+ }); -+ } -+ parameters.set(name, urlPattern && toRegExp(urlPattern)); -+ } -+ -+ function trace(...args) { -+ -+ apply$2(log, null, args); -+ } -+ -+ const snippets = { -+ "abort-current-inline-script": abortCurrentInlineScript, -+ "abort-on-iframe-property-read": abortOnIframePropertyRead, -+ "abort-on-iframe-property-write": abortOnIframePropertyWrite, -+ "abort-on-property-read": abortOnPropertyRead, -+ "abort-on-property-write": abortOnPropertyWrite, -+ "cookie-remover": cookieRemover, -+ "debug": setDebug, -+ "freeze-element": freezeElement, -+ "hide-if-shadow-contains": hideIfShadowContains, -+ "json-override": jsonOverride, -+ "json-prune": jsonPrune, -+ "override-property-read": overridePropertyRead, -+ "prevent-listener": preventListener, -+ "strip-fetch-query-parameter": stripFetchQueryParameter, -+ "trace": trace -+ }; -+ let context; -+ for (const [name, ...args] of filters) { -+ if (snippets.hasOwnProperty(name)) { -+ try { context = snippets[name].apply(context, args); } -+ catch (error) { console.error(error); } -+ } -+ } -+ context = void 0; -+}; -+const graph = new Map([["abort-current-inline-script",null],["abort-on-iframe-property-read",null],["abort-on-iframe-property-write",null],["abort-on-property-read",null],["abort-on-property-write",null],["cookie-remover",null],["debug",null],["freeze-element",null],["hide-if-shadow-contains",null],["json-override",null],["json-prune",null],["override-property-read",null],["prevent-listener",null],["strip-fetch-query-parameter",null],["trace",null]]); -+callback.get = snippet => graph.get(snippet); -+callback.has = snippet => graph.has(snippet); -+ -+ if (t.every(([name]) => !callback.has(name))) return; -+ const append = () => { -+ URL.revokeObjectURL( -+ Object.assign( -+ document.documentElement.appendChild(document.createElement("script")), -+ {async: false, src: URL.createObjectURL(new Blob([ -+ "(" + callback + ")(..." + JSON.stringify([e, ...t]) + ")" -+ ]))} -+ ).src -+ ); -+ }; -+ try { append(); } -+ catch (_) { -+ document.addEventListener("readystatechange", append, {once:true}); -+ } -+} diff --git a/components/resources/adblocking/snippets/dist/isolated-first.jst b/components/resources/adblocking/snippets/dist/isolated-first.jst -new file mode 100755 +new file mode 100644 --- /dev/null +++ b/components/resources/adblocking/snippets/dist/isolated-first.jst -@@ -0,0 +1,65 @@ +@@ -0,0 +1,66 @@ +(e, ...t) => { +/*! -+ * snippets v0.7.0 -+ * https://gitlab.com/eyeo/snippets/-/blob/d7c80795567d9f9c44a6ebaa789baceab85f31f9/dist/isolated-first.jst ++ * snippets v1.4.0 ++ * https://gitlab.com/eyeo/anti-cv/snippets/-/blob/23006aca188eff00b56e3bd9e12591aae7adedf2/dist/isolated-first.jst + * ++ + * This file is part of eyeo's Anti-Circumvention Snippets module (@eyeo/snippets), + * Copyright (C) 2006-present eyeo GmbH + * @@ -9356,8 +5608,8 @@ new file mode 100755 + * along with @eyeo/snippets. If not, see . + */ + ((environment, ...filters) => { -+const e=Proxy,{apply:t,bind:n,call:o}=Function,r=o.bind(t),i=o.bind(n),s=o.bind(o),a={get:(e,t)=>i(o,e[t])},c=t=>new e(t,a),l={get:(e,t)=>i(e[t],e)},u=t=>new e(t,l),{assign:d,defineProperties:h,freeze:f,getOwnPropertyDescriptor:p,getOwnPropertyDescriptors:w,getPrototypeOf:g}=u(Object),{hasOwnProperty:m}=c({}),{species:b}=Symbol,y={get(e,t){const n=e[t];class o extends n{}const r=w(n.prototype);delete r.constructor,f(h(o.prototype,r));const i=w(n);return delete i.length,delete i.prototype,i[b]={value:o},f(h(o,i))}},v=t=>new e(t,y),S="undefined"!=typeof environment?environment:{};"undefined"==typeof globalThis&&(window.globalThis=window);const{apply:k,ownKeys:E}=u(Reflect),M="world"in S,x=M&&"ISOLATED"===S.world,C=M&&"MAIN"===S.world,T="object"==typeof chrome&&!!chrome.runtime,W="object"==typeof browser&&!!browser.runtime,O=!C&&(x||T||W),P=e=>O?e:L(e,R(e)),{create:L,defineProperties:D,defineProperty:N,freeze:I,getOwnPropertyDescriptor:A,getOwnPropertyDescriptors:R}=u(Object),V=u(globalThis),$=O?globalThis:v(globalThis),{Map:H,RegExp:j,Set:_,WeakMap:F,WeakSet:q}=$,B=(e,t,n=null)=>{const o=E(t);for(const r of E(e)){if(o.includes(r))continue;const i=A(e,r);if(n&&"value"in i){const{value:e}=i;"function"==typeof e&&(i.value=n(e))}N(t,r,i)}},z=e=>{const t=$[e];class n extends t{}const{toString:o,valueOf:r}=t.prototype;D(n.prototype,{toString:{value:o},valueOf:{value:r}});const i=e.toLowerCase(),s=e=>function(){const t=k(e,this,arguments);return typeof t===i?new n(t):t};return B(t,n,s),B(t.prototype,n.prototype,s),n},X=I({frozen:new F,hidden:new q,iframePropertiesToAbort:{read:new _,write:new _},abortedIframes:new F}),J=new j("^[A-Z]");var U=new Proxy(new H([["chrome",O&&(T&&chrome||W&&browser)||void 0],["isExtensionContext",O],["variables",X],["console",P(console)],["document",globalThis.document],["performance",P(performance)],["JSON",P(JSON)],["Map",H],["Math",P(Math)],["Number",O?Number:z("Number")],["RegExp",j],["Set",_],["String",O?String:z("String")],["WeakMap",F],["WeakSet",q],["MouseEvent",MouseEvent]]),{get(e,t){if(e.has(t))return e.get(t);let n=globalThis[t];return"function"==typeof n&&(n=(J.test(t)?$:V)[t]),e.set(t,n),n},has:(e,t)=>e.has(t)});const G={WeakSet:WeakSet,WeakMap:WeakMap,WeakValue:class{has(){return!1}set(){}}},{apply:K}=Reflect;const{Map:Q,WeakMap:Y,WeakSet:Z,setTimeout:ee}=U;let te=!0,ne=e=>{e.clear(),te=!te};var oe=function(e){const{WeakSet:t,WeakMap:n,WeakValue:o}=this||G,r=new t,i=new n,s=new o;return function(t){if(r.has(t))return t;if(i.has(t))return i.get(t);if(s.has(t))return s.get(t);const n=K(e,this,arguments);return r.add(n),n!==t&&("object"==typeof t&&t?i:s).set(t,n),n}}.bind({WeakMap:Y,WeakSet:Z,WeakValue:class extends Q{set(e,t){return te&&(te=!te,ee(ne,0,this)),super.set(e,t)}}});const{concat:re,includes:ie,join:se,reduce:ae,unshift:ce}=c([]),le=v(globalThis),{Map:ue,WeakMap:de}=le,he=new ue,fe=t=>{const n=(e=>{const t=[];let n=e;for(;n;){if(he.has(n))ce(t,he.get(n));else{const e=w(n);he.set(n,e),ce(t,e)}n=g(n)}return ce(t,{}),r(d,null,t)})("function"==typeof t?t.prototype:t),o={get(e,t){if(t in n){const{value:o,get:r}=n[t];if(r)return s(r,e);if("function"==typeof o)return i(o,e)}return e[t]},set(e,t,o){if(t in n){const{set:r}=n[t];if(r)return s(r,e,o),!0}return e[t]=o,!0}};return t=>new e(t,o)},{isExtensionContext:pe,Array:we,Number:ge,String:me,Object:be}=U,{isArray:ye}=we,{getOwnPropertyDescriptor:ve,setPrototypeOf:Se}=be,{toString:ke}=be.prototype,{slice:Ee}=me.prototype,{get:Me}=ve(Node.prototype,"nodeType"),xe=pe?{}:{Attr:fe(Attr),CanvasRenderingContext2D:fe(CanvasRenderingContext2D),CSSStyleDeclaration:fe(CSSStyleDeclaration),Document:fe(Document),Element:fe(Element),HTMLCanvasElement:fe(HTMLCanvasElement),HTMLElement:fe(HTMLElement),HTMLImageElement:fe(HTMLImageElement),HTMLScriptElement:fe(HTMLScriptElement),MutationRecord:fe(MutationRecord),Node:fe(Node),ShadowRoot:fe(ShadowRoot),get CSS2Properties(){return xe.CSSStyleDeclaration}},Ce=(e,t)=>{if("Element"!==t&&t in xe)return xe[t](e);if(ye(e))return Se(e,we.prototype);const n=(e=>s(Ee,s(ke,e),8,-1))(e);if(n in xe)return xe[n](e);if(n in U)return Se(e,U[n].prototype);if("nodeType"in e)switch(s(Me,e)){case 1:if(!(t in xe))throw new Error("unknown hint "+t);return xe[t](e);case 2:return xe.Attr(e);case 3:return xe.Node(e);case 9:return xe.Document(e)}throw new Error("unknown brand "+n)};var Te=pe?e=>e===window||e===globalThis?U:e:oe(((e,t="Element")=>{if(e===window||e===globalThis)return U;switch(typeof e){case"object":return e&&Ce(e,t);case"string":return new me(e);case"number":return new ge(e);default:throw new Error("unsupported value")}}));let{document:We,getComputedStyle:Oe,isExtensionContext:Pe,variables:Le,Array:De,MutationObserver:Ne,Object:Ie,XPathEvaluator:Ae,XPathExpression:Re,XPathResult:Ve}=Te(window),{querySelectorAll:$e}=We,He=$e&&i($e,We);const{assign:je,setPrototypeOf:_e}=Ie;class Fe extends Re{evaluate(...e){return _e(r(super.evaluate,this,e),Ve.prototype)}}class qe extends Ae{createExpression(...e){return _e(r(super.createExpression,this,e),Fe.prototype)}}function Be(e){if(Le.hidden.has(e))return;!function(e){Pe&&"function"==typeof checkElement&&checkElement(e)}(e),Le.hidden.add(e);let{style:t}=Te(e),n=Te(t,"CSSStyleDeclaration"),o=Te([]),{debugCSSProperties:r}=S;for(let[e,t]of r||[["display","none"]])n.setProperty(e,t,"important"),o.push([e,n.getPropertyValue(e)]);new Ne((()=>{for(let[e,t]of o){let o=n.getPropertyValue(e),r=n.getPropertyPriority(e);o==t&&"important"==r||n.setProperty(e,t,"important")}})).observe(e,{attributes:!0,attributeFilter:["style"]})}function ze(e){let t=e;if(t.startsWith("xpath(")&&t.endsWith(")")){let e=t.slice(6,-1),n=(new qe).createExpression(e,null),o=Ve.ORDERED_NODE_SNAPSHOT_TYPE;return e=>{if(!e)return;let t=n.evaluate(We,o,null),{snapshotLength:r}=t;for(let n=0;nHe(e).forEach(t)}function Xe(e,t,n,o){let r;null==n&&(n=t);const i=()=>{for(const i of He(n)){const n=Te(i).closest(t);n&&e(i,n)&&(r(),Be(n),"function"==typeof o&&o(n))}};return je(new Ne(i),{race(e){r=e,this.observe(We,{childList:!0,characterData:!0,subtree:!0}),i()}})}function Je(e,t,n){let o=Te(t,"CSSStyleDeclaration");if("none"==o.getPropertyValue("display"))return!1;let r=o.getPropertyValue("visibility");if("hidden"==r||"collapse"==r)return!1;if(!n||e==n)return!0;let i=Te(e).parentElement;return!i||Je(i,Oe(i),n)}function Ue(e){let t=Oe(e),{cssText:n}=t;if(n)return n;for(let e of t)n+=`${e}: ${t[e]}; `;return Te(n).trim()}let{Math:Ge,RegExp:Ke}=Te(window);function Qe(e){let{length:t}=e;if(t>1&&"/"===e[0]){let n="/"===e[t-1];if(n||t>2&&Te(e).endsWith("/i")){let t=[Te(e).slice(1,n?-1:-2)];return n||t.push("i"),new Ke(...t)}}return new Ke(Te(e).replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))}let Ye=!1;function Ze(){return Ye}const{console:et}=Te(window),tt=()=>{};function nt(...e){Ze()&&Te(e).unshift("%c DEBUG","font-weight: bold"),et.log(...e)}function ot(e){return i(Ze()?nt:tt,null,e)}let{Array:rt,Error:it,Map:st,parseInt:at}=Te(window),ct=null,lt=null;function ut(e,t){if(null===ct)return tt;let n=ct,{participants:o}=n;return o.set(r,t),r;function r(){if(n.winners<1)return;if(ot("race")(`${e} won the race`),n===ct)lt.push(r);else if(o.delete(r),--n.winners<1){for(let e of o.values())e();o.clear()}}}const dt={get(e,t){const n=e;for(;!m(e,t);)e=g(e);const{get:o,set:i}=p(e,t);return function(){return arguments.length?r(i,n,arguments):s(o,n)}}};var ht;function ft(e,t,n){var o,r;n?"load"===n?(e("Waiting until window.load"),window.onload=()=>{e("Window.load fired."),t()}):"loading"===n||"interactive"===n||"complete"===n?(e("Waiting document state until :",n),document.onreadystatechange=()=>{e("Document state changed:",document.readyState),document.readyState===n&&t()}):(e("Waiting until ",n," event is triggered on document"),(o=document,r=n,new Promise((e=>{const t=()=>{o.removeEventListener(r,t),e()};o.addEventListener(r,t)}))).then((()=>{e(n," is triggered on document, starting the snippet"),t()})).catch((t=>{e("There was an error while waiting for the event.",t)}))):t()}Te(window),ht=window,new e(ht,dt),Te(/^\d+$/);let{MutationObserver:pt,WeakSet:wt,getComputedStyle:gt}=Te(window);let{clearTimeout:mt,fetch:bt,getComputedStyle:yt,setTimeout:vt,Map:St,MutationObserver:kt,Uint8Array:Et}=Te(window);let Mt=new St;function xt(e,{as:t="arrayBuffer",cleanup:n=6e4}={}){let o=t+":"+e,r=Mt.get(o)||{remove:()=>Mt.delete(o),result:null,timer:0};return mt(r.timer),r.timer=vt(r.remove,n),r.result||(r.result=bt(e).then((e=>e[t]())).catch(r.remove),Mt.set(o,r)),r.result}function Ct(e){return e.reduce(((e,t)=>e+function(e,t=2){let n=Te(e).toString(16);return n.length{const n=e.length+1,o=t.length+1,r=[[0]];let i=0,s=0;for(;++i"{mark(){},end(){}}"};function Xt(e,t=10){return zt}let{MutationObserver:Jt,WeakSet:Ut}=Te(window);const{ELEMENT_NODE:Gt}=Node;let{MutationObserver:Kt,WeakSet:Qt}=Te(window);const{ELEMENT_NODE:Yt}=Node;let{parseInt:Zt,setTimeout:en,Error:tn,MouseEvent:nn,MutationObserver:on,WeakSet:rn}=Te(window);let{parseInt:sn,setTimeout:an,Error:cn,MouseEvent:ln,MutationObserver:un,WeakSet:dn}=Te(window);const hn=["auxclick","click","dblclick","gotpointercapture","lostpointercapture","mouseenter","mousedown","mouseleave","mousemove","mouseout","mouseover","mouseup","pointerdown","pointerenter","pointermove","pointerover","pointerout","pointerup","pointercancel","pointerleave"];const fn={log:nt,race:function(e,t="1"){switch(e){case"start":ct={winners:at(t,10)||1,participants:new st},lt=new rt;break;case"end":case"finish":case"stop":ct=null;for(let e of lt)e();lt=null;break;default:throw new it(`Invalid action: ${e}`)}},debug:function(){Ye=!0},"hide-if-matches-xpath":function(e,t){const{mark:n,end:o}=Xt(),r=ot("hide-if-matches-xpath"),i=t=>{const i=ze(`xpath(${e})`),s=new Ut,a=()=>{n(),i((t=>{if(s.has(t))return!1;s.add(t),l(),Te(t).nodeType===Gt?Be(t):Te(t).textContent="",r("Matched: ",t," for selector: ",e)})),o()},c=new Jt(a),l=ut("hide-if-matches-xpath",(()=>c.disconnect()));c.observe(t,{characterData:!0,childList:!0,subtree:!0}),a()};if(t){let e,n=0;const o=ze(`xpath(${t})`),r=()=>{o((e=>{i(e),n++})),n>0&&e.disconnect()};e=new Jt(r),e.observe(document,{characterData:!0,childList:!0,subtree:!0}),r()}else i(document)},"hide-if-matches-computed-xpath":function(e,t,n,o){const{mark:r,end:i}=Xt(),s=ot("hide-if-matches-computed-xpath");if(!t||!e)return void s("No query or searchQuery provided.");const a=t=>{const n=(t=>e.replace("{{}}",t))(t);s("Starting hiding elements that match query: ",n);const o=ze(`xpath(${n})`),a=new Qt,c=()=>{r(),o((t=>{if(a.has(t))return!1;a.add(t),u(),Te(t).nodeType===Yt?Be(t):Te(t).textContent="",s("Matched: ",t," for selector: ",e)})),i()},l=new Kt(c),u=ut("hide-if-matches-computed-xpath",(()=>l.disconnect()));l.observe(document,{characterData:!0,childList:!0,subtree:!0}),c()},c=Qe(n);ft(s,(()=>{if(t){s("Started searching for: ",t);const e=new Qt;let n;const o=ze(`xpath(${t})`),r=()=>{o((t=>{if(e.has(t))return!1;if(e.add(t),s("Found node: ",t),t.innerHTML){s("Searching in: ",t.innerHTML);const e=t.innerHTML.match(c);if(e&&e.length){let t="";t=e[1]?e[1]:e[0],s("Matched search query: ",t),a(t)}}}))};n=new Kt(r),n.observe(document,{characterData:!0,childList:!0,subtree:!0}),r()}}),o)},"hide-if-contains":function(e,t="*",n=null){const o=ot("hide-if-contains");let r=Qe(e);const i=Xe((e=>r.test(Te(e).textContent)),t,n,(e=>{o("Matched: ",e," for selector: ",t,n)}));i.race(ut("hide-if-contains",(()=>{i.disconnect()})))},"hide-if-contains-similar-text":function(e,t,n=null,o=0,r=0){const i=new Pt,s=ot("hide-if-contains-similar-text"),a=Te(e),{length:c}=a,l=c+Tt(o)||0,u=Te([...a]).sort(),d=Tt(r)||1/0;null==n&&(n=t),s("Looking for similar text: "+a);const h=()=>{for(const e of He(n)){if(i.has(e))continue;i.add(e);const{innerText:n}=Te(e),r=Lt(d,n.length-l+1);for(let i=0;if.disconnect()));f.observe(document,{childList:!0,characterData:!0,subtree:!0}),h()},"hide-if-contains-visible-text":function(e,t,n=null,...o){let r=Te([]);const i=new It([["-snippet-box-margin","2"],["-disable-bg-color-check","false"],["-check-is-contained","false"]]);for(let e of o){e=Te(e);let t=e.indexOf(":");if(t<0)continue;let n=e.slice(0,t).trim().toString(),o=e.slice(t+1).trim().toString();n&&o&&(i.has(n)?i.set(n,o):r.push([n,o]))}let s=Te([["opacity","0"],["font-size","0px"],["color","rgba(0, 0, 0, 0)"]]),a=new It(s.concat(r));function c(e,t,{bgColorCheck:n=!0}={}){t||(t=Nt(e)),t=Te(t);for(const[e,n]of a){if(Qe(n).test(t.getPropertyValue(e)))return!1}let o=t.getPropertyValue("color");return!n||t.getPropertyValue("background-color")!=o}function l(e,t,{bgColorCheck:n=!0}={}){let o=Nt(e,t);if(!Je(e,o)||!c(e,o,{bgColorCheck:n}))return"";let{content:r}=Te(o);if(r&&"none"!==r){let t=Te([]);return r=Te(r).trim().replace(/(["'])(?:(?=(\\?))\2.)*?\1/g,(e=>""+(t.push(Te(e).slice(1,-1))-1))),r=r.replace(/\s*attr\(\s*([^\s,)]+)[^)]*?\)\s*/g,((t,n)=>Te(e).getAttribute(n)||"")),r.replace(/\x01(\d+)/g,((e,n)=>t[n]))}return""}function u(e,t,{boxMargin:n=2}={}){const o=Te(e).getBoundingClientRect(),r=Te(t).getBoundingClientRect(),i=r.left-n,s=r.right+n,a=r.top-n,c=r.bottom+n;return i<=o.left&&o.left<=s&&a<=o.top&&o.top<=c&&a<=o.bottom&&o.bottom<=c&&i<=o.right&&o.right<=s}function d(e,t,n,o,r,{boxMargin:i=2,bgColorCheck:s,checkIsContained:a}={}){let h=!n;if(h&&(n=Nt(e)),!Je(e,n,h&&t))return"";o||"hidden"!==Te(n).getPropertyValue("overflow-x")&&"hidden"!==Te(n).getPropertyValue("overflow-y")||(o=e);let f=l(e,":before",{bgColorCheck:s});for(let t of Te(e).childNodes)switch(Te(t).nodeType){case Vt:f+=d(t,e,Nt(t),o,r,{boxMargin:i,bgColorCheck:s,checkIsContained:a});break;case $t:if(o)u(e,o,{boxMargin:i})&&c(e,n,{bgColorCheck:s})&&(f+=Te(t).nodeValue);else if(c(e,n,{bgColorCheck:s})){if(a&&!u(e,r,{boxMargin:i}))continue;f+=Te(t).nodeValue}}return f+l(e,":after",{bgColorCheck:s})}const h=i.get("-snippet-box-margin"),f=Rt(h)||0,p=!("true"===i.get("-disable-bg-color-check")),w="true"===i.get("-check-is-contained");let g=Qe(e),m=new At;const b=Xe(((e,t)=>{if(m.has(e))return!1;m.add(e);let n=d(e,t,null,null,e,{boxMargin:f,bgColorCheck:p,checkIsContained:w}),o=g.test(n);return Ze()&&n.length&&nt(o,g,n),o}),t,n);b.race(ut("hide-if-contains-visible-text",(()=>{b.disconnect()})))},"hide-if-contains-and-matches-style":function(e,t="*",n=null,o=null,r=null,i,s=null,a=null){const c=ot("hide-if-contains-and-matches-style"),l=new wt;null==n&&(n=t);const u=Qe(e),d=o?Qe(o):null,h=r?Qe(r):null,f=()=>{const e=()=>{if(!(s&&window.innerWidtha))for(const e of He(n))if(!l.has(e)&&u.test(Te(e).textContent))if(!h||h.test(Ue(e))){const n=Te(e).closest(t);if(!n)continue;!d||d.test(Ue(n))?(r(),Be(n),l.add(e),c("Matched: ",n,"which contains: ",e," for params: ",...arguments)):c("In this element the searchStyle matched but style didn't:\n",n,gt(n),...arguments)}else c("In this element the searchStyle didn't match:\n",e,gt(e),...arguments)},o=new pt(e),r=ut("hide-if-contains-and-matches-style",(()=>o.disconnect()));o.observe(document,{childList:!0,characterData:!0,subtree:!0}),e()};ft(c,f,i)},"hide-if-has-and-matches-style":function(e,t="*",n=null,o=null,r=null,i=null,s=null,a=null){const c=ot("hide-if-has-and-matches-style"),l=new jt;null==n&&(n=t);const u=o?Qe(o):null,d=r?Qe(r):null,h=()=>{const o=()=>{if(!(s&&window.innerWidtha))for(const o of He(n))if(!l.has(o))if(!Te(o).querySelector(e)||d&&!d.test(Ue(o)))c("In this element the searchStyle didn't match:\n",o,_t(o),...arguments);else{const e=Te(o).closest(t);!e||u&&!u.test(Ue(e))?c("In this element the searchStyle matched but style didn't:\n",e,_t(e),...arguments):(i(),Be(e),l.add(o),c("Matched: ",e,"which contains: ",o," for params: ",...arguments))}},r=new Ht(o),i=ut("hide-if-has-and-matches-style",(()=>r.disconnect()));r.observe(document,{childList:!0,subtree:!0}),o()};ft(c,h,i)},"hide-if-labelled-by":function(e,t,n=null){let o=null==n,r=Qe(e),i=new Bt,s=()=>{for(let e of He(t)){let t=o?e:Te(e).closest(n);if(!t||!Je(e,Ft(e),t))continue;let s=Te(e).getAttribute("aria-labelledby"),a=()=>{i.has(t)||r.test(Te(e).getAttribute("aria-label")||"")&&(c(),i.add(t),Be(t))};if(s)for(let e of Te(s).split(/\s+/)){let n=Te(document).getElementById(e);n?!i.has(n)&&r.test(n.innerText)&&(c(),i.add(n),Be(t)):a()}else a()}},a=new qt(s),c=ut("hide-if-labelled-by",(()=>a.disconnect()));a.observe(document,{characterData:!0,childList:!0,subtree:!0}),s()},"hide-if-contains-image":function(e,t,n){null==n&&(n=t);let o=Qe(e);const r=ot("hide-if-contains-image");let i=()=>{for(let e of He(n)){let n=yt(e),i=Te(n["background-image"]).match(/^url\("(.*)"\)$/);i&&xt(i[1]).then((n=>{if(o.test(Ct(new Et(n)))){let n=Te(e).closest(t);n&&(a(),Be(n),r("Matched: ",n," for:",...arguments))}}))}},s=new kt(i),a=ut("hide-if-contains-image",(()=>s.disconnect()));s.observe(document,{childList:!0,subtree:!0}),i()},"simulate-event-poc":function(e,t,n="0"){if(!e)throw new tn("[simulate-event snippet]: No event type provided.");if(!t)throw new tn("[simulate-event snippet]: No selector provided.");let o=ze(t),r=Zt(n,10),i=new rn;function s(){o((t=>{i.has(t)||(i.add(t),en((()=>{Te(t).dispatchEvent(new nn(e,{bubbles:!0,cancelable:!0}))}),r))}))}new on(s).observe(document,{childList:!0,subtree:!0}),s()},"simulate-mouse-event":function(...e){const t=ot("simulate-mouse-event");if(e.length<1)throw new cn("[simulate-mouse-event snippet]: No selector provided.");e.length>7&&(e=e.slice(0,7));const n=Te([]);function o(){return n.forEach((e=>{if(!e.found){(function(e){let t=e;if(t.startsWith("xpath(")&&t.endsWith(")")){let t=ze(e);return()=>{let e=Te([]);return t((t=>e.push(t))),e}}return()=>De.from(He(e))})(e.selector)().length>0&&(e.found=!0)}})),n.every((e=>e.found))}function r(e,n,o){e&&n&&("click"===n&&e.click?(e.click(),t("Clicked on this node:\n",e,"\nwith a delay of",o,"ms")):(e.dispatchEvent(new ln(n,{bubbles:!0,cancelable:!0})),t("A",n,"event was dispatched with a delay of",o,"ms on this node:\n",e)))}Te(e).forEach((e=>{const o=function(e){if(!e)return null;const n={selector:"",continue:!1,trigger:!1,event:"click",delay:"500",clicked:!1,found:!1},o=e.split("$");let r=[];o.length>=2&&(r=o[1].toLowerCase().split(",")),[n.selector]=o;for(const e of r)if("trigger"===e)n.trigger=!0;else if("continue"===e)n.continue=!0;else if(e.startsWith("event")){const t=e.toLowerCase().split("=");t[1]?n.event=t[1]:n.event="click"}else if(e.startsWith("delay")){const t=e.toLowerCase().split("=");t[1]?n.delay=t[1]:n.delay="500"}return hn.includes(n.event)||t(n.event," might be misspelled, check for typos.\n","These are the supported events:",hn),n}(e);n.push(o)}));let i=!1;const[s]=n.slice(-1);s.trigger=!0;let a=new dn;function c(){if(i||(i=o()),i)for(const e of n){const t=ze(e.selector),n=sn(e.delay,10);e.trigger&&t((t=>{a.has(t)||(a.add(t),e.continue?setInterval((()=>{r(t,e.event,e.delay)}),n):an((()=>{r(t,e.event,e.delay)}),n))}))}}new un(c).observe(document,{childList:!0,subtree:!0}),c()}}; -+const snippets=fn; ++const e=Proxy,{apply:t,bind:n,call:o}=Function,r=o.bind(t),i=o.bind(n),s=o.bind(o),c={get:(e,t)=>i(o,e[t])},a=t=>new e(t,c),l={get:(e,t)=>i(e[t],e)},u=t=>new e(t,l),{assign:d,defineProperties:f,freeze:h,getOwnPropertyDescriptor:p,getOwnPropertyDescriptors:g,getPrototypeOf:m}=u(Object),{hasOwnProperty:w}=a({}),{species:b}=Symbol,y={get(e,t){const n=e[t];class o extends n{}const r=g(n.prototype);delete r.constructor,h(f(o.prototype,r));const i=g(n);return delete i.length,delete i.prototype,i[b]={value:o},h(f(o,i))}},v=t=>new e(t,y),S="undefined"!=typeof environment?environment:{};"undefined"==typeof globalThis&&(window.globalThis=window);const{apply:k,ownKeys:x}=u(Reflect),E="world"in S,M=E&&"ISOLATED"===S.world,C=E&&"MAIN"===S.world,T="object"==typeof chrome&&!!chrome.runtime,O="object"==typeof browser&&!!browser.runtime,P=!C&&(M||T||O),W=e=>P?e:L(e,$(e)),{create:L,defineProperties:D,defineProperty:N,freeze:A,getOwnPropertyDescriptor:R,getOwnPropertyDescriptors:$}=u(Object),I=u(globalThis),V=P?globalThis:v(globalThis),{Map:H,RegExp:j,Set:B,WeakMap:F,WeakSet:q}=V,_=(e,t,n=null)=>{const o=x(t);for(const r of x(e)){if(o.includes(r))continue;const i=R(e,r);if(n&&"value"in i){const{value:e}=i;"function"==typeof e&&(i.value=n(e))}N(t,r,i)}},z=e=>{const t=V[e];class n extends t{}const{toString:o,valueOf:r}=t.prototype;D(n.prototype,{toString:{value:o},valueOf:{value:r}});const i=e.toLowerCase(),s=e=>function(){const t=k(e,this,arguments);return typeof t===i?new n(t):t};return _(t,n,s),_(t.prototype,n.prototype,s),n},X=A({frozen:new F,hidden:new q,iframePropertiesToAbort:{read:new B,write:new B},abortedIframes:new F}),U=new j("^[A-Z]");var G=new Proxy(new H([["chrome",P&&(T&&chrome||O&&browser)||void 0],["isExtensionContext",P],["variables",X],["console",W(console)],["document",globalThis.document],["performance",W(performance)],["JSON",W(JSON)],["Map",H],["Math",W(Math)],["Number",P?Number:z("Number")],["RegExp",j],["Set",B],["String",P?String:z("String")],["WeakMap",F],["WeakSet",q],["MouseEvent",MouseEvent]]),{get(e,t){if(e.has(t))return e.get(t);let n=globalThis[t];return"function"==typeof n&&(n=(U.test(t)?V:I)[t]),e.set(t,n),n},has:(e,t)=>e.has(t)});const J={WeakSet:WeakSet,WeakMap:WeakMap,WeakValue:class{has(){return!1}set(){}}},{apply:K}=Reflect;const{Map:Q,WeakMap:Y,WeakSet:Z,setTimeout:ee}=G;let te=!0,ne=e=>{e.clear(),te=!te};var oe=function(e){const{WeakSet:t,WeakMap:n,WeakValue:o}=this||J,r=new t,i=new n,s=new o;return function(t){if(r.has(t))return t;if(i.has(t))return i.get(t);if(s.has(t))return s.get(t);const n=K(e,this,arguments);return r.add(n),n!==t&&("object"==typeof t&&t?i:s).set(t,n),n}}.bind({WeakMap:Y,WeakSet:Z,WeakValue:class extends Q{set(e,t){return te&&(te=!te,ee(ne,0,this)),super.set(e,t)}}});const{concat:re,includes:ie,join:se,reduce:ce,unshift:ae}=a([]),le=v(globalThis),{Map:ue,WeakMap:de}=le,fe=new ue,he=t=>{const n=(e=>{const t=[];let n=e;for(;n;){if(fe.has(n))ae(t,fe.get(n));else{const e=g(n);fe.set(n,e),ae(t,e)}n=m(n)}return ae(t,{}),r(d,null,t)})("function"==typeof t?t.prototype:t),o={get(e,t){if(t in n){const{value:o,get:r}=n[t];if(r)return s(r,e);if("function"==typeof o)return i(o,e)}return e[t]},set(e,t,o){if(t in n){const{set:r}=n[t];if(r)return s(r,e,o),!0}return e[t]=o,!0}};return t=>new e(t,o)},{isExtensionContext:pe,Array:ge,Number:me,String:we,Object:be}=G,{isArray:ye}=ge,{getOwnPropertyDescriptor:ve,setPrototypeOf:Se}=be,{toString:ke}=be.prototype,{slice:xe}=we.prototype,{get:Ee}=ve(Node.prototype,"nodeType"),Me=pe?{}:{Attr:he(Attr),CanvasRenderingContext2D:he(CanvasRenderingContext2D),CSSStyleDeclaration:he(CSSStyleDeclaration),Document:he(Document),Element:he(Element),HTMLCanvasElement:he(HTMLCanvasElement),HTMLElement:he(HTMLElement),HTMLImageElement:he(HTMLImageElement),HTMLScriptElement:he(HTMLScriptElement),MutationRecord:he(MutationRecord),Node:he(Node),ShadowRoot:he(ShadowRoot),get CSS2Properties(){return Me.CSSStyleDeclaration}},Ce=(e,t)=>{if("Element"!==t&&t in Me)return Me[t](e);if(ye(e))return Se(e,ge.prototype);const n=(e=>s(xe,s(ke,e),8,-1))(e);if(n in Me)return Me[n](e);if(n in G)return Se(e,G[n].prototype);if("nodeType"in e)switch(s(Ee,e)){case 1:if(!(t in Me))throw new Error("unknown hint "+t);return Me[t](e);case 2:return Me.Attr(e);case 3:return Me.Node(e);case 9:return Me.Document(e)}throw new Error("unknown brand "+n)};var Te=pe?e=>e===window||e===globalThis?G:e:oe(((e,t="Element")=>{if(e===window||e===globalThis)return G;switch(typeof e){case"object":return e&&Ce(e,t);case"string":return new we(e);case"number":return new me(e);default:throw new Error("unsupported value")}}));let Oe=!1;function Pe(){return Oe}let{console:We,document:Le,getComputedStyle:De,isExtensionContext:Ne,variables:Ae,Array:Re,MutationObserver:$e,Object:Ie,XPathEvaluator:Ve,XPathExpression:He,XPathResult:je}=Te(window);const{querySelectorAll:Be}=Le,Fe=Be&&i(Be,Le);function qe(e,t=!1){try{const n=navigator.userAgent.includes("Firefox")?e.openOrClosedShadowRoot:browser.dom.openOrClosedShadowRoot(e);return null===n&&Pe()&&!t&&We.log("Shadow root not found or not added in element yet",e),n}catch(n){return Pe()&&!t&&We.log("Error while accessing shadow root",e,n),null}}function _e(e,t=!1){return Ue(e,Fe.bind(Le),Le,t)}function ze(e,t,n,o){const r=t.getAttribute("xlink:href")||t.getAttribute("href");if(r){const s=Fe(r)[0];if(!s&&Pe())return We.log("No elements found matching",r),!1;if(!(i=e)||0===i.length||i.every((e=>""===e.trim()))){const e=o.length>0?o:[];return n.push({element:s,rootParents:[...e,t]}),!1}const c=s.querySelectorAll.bind(s);return{nextBoundElement:s,nestedSelectorsString:e.join("^^"),next$$:c}}var i}function Xe(e,t){const n=qe(t);if(n){const{querySelectorAll:o}=n,r=o&&i(o,n).bind(n);return{nextBoundElement:t,nestedSelectorsString:":host "+e.join("^^"),next$$:r}}return!1}function Ue(e,t,n,o,r=[]){if(e.includes("^^")){const[i,s,...c]=e.split("^^");let a,l;switch(s){case"svg":l=ze;break;case"sh":l=Xe;break;default:return Pe()&&We.log(s," is not supported. Supported commands are: \n^^sh^^\n^^svg^^"),[]}a=""===i.trim()?[n]:t(i);const u=[];for(const e of a){const t=l(c,e,u,r);if(!t)continue;const{next$$:n,nestedSelectorsString:i,nextBoundElement:s}=t,a=Ue(i,n,s,o,[...r,e]);a&&u.push(...a)}return u}const i=t(e);return o?[...i].map((e=>({element:e,rootParents:r.length>0?r:[]}))):i}function Ge(e,t,n=[]){if(t.includes("^^svg^^")&&(t=t.split("^^svg^^")[0]),t.includes("^^sh^^")){const o=t.split("^^sh^^"),r=o.length-1;if(t=`:host ${o[r]}`,r===n.length)return e.closest(t);return n[r].closest(t)}return n[0]?n[0].closest(t):e.closest(t)}const{assign:Je,setPrototypeOf:Ke}=Ie;class Qe extends He{evaluate(...e){return Ke(r(super.evaluate,this,e),je.prototype)}}class Ye extends Ve{createExpression(...e){return Ke(r(super.createExpression,this,e),Qe.prototype)}}function Ze(e){if(Ae.hidden.has(e))return!1;!function(e){Ne&&"function"==typeof checkElement&&checkElement(e)}(e),Ae.hidden.add(e);let{style:t}=Te(e),n=Te(t,"CSSStyleDeclaration"),o=Te([]),{debugCSSProperties:r}=S;for(let[e,t]of r||[["display","none"]])n.setProperty(e,t,"important"),o.push([e,n.getPropertyValue(e)]);return new $e((()=>{for(let[e,t]of o){let o=n.getPropertyValue(e),r=n.getPropertyPriority(e);o==t&&"important"==r||n.setProperty(e,t,"important")}})).observe(e,{attributes:!0,attributeFilter:["style"]}),!0}function et(e){let t=e;if(t.startsWith("xpath(")&&t.endsWith(")")){let e=t.slice(6,-1),n=(new Ye).createExpression(e,null),o=je.ORDERED_NODE_SNAPSHOT_TYPE;return e=>{if(!e)return;let t=n.evaluate(Le,o,null),{snapshotLength:r}=t;for(let n=0;n_e(e).forEach(t)}function tt(e,t,n,o){let r;null==n&&(n=t);const i=()=>{for(const{element:i,rootParents:s}of _e(n,!0)){const n=Ge(Te(i),t,s);n&&e(i,n,s)&&(r(),Ze(n)&&"function"==typeof o&&o(n))}};return Je(new $e(i),{race(e){r=e,this.observe(Le,{childList:!0,characterData:!0,subtree:!0}),i()}})}function nt(e,t,n,o){let r=Te(t,"CSSStyleDeclaration");if("none"==r.getPropertyValue("display"))return!1;let i=r.getPropertyValue("visibility");if("hidden"==i||"collapse"==i)return!1;if(!n||e==n)return!0;let s=Te(e).parentElement;if(!s){if(!o||!o.length)return!0;s=o[o.length-1],o=o.slice(0,-1)}return nt(s,De(s),n,o)}function ot(e){let t=De(e),{cssText:n}=t;if(n)return n;for(let e of t)n+=`${e}: ${t[e]}; `;return Te(n).trim()}let{Math:rt,RegExp:it}=Te(window);function st(e){let{length:t}=e;if(t>1&&"/"===e[0]){let n="/"===e[t-1];if(n||t>2&&Te(e).endsWith("/i")){let t=[Te(e).slice(1,n?-1:-2)];return n||t.push("i"),new it(...t)}}return new it(Te(e).replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))}const{console:ct}=Te(window),at=()=>{};function lt(...e){if(Pe()){const t=["%c DEBUG","font-weight: bold;"],n=e.indexOf("error"),o=e.indexOf("warn"),r=e.indexOf("success"),i=e.indexOf("info");-1!==n?(t[0]+=" - ERROR",t[1]+="color: red; border:2px solid red",Te(e).splice(n,1)):-1!==o?(t[0]+=" - WARNING",t[1]+="color: orange; border:2px solid orange ",Te(e).splice(o,1)):-1!==r?(t[0]+=" - SUCCESS",t[1]+="color: green; border:2px solid green",Te(e).splice(r,1)):-1!==i&&(t[1]+="color: black;",Te(e).splice(i,1)),Te(e).unshift(...t)}ct.log(...e)}function ut(e){return i(Pe()?lt:at,null,e)}let{Array:dt,Error:ft,Map:ht,parseInt:pt}=Te(window),gt=null,mt=null;function wt(e,t){if(null===gt)return at;let n=gt,{participants:o}=n;return o.set(r,t),r;function r(){if(n.winners<1)return;if(ut("race")("success",`${e} won the race`),n===gt)mt.push(r);else if(o.delete(r),--n.winners<1){for(let e of o.values())e();o.clear()}}}const bt={get(e,t){const n=e;for(;!w(e,t);)e=m(e);const{get:o,set:i}=p(e,t);return function(){return arguments.length?r(i,n,arguments):s(o,n)}}};var yt;function vt(e,t,n){var o,r;n?"load"===n?(e("info","Waiting until window.load"),window.addEventListener("load",(()=>{e("info","Window.load fired."),t()}))):"loading"===n||"interactive"===n||"complete"===n?(e("info","Waiting document state until :",n),document.addEventListener("readystatechange",(()=>{e("info","Document state changed:",document.readyState),document.readyState===n&&t()}))):(e("info","Waiting until ",n," event is triggered on document"),(o=document,r=n,new Promise((e=>{const t=()=>{o.removeEventListener(r,t),e()};o.addEventListener(r,t)}))).then((()=>{e("info",n," is triggered on document, starting the snippet"),t()})).catch((t=>{e("error","There was an error while waiting for the event.",t)}))):t()}Te(window),yt=window,new e(yt,bt),Te(/^\d+$/);let{MutationObserver:St,WeakSet:kt,getComputedStyle:xt}=Te(window);let{clearTimeout:Et,fetch:Mt,getComputedStyle:Ct,setTimeout:Tt,Map:Ot,MutationObserver:Pt,Uint8Array:Wt}=Te(window);let Lt=new Ot;function Dt(e,{as:t="arrayBuffer",cleanup:n=6e4}={}){let o=t+":"+e,r=Lt.get(o)||{remove:()=>Lt.delete(o),result:null,timer:0};return Et(r.timer),r.timer=Tt(r.remove,n),r.result||(r.result=Mt(e).then((e=>e[t]())).catch(r.remove),Lt.set(o,r)),r.result}const{parseFloat:Nt,Math:At,MutationObserver:Rt,WeakSet:$t}=Te(window),{min:It}=At,Vt=(e,t)=>{const n=e.length+1,o=t.length+1,r=[[0]];let i=0,s=0;for(;++i"{mark(){},end(){}}"};function Yt(e,t=10){return Qt}let{MutationObserver:Zt,WeakSet:en}=Te(window);const{ELEMENT_NODE:tn}=Node;let{MutationObserver:nn,WeakSet:on}=Te(window);const{ELEMENT_NODE:rn}=Node;let{parseInt:sn,setTimeout:cn,Error:an,MouseEvent:ln,MutationObserver:un,WeakSet:dn}=Te(window);const fn=["auxclick","click","dblclick","gotpointercapture","lostpointercapture","mouseenter","mousedown","mouseleave","mousemove","mouseout","mouseover","mouseup","pointerdown","pointerenter","pointermove","pointerover","pointerout","pointerup","pointercancel","pointerleave"];let{isNaN:hn,MutationObserver:pn,parseInt:gn,parseFloat:mn,setTimeout:wn}=Te(window);const bn={log:lt,race:function(e,t="1"){switch(e){case"start":gt={winners:pt(t,10)||1,participants:new ht},mt=new dt;break;case"end":case"finish":case"stop":gt=null;for(let e of mt)e();mt=null;break;default:throw new ft(`Invalid action: ${e}`)}},debug:function(){Oe=!0},"hide-if-matches-xpath":function(e,t){const{mark:n,end:o}=Yt(),r=ut("hide-if-matches-xpath"),i=t=>{const i=et(`xpath(${e})`),s=new en,c=()=>{n(),i((t=>{if(s.has(t))return!1;s.add(t),l(),Te(t).nodeType===tn?Ze(t):Te(t).textContent="",r("success","Matched: ",t," for selector: ",e)})),o()},a=new Zt(c),l=wt("hide-if-matches-xpath",(()=>a.disconnect()));a.observe(t,{characterData:!0,childList:!0,subtree:!0}),c()};if(t){let e,n=0;const o=et(`xpath(${t})`),r=()=>{o((e=>{i(e),n++})),n>0&&e.disconnect()};e=new Zt(r),e.observe(document,{characterData:!0,childList:!0,subtree:!0}),r()}else i(document)},"hide-if-matches-computed-xpath":function(e,t,n,o){const{mark:r,end:i}=Yt(),s=ut("hide-if-matches-computed-xpath");if(!t||!e)return void s("error","No query or searchQuery provided.");const c=t=>{const n=(t=>e.replace("{{}}",t))(t);s("info","Starting hiding elements that match query: ",n);const o=et(`xpath(${n})`),c=new on,a=()=>{r(),o((t=>{if(c.has(t))return!1;c.add(t),u(),Te(t).nodeType===rn?Ze(t):Te(t).textContent="",s("success","Matched: ",t," for selector: ",e)})),i()},l=new nn(a),u=wt("hide-if-matches-computed-xpath",(()=>l.disconnect()));l.observe(document,{characterData:!0,childList:!0,subtree:!0}),a()},a=st(n);vt(s,(()=>{if(t){s("info","Started searching for: ",t);const e=new on;let n;const o=et(`xpath(${t})`),r=()=>{o((t=>{if(e.has(t))return!1;if(e.add(t),s("info","Found node: ",t),t.innerHTML){s("info","Searching in: ",t.innerHTML);const e=t.innerHTML.match(a);if(e&&e.length){let t="";t=e[1]?e[1]:e[0],s("info","Matched search query: ",t),c(t)}}}))};n=new nn(r),n.observe(document,{characterData:!0,childList:!0,subtree:!0}),r()}}),o)},"hide-if-contains":function(e,t="*",n=null){const o=ut("hide-if-contains");let r=st(e);const i=tt((e=>r.test(Te(e).textContent)),t,n,(e=>{o("success","Matched: ",e," for selector: ",t,n)}));i.race(wt("hide-if-contains",(()=>{i.disconnect()})))},"hide-if-contains-similar-text":function(e,t,n=null,o=0,r=0){const i=new $t,s=ut("hide-if-contains-similar-text"),c=Te(e),{length:a}=c,l=a+Nt(o)||0,u=Te([...c]).sort(),d=Nt(r)||1/0;null==n&&(n=t),s("Looking for similar text: "+c);const f=()=>{for(const{element:e,rootParents:r}of _e(n,!0)){if(i.has(e))continue;i.add(e);const{innerText:n}=Te(e),a=It(d,n.length-l+1);for(let i=0;ih.disconnect()));h.observe(document,{childList:!0,characterData:!0,subtree:!0}),f()},"hide-if-contains-visible-text":function(e,t,n=null,...o){let r=Te([]);const i=new jt([["-snippet-box-margin","2"],["-disable-bg-color-check","false"],["-check-is-contained","false"]]);for(let e of o){e=Te(e);let t=e.indexOf(":");if(t<0)continue;let n=e.slice(0,t).trim().toString(),o=e.slice(t+1).trim().toString();n&&o&&(i.has(n)?i.set(n,o):r.push([n,o]))}let s=Te([["opacity","0"],["font-size","0px"],["color","rgba(0, 0, 0, 0)"]]),c=new jt(s.concat(r));function a(e,t,{bgColorCheck:n=!0}={}){t||(t=Ht(e)),t=Te(t);for(const[e,n]of c){if(st(n).test(t.getPropertyValue(e)))return!1}let o=t.getPropertyValue("color");return!n||t.getPropertyValue("background-color")!=o}function l(e,t,{bgColorCheck:n=!0}={}){let o=Ht(e,t);if(!nt(e,o)||!a(e,o,{bgColorCheck:n}))return"";let{content:r}=Te(o);if(r&&"none"!==r){let t=Te([]);return r=Te(r).trim().replace(/(["'])(?:(?=(\\?))\2.)*?\1/g,(e=>""+(t.push(Te(e).slice(1,-1))-1))),r=r.replace(/\s*attr\(\s*([^\s,)]+)[^)]*?\)\s*/g,((t,n)=>Te(e).getAttribute(n)||"")),r.replace(/\x01(\d+)/g,((e,n)=>t[n]))}return""}function u(e,t,{boxMargin:n=2}={}){const o=Te(e).getBoundingClientRect(),r=Te(t).getBoundingClientRect(),i=r.left-n,s=r.right+n,c=r.top-n,a=r.bottom+n;return i<=o.left&&o.left<=s&&c<=o.top&&o.top<=a&&c<=o.bottom&&o.bottom<=a&&i<=o.right&&o.right<=s}function d(e,t,n,o,r,i,{boxMargin:s=2,bgColorCheck:c,checkIsContained:f}={}){let h=!n;if(h&&(n=Ht(e)),!nt(e,n,h&&t,i))return"";o||"hidden"!==Te(n).getPropertyValue("overflow-x")&&"hidden"!==Te(n).getPropertyValue("overflow-y")||(o=e);let p=l(e,":before",{bgColorCheck:c});for(let t of function(e,t=!0){const n=qe(e,t);return n?n.childNodes:Te(e).childNodes}(Te(e)))switch(Te(t).nodeType){case qt:p+=d(t,e,Ht(t),o,r,i,{boxMargin:s,bgColorCheck:c,checkIsContained:f});break;case _t:if(o)u(e,o,{boxMargin:s})&&a(e,n,{bgColorCheck:c})&&(p+=Te(t).nodeValue);else if(a(e,n,{bgColorCheck:c})){if(f&&!u(e,r,{boxMargin:s}))continue;p+=Te(t).nodeValue}}return p+l(e,":after",{bgColorCheck:c})}const f=i.get("-snippet-box-margin"),h=Ft(f)||0,p=!("true"===i.get("-disable-bg-color-check")),g="true"===i.get("-check-is-contained");let m=st(e),w=new Bt;const b=tt(((e,t,n)=>{if(w.has(e))return!1;w.add(e);let o=d(e,t,null,null,e,n,{boxMargin:h,bgColorCheck:p,checkIsContained:g}),r=m.test(o);return Pe()&&o.length&<(r?"success":"info",r,m,o),r}),t,n);b.race(wt("hide-if-contains-visible-text",(()=>{b.disconnect()})))},"hide-if-contains-and-matches-style":function(e,t="*",n=null,o=null,r=null,i,s=null,c=null){const a=ut("hide-if-contains-and-matches-style"),l=new kt,u=Pe()&&new kt;null==n&&(n=t);const d=st(e),f=o?st(o):null,h=r?st(r):null;vt(a,(()=>{const e=()=>{if(!(s&&window.innerWidthc))for(const{element:e,rootParents:o}of _e(n,!0))if(!l.has(e)&&d.test(Te(e).textContent))if(!h||h.test(ot(e))){const n=Ge(Te(e),t,o);if(!n)continue;if(!f||f.test(ot(n)))r(),Ze(n),l.add(e),a("success","Matched: ",n,"which contains: ",e," for params: ",...arguments);else{if(!u||u.has(n))continue;a("info","In this element the searchStyle matched but style didn't:\n",n,xt(n),...arguments),u.add(n)}}else{if(!u||u.has(e))continue;a("info","In this element the searchStyle didn't match:\n",e,xt(e),...arguments),u.add(e)}},o=new St(e),r=wt("hide-if-contains-and-matches-style",(()=>o.disconnect()));o.observe(document,{childList:!0,characterData:!0,subtree:!0}),e()}),i)},"hide-if-has-and-matches-style":function(e,t="*",n=null,o=null,r=null,i=null,s=null,c=null){const a=ut("hide-if-has-and-matches-style"),l=new Xt,u=Pe()&&new Xt;null==n&&(n=t);const d=o?st(o):null,f=r?st(r):null;vt(a,(()=>{const o=()=>{if(!(s&&window.innerWidthc))for(const{element:o,rootParents:r}of _e(n,!0))if(!l.has(o))if(!Te(o).querySelector(e)||f&&!f.test(ot(o))){if(!u||u.has(o))continue;a("info","In this element the searchStyle didn't match:\n",o,Ut(o),...arguments),u.add(o)}else{const e=Ge(Te(o),t,r);if(!e||d&&!d.test(ot(e))){if(!u||u.has(e))continue;a("info","In this element the searchStyle matchedbut style didn't:\n",e,Ut(e),...arguments),u.add(e)}else i(),Ze(e),l.add(o),a("success","Matched: ",e,"which contains: ",o," for params: ",...arguments)}},r=new zt(o),i=wt("hide-if-has-and-matches-style",(()=>r.disconnect()));r.observe(document,{childList:!0,subtree:!0}),o()}),i)},"hide-if-labelled-by":function(e,t,n=null){let o=null==n,r=st(e),i=new Kt,s=()=>{for(const{element:e,rootParents:s}of _e(t,!0)){let t=o?e:Ge(Te(e),n,s);if(!t||!nt(e,Gt(e),t))continue;let c=Te(e).getAttribute("aria-labelledby"),l=()=>{i.has(t)||r.test(Te(e).getAttribute("aria-label")||"")&&(a(),i.add(t),Ze(t))};if(c)for(let e of Te(c).split(/\s+/)){let n=Te(document).getElementById(e);n?!i.has(n)&&r.test(n.innerText)&&(a(),i.add(n),Ze(t)):l()}else l()}},c=new Jt(s),a=wt("hide-if-labelled-by",(()=>c.disconnect()));c.observe(document,{characterData:!0,childList:!0,subtree:!0}),s()},"hide-if-contains-image":function(e,t,n){null==n&&(n=t);let o=st(e);const r=ut("hide-if-contains-image");let i=()=>{for(const{element:e,rootParents:i}of _e(n,!0)){let n=Ct(e),s=Te(n["background-image"]).match(/^url\("(.*)"\)$/);s&&Dt(s[1]).then((n=>{if(o.test(new Wt(n).reduce(((e,t)=>e+function(e,t=2){let n=Te(e).toString(16);n.lengths.disconnect()));s.observe(document,{childList:!0,subtree:!0}),i()},"simulate-mouse-event":function(...e){const t=ut("simulate-mouse-event");if(e.length<1)throw new an("[simulate-mouse-event snippet]: No selector provided.");e.length>7&&(e=e.slice(0,7));const n=Te([]);function o(){return n.forEach((e=>{if(!e.found){(function(e){let t=e;if(t.startsWith("xpath(")&&t.endsWith(")")){let t=et(e);return()=>{let e=Te([]);return t((t=>e.push(t))),e}}return()=>Re.from(_e(e))})(e.selector)().length>0&&(e.found=!0)}})),n.every((e=>e.found))}function r(e,n,o){e&&n&&("click"===n&&e.click?(e.click(),t("success","Clicked on this node:\n",e,"\nwith a delay of",o,"ms")):(e.dispatchEvent(new ln(n,{bubbles:!0,cancelable:!0})),t("success","A",n,"event was dispatched with a delay of",o,"ms on this node:\n",e)))}Te(e).forEach((e=>{const o=function(e){if(!e)return null;const n={selector:"",continue:!1,trigger:!1,event:"click",delay:"500",clicked:!1,found:!1},o=e.split("$");let r=[];o.length>=2&&(r=o[1].toLowerCase().split(",")),[n.selector]=o;for(const e of r)if("trigger"===e)n.trigger=!0;else if("continue"===e)n.continue=!0;else if(e.startsWith("event")){const t=e.toLowerCase().split("=");t[1]?n.event=t[1]:n.event="click"}else if(e.startsWith("delay")){const t=e.toLowerCase().split("=");t[1]?n.delay=t[1]:n.delay="500"}return fn.includes(n.event)||t("warn",n.event," might be misspelled, check for typos.\n","These are the supported events:",fn),n}(e);n.push(o)}));let i=!1;const[s]=n.slice(-1);s.trigger=!0;let c=new dn;function a(){if(i||(i=o()),i)for(const e of n){const t=et(e.selector),n=sn(e.delay,10);e.trigger&&t((t=>{c.has(t)||(c.add(t),e.continue?setInterval((()=>{r(t,e.event,e.delay)}),n):cn((()=>{r(t,e.event,e.delay)}),n))}))}}new un(a).observe(document,{childList:!0,subtree:!0}),a()},"skip-video":function(e,t,...n){const o=new Map([["-max-attempts","10"],["-retry-ms","10"],["-run-once","false"],["-wait-until",""],["-skip-to","-0.1"],["-stop-on-video-end","false"],["-start-from","0"],["-mute-video-when-skipping","true"]]);for(let e of n){e=Te(e);let t=e.indexOf(":");if(t<0)continue;let n=e.slice(0,t).trim().toString(),r=e.slice(t+1).trim().toString();n&&r&&o.has(n)&&o.set(n,r)}const r=o.get("-max-attempts"),i=gn(r||10,10),s=o.get("-retry-ms"),c=gn(s||10,10),a="true"===o.get("-run-once"),l=o.get("-skip-to"),u=mn(l||-.1),d=o.get("-start-from"),f=gn(d||0,10),h=o.get("-wait-until"),p="true"===o.get("-stop-on-video-end"),g=!("false"===o.get("-mute-video-when-skipping")),m=ut("skip-video"),w=et(`xpath(${t})`);let b=!1;vt(m,(()=>{const n=(s=0)=>{b&&a?o&&o.disconnect():w((o=>{m("info","Matched: ",o," for selector: ",t),m("info","Running video skipping logic.");const a=_e(e)[0];for(;hn(a.duration)&&s{const e=s+1;m("info","Running video skipping logic. Attempt: ",e),n(e)}),c);const l=a.duration-a.currentTime<.5;!(!hn(a.duration)&&a.duration>0&&a.currentTimeo.disconnect()));o.observe(document,{characterData:!0,childList:!0,subtree:!0}),n()}),h)}}; ++const snippets=bn; +let context; +for (const [name, ...args] of filters) { +if (snippets.hasOwnProperty(name)) { @@ -9369,8 +5621,8 @@ new file mode 100755 +})(e, ...t); + +const callback = (environment, ...filters) => { -+const e=Proxy,{apply:t,bind:r,call:n}=Function,o=n.bind(t),i=n.bind(r),s=n.bind(n),a={get:(e,t)=>i(n,e[t])},l=t=>new e(t,a),c=(t,r)=>new e(t,{apply:(e,t,n)=>o(r,t,n)}),u={get:(e,t)=>i(e[t],e)},f=t=>new e(t,u),{assign:p,defineProperties:d,freeze:h,getOwnPropertyDescriptor:w,getOwnPropertyDescriptors:g,getPrototypeOf:y}=f(Object),{hasOwnProperty:m}=l({}),{species:b}=Symbol,v={get(e,t){const r=e[t];class n extends r{}const o=g(r.prototype);delete o.constructor,h(d(n.prototype,o));const i=g(r);return delete i.length,delete i.prototype,i[b]={value:n},h(d(n,i))}},E=t=>new e(t,v),S="undefined"!=typeof environment?environment:{};"undefined"==typeof globalThis&&(window.globalThis=window);const{apply:M,ownKeys:T}=f(Reflect),x="world"in S,O=x&&"ISOLATED"===S.world,P=x&&"MAIN"===S.world,j="object"==typeof chrome&&!!chrome.runtime,N="object"==typeof browser&&!!browser.runtime,L=!P&&(O||j||N),k=e=>L?e:C(e,H(e)),{create:C,defineProperties:A,defineProperty:W,freeze:$,getOwnPropertyDescriptor:D,getOwnPropertyDescriptors:H}=f(Object),z=f(globalThis),R=L?globalThis:E(globalThis),{Map:F,RegExp:I,Set:J,WeakMap:V,WeakSet:B}=R,U=(e,t,r=null)=>{const n=T(t);for(const o of T(e)){if(n.includes(o))continue;const i=D(e,o);if(r&&"value"in i){const{value:e}=i;"function"==typeof e&&(i.value=r(e))}W(t,o,i)}},_=e=>{const t=R[e];class r extends t{}const{toString:n,valueOf:o}=t.prototype;A(r.prototype,{toString:{value:n},valueOf:{value:o}});const i=e.toLowerCase(),s=e=>function(){const t=M(e,this,arguments);return typeof t===i?new r(t):t};return U(t,r,s),U(t.prototype,r.prototype,s),r},X=$({frozen:new V,hidden:new B,iframePropertiesToAbort:{read:new J,write:new J},abortedIframes:new V}),q=new I("^[A-Z]");var G=new Proxy(new F([["chrome",L&&(j&&chrome||N&&browser)||void 0],["isExtensionContext",L],["variables",X],["console",k(console)],["document",globalThis.document],["performance",k(performance)],["JSON",k(JSON)],["Map",F],["Math",k(Math)],["Number",L?Number:_("Number")],["RegExp",I],["Set",J],["String",L?String:_("String")],["WeakMap",V],["WeakSet",B],["MouseEvent",MouseEvent]]),{get(e,t){if(e.has(t))return e.get(t);let r=globalThis[t];return"function"==typeof r&&(r=(q.test(t)?R:z)[t]),e.set(t,r),r},has:(e,t)=>e.has(t)});const K={WeakSet:WeakSet,WeakMap:WeakMap,WeakValue:class{has(){return!1}set(){}}},{apply:Y}=Reflect;const{Map:Z,WeakMap:Q,WeakSet:ee,setTimeout:te}=G;let re=!0,ne=e=>{e.clear(),re=!re};var oe=function(e){const{WeakSet:t,WeakMap:r,WeakValue:n}=this||K,o=new t,i=new r,s=new n;return function(t){if(o.has(t))return t;if(i.has(t))return i.get(t);if(s.has(t))return s.get(t);const r=Y(e,this,arguments);return o.add(r),r!==t&&("object"==typeof t&&t?i:s).set(t,r),r}}.bind({WeakMap:Q,WeakSet:ee,WeakValue:class extends Z{set(e,t){return re&&(re=!re,te(ne,0,this)),super.set(e,t)}}});const{concat:ie,includes:se,join:ae,reduce:le,unshift:ce}=l([]),ue=E(globalThis),{Map:fe,WeakMap:pe}=ue,de=new fe,he=t=>{const r=(e=>{const t=[];let r=e;for(;r;){if(de.has(r))ce(t,de.get(r));else{const e=g(r);de.set(r,e),ce(t,e)}r=y(r)}return ce(t,{}),o(p,null,t)})("function"==typeof t?t.prototype:t),n={get(e,t){if(t in r){const{value:n,get:o}=r[t];if(o)return s(o,e);if("function"==typeof n)return i(n,e)}return e[t]},set(e,t,n){if(t in r){const{set:o}=r[t];if(o)return s(o,e,n),!0}return e[t]=n,!0}};return t=>new e(t,n)},{isExtensionContext:we,Array:ge,Number:ye,String:me,Object:be}=G,{isArray:ve}=ge,{getOwnPropertyDescriptor:Ee,setPrototypeOf:Se}=be,{toString:Me}=be.prototype,{slice:Te}=me.prototype,{get:xe}=Ee(Node.prototype,"nodeType"),Oe=we?{}:{Attr:he(Attr),CanvasRenderingContext2D:he(CanvasRenderingContext2D),CSSStyleDeclaration:he(CSSStyleDeclaration),Document:he(Document),Element:he(Element),HTMLCanvasElement:he(HTMLCanvasElement),HTMLElement:he(HTMLElement),HTMLImageElement:he(HTMLImageElement),HTMLScriptElement:he(HTMLScriptElement),MutationRecord:he(MutationRecord),Node:he(Node),ShadowRoot:he(ShadowRoot),get CSS2Properties(){return Oe.CSSStyleDeclaration}},Pe=(e,t)=>{if("Element"!==t&&t in Oe)return Oe[t](e);if(ve(e))return Se(e,ge.prototype);const r=(e=>s(Te,s(Me,e),8,-1))(e);if(r in Oe)return Oe[r](e);if(r in G)return Se(e,G[r].prototype);if("nodeType"in e)switch(s(xe,e)){case 1:if(!(t in Oe))throw new Error("unknown hint "+t);return Oe[t](e);case 2:return Oe.Attr(e);case 3:return Oe.Node(e);case 9:return Oe.Document(e)}throw new Error("unknown brand "+r)};var je=we?e=>e===window||e===globalThis?G:e:oe(((e,t="Element")=>{if(e===window||e===globalThis)return G;switch(typeof e){case"object":return e&&Pe(e,t);case"string":return new me(e);case"number":return new ye(e);default:throw new Error("unsupported value")}}));const Ne={get(e,t){const r=e;for(;!m(e,t);)e=y(e);const{get:n,set:i}=w(e,t);return function(){return arguments.length?o(i,r,arguments):s(n,r)}}},Le=t=>new e(t,Ne);let ke=!1;function Ce(){return ke}const{console:Ae}=je(window),We=()=>{};function $e(...e){Ce()&&je(e).unshift("%c DEBUG","font-weight: bold"),Ae.log(...e)}function De(e){return i(Ce()?$e:We,null,e)}let{Math:He,RegExp:ze}=je(window);function Re(e){let{length:t}=e;if(t>1&&"/"===e[0]){let r="/"===e[t-1];if(r||t>2&&je(e).endsWith("/i")){let t=[je(e).slice(1,r?-1:-2)];return r||t.push("i"),new ze(...t)}}return new ze(je(e).replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))}function Fe(){return je(He.floor(2116316160*He.random()+60466176)).toString(36)}let{parseFloat:Ie,variables:Je,Array:Ve,Error:Be,Map:Ue,Object:_e,ReferenceError:Xe,Set:qe,WeakMap:Ge}=je(window),{onerror:Ke}=Le(window),Ye=Node.prototype,Ze=Element.prototype,Qe=null;function et(e,t,r,n=!0){let o=je(t),i=o.indexOf(".");if(-1==i){let o=_e.getOwnPropertyDescriptor(e,t);if(o&&!o.configurable)return;let i=_e.assign({},r,{configurable:n});if(!o&&!i.get&&i.set){let r=e[t];i.get=()=>r}return void _e.defineProperty(e,t,i)}let s=o.slice(0,i).toString();t=o.slice(i+1).toString();let a=e[s];!a||"object"!=typeof a&&"function"!=typeof a||et(a,t,r);let l=_e.getOwnPropertyDescriptor(e,s);if(l&&!l.configurable)return;Qe||(Qe=new Ge),Qe.has(e)||Qe.set(e,new Ue);let c=Qe.get(e);if(c.has(s))return void c.get(s).set(t,r);let u=new Ue([[t,r]]);c.set(s,u),_e.defineProperty(e,s,{get:()=>a,set(e){if(a=e,a&&("object"==typeof a||"function"==typeof a))for(let[e,t]of u)et(a,e,t)},configurable:n})}function tt(e){let t=Ke();Ke(((...r)=>{let n=r.length&&r[0];return!("string"!=typeof n||!je(n).includes(e))||("function"==typeof t?o(t,this,r):void 0)}))}function rt(e,t,r,n=!0){let o=De(e);if(!r)return void o("no property to abort on read");let i=Fe();o(`aborting on ${r} access`),et(t,r,{get:function(){throw o(`${r} access aborted`),new Xe(i)},set(){}},n),tt(i)}function nt(e,t,r,n=!0){let o=De(e);if(!r)return void o("no property to abort on write");let i=Fe();o(`aborting when setting ${r}`),et(t,r,{set:function(){throw o(`setting ${r} aborted`),new Xe(i)}},n),tt(i)}function ot(e,t=!1,r=!1){let n=Je.abortedIframes,i=Je.iframePropertiesToAbort;for(let o of Ve.from(window.frames))if(n.has(o))for(let i of e)t&&n.get(o).read.add(i),r&&n.get(o).write.add(i);for(let n of e)t&&i.read.add(n),r&&i.write.add(n);function a(){for(let e of Ve.from(window.frames)){n.has(e)||n.set(e,{read:new qe(i.read),write:new qe(i.write)});let t=n.get(e).read;if(t.size>0){let r=Ve.from(t);t.clear();for(let t of r)rt("abort-on-iframe-property-read",e,t)}let r=n.get(e).write;if(r.size>0){let t=Ve.from(r);r.clear();for(let r of t)nt("abort-on-iframe-property-write",e,r)}}}a(),n.has(document)||(n.set(document,!0),function(e){let t;function r(e,t){for(let r of t){et(e,r,n(e,r))}}function n(t,r){let n=t[r];return{get:()=>function(...t){let r;return r=o(n,this,t),e&&e(),r}}}function i(t,r){let n=_e.getOwnPropertyDescriptor(t,r),{set:o}=n||{};return{set(t){let r;return r=s(o,this,t),e&&e(),r}}}r(Ye,["appendChild","insertBefore","replaceChild"]),r(Ze,["append","prepend","replaceWith","after","before","insertAdjacentElement","insertAdjacentHTML"]),t=i(Ze,"innerHTML"),et(Ze,"innerHTML",t),t=i(Ze,"outerHTML"),et(Ze,"outerHTML",t)}(a))}let{Object:it}=window;function st(e,t){if(!(e instanceof it))return;let r=e,n=je(t).split(".");if(0===n.length)return;for(let e=0;e{};case"trueFunc":return()=>!0;case"falseFunc":return()=>!1;case"emptyArray":return[];case"emptyObj":return{};case"undefined":return;case"":return e;default:if(at.test(e))return Ie(e);throw new Be(`[override-property-read snippet]: Value "${e}" is not valid.`)}}let{HTMLScriptElement:ct,Object:ut,ReferenceError:ft}=je(window),pt=ut.getPrototypeOf(ct);let{Error:dt}=je(window),{cookie:ht}=Le(document);let{document:wt,getComputedStyle:gt,isExtensionContext:yt,variables:mt,Array:bt,MutationObserver:vt,Object:Et,XPathEvaluator:St,XPathExpression:Mt,XPathResult:Tt}=je(window),{querySelectorAll:xt}=wt,Ot=xt&&i(xt,wt);const{assign:Pt,setPrototypeOf:jt}=Et;class Nt extends Mt{evaluate(...e){return jt(o(super.evaluate,this,e),Tt.prototype)}}class Lt extends St{createExpression(...e){return jt(o(super.createExpression,this,e),Nt.prototype)}}function kt(e){if(mt.hidden.has(e))return;!function(e){yt&&"function"==typeof checkElement&&checkElement(e)}(e),mt.hidden.add(e);let{style:t}=je(e),r=je(t,"CSSStyleDeclaration"),n=je([]),{debugCSSProperties:o}=S;for(let[e,t]of o||[["display","none"]])r.setProperty(e,t,"important"),n.push([e,r.getPropertyValue(e)]);new vt((()=>{for(let[e,t]of n){let n=r.getPropertyValue(e),o=r.getPropertyPriority(e);n==t&&"important"==o||r.setProperty(e,t,"important")}})).observe(e,{attributes:!0,attributeFilter:["style"]})}function Ct(e){let t=e;if(t.startsWith("xpath(")&&t.endsWith(")")){let t=function(e){let t=e;if(t.startsWith("xpath(")&&t.endsWith(")")){let e=t.slice(6,-1),r=(new Lt).createExpression(e,null),n=Tt.ORDERED_NODE_SNAPSHOT_TYPE;return e=>{if(!e)return;let t=r.evaluate(wt,n,null),{snapshotLength:o}=t;for(let r=0;rOt(e).forEach(t)}(e);return()=>{let e=je([]);return t((t=>e.push(t))),e}}return()=>bt.from(Ot(e))}let{ELEMENT_NODE:At,TEXT_NODE:Wt,prototype:$t}=Node,{prototype:Dt}=Element,{prototype:Ht}=HTMLElement,{console:zt,variables:Rt,DOMParser:Ft,Error:It,MutationObserver:Jt,Object:Vt,ReferenceError:Bt}=je(window),{getOwnPropertyDescriptor:Ut}=Vt;function _t(e,t){return We}je(window);const{Map:Xt,MutationObserver:qt,Object:Gt,Set:Kt,WeakSet:Yt}=je(window);let Zt=Element.prototype,{attachShadow:Qt}=Zt,er=new Yt,tr=new Xt,rr=null;const{Error:nr,JSON:or,Map:ir,Object:sr}=je(window);let ar=null;let{Error:lr,JSON:cr,Map:ur,Object:fr}=je(window),pr=null;let{Error:dr}=je(window);let{Error:hr,Map:wr,Object:gr,console:yr}=je(window),{toString:mr}=Function.prototype,br=EventTarget.prototype,{addEventListener:vr}=br,Er=null;let Sr,{URL:Mr,fetch:Tr}=je(window),{delete:xr,has:Or}=l(URLSearchParams.prototype);const Pr={"abort-current-inline-script":function(e,t=null){const r=De("abort-current-inline-script"),n=t?Re(t):null,o=Fe(),i=je(document).currentScript;let a=window;const l=je(e).split("."),c=je(l).pop();for(let e of je(l))if(a=a[e],!a||"object"!=typeof a&&"function"!=typeof a)return void r(l," is not found");const{get:u,set:f}=ut.getOwnPropertyDescriptor(a,c)||{};let p=a[c];void 0===p&&r("The property",c,"doesn't exist yet. Check typos.");const d=()=>{const e=je(document).currentScript;if(e instanceof pt&&""==je(e,"HTMLScriptElement").src&&e!=i&&(!n||n.test(je(e).textContent)))throw r(l," is aborted \n",e),new ft(o)};et(a,c,{get(){return d(),u?s(u,this):p},set(e){d(),f?s(f,this,e):p=e}}),tt(o)},"abort-on-iframe-property-read":function(...e){ot(e,!0,!1)},"abort-on-iframe-property-write":function(...e){ot(e,!1,!0)},"abort-on-property-read":function(e,t){rt("abort-on-property-read",window,e,!("false"===t))},"abort-on-property-write":function(e,t){nt("abort-on-property-write",window,e,!("false"===t))},"cookie-remover":function(e){if(!e)throw new dt("[cookie-remover snippet]: No cookie to remove.");let t=De("cookie-remover"),r=Re(e);if(je(/^http|^about/).test(location.protocol)){t("Parsing cookies for matches");for(const e of je(je(ht()).split(";").filter((e=>r.test(je(e).split("=")[0]))))){let r=je(location.hostname),n=je(e).split("=")[0],o="expires=Thu, 01 Jan 1970 00:00:00 GMT",i="path=/",s="domain="+r.slice(r.indexOf(".")+1);ht(`${je(n).trim()}=;${o};${i};${s}`),t(`Set expiration date on ${n}`)}}else t("Snippet only works for http or https and about.")},debug:function(){ke=!0},"freeze-element":function(e,t="",...r){let n,i,a=!1,l=!1,c=je(r).filter((e=>!h(e))),u=je(r).filter((e=>h(e))).map(Re),f=Fe(),p=Ct(e);!function(){let r=je(t).split("+");1===r.length&&""===r[0]&&(r=[]);for(let t of r)switch(t){case"subtree":a=!0;break;case"abort":l=!0;break;default:throw new It("[freeze] Unknown option passed to the snippet. [selector]: "+e+" [option]: "+t)}}();let d={selector:e,shouldAbort:l,rid:f,exceptionSelectors:c,regexExceptions:u,changeId:0};function h(e){return e.length>=2&&"/"==e[0]&&"/"==e[e.length-1]}function w(){i=p(),g(i,!1)}function g(e,t=!0){for(let r of e)Rt.frozen.has(r)||(Rt.frozen.set(r,d),!t&&a&&new Jt((e=>{for(let t of je(e))g(je(t,"MutationRecord").addedNodes)})).observe(r,{childList:!0,subtree:!0}),a&&je(r).nodeType===At&&g(je(r).childNodes))}function y(e,...t){$e(`[freeze][${e}] `,...t)}function m(e,t,r,n){let o=n.selector,i=n.changeId,s="string"==typeof e,a=n.shouldAbort?"aborting":"watching";switch(zt.groupCollapsed(`[freeze][${i}] ${a}: ${o}`),r){case"appendChild":case"append":case"prepend":case"insertBefore":case"replaceChild":case"insertAdjacentElement":case"insertAdjacentHTML":case"insertAdjacentText":case"innerHTML":case"outerHTML":y(i,s?"text: ":"node: ",e),y(i,"added to node: ",t);break;case"replaceWith":case"after":case"before":y(i,s?"text: ":"node: ",e),y(i,"added to node: ",je(t).parentNode);break;case"textContent":case"innerText":case"nodeValue":y(i,"content of node: ",t),y(i,"changed to: ",e)}y(i,`using the function "${r}"`),zt.groupEnd(),n.changeId++}function b(e,t){if(t)for(let r of t)if(r.test(e))return!0;return!1}function v(e){throw new Bt(e)}function E(e,t,r,n){let o=new Ft,{body:i}=je(o.parseFromString(e,"text/html")),s=S(je(i).childNodes,t,r,n);return je(s).map((e=>{switch(je(e).nodeType){case At:return je(e).outerHTML;case Wt:return je(e).textContent;default:return""}})).join("")}function S(e,t,r,n){let o=je([]);for(let i of e)M(i,t,r,n)&&o.push(i);return o}function M(e,t,r,n){let o=n.shouldAbort,i=n.regexExceptions,s=n.exceptionSelectors,a=n.rid;if("string"==typeof e){let s=e;return!!b(s,i)||(Ce()&&m(s,t,r,n),o&&v(a),Ce())}let l=e;switch(je(l).nodeType){case At:return!!function(e,t){if(t){let r=je(e);for(let e of t)if(r.matches(e))return!0}return!1}(l,s)||(o&&(Ce()&&m(l,t,r,n),v(a)),!!Ce()&&(kt(l),m(l,t,r,n),!0));case Wt:return!!b(je(l).textContent,i)||(Ce()&&m(l,t,r,n),o&&v(a),!1);default:return!0}}function T(e,t,r,n){let i=Ut(e,t)||{},a=i.get&&s(i.get,e)||i.value;if(a)return{get:()=>function(...e){if(r(this)){let r=n(this);if(r){let n=e[0];if(!M(n,this,t,r))return n}}return o(a,this,e)}}}function x(e,t,r,n){let i=Ut(e,t)||{},a=i.get&&s(i.get,e)||i.value;if(a)return{get:()=>function(...e){if(!r(this))return o(a,this,e);let i=n(this);if(!i)return o(a,this,e);let s=S(e,this,t,i);return s.length>0?o(a,this,s):void 0}}}function O(e,t,r,n){let i=Ut(e,t)||{},a=i.get&&s(i.get,e)||i.value;if(a)return{get:()=>function(...e){let[i,l]=e,c="afterbegin"===i||"beforeend"===i;if(r(this,c)){let e=n(this,c);if(e){let r,n=c?this:je(this).parentNode;switch(t){case"insertAdjacentElement":if(!M(l,n,t,e))return l;break;case"insertAdjacentHTML":return r=E(l,n,t,e),r?s(a,this,i,r):void 0;case"insertAdjacentText":if(!M(l,n,t,e))return}}}return o(a,this,e)}}}function P(e,t,r,n){let o=Ut(e,t)||{},{set:i}=o;if(i)return{set(e){if(!r(this))return s(i,this,e);let o=n(this);if(!o)return s(i,this,e);let a=E(e,this,t,o);return a?s(i,this,a):void 0}}}function j(e,t,r,n){let o=Ut(e,t)||{},{set:i}=o;if(i)return{set(e){if(!r(this))return s(i,this,e);let o=n(this);return o?M(e,this,t,o)?s(i,this,e):void 0:s(i,this,e)}}}Rt.frozen.has(document)||(Rt.frozen.set(document,!0),function(){let e;function t(e){return e&&Rt.frozen.has(e)}function r(e){try{return e&&(Rt.frozen.has(e)||Rt.frozen.has(je(e).parentNode))}catch(e){return!1}}function n(e,t){try{return e&&(Rt.frozen.has(e)&&t||Rt.frozen.has(je(e).parentNode)&&!t)}catch(e){return!1}}function o(e){return Rt.frozen.get(e)}function i(e){try{if(Rt.frozen.has(e))return Rt.frozen.get(e);let t=je(e).parentNode;return Rt.frozen.get(t)}catch(e){}}function s(e,t){try{if(Rt.frozen.has(e)&&t)return Rt.frozen.get(e);let r=je(e).parentNode;return Rt.frozen.get(r)}catch(e){}}e=T($t,"appendChild",t,o),et($t,"appendChild",e),e=T($t,"insertBefore",t,o),et($t,"insertBefore",e),e=T($t,"replaceChild",t,o),et($t,"replaceChild",e),e=x(Dt,"append",t,o),et(Dt,"append",e),e=x(Dt,"prepend",t,o),et(Dt,"prepend",e),e=x(Dt,"replaceWith",r,i),et(Dt,"replaceWith",e),e=x(Dt,"after",r,i),et(Dt,"after",e),e=x(Dt,"before",r,i),et(Dt,"before",e),e=O(Dt,"insertAdjacentElement",n,s),et(Dt,"insertAdjacentElement",e),e=O(Dt,"insertAdjacentHTML",n,s),et(Dt,"insertAdjacentHTML",e),e=O(Dt,"insertAdjacentText",n,s),et(Dt,"insertAdjacentText",e),e=P(Dt,"innerHTML",t,o),et(Dt,"innerHTML",e),e=P(Dt,"outerHTML",r,i),et(Dt,"outerHTML",e),e=j($t,"textContent",t,o),et($t,"textContent",e),e=j(Ht,"innerText",t,o),et(Ht,"innerText",e),e=j($t,"nodeValue",t,o),et($t,"nodeValue",e)}()),n=new Jt(w),n.observe(document,{childList:!0,subtree:!0}),w()},"hide-if-shadow-contains":function(e,t="*"){let r=`${e}\\${t}`;tr.has(r)||tr.set(r,[Re(e),t,_t()]);const n=De("hide-if-shadow-contain");rr||(rr=new qt((e=>{let t=new Kt;for(let{target:r}of je(e)){let e=je(r).parentNode;for(;e;)[r,e]=[e,je(r).parentNode];if(!er.has(r)&&!t.has(r)){t.add(r);for(let[e,t,o]of tr.values())if(e.test(je(r).textContent)){let e=je(r.host).closest(t);e&&(o(),je(r).appendChild(document.createElement("style")).textContent=":host {display: none !important}",kt(e),er.add(r),n("Hiding: ",e," for params: ",...arguments))}}}})),Gt.defineProperty(Zt,"attachShadow",{value:c(Qt,(function(){let e=o(Qt,this,arguments);return n("attachShadow is called for: ",e),rr.observe(e,{childList:!0,characterData:!0,subtree:!0}),e}))}))},"json-override":function(e,t,r="",n=""){if(!e)throw new nr("[json-override snippet]: Missing paths to override.");if(void 0===t)throw new nr("[json-override snippet]: No value to override with.");if(!ar){let e=De("json-override"),{parse:t}=or;ar=new ir,sr.defineProperty(window.JSON,"parse",{value:c(t,(function(r){let n=o(t,this,arguments);for(let{prune:t,needle:o,filter:i,value:s}of ar.values())if(!i||i.test(r)){if(je(o).some((e=>!st(n,e))))return n;for(let r of t){let t=st(n,r);void 0!==t&&(e(`Found ${r} replaced it with ${s}`),t[0][t[1]]=lt(s))}}return n}))}),e("Wrapped JSON.parse for override")}ar.set(e,{prune:je(e).split(/ +/),needle:r.length?je(r).split(/ +/):[],filter:n?Re(n):null,value:t})},"json-prune":function(e,t=""){if(!e)throw new lr("Missing paths to prune");if(!pr){let e=De("json-prune"),{parse:t}=cr;pr=new ur,fr.defineProperty(window.JSON,"parse",{value:c(t,(function(){let r=o(t,this,arguments);for(let{prune:t,needle:n}of pr.values()){if(je(n).some((e=>!st(r,e))))return r;for(let n of t){let t=st(r,n);void 0!==t&&(e(`Found ${n} and deleted`),delete t[0][t[1]])}}return r}))}),e("Wrapped JSON.parse for prune")}pr.set(e,{prune:je(e).split(/ +/),needle:t.length?je(t).split(/ +/):[]})},"override-property-read":function(e,t){if(!e)throw new dr("[override-property-read snippet]: No property to override.");if(void 0===t)throw new dr("[override-property-read snippet]: No value to override with.");let r=De("override-property-read"),n=lt(t);r(`Overriding ${e}.`),et(window,e,{get:()=>(r(`${e} override done.`),n),set(){}})},"prevent-listener":function(e,t,r){if(!e)throw new hr("[prevent-listener snippet]: No event type.");if(!Er){Er=new wr;let e=De("[prevent]");gr.defineProperty(br,"addEventListener",{value:c(vr,(function(t,r){for(let{evt:n,handlers:o,selectors:i}of Er.values()){if(!n.test(t))continue;let a=this instanceof Element;for(let l=0;lc.test(s(mr,"function"==typeof r?r:r.handleEvent));if((!c||f())&&(!u||a&&je(this).matches(u)))return void(Ce()&&(yr.groupCollapsed("DEBUG [prevent] was successful"),e(`type: ${t} matching ${n}`),e("handler:",r),c&&e(`matching ${c}`),u&&e("on element: ",this,` matching ${u}`),e("was prevented from being added"),yr.groupEnd()))}}return o(vr,this,arguments)}))}),e("Wrapped addEventListener")}Er.has(e)||Er.set(e,{evt:Re(e),handlers:[],selectors:[]});let{handlers:n,selectors:i}=Er.get(e);n.push(t?Re(t):null),i.push(r)},"strip-fetch-query-parameter":function(e,t=null){const r=De("strip-fetch-query-parameter");Sr||(Sr=new Map,window.fetch=c(Tr,((...e)=>{let[t]=e;if("string"==typeof t){let n=new Mr(t);for(let[o,i]of Sr)i&&!i.test(t)||Or(n.searchParams,o)&&(r(`${o} has been stripped from url ${t}`),xr(n.searchParams,o),e[0]=n.href)}return o(Tr,self,e)}))),Sr.set(e,t&&Re(t))},trace:function(...e){o($e,null,e)}}; -+const snippets=Pr; ++const e=Proxy,{apply:t,bind:n,call:r}=Function,o=r.bind(t),i=r.bind(n),s=r.bind(r),a={get:(e,t)=>i(r,e[t])},c=t=>new e(t,a),l=(t,n)=>new e(t,{apply:(e,t,r)=>o(n,t,r)}),u={get:(e,t)=>i(e[t],e)},f=t=>new e(t,u),{assign:p,defineProperties:d,freeze:h,getOwnPropertyDescriptor:w,getOwnPropertyDescriptors:g,getPrototypeOf:y}=f(Object),{hasOwnProperty:m}=c({}),{species:b}=Symbol,v={get(e,t){const n=e[t];class r extends n{}const o=g(n.prototype);delete o.constructor,h(d(r.prototype,o));const i=g(n);return delete i.length,delete i.prototype,i[b]={value:r},h(d(r,i))}},S=t=>new e(t,v),E="undefined"!=typeof environment?environment:{};"undefined"==typeof globalThis&&(window.globalThis=window);const{apply:x,ownKeys:M}=f(Reflect),T="world"in E,O=T&&"ISOLATED"===E.world,j=T&&"MAIN"===E.world,P="object"==typeof chrome&&!!chrome.runtime,N="object"==typeof browser&&!!browser.runtime,k=!j&&(O||P||N),C=e=>k?e:$(e,D(e)),{create:$,defineProperties:L,defineProperty:A,freeze:W,getOwnPropertyDescriptor:R,getOwnPropertyDescriptors:D}=f(Object),H=f(globalThis),z=k?globalThis:S(globalThis),{Map:I,RegExp:F,Set:B,WeakMap:J,WeakSet:V}=z,U=(e,t,n=null)=>{const r=M(t);for(const o of M(e)){if(r.includes(o))continue;const i=R(e,o);if(n&&"value"in i){const{value:e}=i;"function"==typeof e&&(i.value=n(e))}A(t,o,i)}},q=e=>{const t=z[e];class n extends t{}const{toString:r,valueOf:o}=t.prototype;L(n.prototype,{toString:{value:r},valueOf:{value:o}});const i=e.toLowerCase(),s=e=>function(){const t=x(e,this,arguments);return typeof t===i?new n(t):t};return U(t,n,s),U(t.prototype,n.prototype,s),n},_=W({frozen:new J,hidden:new V,iframePropertiesToAbort:{read:new B,write:new B},abortedIframes:new J}),G=new F("^[A-Z]");var X=new Proxy(new I([["chrome",k&&(P&&chrome||N&&browser)||void 0],["isExtensionContext",k],["variables",_],["console",C(console)],["document",globalThis.document],["performance",C(performance)],["JSON",C(JSON)],["Map",I],["Math",C(Math)],["Number",k?Number:q("Number")],["RegExp",F],["Set",B],["String",k?String:q("String")],["WeakMap",J],["WeakSet",V],["MouseEvent",MouseEvent]]),{get(e,t){if(e.has(t))return e.get(t);let n=globalThis[t];return"function"==typeof n&&(n=(G.test(t)?z:H)[t]),e.set(t,n),n},has:(e,t)=>e.has(t)});const K={WeakSet:WeakSet,WeakMap:WeakMap,WeakValue:class{has(){return!1}set(){}}},{apply:Y}=Reflect;const{Map:Z,WeakMap:Q,WeakSet:ee,setTimeout:te}=X;let ne=!0,re=e=>{e.clear(),ne=!ne};var oe=function(e){const{WeakSet:t,WeakMap:n,WeakValue:r}=this||K,o=new t,i=new n,s=new r;return function(t){if(o.has(t))return t;if(i.has(t))return i.get(t);if(s.has(t))return s.get(t);const n=Y(e,this,arguments);return o.add(n),n!==t&&("object"==typeof t&&t?i:s).set(t,n),n}}.bind({WeakMap:Q,WeakSet:ee,WeakValue:class extends Z{set(e,t){return ne&&(ne=!ne,te(re,0,this)),super.set(e,t)}}});const{concat:ie,includes:se,join:ae,reduce:ce,unshift:le}=c([]),ue=S(globalThis),{Map:fe,WeakMap:pe}=ue,de=new fe,he=t=>{const n=(e=>{const t=[];let n=e;for(;n;){if(de.has(n))le(t,de.get(n));else{const e=g(n);de.set(n,e),le(t,e)}n=y(n)}return le(t,{}),o(p,null,t)})("function"==typeof t?t.prototype:t),r={get(e,t){if(t in n){const{value:r,get:o}=n[t];if(o)return s(o,e);if("function"==typeof r)return i(r,e)}return e[t]},set(e,t,r){if(t in n){const{set:o}=n[t];if(o)return s(o,e,r),!0}return e[t]=r,!0}};return t=>new e(t,r)},{isExtensionContext:we,Array:ge,Number:ye,String:me,Object:be}=X,{isArray:ve}=ge,{getOwnPropertyDescriptor:Se,setPrototypeOf:Ee}=be,{toString:xe}=be.prototype,{slice:Me}=me.prototype,{get:Te}=Se(Node.prototype,"nodeType"),Oe=we?{}:{Attr:he(Attr),CanvasRenderingContext2D:he(CanvasRenderingContext2D),CSSStyleDeclaration:he(CSSStyleDeclaration),Document:he(Document),Element:he(Element),HTMLCanvasElement:he(HTMLCanvasElement),HTMLElement:he(HTMLElement),HTMLImageElement:he(HTMLImageElement),HTMLScriptElement:he(HTMLScriptElement),MutationRecord:he(MutationRecord),Node:he(Node),ShadowRoot:he(ShadowRoot),get CSS2Properties(){return Oe.CSSStyleDeclaration}},je=(e,t)=>{if("Element"!==t&&t in Oe)return Oe[t](e);if(ve(e))return Ee(e,ge.prototype);const n=(e=>s(Me,s(xe,e),8,-1))(e);if(n in Oe)return Oe[n](e);if(n in X)return Ee(e,X[n].prototype);if("nodeType"in e)switch(s(Te,e)){case 1:if(!(t in Oe))throw new Error("unknown hint "+t);return Oe[t](e);case 2:return Oe.Attr(e);case 3:return Oe.Node(e);case 9:return Oe.Document(e)}throw new Error("unknown brand "+n)};var Pe=we?e=>e===window||e===globalThis?X:e:oe(((e,t="Element")=>{if(e===window||e===globalThis)return X;switch(typeof e){case"object":return e&&je(e,t);case"string":return new me(e);case"number":return new ye(e);default:throw new Error("unsupported value")}}));const Ne={get(e,t){const n=e;for(;!m(e,t);)e=y(e);const{get:r,set:i}=w(e,t);return function(){return arguments.length?o(i,n,arguments):s(r,n)}}},ke=t=>new e(t,Ne);let Ce=!1;function $e(){return Ce}const{console:Le}=Pe(window),Ae=()=>{};function We(...e){if($e()){const t=["%c DEBUG","font-weight: bold;"],n=e.indexOf("error"),r=e.indexOf("warn"),o=e.indexOf("success"),i=e.indexOf("info");-1!==n?(t[0]+=" - ERROR",t[1]+="color: red; border:2px solid red",Pe(e).splice(n,1)):-1!==r?(t[0]+=" - WARNING",t[1]+="color: orange; border:2px solid orange ",Pe(e).splice(r,1)):-1!==o?(t[0]+=" - SUCCESS",t[1]+="color: green; border:2px solid green",Pe(e).splice(o,1)):-1!==i&&(t[1]+="color: black;",Pe(e).splice(i,1)),Pe(e).unshift(...t)}Le.log(...e)}function Re(e){return i($e()?We:Ae,null,e)}let{Math:De,RegExp:He}=Pe(window);function ze(e){let{length:t}=e;if(t>1&&"/"===e[0]){let n="/"===e[t-1];if(n||t>2&&Pe(e).endsWith("/i")){let t=[Pe(e).slice(1,n?-1:-2)];return n||t.push("i"),new He(...t)}}return new He(Pe(e).replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))}function Ie(){return Pe(De.floor(2116316160*De.random()+60466176)).toString(36)}let{parseFloat:Fe,variables:Be,Array:Je,Error:Ve,Map:Ue,Object:qe,ReferenceError:_e,Set:Ge,WeakMap:Xe}=Pe(window),{onerror:Ke}=ke(window),Ye=Node.prototype,Ze=Element.prototype,Qe=null;function et(e,t,n,r=!0){let o=Pe(t),i=o.indexOf(".");if(-1==i){let o=qe.getOwnPropertyDescriptor(e,t);if(o&&!o.configurable)return;let i=qe.assign({},n,{configurable:r});if(!o&&!i.get&&i.set){let n=e[t];i.get=()=>n}return void qe.defineProperty(e,t,i)}let s=o.slice(0,i).toString();t=o.slice(i+1).toString();let a=e[s];!a||"object"!=typeof a&&"function"!=typeof a||et(a,t,n);let c=qe.getOwnPropertyDescriptor(e,s);if(c&&!c.configurable)return;Qe||(Qe=new Xe),Qe.has(e)||Qe.set(e,new Ue);let l=Qe.get(e);if(l.has(s))return void l.get(s).set(t,n);let u=new Ue([[t,n]]);l.set(s,u),qe.defineProperty(e,s,{get:()=>a,set(e){if(a=e,a&&("object"==typeof a||"function"==typeof a))for(let[e,t]of u)et(a,e,t)},configurable:r})}function tt(e){let t=Ke();Ke(((...n)=>{let r=n.length&&n[0];return!("string"!=typeof r||!Pe(r).includes(e))||("function"==typeof t?o(t,this,n):void 0)}))}function nt(e,t,n,r=!0){let o=Re(e);if(!n)return void o("error","no property to abort on read");let i=Ie();o("info",`aborting on ${n} access`),et(t,n,{get:function(){throw o("success",`${n} access aborted`),new _e(i)},set(){}},r),tt(i)}function rt(e,t,n,r=!0){let o=Re(e);if(!n)return void o("error","no property to abort on write");let i=Ie();o("info",`aborting when setting ${n}`),et(t,n,{set:function(){throw o("success",`setting ${n} aborted`),new _e(i)}},r),tt(i)}function ot(e,t=!1,n=!1){let r=Be.abortedIframes,i=Be.iframePropertiesToAbort;for(let o of Je.from(window.frames))if(r.has(o))for(let i of e)t&&r.get(o).read.add(i),n&&r.get(o).write.add(i);for(let r of e)t&&i.read.add(r),n&&i.write.add(r);function a(){for(let e of Je.from(window.frames)){r.has(e)||r.set(e,{read:new Ge(i.read),write:new Ge(i.write)});let t=r.get(e).read;if(t.size>0){let n=Je.from(t);t.clear();for(let t of n)nt("abort-on-iframe-property-read",e,t)}let n=r.get(e).write;if(n.size>0){let t=Je.from(n);n.clear();for(let n of t)rt("abort-on-iframe-property-write",e,n)}}}a(),r.has(document)||(r.set(document,!0),function(e){let t;function n(e,t){for(let n of t){et(e,n,r(e,n))}}function r(t,n){let r=t[n];return{get:()=>function(...t){let n;return n=o(r,this,t),e&&e(),n}}}function i(t,n){let r=qe.getOwnPropertyDescriptor(t,n),{set:o}=r||{};return{set(t){let n;return n=s(o,this,t),e&&e(),n}}}n(Ye,["appendChild","insertBefore","replaceChild"]),n(Ze,["append","prepend","replaceWith","after","before","insertAdjacentElement","insertAdjacentHTML"]),t=i(Ze,"innerHTML"),et(Ze,"innerHTML",t),t=i(Ze,"outerHTML"),et(Ze,"outerHTML",t)}(a))}let{Object:it}=window;function st(e,t){if(!(e instanceof it))return;let n=e,r=Pe(t).split(".");if(0===r.length)return;for(let e=0;e{};case"trueFunc":return()=>!0;case"falseFunc":return()=>!1;case"emptyArray":return[];case"emptyObj":return{};case"undefined":return;case"":return e;default:if(at.test(e))return Fe(e);throw new Ve(`[override-property-read snippet]: Value "${e}" is not valid.`)}}let{HTMLScriptElement:lt,Object:ut,ReferenceError:ft}=Pe(window),pt=ut.getPrototypeOf(lt);let{Error:dt,URL:ht}=Pe(window),{cookie:wt}=ke(document);let{console:gt,document:yt,getComputedStyle:mt,isExtensionContext:bt,variables:vt,Array:St,MutationObserver:Et,Object:xt,XPathEvaluator:Mt,XPathExpression:Tt,XPathResult:Ot}=Pe(window);const{querySelectorAll:jt}=yt,Pt=jt&&i(jt,yt);function Nt(e,t=!1){return $t(e,Pt.bind(yt),yt,t)}function kt(e,t,n,r){const o=t.getAttribute("xlink:href")||t.getAttribute("href");if(o){const s=Pt(o)[0];if(!s&&$e())return gt.log("No elements found matching",o),!1;if(!(i=e)||0===i.length||i.every((e=>""===e.trim()))){const e=r.length>0?r:[];return n.push({element:s,rootParents:[...e,t]}),!1}const a=s.querySelectorAll.bind(s);return{nextBoundElement:s,nestedSelectorsString:e.join("^^"),next$$:a}}var i}function Ct(e,t){const n=function(e,t=!1){try{const n=navigator.userAgent.includes("Firefox")?e.openOrClosedShadowRoot:browser.dom.openOrClosedShadowRoot(e);return null===n&&$e()&&!t&>.log("Shadow root not found or not added in element yet",e),n}catch(n){return $e()&&!t&>.log("Error while accessing shadow root",e,n),null}}(t);if(n){const{querySelectorAll:r}=n,o=r&&i(r,n).bind(n);return{nextBoundElement:t,nestedSelectorsString:":host "+e.join("^^"),next$$:o}}return!1}function $t(e,t,n,r,o=[]){if(e.includes("^^")){const[i,s,...a]=e.split("^^");let c,l;switch(s){case"svg":l=kt;break;case"sh":l=Ct;break;default:return $e()&>.log(s," is not supported. Supported commands are: \n^^sh^^\n^^svg^^"),[]}c=""===i.trim()?[n]:t(i);const u=[];for(const e of c){const t=l(a,e,u,o);if(!t)continue;const{next$$:n,nestedSelectorsString:i,nextBoundElement:s}=t,c=$t(i,n,s,r,[...o,e]);c&&u.push(...c)}return u}const i=t(e);return r?[...i].map((e=>({element:e,rootParents:o.length>0?o:[]}))):i}const{assign:Lt,setPrototypeOf:At}=xt;class Wt extends Tt{evaluate(...e){return At(o(super.evaluate,this,e),Ot.prototype)}}class Rt extends Mt{createExpression(...e){return At(o(super.createExpression,this,e),Wt.prototype)}}function Dt(e){if(vt.hidden.has(e))return!1;!function(e){bt&&"function"==typeof checkElement&&checkElement(e)}(e),vt.hidden.add(e);let{style:t}=Pe(e),n=Pe(t,"CSSStyleDeclaration"),r=Pe([]),{debugCSSProperties:o}=E;for(let[e,t]of o||[["display","none"]])n.setProperty(e,t,"important"),r.push([e,n.getPropertyValue(e)]);return new Et((()=>{for(let[e,t]of r){let r=n.getPropertyValue(e),o=n.getPropertyPriority(e);r==t&&"important"==o||n.setProperty(e,t,"important")}})).observe(e,{attributes:!0,attributeFilter:["style"]}),!0}function Ht(e){let t=e;if(t.startsWith("xpath(")&&t.endsWith(")")){let t=function(e){let t=e;if(t.startsWith("xpath(")&&t.endsWith(")")){let e=t.slice(6,-1),n=(new Rt).createExpression(e,null),r=Ot.ORDERED_NODE_SNAPSHOT_TYPE;return e=>{if(!e)return;let t=n.evaluate(yt,r,null),{snapshotLength:o}=t;for(let n=0;nNt(e).forEach(t)}(e);return()=>{let e=Pe([]);return t((t=>e.push(t))),e}}return()=>St.from(Nt(e))}let{ELEMENT_NODE:zt,TEXT_NODE:It,prototype:Ft}=Node,{prototype:Bt}=Element,{prototype:Jt}=HTMLElement,{console:Vt,variables:Ut,DOMParser:qt,Error:_t,MutationObserver:Gt,Object:Xt,ReferenceError:Kt}=Pe(window),{getOwnPropertyDescriptor:Yt}=Xt;Pe(window);const{Map:Zt,MutationObserver:Qt,Object:en,Set:tn,WeakSet:nn}=Pe(window);let rn=Element.prototype,{attachShadow:on}=rn,sn=new nn,an=new Zt,cn=null;const{Error:ln,JSON:un,Map:fn,Response:pn,Object:dn}=Pe(window);let hn=null;let{Error:wn,JSON:gn,Map:yn,Object:mn,Response:bn}=Pe(window),vn=null;let{Error:Sn}=Pe(window);let{Error:En,Map:xn,Object:Mn,console:Tn}=Pe(window),{toString:On}=Function.prototype,jn=EventTarget.prototype,{addEventListener:Pn}=jn,Nn=null;let kn,{URL:Cn,fetch:$n}=Pe(window),{delete:Ln,has:An}=c(URLSearchParams.prototype);const Wn={"abort-current-inline-script":function(e,t=null){const n=Re("abort-current-inline-script"),r=t?ze(t):null,o=Ie(),i=Pe(document).currentScript;let a=window;const c=Pe(e).split("."),l=Pe(c).pop();for(let e of Pe(c))if(a=a[e],!a||"object"!=typeof a&&"function"!=typeof a)return void n("warn",c," is not found");const{get:u,set:f}=ut.getOwnPropertyDescriptor(a,l)||{};let p=a[l];void 0===p&&n("warn","The property",l,"doesn't exist yet. Check typos.");const d=()=>{const e=Pe(document).currentScript;if(e instanceof pt&&""==Pe(e,"HTMLScriptElement").src&&e!=i&&(!r||r.test(Pe(e).textContent)))throw n("success",c," is aborted \n",e),new ft(o)};et(a,l,{get(){return d(),u?s(u,this):p},set(e){d(),f?s(f,this,e):p=e}}),tt(o)},"abort-on-iframe-property-read":function(...e){ot(e,!0,!1)},"abort-on-iframe-property-write":function(...e){ot(e,!1,!0)},"abort-on-property-read":function(e,t){nt("abort-on-property-read",window,e,!("false"===t))},"abort-on-property-write":function(e,t){rt("abort-on-property-write",window,e,!("false"===t))},"cookie-remover":function(e,t=!1){if(!e)throw new dt("[cookie-remover snippet]: No cookie to remove.");let n=Re("cookie-remover"),r=ze(e);if(!Pe(/^http|^about/).test(location.protocol))return void n("warn","Snippet only works for http or https and about.");function o(){return Pe(wt()).split(";").filter((e=>r.test(Pe(e).split("=")[0])))}const i=()=>{n("info","Parsing cookies for matches");for(const e of Pe(o())){let t=Pe(location.hostname);!t&&Pe(location.ancestorOrigins)&&Pe(location.ancestorOrigins[0])&&(t=new ht(Pe(location.ancestorOrigins[0])).hostname);const r=Pe(e).split("=")[0],o="expires=Thu, 01 Jan 1970 00:00:00 GMT",i="path=/",s=t.split(".");for(let e=s.length;e>0;e--){const t=s.slice(s.length-e).join(".");wt(`${Pe(r).trim()}=;${o};${i};domain=${t}`),wt(`${Pe(r).trim()}=;${o};${i};domain=.${t}`),n("success",`Set expiration date on ${r}`)}}};if(i(),t){let e=o();setInterval((()=>{let t=o();if(t!==e)try{i()}finally{e=t}}),1e3)}},debug:function(){Ce=!0},"freeze-element":function(e,t="",...n){let r,i,a=!1,c=!1,l=Pe(n).filter((e=>!h(e))),u=Pe(n).filter((e=>h(e))).map(ze),f=Ie(),p=Ht(e);!function(){let n=Pe(t).split("+");1===n.length&&""===n[0]&&(n=[]);for(let t of n)switch(t){case"subtree":a=!0;break;case"abort":c=!0;break;default:throw new _t("[freeze] Unknown option passed to the snippet. [selector]: "+e+" [option]: "+t)}}();let d={selector:e,shouldAbort:c,rid:f,exceptionSelectors:l,regexExceptions:u,changeId:0};function h(e){return e.length>=2&&"/"==e[0]&&"/"==e[e.length-1]}function w(){i=p(),g(i,!1)}function g(e,t=!0){for(let n of e)Ut.frozen.has(n)||(Ut.frozen.set(n,d),!t&&a&&new Gt((e=>{for(let t of Pe(e))g(Pe(t,"MutationRecord").addedNodes)})).observe(n,{childList:!0,subtree:!0}),a&&Pe(n).nodeType===zt&&g(Pe(n).childNodes))}function y(e,...t){We(`[freeze][${e}] `,...t)}function m(e,t,n,r){let o=r.selector,i=r.changeId,s="string"==typeof e,a=r.shouldAbort?"aborting":"watching";switch(Vt.groupCollapsed(`[freeze][${i}] ${a}: ${o}`),n){case"appendChild":case"append":case"prepend":case"insertBefore":case"replaceChild":case"insertAdjacentElement":case"insertAdjacentHTML":case"insertAdjacentText":case"innerHTML":case"outerHTML":y(i,s?"text: ":"node: ",e),y(i,"added to node: ",t);break;case"replaceWith":case"after":case"before":y(i,s?"text: ":"node: ",e),y(i,"added to node: ",Pe(t).parentNode);break;case"textContent":case"innerText":case"nodeValue":y(i,"content of node: ",t),y(i,"changed to: ",e)}y(i,`using the function "${n}"`),Vt.groupEnd(),r.changeId++}function b(e,t){if(t)for(let n of t)if(n.test(e))return!0;return!1}function v(e){throw new Kt(e)}function S(e,t,n,r){let o=new qt,{body:i}=Pe(o.parseFromString(e,"text/html")),s=E(Pe(i).childNodes,t,n,r);return Pe(s).map((e=>{switch(Pe(e).nodeType){case zt:return Pe(e).outerHTML;case It:return Pe(e).textContent;default:return""}})).join("")}function E(e,t,n,r){let o=Pe([]);for(let i of e)x(i,t,n,r)&&o.push(i);return o}function x(e,t,n,r){let o=r.shouldAbort,i=r.regexExceptions,s=r.exceptionSelectors,a=r.rid;if("string"==typeof e){let s=e;return!!b(s,i)||($e()&&m(s,t,n,r),o&&v(a),$e())}let c=e;switch(Pe(c).nodeType){case zt:return!!function(e,t){if(t){let n=Pe(e);for(let e of t)if(n.matches(e))return!0}return!1}(c,s)||(o&&($e()&&m(c,t,n,r),v(a)),!!$e()&&(Dt(c),m(c,t,n,r),!0));case It:return!!b(Pe(c).textContent,i)||($e()&&m(c,t,n,r),o&&v(a),!1);default:return!0}}function M(e,t,n,r){let i=Yt(e,t)||{},a=i.get&&s(i.get,e)||i.value;if(a)return{get:()=>function(...e){if(n(this)){let n=r(this);if(n){let r=e[0];if(!x(r,this,t,n))return r}}return o(a,this,e)}}}function T(e,t,n,r){let i=Yt(e,t)||{},a=i.get&&s(i.get,e)||i.value;if(a)return{get:()=>function(...e){if(!n(this))return o(a,this,e);let i=r(this);if(!i)return o(a,this,e);let s=E(e,this,t,i);return s.length>0?o(a,this,s):void 0}}}function O(e,t,n,r){let i=Yt(e,t)||{},a=i.get&&s(i.get,e)||i.value;if(a)return{get:()=>function(...e){let[i,c]=e,l="afterbegin"===i||"beforeend"===i;if(n(this,l)){let e=r(this,l);if(e){let n,r=l?this:Pe(this).parentNode;switch(t){case"insertAdjacentElement":if(!x(c,r,t,e))return c;break;case"insertAdjacentHTML":return n=S(c,r,t,e),n?s(a,this,i,n):void 0;case"insertAdjacentText":if(!x(c,r,t,e))return}}}return o(a,this,e)}}}function j(e,t,n,r){let o=Yt(e,t)||{},{set:i}=o;if(i)return{set(e){if(!n(this))return s(i,this,e);let o=r(this);if(!o)return s(i,this,e);let a=S(e,this,t,o);return a?s(i,this,a):void 0}}}function P(e,t,n,r){let o=Yt(e,t)||{},{set:i}=o;if(i)return{set(e){if(!n(this))return s(i,this,e);let o=r(this);return o?x(e,this,t,o)?s(i,this,e):void 0:s(i,this,e)}}}Ut.frozen.has(document)||(Ut.frozen.set(document,!0),function(){let e;function t(e){return e&&Ut.frozen.has(e)}function n(e){try{return e&&(Ut.frozen.has(e)||Ut.frozen.has(Pe(e).parentNode))}catch(e){return!1}}function r(e,t){try{return e&&(Ut.frozen.has(e)&&t||Ut.frozen.has(Pe(e).parentNode)&&!t)}catch(e){return!1}}function o(e){return Ut.frozen.get(e)}function i(e){try{if(Ut.frozen.has(e))return Ut.frozen.get(e);let t=Pe(e).parentNode;return Ut.frozen.get(t)}catch(e){}}function s(e,t){try{if(Ut.frozen.has(e)&&t)return Ut.frozen.get(e);let n=Pe(e).parentNode;return Ut.frozen.get(n)}catch(e){}}e=M(Ft,"appendChild",t,o),et(Ft,"appendChild",e),e=M(Ft,"insertBefore",t,o),et(Ft,"insertBefore",e),e=M(Ft,"replaceChild",t,o),et(Ft,"replaceChild",e),e=T(Bt,"append",t,o),et(Bt,"append",e),e=T(Bt,"prepend",t,o),et(Bt,"prepend",e),e=T(Bt,"replaceWith",n,i),et(Bt,"replaceWith",e),e=T(Bt,"after",n,i),et(Bt,"after",e),e=T(Bt,"before",n,i),et(Bt,"before",e),e=O(Bt,"insertAdjacentElement",r,s),et(Bt,"insertAdjacentElement",e),e=O(Bt,"insertAdjacentHTML",r,s),et(Bt,"insertAdjacentHTML",e),e=O(Bt,"insertAdjacentText",r,s),et(Bt,"insertAdjacentText",e),e=j(Bt,"innerHTML",t,o),et(Bt,"innerHTML",e),e=j(Bt,"outerHTML",n,i),et(Bt,"outerHTML",e),e=P(Ft,"textContent",t,o),et(Ft,"textContent",e),e=P(Jt,"innerText",t,o),et(Jt,"innerText",e),e=P(Ft,"nodeValue",t,o),et(Ft,"nodeValue",e)}()),r=new Gt(w),r.observe(document,{childList:!0,subtree:!0}),w()},"hide-if-shadow-contains":function(e,t="*"){let n=`${e}\\${t}`;an.has(n)||an.set(n,[ze(e),t,Ae]);const r=Re("hide-if-shadow-contain");cn||(cn=new Qt((e=>{let t=new tn;for(let{target:n}of Pe(e)){let e=Pe(n).parentNode;for(;e;)[n,e]=[e,Pe(n).parentNode];if(!sn.has(n)&&!t.has(n)){t.add(n);for(let[e,t,o]of an.values())if(e.test(Pe(n).textContent)){let e=Pe(n.host).closest(t);e&&(o(),Pe(n).appendChild(document.createElement("style")).textContent=":host {display: none !important}",Dt(e),sn.add(n),r("success","Hiding: ",e," for params: ",...arguments))}}}})),en.defineProperty(rn,"attachShadow",{value:l(on,(function(){let e=o(on,this,arguments);return r("info","attachShadow is called for: ",e),cn.observe(e,{childList:!0,characterData:!0,subtree:!0}),e}))}))},"json-override":function(e,t,n="",r=""){if(!e)throw new ln("[json-override snippet]: Missing paths to override.");if(void 0===t)throw new ln("[json-override snippet]: No value to override with.");if(!hn){let i=Re("json-override");function s(e,t){for(let{prune:n,needle:r,filter:o,value:s}of hn.values())if(!o||o.test(t)){if(Pe(r).some((t=>!st(e,t))))return e;for(let t of n){let n=st(e,t);void 0!==n&&(i("success",`Found ${t} replaced it with ${s}`),n[0][n[1]]=ct(s))}}return e}let{parse:a}=un;hn=new fn,dn.defineProperty(window.JSON,"parse",{value:l(a,(function(e){return s(o(a,this,arguments),e)}))}),i("info","Wrapped JSON.parse for override");let{json:c}=pn.prototype;dn.defineProperty(window.Response.prototype,"json",{value:l(c,(function(e){return o(c,this,arguments).then((t=>s(t,e)))}))}),i("info","Wrapped Response.json for override")}hn.set(e,{prune:Pe(e).split(/ +/),needle:n.length?Pe(n).split(/ +/):[],filter:r?ze(r):null,value:t})},"json-prune":function(e,t=""){if(!e)throw new wn("Missing paths to prune");if(!vn){let n=Re("json-prune");function r(e){for(let{prune:t,needle:r}of vn.values()){if(Pe(r).some((t=>!st(e,t))))return e;for(let r of t){let t=st(e,r);void 0!==t&&(n("success",`Found ${r} and deleted`),delete t[0][t[1]])}}return e}let{parse:i}=gn;vn=new yn,mn.defineProperty(window.JSON,"parse",{value:l(i,(function(){return r(o(i,this,arguments))}))}),n("info","Wrapped JSON.parse for prune");let{json:s}=bn.prototype;mn.defineProperty(window.Response.prototype,"json",{value:l(s,(function(){return o(s,this,arguments).then((e=>r(e)))}))}),n("info","Wrapped Response.json for prune")}vn.set(e,{prune:Pe(e).split(/ +/),needle:t.length?Pe(t).split(/ +/):[]})},"override-property-read":function(e,t,n){if(!e)throw new Sn("[override-property-read snippet]: No property to override.");if(void 0===t)throw new Sn("[override-property-read snippet]: No value to override with.");let r=Re("override-property-read"),o=ct(t);r("info",`Overriding ${e}.`);const i=!("false"===n);et(window,e,{get:()=>(r("success",`${e} override done.`),o),set(){}},i)},"prevent-listener":function(e,t,n){if(!e)throw new En("[prevent-listener snippet]: No event type.");if(!Nn){Nn=new xn;let e=Re("[prevent]");Mn.defineProperty(jn,"addEventListener",{value:l(Pn,(function(t,n){for(let{evt:r,handlers:o,selectors:i}of Nn.values()){if(!r.test(t))continue;let a=this instanceof Element;for(let c=0;c{let[t]=e;if("string"==typeof t){let r=new Cn(t);for(let[o,i]of kn)i&&!i.test(t)||An(r.searchParams,o)&&(n("success",`${o} has been stripped from url ${t}`),Ln(r.searchParams,o),e[0]=r.href)}return o($n,self,e)}))),kn.set(e,t&&ze(t))},trace:function(...e){o(We,null,e)}}; ++const snippets=Wn; +let context; +for (const [name, ...args] of filters) { +if (snippets.hasOwnProperty(name)) { @@ -9401,14 +5653,14 @@ new file mode 100755 + } +} diff --git a/components/resources/adblocking/snippets/dist/isolated-first.source.jst b/components/resources/adblocking/snippets/dist/isolated-first.source.jst -new file mode 100755 +new file mode 100644 --- /dev/null +++ b/components/resources/adblocking/snippets/dist/isolated-first.source.jst -@@ -0,0 +1,3624 @@ +@@ -0,0 +1,4215 @@ +(e, ...t) => { +/*! -+ * snippets v0.7.0 (https://gitlab.com/eyeo/anti-cv/snippets/-/tree/5f54b58f039a604088d65991f2829a9a081832f6/dist) -+ * https://gitlab.com/eyeo/snippets/-/commit/d7c80795567d9f9c44a6ebaa789baceab85f31f9 ++ * snippets v1.4.0 ++ * https://gitlab.com/eyeo/anti-cv/snippets/-/blob/23006aca188eff00b56e3bd9e12591aae7adedf2/dist/isolated-first.jst + * + * This file is part of eyeo's Anti-Circumvention Snippets module (@eyeo/snippets), + * Copyright (C) 2006-present eyeo GmbH @@ -9527,7 +5779,7 @@ new file mode 100755 + + const invokes = bound(globalThis); + const classes = isExtensionContext$2 ? globalThis : secure(globalThis); -+ const {Map: Map$5, RegExp: RegExp$1, Set, WeakMap: WeakMap$3, WeakSet: WeakSet$b} = classes; ++ const {Map: Map$6, RegExp: RegExp$1, Set, WeakMap: WeakMap$3, WeakSet: WeakSet$a} = classes; + + const augment = (source, target, method = null) => { + const known = ownKeys(target); @@ -9565,7 +5817,7 @@ new file mode 100755 + + const variables$1 = freeze({ + frozen: new WeakMap$3(), -+ hidden: new WeakSet$b(), ++ hidden: new WeakSet$a(), + iframePropertiesToAbort: { + read: new Set(), + write: new Set() @@ -9575,7 +5827,7 @@ new file mode 100755 + + const startsCapitalized = new RegExp$1("^[A-Z]"); + -+ var env = new Proxy(new Map$5([ ++ var env = new Proxy(new Map$6([ + + ["chrome", ( + isExtensionContext$2 && ( @@ -9590,14 +5842,14 @@ new file mode 100755 + ["document", globalThis.document], + ["performance", copyIfExtension(performance)], + ["JSON", copyIfExtension(JSON)], -+ ["Map", Map$5], ++ ["Map", Map$6], + ["Math", copyIfExtension(Math)], + ["Number", isExtensionContext$2 ? Number : primitive("Number")], + ["RegExp", RegExp$1], + ["Set", Set], + ["String", isExtensionContext$2 ? String : primitive("String")], + ["WeakMap", WeakMap$3], -+ ["WeakSet", WeakSet$b], ++ ["WeakSet", WeakSet$a], + + ["MouseEvent", MouseEvent] + ]), { @@ -9647,7 +5899,7 @@ new file mode 100755 + }; + } + -+ const {Map: Map$4, WeakMap: WeakMap$2, WeakSet: WeakSet$a, setTimeout: setTimeout$3} = env; ++ const {Map: Map$5, WeakMap: WeakMap$2, WeakSet: WeakSet$9, setTimeout: setTimeout$3} = env; + + let cleanup = true; + let cleanUpCallback = map => { @@ -9657,9 +5909,9 @@ new file mode 100755 + + var transformer = transformOnce.bind({ + WeakMap: WeakMap$2, -+ WeakSet: WeakSet$a, ++ WeakSet: WeakSet$9, + -+ WeakValue: class extends Map$4 { ++ WeakValue: class extends Map$5 { + set(key, value) { + if (cleanup) { + cleanup = !cleanup; @@ -9675,11 +5927,11 @@ new file mode 100755 + const globals = secure(globalThis); + + const { -+ Map: Map$3, ++ Map: Map$4, + WeakMap: WeakMap$1 + } = globals; + -+ const map = new Map$3; ++ const map = new Map$4; + const descriptors = target => { + const chain = []; + let current = target; @@ -9815,7 +6067,18 @@ new file mode 100755 + } + }); + ++ let debugging = true; ++ ++ function debug() { ++ return debugging; ++ } ++ ++ function setDebug() { ++ debugging = true; ++ } ++ + let { ++ console: console$2, + document: document$1, + getComputedStyle: getComputedStyle$5, + isExtensionContext, @@ -9828,8 +6091,184 @@ new file mode 100755 + XPathResult + } = $(window); + -+ let {querySelectorAll} = document$1; -+ let $$ = querySelectorAll && bind(querySelectorAll, document$1); ++ const {querySelectorAll} = document$1; ++ const document$$ = querySelectorAll && bind(querySelectorAll, document$1); ++ ++ function $openOrClosedShadowRoot(element, failSilently = false) { ++ try { ++ const shadowRoot = (navigator.userAgent.includes("Firefox")) ? ++ element.openOrClosedShadowRoot : ++ browser.dom.openOrClosedShadowRoot(element); ++ if (shadowRoot === null && ((debug() && !failSilently))) ++ console$2.log("Shadow root not found or not added in element yet", element); ++ return shadowRoot; ++ } ++ catch (error) { ++ if (debug() && !failSilently) ++ console$2.log("Error while accessing shadow root", element, error); ++ return null; ++ } ++ } ++ ++ function $$(selector, returnRoots = false) { ++ ++ return $$recursion( ++ selector, ++ document$$.bind(document$1), ++ document$1, ++ returnRoots ++ ); ++ } ++ ++ function isArrayEmptyStrings(arr) { ++ return !arr || arr.length === 0 || arr.every(item => item.trim() === ""); ++ } ++ ++ function executeSvgCommand( ++ nestedCommands, ++ rootParent, ++ resultNodes, ++ rootParents ++ ) { ++ const xlinkHref = rootParent.getAttribute("xlink:href") || ++ rootParent.getAttribute("href"); ++ if (xlinkHref) { ++ const matchingElement = document$$(xlinkHref)[0]; ++ if (!matchingElement && debug()) { ++ console$2.log("No elements found matching", xlinkHref); ++ return false; ++ } ++ ++ if (isArrayEmptyStrings(nestedCommands)) { ++ const oldRootParents = rootParents.length > 0 ? rootParents : []; ++ resultNodes.push({ ++ element: matchingElement, ++ rootParents: [...oldRootParents, rootParent] ++ }); ++ return false; ++ } ++ const next$$ = matchingElement.querySelectorAll.bind(matchingElement); ++ return { ++ nextBoundElement: matchingElement, ++ nestedSelectorsString: nestedCommands.join("^^"), ++ next$$ ++ }; ++ } ++ } ++ ++ function executeShadowRootCommand(nestedCommands, rootParent) { ++ const shadowRoot = $openOrClosedShadowRoot(rootParent); ++ if (shadowRoot) { ++ const {querySelectorAll: shadowRootQuerySelectorAll} = shadowRoot; ++ const next$$ = shadowRootQuerySelectorAll && ++ bind(shadowRootQuerySelectorAll, shadowRoot).bind(shadowRoot); ++ return { ++ nextBoundElement: rootParent, ++ nestedSelectorsString: ":host " + nestedCommands.join("^^"), ++ next$$ ++ }; ++ } ++ ++ return false; ++ } ++ ++ function $$recursion( ++ selector, ++ bound$$, ++ boundElement, ++ returnRoots, ++ rootParents = [] ++ ) { ++ if (selector.includes("^^")) { ++ const [currentSelector, currentCommand, ...nestedCommands] = ++ selector.split("^^"); ++ let newRootParents; ++ ++ let commandFn; ++ switch (currentCommand) { ++ case "svg": { ++ commandFn = executeSvgCommand; ++ break; ++ } ++ case "sh": { ++ commandFn = executeShadowRootCommand; ++ break; ++ } ++ default: { ++ if (debug()) { ++ console$2.log( ++ currentCommand, ++ " is not supported. Supported commands are: \n^^sh^^\n^^svg^^" ++ ); ++ } ++ return []; ++ } ++ } ++ ++ if (currentSelector.trim() === "") ++ newRootParents = [boundElement]; ++ else ++ newRootParents = bound$$(currentSelector); ++ ++ const resultNodes = []; ++ ++ for (const rootParent of newRootParents) { ++ const res = ++ commandFn(nestedCommands, rootParent, resultNodes, rootParents); ++ if (!res) ++ continue; ++ const {next$$, nestedSelectorsString, nextBoundElement} = res; ++ const nestedElements = $$recursion( ++ nestedSelectorsString, ++ next$$, ++ nextBoundElement, ++ returnRoots, ++ [...rootParents, rootParent] ++ ); ++ if (nestedElements) ++ resultNodes.push(...nestedElements); ++ } ++ return resultNodes; ++ } ++ const foundElements = bound$$(selector); ++ if (returnRoots) { ++ return [...foundElements].map(element => ( ++ {element, rootParents: rootParents.length > 0 ? rootParents : []}) ++ ); ++ } ++ return foundElements; ++ } ++ ++ function $closest(element, selector, shadowRootParents = []) { ++ if (selector.includes("^^svg^^")) ++ selector = selector.split("^^svg^^")[0]; ++ ++ if (selector.includes("^^sh^^")) { ++ ++ const splitSelector = selector.split("^^sh^^"); ++ const numShadowRootsToCross = splitSelector.length - 1; ++ selector = `:host ${splitSelector[numShadowRootsToCross]}`; ++ ++ if (numShadowRootsToCross === shadowRootParents.length) { ++ ++ return element.closest(selector); ++ } ++ ++ const shadowRootParent = shadowRootParents[numShadowRootsToCross]; ++ return shadowRootParent.closest(selector); ++ } ++ if (shadowRootParents[0]) ++ return shadowRootParents[0].closest(selector); ++ return element.closest(selector); ++ } ++ ++ function $childNodes(element, failSilently = true) { ++ const shadowRoot = $openOrClosedShadowRoot(element, failSilently); ++ if (shadowRoot) ++ return shadowRoot.childNodes; ++ ++ return $(element).childNodes; ++ } + + const {assign, setPrototypeOf} = Object$1; + @@ -9853,7 +6292,7 @@ new file mode 100755 + + function hideElement(element) { + if (variables.hidden.has(element)) -+ return; ++ return false; + + notifyElementHidden(element); + @@ -9878,6 +6317,7 @@ new file mode 100755 + } + }).observe(element, {attributes: true, + attributeFilter: ["style"]}); ++ return true; + } + + function notifyElementHidden(element) { @@ -9927,12 +6367,11 @@ new file mode 100755 + + let won; + const callback = () => { -+ for (const element of $$(searchSelector)) { -+ const closest = $(element).closest(selector); -+ if (closest && match(element, closest)) { ++ for (const {element, rootParents} of $$(searchSelector, true)) { ++ const closest = $closest($(element), selector, rootParents); ++ if (closest && match(element, closest, rootParents)) { + won(); -+ hideElement(closest); -+ if (typeof onHideCallback === "function") ++ if (hideElement(closest) && typeof onHideCallback === "function") + onHideCallback(closest); + } + } @@ -9951,7 +6390,7 @@ new file mode 100755 + ); + } + -+ function isVisible(element, style, closest) { ++ function isVisible(element, style, closest, shadowRootParents) { + let $style = $(style, "CSSStyleDeclaration"); + if ($style.getPropertyValue("display") == "none") + return false; @@ -9964,10 +6403,20 @@ new file mode 100755 + return true; + + let parent = $(element).parentElement; -+ if (!parent) -+ return true; ++ if (!parent) { + -+ return isVisible(parent, getComputedStyle$5(parent), closest); ++ if (shadowRootParents && shadowRootParents.length) { ++ parent = shadowRootParents[shadowRootParents.length - 1]; ++ shadowRootParents = shadowRootParents.slice(0, -1); ++ } ++ else { ++ return true; ++ } ++ } ++ ++ return isVisible( ++ parent, getComputedStyle$5(parent), closest, shadowRootParents ++ ); + } + + function getComputedCSSText(element) { @@ -10007,24 +6456,41 @@ new file mode 100755 + return new RegExp(regexEscape(pattern)); + } + -+ let debugging = false; -+ -+ function debug() { -+ return debugging; -+ } -+ -+ function setDebug() { -+ debugging = true; -+ } -+ + const {console: console$1} = $(window); + + const noop = () => {}; + + function log(...args) { -+ if (debug()) -+ $(args).unshift("%c DEBUG", "font-weight: bold"); ++ if (debug()) { ++ const logArgs = ["%c DEBUG", "font-weight: bold;"]; + ++ const isErrorIndex = args.indexOf("error"); ++ const isWarnIndex = args.indexOf("warn"); ++ const isSuccessIndex = args.indexOf("success"); ++ const isInfoIndex = args.indexOf("info"); ++ ++ if (isErrorIndex !== -1) { ++ logArgs[0] += " - ERROR"; ++ logArgs[1] += "color: red; border:2px solid red"; ++ $(args).splice(isErrorIndex, 1); ++ } ++ else if (isWarnIndex !== -1) { ++ logArgs[0] += " - WARNING"; ++ logArgs[1] += "color: orange; border:2px solid orange "; ++ $(args).splice(isWarnIndex, 1); ++ } ++ else if (isSuccessIndex !== -1) { ++ logArgs[0] += " - SUCCESS"; ++ logArgs[1] += "color: green; border:2px solid green"; ++ $(args).splice(isSuccessIndex, 1); ++ } ++ else if (isInfoIndex !== -1) { ++ logArgs[1] += "color: black;"; ++ $(args).splice(isInfoIndex, 1); ++ } ++ ++ $(args).unshift(...logArgs); ++ } + console$1.log(...args); + } + @@ -10032,7 +6498,7 @@ new file mode 100755 + return bind(debug() ? log : noop, null, name); + } + -+ let {Array, Error: Error$3, Map: Map$2, parseInt: parseInt$2} = $(window); ++ let {Array, Error: Error$2, Map: Map$3, parseInt: parseInt$2} = $(window); + + let stack = null; + let won = null; @@ -10042,7 +6508,7 @@ new file mode 100755 + case "start": + stack = { + winners: parseInt$2(winners, 10) || 1, -+ participants: new Map$2() ++ participants: new Map$3() + }; + won = new Array(); + break; @@ -10055,7 +6521,7 @@ new file mode 100755 + won = null; + break; + default: -+ throw new Error$3(`Invalid action: ${action}`); ++ throw new Error$2(`Invalid action: ${action}`); + } + } + @@ -10076,7 +6542,7 @@ new file mode 100755 + return; + + let debugLog = getDebugger("race"); -+ debugLog(`${name} won the race`); ++ debugLog("success", `${name} won the race`); + + if (current === stack) { + won.push(win); @@ -10096,7 +6562,12 @@ new file mode 100755 + function hideIfContains(search, selector = "*", searchSelector = null) { + const debugLog = getDebugger("hide-if-contains"); + const onHideCallback = node => { -+ debugLog("Matched: ", node, " for selector: ", selector, searchSelector); ++ debugLog("success", ++ "Matched: ", ++ node, ++ " for selector: ", ++ selector, ++ searchSelector); + }; + let re = toRegExp(search); + @@ -10153,33 +6624,40 @@ new file mode 100755 + if (waitUntil) { + + if (waitUntil === "load") { -+ debugLog("Waiting until window.load"); ++ debugLog("info", "Waiting until window.load"); + -+ window.onload = () => { -+ debugLog("Window.load fired."); ++ window.addEventListener("load", () => { ++ debugLog("info", "Window.load fired."); + mainLogic(); -+ }; ++ }); + } + + else if (waitUntil === "loading" || + waitUntil === "interactive" || + waitUntil === "complete") { -+ debugLog("Waiting document state until :", waitUntil); ++ debugLog("info", "Waiting document state until :", waitUntil); + -+ document.onreadystatechange = () => { -+ debugLog("Document state changed:", document.readyState); ++ document.addEventListener("readystatechange", () => { ++ debugLog("info", "Document state changed:", document.readyState); + if (document.readyState === waitUntil) + mainLogic(); -+ }; ++ }); + } + + else { -+ debugLog("Waiting until ", waitUntil, " event is triggered on document"); ++ debugLog("info", ++ "Waiting until ", ++ waitUntil, ++ " event is triggered on document"); + getPromiseFromEvent(document, waitUntil).then(() => { -+ debugLog(waitUntil, " is triggered on document, starting the snippet"); ++ debugLog("info", ++ waitUntil, ++ " is triggered on document, starting the snippet"); + mainLogic(); + }).catch(err => { -+ debugLog("There was an error while waiting for the event.", err); ++ debugLog("error", ++ "There was an error while waiting for the event.", ++ err); + }); + } + } @@ -10189,7 +6667,7 @@ new file mode 100755 + } + } + -+ let {MutationObserver: MutationObserver$8, WeakSet: WeakSet$9, getComputedStyle: getComputedStyle$4} = $(window); ++ let {MutationObserver: MutationObserver$8, WeakSet: WeakSet$8, getComputedStyle: getComputedStyle$4} = $(window); + + function hideIfContainsAndMatchesStyle(search, + selector = "*", @@ -10201,7 +6679,8 @@ new file mode 100755 + windowWidthMax = null + ) { + const debugLog = getDebugger("hide-if-contains-and-matches-style"); -+ const hiddenMap = new WeakSet$9(); ++ const hiddenMap = new WeakSet$8(); ++ const logMap = debug() && new WeakSet$8(); + if (searchSelector == null) + searchSelector = selector; + @@ -10215,20 +6694,21 @@ new file mode 100755 + (windowWidthMax && window.innerWidth > windowWidthMax) + ) + return; -+ for (const element of $$(searchSelector)) { ++ for (const {element, rootParents} of $$(searchSelector, true)) { + if (hiddenMap.has(element)) + continue; + if (searchRegExp.test($(element).textContent)) { + if (!searchStyleRegExp || + searchStyleRegExp.test(getComputedCSSText(element))) { -+ const closest = $(element).closest(selector); ++ const closest = $closest($(element), selector, rootParents); + if (!closest) + continue; + if (!styleRegExp || styleRegExp.test(getComputedCSSText(closest))) { + win(); + hideElement(closest); + hiddenMap.add(element); -+ debugLog("Matched: ", ++ debugLog("success", ++ "Matched: ", + closest, + "which contains: ", + element, @@ -10236,19 +6716,26 @@ new file mode 100755 + ...arguments); + } + else { -+ debugLog( -+ "In this element the searchStyle matched but style didn't:\n", -+ closest, -+ getComputedStyle$4(closest), -+ ...arguments); ++ if (!logMap || logMap.has(closest)) ++ continue; ++ debugLog("info", ++ "In this element the searchStyle matched " + ++ "but style didn't:\n", ++ closest, ++ getComputedStyle$4(closest), ++ ...arguments); ++ logMap.add(closest); + } + } + else { -+ debugLog( -+ "In this element the searchStyle didn't match:\n", -+ element, -+ getComputedStyle$4(element), -+ ...arguments); ++ if (!logMap || logMap.has(element)) ++ continue; ++ debugLog("info", ++ "In this element the searchStyle didn't match:\n", ++ element, ++ getComputedStyle$4(element), ++ ...arguments); ++ logMap.add(element); + } + } + } @@ -10270,7 +6757,7 @@ new file mode 100755 + fetch, + getComputedStyle: getComputedStyle$3, + setTimeout: setTimeout$2, -+ Map: Map$1, ++ Map: Map$2, + MutationObserver: MutationObserver$7, + Uint8Array + } = $(window); @@ -10284,17 +6771,17 @@ new file mode 100755 + const debugLog = getDebugger("hide-if-contains-image"); + + let callback = () => { -+ for (let element of $$(searchSelector)) { ++ for (const {element, rootParents} of $$(searchSelector, true)) { + let style = getComputedStyle$3(element); + let match = $(style["background-image"]).match(/^url\("(.*)"\)$/); + if (match) { + fetchContent(match[1]).then(content => { + if (searchRegExp.test(uint8ArrayToHex(new Uint8Array(content)))) { -+ let closest = $(element).closest(selector); ++ let closest = $closest($(element), selector, rootParents); + if (closest) { + win(); + hideElement(closest); -+ debugLog("Matched: ", closest, " for:", ...arguments); ++ debugLog("success", "Matched: ", closest, " for:", ...arguments); + } + } + }); @@ -10311,7 +6798,7 @@ new file mode 100755 + callback(); + } + -+ let fetchContentMap = new Map$1(); ++ let fetchContentMap = new Map$2(); + + function fetchContent(url, {as = "arrayBuffer", cleanup = 60000} = {}) { + @@ -10343,7 +6830,7 @@ new file mode 100755 + return uint8Array.reduce((hex, byte) => hex + toHex(byte), ""); + } + -+ const {parseFloat: parseFloat$1, Math: Math$1, MutationObserver: MutationObserver$6, WeakSet: WeakSet$8} = $(window); ++ const {parseFloat: parseFloat$2, Math: Math$1, MutationObserver: MutationObserver$6, WeakSet: WeakSet$7} = $(window); + const {min} = Math$1; + + const ld = (a, b) => { @@ -10377,13 +6864,13 @@ new file mode 100755 + ignoreChars = 0, + maxSearches = 0 + ) { -+ const visitedNodes = new WeakSet$8(); ++ const visitedNodes = new WeakSet$7(); + const debugLog = getDebugger("hide-if-contains-similar-text"); + const $search = $(search); + const {length} = $search; -+ const chars = length + parseFloat$1(ignoreChars) || 0; ++ const chars = length + parseFloat$2(ignoreChars) || 0; + const find = $([...$search]).sort(); -+ const guard = parseFloat$1(maxSearches) || Infinity; ++ const guard = parseFloat$2(maxSearches) || Infinity; + + if (searchSelector == null) + searchSelector = selector; @@ -10391,7 +6878,7 @@ new file mode 100755 + debugLog("Looking for similar text: " + $search); + + const callback = () => { -+ for (const element of $$(searchSelector)) { ++ for (const {element, rootParents} of $$(searchSelector, true)) { + if (visitedNodes.has(element)) + continue; + @@ -10402,8 +6889,8 @@ new file mode 100755 + const str = $(innerText).substr(i, chars); + const distance = ld(find, $([...str]).sort()) - ignoreChars; + if (distance <= 0) { -+ const closest = $(element).closest(selector); -+ debugLog("Found similar text: " + $search, closest); ++ const closest = $closest($(element), selector, rootParents); ++ debugLog("success", "Found similar text: " + $search, closest); + if (closest) { + win(); + hideElement(closest); @@ -10423,7 +6910,7 @@ new file mode 100755 + callback(); + } + -+ let {getComputedStyle: getComputedStyle$2, Map, WeakSet: WeakSet$7, parseFloat} = $(window); ++ let {getComputedStyle: getComputedStyle$2, Map: Map$1, WeakSet: WeakSet$6, parseFloat: parseFloat$1} = $(window); + + const {ELEMENT_NODE: ELEMENT_NODE$2, TEXT_NODE} = Node; + @@ -10431,7 +6918,7 @@ new file mode 100755 + searchSelector = null, + ...attributes) { + let entries = $([]); -+ const optionalParameters = new Map([ ++ const optionalParameters = new Map$1([ + ["-snippet-box-margin", "2"], + ["-disable-bg-color-check", "false"], + ["-check-is-contained", "false"] @@ -10461,7 +6948,7 @@ new file mode 100755 + ["color", "rgba(0, 0, 0, 0)"] + ]); + -+ let attributesMap = new Map(defaultEntries.concat(entries)); ++ let attributesMap = new Map$1(defaultEntries.concat(entries)); + + function isTextVisible(element, style, {bgColorCheck = true} = {}) { + if (!style) @@ -10535,6 +7022,7 @@ new file mode 100755 + style, + parentOverflowNode, + originalElement, ++ shadowRootParents, + { + boxMargin = 2, + bgColorCheck, @@ -10544,7 +7032,7 @@ new file mode 100755 + if (checkClosest) + style = getComputedStyle$2(element); + -+ if (!isVisible(element, style, checkClosest && closest)) ++ if (!isVisible(element, style, checkClosest && closest, shadowRootParents)) + return ""; + + if (!parentOverflowNode && @@ -10556,7 +7044,7 @@ new file mode 100755 + parentOverflowNode = element; + + let text = getPseudoContent(element, ":before", {bgColorCheck}); -+ for (let node of $(element).childNodes) { ++ for (let node of $childNodes($(element))) { + switch ($(node).nodeType) { + case ELEMENT_NODE$2: + text += getVisibleContent(node, @@ -10564,6 +7052,7 @@ new file mode 100755 + getComputedStyle$2(node), + parentOverflowNode, + originalElement, ++ shadowRootParents, + { + boxMargin, + bgColorCheck, @@ -10589,8 +7078,9 @@ new file mode 100755 + } + return text + getPseudoContent(element, ":after", {bgColorCheck}); + } ++ + const boxMarginStr = optionalParameters.get("-snippet-box-margin"); -+ const boxMargin = parseFloat(boxMarginStr) || 0; ++ const boxMargin = parseFloat$1(boxMarginStr) || 0; + + const bgColorCheckStr = optionalParameters.get("-disable-bg-color-check"); + const bgColorCheck = !(bgColorCheckStr === "true"); @@ -10599,23 +7089,27 @@ new file mode 100755 + const checkIsContained = (checkIsContainedStr === "true"); + + let re = toRegExp(search); -+ let seen = new WeakSet$7(); ++ let seen = new WeakSet$6(); + + const mo = hideIfMatches( -+ (element, closest) => { ++ (element, closest, rootParents) => { + if (seen.has(element)) + return false; + + seen.add(element); -+ let text = getVisibleContent(element, closest, null, null, element, { -+ boxMargin, -+ bgColorCheck, -+ checkIsContained -+ } ++ let text = getVisibleContent( ++ element, closest, null, null, element, rootParents, { ++ boxMargin, ++ bgColorCheck, ++ checkIsContained ++ } + ); + let result = re.test(text); -+ if (debug() && text.length) -+ log(result, re, text); ++ if (debug() && text.length) { ++ result ? log("success", result, re, text) : ++ log("info", result, re, text); ++ } ++ + return result; + }, + selector, @@ -10629,7 +7123,7 @@ new file mode 100755 + )); + } + -+ let {MutationObserver: MutationObserver$5, WeakSet: WeakSet$6, getComputedStyle: getComputedStyle$1} = $(window); ++ let {MutationObserver: MutationObserver$5, WeakSet: WeakSet$5, getComputedStyle: getComputedStyle$1} = $(window); + + function hideIfHasAndMatchesStyle(search, + selector = "*", @@ -10641,7 +7135,8 @@ new file mode 100755 + windowWidthMax = null + ) { + const debugLog = getDebugger("hide-if-has-and-matches-style"); -+ const hiddenMap = new WeakSet$6(); ++ const hiddenMap = new WeakSet$5(); ++ const logMap = debug() && new WeakSet$5(); + if (searchSelector == null) + searchSelector = selector; + @@ -10653,19 +7148,20 @@ new file mode 100755 + (windowWidthMax && window.innerWidth > windowWidthMax) + ) + return; -+ for (const element of $$(searchSelector)) { ++ for (const {element, rootParents} of $$(searchSelector, true)) { + if (hiddenMap.has(element)) + continue; + if ($(element).querySelector(search) && + (!searchStyleRegExp || + searchStyleRegExp.test(getComputedCSSText(element)))) { -+ const closest = $(element).closest(selector); ++ const closest = $closest($(element), selector, rootParents); + if (closest && (!styleRegExp || + styleRegExp.test(getComputedCSSText(closest)))) { + win(); + hideElement(closest); + hiddenMap.add(element); -+ debugLog("Matched: ", ++ debugLog("success", ++ "Matched: ", + closest, + "which contains: ", + element, @@ -10673,19 +7169,26 @@ new file mode 100755 + ...arguments); + } + else { -+ debugLog( -+ "In this element the searchStyle matched but style didn't:\n", -+ closest, -+ getComputedStyle$1(closest), -+ ...arguments); ++ if (!logMap || logMap.has(closest)) ++ continue; ++ debugLog("info", ++ "In this element the searchStyle matched" + ++ "but style didn't:\n", ++ closest, ++ getComputedStyle$1(closest), ++ ...arguments); ++ logMap.add(closest); + } + } + else { -+ debugLog( -+ "In this element the searchStyle didn't match:\n", -+ element, -+ getComputedStyle$1(element), -+ ...arguments); ++ if (!logMap || logMap.has(element)) ++ continue; ++ debugLog("info", ++ "In this element the searchStyle didn't match:\n", ++ element, ++ getComputedStyle$1(element), ++ ...arguments); ++ logMap.add(element); + } + } + }; @@ -10701,30 +7204,31 @@ new file mode 100755 + waitUntilEvent(debugLog, mainLogic, waitUntil); + } + -+ let {getComputedStyle, MutationObserver: MutationObserver$4, WeakSet: WeakSet$5} = $(window); ++ let {getComputedStyle, MutationObserver: MutationObserver$4, WeakSet: WeakSet$4} = $(window); + + function hideIfLabelledBy(search, selector, searchSelector = null) { + let sameSelector = searchSelector == null; + + let searchRegExp = toRegExp(search); + -+ let matched = new WeakSet$5(); ++ let matched = new WeakSet$4(); + + let callback = () => { -+ for (let node of $$(selector)) { ++ for (const {element, rootParents} of $$(selector, true)) { + let closest = sameSelector ? -+ node : -+ $(node).closest(searchSelector); -+ if (!closest || !isVisible(node, getComputedStyle(node), closest)) ++ element : ++ $closest($(element), searchSelector, rootParents); ++ if (!closest || ++ !isVisible(element, getComputedStyle(element), closest)) + continue; + -+ let attr = $(node).getAttribute("aria-labelledby"); ++ let attr = $(element).getAttribute("aria-labelledby"); + let fallback = () => { + if (matched.has(closest)) + return; + + if (searchRegExp.test( -+ $(node).getAttribute("aria-label") || "" ++ $(element).getAttribute("aria-label") || "" + )) { + win(); + matched.add(closest); @@ -10776,7 +7280,7 @@ new file mode 100755 + return noopProfile; + } + -+ let {MutationObserver: MutationObserver$3, WeakSet: WeakSet$4} = $(window); ++ let {MutationObserver: MutationObserver$3, WeakSet: WeakSet$3} = $(window); + + const {ELEMENT_NODE: ELEMENT_NODE$1} = Node; + @@ -10786,7 +7290,7 @@ new file mode 100755 + + const startHidingMutationObserver = scopeNode => { + const queryAndApply = initQueryAndApply(`xpath(${query})`); -+ const seenMap = new WeakSet$4(); ++ const seenMap = new WeakSet$3(); + const callback = () => { + mark(); + queryAndApply(node => { @@ -10798,7 +7302,7 @@ new file mode 100755 + hideElement(node); + else + $(node).textContent = ""; -+ debugLog("Matched: ", node, " for selector: ", query); ++ debugLog("success", "Matched: ", node, " for selector: ", query); + }); + end(); + }; @@ -10838,7 +7342,7 @@ new file mode 100755 + } + } + -+ let {MutationObserver: MutationObserver$2, WeakSet: WeakSet$3} = $(window); ++ let {MutationObserver: MutationObserver$2, WeakSet: WeakSet$2} = $(window); + + const {ELEMENT_NODE} = Node; + @@ -10848,7 +7352,7 @@ new file mode 100755 + const debugLog = getDebugger("hide-if-matches-computed-xpath"); + + if (!searchQuery || !query) { -+ debugLog("No query or searchQuery provided."); ++ debugLog("error", "No query or searchQuery provided."); + return; + } + @@ -10856,9 +7360,11 @@ new file mode 100755 + + const startHidingMutationObserver = foundText => { + const computedQuery = computeQuery(foundText); -+ debugLog("Starting hiding elements that match query: ", computedQuery); ++ debugLog("info", ++ "Starting hiding elements that match query: ", ++ computedQuery); + const queryAndApply = initQueryAndApply(`xpath(${computedQuery})`); -+ const seenMap = new WeakSet$3(); ++ const seenMap = new WeakSet$2(); + const callback = () => { + mark(); + queryAndApply(node => { @@ -10870,7 +7376,7 @@ new file mode 100755 + hideElement(node); + else + $(node).textContent = ""; -+ debugLog("Matched: ", node, " for selector: ", query); ++ debugLog("success", "Matched: ", node, " for selector: ", query); + }); + end(); + }; @@ -10888,8 +7394,8 @@ new file mode 100755 + + const mainLogic = () => { + if (searchQuery) { -+ debugLog("Started searching for: ", searchQuery); -+ const seenMap = new WeakSet$3(); ++ debugLog("info", "Started searching for: ", searchQuery); ++ const seenMap = new WeakSet$2(); + let searchMO; + const searchQueryAndApply = initQueryAndApply(`xpath(${searchQuery})`); + const findMutationSearchNodes = () => { @@ -10897,16 +7403,16 @@ new file mode 100755 + if (seenMap.has(searchNode)) + return false; + seenMap.add(searchNode); -+ debugLog("Found node: ", searchNode); ++ debugLog("info", "Found node: ", searchNode); + if (searchNode.innerHTML) { -+ debugLog("Searching in: ", searchNode.innerHTML); ++ debugLog("info", "Searching in: ", searchNode.innerHTML); + const foundTextArr = searchNode.innerHTML.match(re); + if (foundTextArr && foundTextArr.length) { + let foundText = ""; + + foundTextArr[1] ? foundText = foundTextArr[1] : + foundText = foundTextArr[0]; -+ debugLog("Matched search query: ", foundText); ++ debugLog("info", "Matched search query: ", foundText); + startHidingMutationObserver(foundText); + } + } @@ -10927,46 +7433,9 @@ new file mode 100755 + let { + parseInt: parseInt$1, + setTimeout: setTimeout$1, -+ Error: Error$2, -+ MouseEvent: MouseEvent$2, -+ MutationObserver: MutationObserver$1, -+ WeakSet: WeakSet$2 -+ } = $(window); -+ -+ function simulateEvent(event, selector, delay = "0") { -+ if (!event) -+ throw new Error$2("[simulate-event snippet]: No event type provided."); -+ if (!selector) -+ throw new Error$2("[simulate-event snippet]: No selector provided."); -+ -+ let queryAndApply = initQueryAndApply(selector); -+ let delayInMiliseconds = parseInt$1(delay, 10); -+ let dispatchedNodes = new WeakSet$2(); -+ -+ let observer = new MutationObserver$1(findNodesAndDispatchEvents); -+ observer.observe(document, {childList: true, subtree: true}); -+ findNodesAndDispatchEvents(); -+ -+ function findNodesAndDispatchEvents() { -+ queryAndApply(node => { -+ if (!dispatchedNodes.has(node)) { -+ dispatchedNodes.add(node); -+ setTimeout$1(() => { -+ $(node).dispatchEvent( -+ new MouseEvent$2(event, {bubbles: true, cancelable: true}) -+ ); -+ }, delayInMiliseconds); -+ } -+ }); -+ } -+ } -+ -+ let { -+ parseInt, -+ setTimeout, + Error: Error$1, + MouseEvent: MouseEvent$1, -+ MutationObserver, ++ MutationObserver: MutationObserver$1, + WeakSet: WeakSet$1 + } = $(window); + @@ -11023,7 +7492,8 @@ new file mode 100755 + } + } + if (!VALID_TYPES.includes(result.event)) { -+ debugLog(result.event, ++ debugLog("warn", ++ result.event, + " might be misspelled, check for typos.\n", + "These are the supported events:", + VALID_TYPES); @@ -11057,21 +7527,25 @@ new file mode 100755 + + if (event === "click" && node.click) { + node.click(); -+ debugLog( -+ "Clicked on this node:\n", node, "\nwith a delay of", delay, "ms" ++ debugLog("success", ++ "Clicked on this node:\n", ++ node, ++ "\nwith a delay of", ++ delay, ++ "ms" + ); + } + else { + node.dispatchEvent( + new MouseEvent$1(event, {bubbles: true, cancelable: true}) + ); -+ debugLog( -+ "A", -+ event, -+ "event was dispatched with a delay of", -+ delay, -+ "ms on this node:\n", -+ node ++ debugLog("success", ++ "A", ++ event, ++ "event was dispatched with a delay of", ++ delay, ++ "ms on this node:\n", ++ node + ); + } + } @@ -11082,7 +7556,7 @@ new file mode 100755 + + let dispatchedNodes = new WeakSet$1(); + -+ let observer = new MutationObserver(findNodesAndDispatchEvents); ++ let observer = new MutationObserver$1(findNodesAndDispatchEvents); + observer.observe(document, {childList: true, subtree: true}); + findNodesAndDispatchEvents(); + @@ -11093,7 +7567,7 @@ new file mode 100755 + if (allFound) { + for (const parsedRule of parsedArgs) { + const queryAndApply = initQueryAndApply(parsedRule.selector); -+ const delayInMiliseconds = parseInt(parsedRule.delay, 10); ++ const delayInMiliseconds = parseInt$1(parsedRule.delay, 10); + if (parsedRule.trigger) { + queryAndApply(node => { + if (!dispatchedNodes.has(node)) { @@ -11104,7 +7578,7 @@ new file mode 100755 + }, delayInMiliseconds); + } + else { -+ setTimeout(() => { ++ setTimeout$1(() => { + triggerEvent(node, parsedRule.event, parsedRule.delay); + }, delayInMiliseconds); + } @@ -11116,6 +7590,115 @@ new file mode 100755 + } + } + ++ let {isNaN, MutationObserver, parseInt, parseFloat, setTimeout} = $(window); ++ ++ function skipVideo(playerSelector, xpathCondition, ...attributes) { ++ const optionalParameters = new Map([ ++ ["-max-attempts", "10"], ++ ["-retry-ms", "10"], ++ ["-run-once", "false"], ++ ["-wait-until", ""], ++ ["-skip-to", "-0.1"], ++ ["-stop-on-video-end", "false"], ++ ["-start-from", "0"], ++ ["-mute-video-when-skipping", "true"] ++ ]); ++ ++ for (let attr of attributes) { ++ attr = $(attr); ++ let markerIndex = attr.indexOf(":"); ++ if (markerIndex < 0) ++ continue; ++ ++ let key = attr.slice(0, markerIndex).trim().toString(); ++ let value = attr.slice(markerIndex + 1).trim().toString(); ++ ++ if (key && value && optionalParameters.has(key)) ++ optionalParameters.set(key, value); ++ } ++ ++ const maxAttemptsStr = optionalParameters.get("-max-attempts"); ++ const maxAttemptsNum = parseInt(maxAttemptsStr || 10, 10); ++ ++ const retryMsStr = optionalParameters.get("-retry-ms"); ++ const retryMsNum = parseInt(retryMsStr || 10, 10); ++ ++ const runOnceStr = optionalParameters.get("-run-once"); ++ const runOnceFlag = (runOnceStr === "true"); ++ ++ const skipToStr = optionalParameters.get("-skip-to"); ++ const skipToNum = parseFloat(skipToStr || -0.1); ++ ++ const startFromStr = optionalParameters.get("-start-from"); ++ const startFrom = parseInt(startFromStr || 0, 10); ++ ++ const waitUntil = optionalParameters.get("-wait-until"); ++ ++ const stopOnVideoEndStr = optionalParameters.get("-stop-on-video-end"); ++ const stopOnVideoEndFlag = (stopOnVideoEndStr === "true"); ++ ++ const muteVideoStr = optionalParameters.get("-mute-video-when-skipping"); ++ const muteVideo = !(muteVideoStr === "false"); ++ ++ const debugLog = getDebugger("skip-video"); ++ const queryAndApply = initQueryAndApply(`xpath(${xpathCondition})`); ++ let skippedOnce = false; ++ ++ const mainLogic = () => { ++ const callback = (retryCounter = 0) => { ++ if (skippedOnce && runOnceFlag) { ++ if (mo) ++ mo.disconnect(); ++ return; ++ } ++ queryAndApply(node => { ++ debugLog("info", "Matched: ", node, " for selector: ", xpathCondition); ++ debugLog("info", "Running video skipping logic."); ++ const video = $$(playerSelector)[0]; ++ while (isNaN(video.duration) && retryCounter < maxAttemptsNum) { ++ setTimeout(() => { ++ const attempt = retryCounter + 1; ++ debugLog("info", ++ "Running video skipping logic. Attempt: ", ++ attempt); ++ callback(attempt); ++ }, retryMsNum); ++ return; ++ } ++ const videoNearEnd = (video.duration - video.currentTime) < 0.5; ++ if (!isNaN(video.duration) && (video.duration > 0) && ++ (video.currentTime < video.duration) && ++ !(stopOnVideoEndFlag && videoNearEnd)) { ++ if (muteVideo) { ++ video.muted = true; ++ debugLog("success", "Muted video..."); ++ } ++ if (startFrom <= video.currentTime * 1000) { ++ ++ skipToNum <= 0 ? ++ video.currentTime = video.duration + skipToNum : ++ video.currentTime += skipToNum; ++ debugLog("success", "Skipped duration..."); ++ video.paused && video.play(); ++ skippedOnce = true; ++ win(); ++ } ++ } ++ }); ++ }; ++ const mo = new MutationObserver(callback); ++ const win = raceWinner( ++ "skip-video", ++ () => mo.disconnect() ++ ); ++ mo.observe( ++ document, {characterData: true, childList: true, subtree: true}); ++ callback(); ++ }; ++ ++ waitUntilEvent(debugLog, mainLogic, waitUntil); ++ } ++ + const snippets = { + log, + race, @@ -11129,8 +7712,8 @@ new file mode 100755 + "hide-if-has-and-matches-style": hideIfHasAndMatchesStyle, + "hide-if-labelled-by": hideIfLabelledBy, + "hide-if-contains-image": hideIfContainsImage, -+ "simulate-event-poc": simulateEvent, -+ "simulate-mouse-event": simulateMouseEvent ++ "simulate-mouse-event": simulateMouseEvent, ++ "skip-video": skipVideo + }; + let context; + for (const [name, ...args] of filters) { @@ -11562,15 +8145,42 @@ new file mode 100755 + debugging = true; + } + -+ const {console: console$3} = $(window); ++ const {console: console$4} = $(window); + + const noop = () => {}; + + function log(...args) { -+ if (debug()) -+ $(args).unshift("%c DEBUG", "font-weight: bold"); ++ if (debug()) { ++ const logArgs = ["%c DEBUG", "font-weight: bold;"]; + -+ console$3.log(...args); ++ const isErrorIndex = args.indexOf("error"); ++ const isWarnIndex = args.indexOf("warn"); ++ const isSuccessIndex = args.indexOf("success"); ++ const isInfoIndex = args.indexOf("info"); ++ ++ if (isErrorIndex !== -1) { ++ logArgs[0] += " - ERROR"; ++ logArgs[1] += "color: red; border:2px solid red"; ++ $(args).splice(isErrorIndex, 1); ++ } ++ else if (isWarnIndex !== -1) { ++ logArgs[0] += " - WARNING"; ++ logArgs[1] += "color: orange; border:2px solid orange "; ++ $(args).splice(isWarnIndex, 1); ++ } ++ else if (isSuccessIndex !== -1) { ++ logArgs[0] += " - SUCCESS"; ++ logArgs[1] += "color: green; border:2px solid green"; ++ $(args).splice(isSuccessIndex, 1); ++ } ++ else if (isInfoIndex !== -1) { ++ logArgs[1] += "color: black;"; ++ $(args).splice(isInfoIndex, 1); ++ } ++ ++ $(args).unshift(...logArgs); ++ } ++ console$4.log(...args); + } + + function getDebugger(name) { @@ -11702,18 +8312,18 @@ new file mode 100755 + let debugLog = getDebugger(loggingPrefix); + + if (!property) { -+ debugLog("no property to abort on read"); ++ debugLog("error", "no property to abort on read"); + return; + } + + let rid = randomId(); + + function abort() { -+ debugLog(`${property} access aborted`); ++ debugLog("success", `${property} access aborted`); + throw new ReferenceError$2(rid); + } + -+ debugLog(`aborting on ${property} access`); ++ debugLog("info", `aborting on ${property} access`); + + wrapPropertyAccess(context, + property, @@ -11727,18 +8337,18 @@ new file mode 100755 + let debugLog = getDebugger(loggingPrefix); + + if (!property) { -+ debugLog("no property to abort on write"); ++ debugLog("error", "no property to abort on write"); + return; + } + + let rid = randomId(); + + function abort() { -+ debugLog(`setting ${property} aborted`); ++ debugLog("success", `setting ${property} aborted`); + throw new ReferenceError$2(rid); + } + -+ debugLog(`aborting when setting ${property}`); ++ debugLog("info", `aborting when setting ${property}`); + + wrapPropertyAccess(context, property, {set: abort}, setConfigurable); + overrideOnError(rid); @@ -11934,7 +8544,7 @@ new file mode 100755 + object = object[node]; + if ( + !object || !(typeof object == "object" || typeof object == "function")) { -+ debugLog(path, " is not found"); ++ debugLog("warn", path, " is not found"); + return; + } + } @@ -11944,7 +8554,7 @@ new file mode 100755 + + let currentValue = object[name]; + if (typeof currentValue === "undefined") -+ debugLog("The property", name, "doesn't exist yet. Check typos."); ++ debugLog("warn", "The property", name, "doesn't exist yet. Check typos."); + + const abort = () => { + const element = $(document).currentScript; @@ -11952,7 +8562,7 @@ new file mode 100755 + $(element, "HTMLScriptElement").src == "" && + element != us && + (!re || re.test($(element).textContent))) { -+ debugLog(path, " is aborted \n", element); ++ debugLog("success", path, " is aborted \n", element); + throw new ReferenceError$1(rid); + } + }; @@ -11999,10 +8609,10 @@ new file mode 100755 + abortOnWrite("abort-on-property-write", window, property, configurableFlag); + } + -+ let {Error: Error$6} = $(window); ++ let {Error: Error$6, URL: URL$1} = $(window); + let {cookie: documentCookies} = accessor(document); + -+ function cookieRemover(cookie) { ++ function cookieRemover(cookie, autoRemoveCookie = false) { + if (!cookie) + throw new Error$6("[cookie-remover snippet]: No cookie to remove."); + @@ -12010,31 +8620,60 @@ new file mode 100755 + let re = toRegExp(cookie); + + if (!$(/^http|^about/).test(location.protocol)) { -+ debugLog("Snippet only works for http or https and about."); ++ debugLog("warn", "Snippet only works for http or https and about."); + return; + } + -+ debugLog("Parsing cookies for matches"); -+ -+ for (const pair of $(getCookieMatches())) { -+ let $hostname = $(location.hostname); -+ let name = $(pair).split("=")[0]; -+ let expires = "expires=Thu, 01 Jan 1970 00:00:00 GMT"; -+ let path = "path=/"; -+ let domain = "domain=" + $hostname.slice($hostname.indexOf(".") + 1); -+ -+ documentCookies(`${$(name).trim()}=;${expires};${path};${domain}`); -+ -+ debugLog(`Set expiration date on ${name}`); -+ } -+ + function getCookieMatches() { + const arr = $(documentCookies()).split(";"); + return arr.filter(str => re.test($(str).split("=")[0])); + } ++ ++ const mainLogic = () => { ++ debugLog("info", "Parsing cookies for matches"); ++ for (const pair of $(getCookieMatches())) { ++ let $hostname = $(location.hostname); ++ ++ if (!$hostname && ++ $(location.ancestorOrigins) && $(location.ancestorOrigins[0])) ++ $hostname = new URL$1($(location.ancestorOrigins[0])).hostname; ++ const name = $(pair).split("=")[0]; ++ const expires = "expires=Thu, 01 Jan 1970 00:00:00 GMT"; ++ const path = "path=/"; ++ const domainParts = $hostname.split("."); ++ ++ for (let numDomainParts = domainParts.length; ++ numDomainParts > 0; numDomainParts--) { ++ const domain = ++ domainParts.slice(domainParts.length - numDomainParts).join("."); ++ documentCookies(`${$(name).trim()}=;${expires};${path};domain=${domain}`); ++ documentCookies(`${$(name).trim()}=;${expires};${path};domain=.${domain}`); ++ debugLog("success", `Set expiration date on ${name}`); ++ } ++ } ++ }; ++ ++ mainLogic(); ++ ++ if (autoRemoveCookie) { ++ ++ let lastCookie = getCookieMatches(); ++ setInterval(() => { ++ let newCookie = getCookieMatches(); ++ if (newCookie !== lastCookie) { ++ try { ++ mainLogic(); ++ } ++ finally { ++ lastCookie = newCookie; ++ } ++ } ++ }, 1000); ++ } + } + + let { ++ console: console$3, + document: document$1, + getComputedStyle, + isExtensionContext, @@ -12047,8 +8686,153 @@ new file mode 100755 + XPathResult + } = $(window); + -+ let {querySelectorAll} = document$1; -+ let $$ = querySelectorAll && bind(querySelectorAll, document$1); ++ const {querySelectorAll} = document$1; ++ const document$$ = querySelectorAll && bind(querySelectorAll, document$1); ++ ++ function $openOrClosedShadowRoot(element, failSilently = false) { ++ try { ++ const shadowRoot = (navigator.userAgent.includes("Firefox")) ? ++ element.openOrClosedShadowRoot : ++ browser.dom.openOrClosedShadowRoot(element); ++ if (shadowRoot === null && ((debug() && !failSilently))) ++ console$3.log("Shadow root not found or not added in element yet", element); ++ return shadowRoot; ++ } ++ catch (error) { ++ if (debug() && !failSilently) ++ console$3.log("Error while accessing shadow root", element, error); ++ return null; ++ } ++ } ++ ++ function $$(selector, returnRoots = false) { ++ ++ return $$recursion( ++ selector, ++ document$$.bind(document$1), ++ document$1, ++ returnRoots ++ ); ++ } ++ ++ function isArrayEmptyStrings(arr) { ++ return !arr || arr.length === 0 || arr.every(item => item.trim() === ""); ++ } ++ ++ function executeSvgCommand( ++ nestedCommands, ++ rootParent, ++ resultNodes, ++ rootParents ++ ) { ++ const xlinkHref = rootParent.getAttribute("xlink:href") || ++ rootParent.getAttribute("href"); ++ if (xlinkHref) { ++ const matchingElement = document$$(xlinkHref)[0]; ++ if (!matchingElement && debug()) { ++ console$3.log("No elements found matching", xlinkHref); ++ return false; ++ } ++ ++ if (isArrayEmptyStrings(nestedCommands)) { ++ const oldRootParents = rootParents.length > 0 ? rootParents : []; ++ resultNodes.push({ ++ element: matchingElement, ++ rootParents: [...oldRootParents, rootParent] ++ }); ++ return false; ++ } ++ const next$$ = matchingElement.querySelectorAll.bind(matchingElement); ++ return { ++ nextBoundElement: matchingElement, ++ nestedSelectorsString: nestedCommands.join("^^"), ++ next$$ ++ }; ++ } ++ } ++ ++ function executeShadowRootCommand(nestedCommands, rootParent) { ++ const shadowRoot = $openOrClosedShadowRoot(rootParent); ++ if (shadowRoot) { ++ const {querySelectorAll: shadowRootQuerySelectorAll} = shadowRoot; ++ const next$$ = shadowRootQuerySelectorAll && ++ bind(shadowRootQuerySelectorAll, shadowRoot).bind(shadowRoot); ++ return { ++ nextBoundElement: rootParent, ++ nestedSelectorsString: ":host " + nestedCommands.join("^^"), ++ next$$ ++ }; ++ } ++ ++ return false; ++ } ++ ++ function $$recursion( ++ selector, ++ bound$$, ++ boundElement, ++ returnRoots, ++ rootParents = [] ++ ) { ++ if (selector.includes("^^")) { ++ const [currentSelector, currentCommand, ...nestedCommands] = ++ selector.split("^^"); ++ let newRootParents; ++ ++ let commandFn; ++ switch (currentCommand) { ++ case "svg": { ++ commandFn = executeSvgCommand; ++ break; ++ } ++ case "sh": { ++ commandFn = executeShadowRootCommand; ++ break; ++ } ++ default: { ++ if (debug()) { ++ console$3.log( ++ currentCommand, ++ " is not supported. Supported commands are: \n^^sh^^\n^^svg^^" ++ ); ++ } ++ return []; ++ } ++ } ++ ++ if (currentSelector.trim() === "") ++ newRootParents = [boundElement]; ++ else ++ newRootParents = bound$$(currentSelector); ++ ++ const resultNodes = []; ++ ++ for (const rootParent of newRootParents) { ++ const res = ++ commandFn(nestedCommands, rootParent, resultNodes, rootParents); ++ if (!res) ++ continue; ++ const {next$$, nestedSelectorsString, nextBoundElement} = res; ++ const nestedElements = $$recursion( ++ nestedSelectorsString, ++ next$$, ++ nextBoundElement, ++ returnRoots, ++ [...rootParents, rootParent] ++ ); ++ if (nestedElements) ++ resultNodes.push(...nestedElements); ++ } ++ return resultNodes; ++ } ++ const foundElements = bound$$(selector); ++ if (returnRoots) { ++ return [...foundElements].map(element => ( ++ {element, rootParents: rootParents.length > 0 ? rootParents : []}) ++ ); ++ } ++ return foundElements; ++ } + + const {assign, setPrototypeOf} = Object$6; + @@ -12072,7 +8856,7 @@ new file mode 100755 + + function hideElement(element) { + if (variables$1.hidden.has(element)) -+ return; ++ return false; + + notifyElementHidden(element); + @@ -12097,6 +8881,7 @@ new file mode 100755 + } + }).observe(element, {attributes: true, + attributeFilter: ["style"]}); ++ return true; + } + + function notifyElementHidden(element) { @@ -12726,7 +9511,11 @@ new file mode 100755 + hideElement(closest); + + hiddenShadowRoots.add(target); -+ debugLog("Hiding: ", closest, " for params: ", ...arguments); ++ debugLog("success", ++ "Hiding: ", ++ closest, ++ " for params: ", ++ ...arguments); + } + } + } @@ -12738,7 +9527,7 @@ new file mode 100755 + value: proxy(attachShadow, function() { + + let root = apply$2(attachShadow, this, arguments); -+ debugLog("attachShadow is called for: ", root); ++ debugLog("info", "attachShadow is called for: ", root); + + observer.observe(root, { + childList: true, @@ -12752,7 +9541,7 @@ new file mode 100755 + } + } + -+ const {Error: Error$4, JSON: JSON$2, Map: Map$3, Object: Object$3} = $(window); ++ const {Error: Error$4, JSON: JSON$2, Map: Map$3, Response: Response$1, Object: Object$3} = $(window); + + let paths$1 = null; + @@ -12767,33 +9556,44 @@ new file mode 100755 + if (!paths$1) { + let debugLog = getDebugger("json-override"); + ++ function overrideObject(obj, str) { ++ for (let {prune, needle, filter: flt, value: val} of paths$1.values()) { ++ if (flt && !flt.test(str)) ++ continue; ++ ++ if ($(needle).some(path => !findOwner(obj, path))) ++ return obj; ++ ++ for (let path of prune) { ++ let details = findOwner(obj, path); ++ if (typeof details != "undefined") { ++ debugLog("success", `Found ${path} replaced it with ${val}`); ++ details[0][details[1]] = overrideValue(val); ++ } ++ } ++ } ++ return obj; ++ } ++ + let {parse} = JSON$2; + paths$1 = new Map$3(); + + Object$3.defineProperty(window.JSON, "parse", { + value: proxy(parse, function(str) { + let result = apply$2(parse, this, arguments); -+ -+ for (let {prune, needle, filter: flt, value: val} of paths$1.values()) { -+ if (flt && !flt.test(str)) -+ continue; -+ -+ if ($(needle).some(path => !findOwner(result, path))) -+ return result; -+ -+ for (let path of prune) { -+ let details = findOwner(result, path); -+ if (typeof details != "undefined") { -+ debugLog(`Found ${path} replaced it with ${val}`); -+ details[0][details[1]] = overrideValue(val); -+ } -+ } -+ } -+ -+ return result; ++ return overrideObject(result, str); + }) + }); -+ debugLog("Wrapped JSON.parse for override"); ++ debugLog("info", "Wrapped JSON.parse for override"); ++ ++ let {json} = Response$1.prototype; ++ Object$3.defineProperty(window.Response.prototype, "json", { ++ value: proxy(json, function(str) { ++ let resultPromise = apply$2(json, this, arguments); ++ return resultPromise.then(obj => overrideObject(obj, str)); ++ }) ++ }); ++ debugLog("info", "Wrapped Response.json for override"); + } + + paths$1.set(rawOverridePaths, { @@ -12804,7 +9604,7 @@ new file mode 100755 + }); + } + -+ let {Error: Error$3, JSON: JSON$1, Map: Map$2, Object: Object$2} = $(window); ++ let {Error: Error$3, JSON: JSON$1, Map: Map$2, Object: Object$2, Response} = $(window); + + let paths = null; + @@ -12815,30 +9615,41 @@ new file mode 100755 + if (!paths) { + let debugLog = getDebugger("json-prune"); + ++ function pruneObject(obj) { ++ for (let {prune, needle} of paths.values()) { ++ if ($(needle).some(path => !findOwner(obj, path))) ++ return obj; ++ ++ for (let path of prune) { ++ let details = findOwner(obj, path); ++ if (typeof details != "undefined") { ++ debugLog("success", `Found ${path} and deleted`); ++ delete details[0][details[1]]; ++ } ++ } ++ } ++ return obj; ++ } ++ + let {parse} = JSON$1; + paths = new Map$2(); + + Object$2.defineProperty(window.JSON, "parse", { + value: proxy(parse, function() { + let result = apply$2(parse, this, arguments); -+ -+ for (let {prune, needle} of paths.values()) { -+ if ($(needle).some(path => !findOwner(result, path))) -+ return result; -+ -+ for (let path of prune) { -+ let details = findOwner(result, path); -+ if (typeof details != "undefined") { -+ debugLog(`Found ${path} and deleted`); -+ delete details[0][details[1]]; -+ } -+ } -+ } -+ -+ return result; ++ return pruneObject(result); + }) + }); -+ debugLog("Wrapped JSON.parse for prune"); ++ debugLog("info", "Wrapped JSON.parse for prune"); ++ ++ let {json} = Response.prototype; ++ Object$2.defineProperty(window.Response.prototype, "json", { ++ value: proxy(json, function() { ++ let resultPromise = apply$2(json, this, arguments); ++ return resultPromise.then(obj => pruneObject(obj)); ++ }) ++ }); ++ debugLog("info", "Wrapped Response.json for prune"); + } + + paths.set(rawPrunePaths, { @@ -12849,7 +9660,7 @@ new file mode 100755 + + let {Error: Error$2} = $(window); + -+ function overridePropertyRead(property, value) { ++ function overridePropertyRead(property, value, setConfigurable) { + if (!property) { + throw new Error$2("[override-property-read snippet]: " + + "No property to override."); @@ -12864,13 +9675,18 @@ new file mode 100755 + let cValue = overrideValue(value); + + let newGetter = () => { -+ debugLog(`${property} override done.`); ++ debugLog("success", `${property} override done.`); + return cValue; + }; + -+ debugLog(`Overriding ${property}.`); ++ debugLog("info", `Overriding ${property}.`); + -+ wrapPropertyAccess(window, property, {get: newGetter, set() {}}); ++ const configurableFlag = !(setConfigurable === "false"); ++ ++ wrapPropertyAccess(window, ++ property, ++ {get: newGetter, set() {}}, ++ configurableFlag); + } + + let {Error: Error$1, Map: Map$1, Object: Object$1, console: console$1} = $(window); @@ -12900,32 +9716,59 @@ new file mode 100755 + let isElement = this instanceof Element; + + for (let i = 0; i < handlers.length; i++) { -+ let handler = handlers[i]; -+ let sel = selectors[i]; ++ const handler = handlers[i]; ++ const sel = selectors[i]; + -+ let handlerMatch = () => handler.test( -+ call( -+ toString, -+ typeof listener === "function" ? -+ listener : listener.handleEvent -+ ) -+ ); -+ -+ if ( -+ (handler && !handlerMatch()) || -+ (sel && !(isElement && $(this).matches(sel))) -+ ) ++ if (sel && !(isElement && $(this).matches(sel))) + continue; + ++ if (handler) { ++ const proxiedHandlerMatch = function() { ++ try { ++ const proxiedHandlerString = call( ++ toString, ++ typeof listener === "function" ? ++ listener : listener.handleEvent ++ ); ++ return handler.test(proxiedHandlerString); ++ } ++ catch (e) { ++ debugLog("error", ++ "Error while trying to stringify listener: ", ++ e); ++ return false; ++ } ++ }; ++ ++ const actualHandlerMatch = function() { ++ try { ++ const actualHandlerString = String( ++ typeof listener === "function" ? ++ listener : listener.handleEvent ++ ); ++ return handler.test(actualHandlerString); ++ } ++ catch (e) { ++ debugLog("error", ++ "Error while trying to stringify listener: ", ++ e); ++ return false; ++ } ++ }; ++ ++ if (!proxiedHandlerMatch() && !actualHandlerMatch()) ++ continue; ++ } ++ + if (debug()) { + console$1.groupCollapsed("DEBUG [prevent] was successful"); -+ debugLog(`type: ${type} matching ${evt}`); -+ debugLog("handler:", listener); ++ debugLog("success", `type: ${type} matching ${evt}`); ++ debugLog("success", "handler:", listener); + if (handler) -+ debugLog(`matching ${handler}`); ++ debugLog("success", `matching ${handler}`); + if (sel) -+ debugLog("on element: ", this, ` matching ${sel}`); -+ debugLog("was prevented from being added"); ++ debugLog("success", "on element: ", this, ` matching ${sel}`); ++ debugLog("success", "was prevented from being added"); + console$1.groupEnd(); + } + return; @@ -12935,7 +9778,7 @@ new file mode 100755 + }) + }); + -+ debugLog("Wrapped addEventListener"); ++ debugLog("info", "Wrapped addEventListener"); + } + + if (!events.has(event)) @@ -12965,7 +9808,7 @@ new file mode 100755 + for (let [key, reg] of parameters) { + if (!reg || reg.test(source)) { + if (hasParam(url.searchParams, key)) { -+ debugLog(`${key} has been stripped from url ${source}`); ++ debugLog("success", `${key} has been stripped from url ${source}`); + deleteParam(url.searchParams, key); + args[0] = url.href; + } @@ -13098,6 +9941,24 @@ diff --git a/content/public/browser/content_browser_client.h b/content/public/br const net::SiteForCookies& site_for_cookies, const std::optional& user_agent, mojo::PendingRemote +diff --git a/content/public/common/isolated_world_ids.h b/content/public/common/isolated_world_ids.h +--- a/content/public/common/isolated_world_ids.h ++++ b/content/public/common/isolated_world_ids.h +@@ -17,12 +17,10 @@ enum IsolatedWorldIDs : int32_t { + // The main world. Chrome cannot use ID 0 for an isolated world because 0 + // represents the main world. + ISOLATED_WORLD_ID_GLOBAL = 0, +- +- // Isolated world for eyeo ad blocking (element hiding) +- ISOLATED_WORLD_ID_ADBLOCK, +- + // Custom isolated world ids used by other embedders should start from here. + ISOLATED_WORLD_ID_CONTENT_END, ++ // Isolated world for eyeo ad blocking (element hiding) ++ ISOLATED_WORLD_ID_ADBLOCK, + // If any embedder has more than 10 custom isolated worlds that will be run + // via RenderFrameImpl::OnJavaScriptExecuteRequestInIsolatedWorld update this. + ISOLATED_WORLD_ID_MAX = ISOLATED_WORLD_ID_CONTENT_END + 10, diff --git a/cromite_flags/chrome/browser/about_flags_cc/Stricter-popup-blocker.inc b/cromite_flags/chrome/browser/about_flags_cc/Stricter-popup-blocker.inc new file mode 100644 --- /dev/null