From e0d331296835f3a341a3fe8f252a62419a0aa314 Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Thu, 1 Dec 2022 13:52:28 +0300 Subject: [PATCH 01/70] fix typos and getRequestProps bug for v1.7.3 AG-13369 Merge in ADGUARD-FILTERS/scriptlets from fix/AG-13369_01 to master Squashed commit of the following: commit 1f94053e7a596a52815e0d1b8e3e5ac75b4fd919 Author: Stanislav A Date: Wed Nov 30 20:53:15 2022 +0300 & to'and' commit 8d9e97509c5ea0aa41dc4a1e2d80f1a413054178 Author: Stanislav A Date: Wed Nov 30 20:31:46 2022 +0300 add fixes to changelog commit d7d355f857641113d41d073d8988233328377e3a Author: Stanislav A Date: Wed Nov 30 18:20:28 2022 +0300 improve getXhrData commit 285068794a33c2084eb7d329a09a2b0224afb206 Author: Stanislav A Date: Wed Nov 30 15:39:28 2022 +0300 revert babel changes in redirect files commit 19a0f522f2fea692751c3f4e3c922e92b09c3cd8 Author: Stanislav A Date: Wed Nov 30 15:27:13 2022 +0300 update tests commit a6c789ddb0f154da8d40b5acad03eed329ab9cc2 Author: Stanislav A Date: Wed Nov 30 14:19:51 2022 +0300 fix replace-xhr-response tests commit fdcef84bff9335c9806663cfb85f6133fbed31d8 Author: Stanislav A Date: Tue Nov 29 20:37:26 2022 +0300 fix spread issue instead of excluding babel plugin commit 84cdb937199b2baa07e726a562282dd6962a71ec Author: Stanislav A Date: Tue Nov 29 20:26:13 2022 +0300 remove unnecessary console.log commit a32955e069594603a531d0ac9c791096d8a3c00b Author: Stanislav A Date: Tue Nov 29 18:41:04 2022 +0300 fix typos, exclude @babel/plugin-transform-spread --- CHANGELOG.md | 7 +++++++ src/helpers/cookie-utils.js | 2 +- src/helpers/request-utils.js | 2 +- src/scriptlets/prevent-fetch.js | 2 ++ src/scriptlets/prevent-xhr.js | 2 ++ .../trusted-replace-fetch-response.js | 4 +++- .../trusted-replace-xhr-response.js | 9 ++++++--- src/scriptlets/trusted-set-cookie.js | 6 +++--- .../trusted-replace-xhr-response.test.js | 19 ++++++++++++------- wiki/about-trusted-scriptlets.md | 6 +++--- 10 files changed, 40 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d16ec67..e336ede5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Scriptlets and Redirect Resources Changelog +## v1.7.5 + +### Fixed + +* spread of args bug at getXhrData call for `trusted-replace-xhr-response` +* request properties array not being served to `getRequestData` and `parseMatchProps` helpers + ## v1.7.3 ### Added diff --git a/src/helpers/cookie-utils.js b/src/helpers/cookie-utils.js index 332d5896..d8927c8e 100644 --- a/src/helpers/cookie-utils.js +++ b/src/helpers/cookie-utils.js @@ -48,7 +48,7 @@ export const concatCookieNameValuePath = (source, rawName, rawValue, rawPath) => return null; } // eslint-disable-next-line max-len - return `${encodeURIComponent(rawName)}=${encodeURIComponent(rawValue)}; ${getCookiePath(rawPath)}`; + return `${encodeURIComponent(rawName)}=${encodeURIComponent(rawValue)}; ${getCookiePath(rawPath)};`; }; /** diff --git a/src/helpers/request-utils.js b/src/helpers/request-utils.js index 044a696c..777892e9 100644 --- a/src/helpers/request-utils.js +++ b/src/helpers/request-utils.js @@ -6,7 +6,7 @@ import { getObjectFromEntries } from './object-utils'; * Includes common 'url' and 'method' props and all other fetch-specific props * @returns {string[]} */ -const getRequestProps = () => [ +export const getRequestProps = () => [ 'url', 'method', 'headers', diff --git a/src/scriptlets/prevent-fetch.js b/src/scriptlets/prevent-fetch.js index 6dda4ffd..6e4ac590 100644 --- a/src/scriptlets/prevent-fetch.js +++ b/src/scriptlets/prevent-fetch.js @@ -12,6 +12,7 @@ import { escapeRegExp, isEmptyObject, getRequestData, + getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, @@ -158,6 +159,7 @@ preventFetch.injections = [ escapeRegExp, isEmptyObject, getRequestData, + getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, diff --git a/src/scriptlets/prevent-xhr.js b/src/scriptlets/prevent-xhr.js index e580ee15..4147da97 100644 --- a/src/scriptlets/prevent-xhr.js +++ b/src/scriptlets/prevent-xhr.js @@ -17,6 +17,7 @@ import { parseMatchProps, validateParsedData, getMatchPropsData, + getRequestProps, getRandomIntInclusive, getRandomStrByLength, } from '../helpers/index'; @@ -201,6 +202,7 @@ preventXHR.injections = [ parseMatchProps, validateParsedData, getMatchPropsData, + getRequestProps, getRandomIntInclusive, getRandomStrByLength, ]; diff --git a/src/scriptlets/trusted-replace-fetch-response.js b/src/scriptlets/trusted-replace-fetch-response.js index ab54364c..7ccf28bf 100644 --- a/src/scriptlets/trusted-replace-fetch-response.js +++ b/src/scriptlets/trusted-replace-fetch-response.js @@ -11,6 +11,7 @@ import { escapeRegExp, isEmptyObject, getRequestData, + getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, @@ -97,7 +98,7 @@ export function trustedReplaceFetchResponse(source, pattern = '', replacement = let shouldReplace = false; let fetchData; - const handlerWrapper = async (target, thisArg, args) => { + const handlerWrapper = (target, thisArg, args) => { fetchData = getFetchData(args); if (shouldLog) { @@ -199,6 +200,7 @@ trustedReplaceFetchResponse.injections = [ escapeRegExp, isEmptyObject, getRequestData, + getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, diff --git a/src/scriptlets/trusted-replace-xhr-response.js b/src/scriptlets/trusted-replace-xhr-response.js index 804756c1..ca6d6754 100644 --- a/src/scriptlets/trusted-replace-xhr-response.js +++ b/src/scriptlets/trusted-replace-xhr-response.js @@ -8,6 +8,7 @@ import { // following helpers should be imported and injected // because they are used by helpers above getMatchPropsData, + getRequestProps, validateParsedData, parseMatchProps, isValidStrPattern, @@ -94,11 +95,12 @@ export function trustedReplaceXhrResponse(source, pattern = '', replacement = '' let requestHeaders = []; const openWrapper = (target, thisArg, args) => { - xhrData = getXhrData(...args); + // eslint-disable-next-line prefer-spread + xhrData = getXhrData.apply(null, args); if (shouldLog) { // Log if no propsToMatch given - const message = `log: xhr( ${objectToString(xhrData)} )`; + const message = `xhr( ${objectToString(xhrData)} )`; logMessage(source, message, true); hit(source); return Reflect.apply(target, thisArg, args); @@ -126,7 +128,7 @@ export function trustedReplaceXhrResponse(source, pattern = '', replacement = '' return Reflect.apply(target, thisArg, args); }; - const sendWrapper = async (target, thisArg, args) => { + const sendWrapper = (target, thisArg, args) => { if (!shouldReplace) { return Reflect.apply(target, thisArg, args); } @@ -236,6 +238,7 @@ trustedReplaceXhrResponse.injections = [ matchRequestProps, getXhrData, getMatchPropsData, + getRequestProps, validateParsedData, parseMatchProps, isValidStrPattern, diff --git a/src/scriptlets/trusted-set-cookie.js b/src/scriptlets/trusted-set-cookie.js index 64eda3b6..5459df37 100644 --- a/src/scriptlets/trusted-set-cookie.js +++ b/src/scriptlets/trusted-set-cookie.js @@ -29,12 +29,12 @@ import { * - arbitrary value * - empty string for no value * - `$now$` keyword for setting current time - * - 'offsetExpiresSec' - optional, offset from current time in seconds, after which cookie should expire; defaults to no offset + * - `offsetExpiresSec` - optional, offset from current time in seconds, after which cookie should expire; defaults to no offset * Possible values: * - positive integer in seconds * - `1year` keyword for setting expiration date to one year * - `1day` keyword for setting expiration date to one day - * - 'reload' - optional, boolean. Argument for reloading page after cookie is set. Defaults to `false` + * - `reload` - optional, boolean. Argument for reloading page after cookie is set. Defaults to `false` * - `path` - optional, argument for setting cookie path, defaults to `/`; possible values: * - `/` — root path * - `none` — to set no path at all @@ -48,7 +48,7 @@ import { * * 2. Set cookie with `new Date().getTime()` value * ``` - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '$now') + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '$now$') * ``` * * 3. Set cookie which will expire in 3 days diff --git a/tests/scriptlets/trusted-replace-xhr-response.test.js b/tests/scriptlets/trusted-replace-xhr-response.test.js index 347496c5..efc5b55c 100644 --- a/tests/scriptlets/trusted-replace-xhr-response.test.js +++ b/tests/scriptlets/trusted-replace-xhr-response.test.js @@ -31,6 +31,9 @@ if (isSupported) { test('No args, logging', async (assert) => { const METHOD = 'GET'; const URL = `${FETCH_OBJECTS_PATH}/test01.json`; + const ASYNC = true; + const USER = 'user'; + const PASSWORD = 'password'; const done = assert.async(); @@ -39,7 +42,8 @@ if (isSupported) { if (input.indexOf('trace') > -1) { return; } - const EXPECTED_LOG_STR = `xhr( method:"${METHOD}" url:"${URL}" )`; + // eslint-disable-next-line max-len + const EXPECTED_LOG_STR = `${name}: xhr( method:"${METHOD}" url:"${URL}" async:"${ASYNC}" user:"${USER}" password:"${PASSWORD}" )`; assert.ok(startsWith(input, EXPECTED_LOG_STR), 'console.hit input'); }; const PATTERN = ''; @@ -48,7 +52,7 @@ if (isSupported) { runScriptlet(name, [PATTERN, REPLACEMENT]); const xhr = new XMLHttpRequest(); - xhr.open(METHOD, URL); + xhr.open(METHOD, URL, ASYNC, USER, PASSWORD); xhr.onload = () => { assert.strictEqual(xhr.readyState, 4, 'Response done'); assert.ok(xhr.response, 'Response data exists'); @@ -63,7 +67,7 @@ if (isSupported) { const URL = `${FETCH_OBJECTS_PATH}/test01.json`; const PATTERN = /[-0-9]+/; const REPLACEMENT = 'a'; - const MATCH_DATA = [PATTERN, REPLACEMENT, `${URL} method:${METHOD}`]; + const MATCH_DATA = [`${PATTERN}`, REPLACEMENT, `${URL} method:${METHOD}`]; runScriptlet(name, MATCH_DATA); @@ -85,9 +89,10 @@ if (isSupported) { test('Matched, regex pattern', async (assert) => { const METHOD = 'GET'; const URL = `${FETCH_OBJECTS_PATH}/test01.json`; - const PATTERN = '/a1/'; + + const PATTERN = /a1/; const REPLACEMENT = 'x'; - const MATCH_DATA = [PATTERN, REPLACEMENT, `${URL} method:${METHOD}`]; + const MATCH_DATA = [`${PATTERN}`, REPLACEMENT, `${URL} method:${METHOD}`]; runScriptlet(name, MATCH_DATA); @@ -97,8 +102,8 @@ if (isSupported) { xhr.open(METHOD, URL); xhr.onload = () => { assert.strictEqual(xhr.readyState, 4, 'Response done'); - assert.ok(xhr.response.includes(REPLACEMENT) && !xhr.response.includes(PATTERN), 'Response has been modified'); - assert.ok(xhr.responseText.includes(REPLACEMENT) && !xhr.responseText.includes(PATTERN), 'Response text has been modified'); + assert.ok(xhr.response.includes(REPLACEMENT) && !PATTERN.test(xhr.response), 'Response has been modified'); + assert.ok(xhr.responseText.includes(REPLACEMENT) && !PATTERN.test(xhr.responseText), 'Response text has been modified'); assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); done(); diff --git a/wiki/about-trusted-scriptlets.md b/wiki/about-trusted-scriptlets.md index 01cd58be..348b7844 100644 --- a/wiki/about-trusted-scriptlets.md +++ b/wiki/about-trusted-scriptlets.md @@ -184,12 +184,12 @@ example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, - arbitrary value - empty string for no value - `$now$` keyword for setting current time -- 'offsetExpiresSec' - optional, offset from current time in seconds, after which cookie should expire; defaults to no offset +- `offsetExpiresSec` - optional, offset from current time in seconds, after which cookie should expire; defaults to no offset Possible values: - positive integer in seconds - `1year` keyword for setting expiration date to one year - `1day` keyword for setting expiration date to one day -- 'reload' - optional, boolean. Argument for reloading page after cookie is set. Defaults to `false` +- `reload` - optional, boolean. Argument for reloading page after cookie is set. Defaults to `false` - `path` - optional, argument for setting cookie path, defaults to `/`; possible values: - `/` — root path - `none` — to set no path at all @@ -203,7 +203,7 @@ example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '1-accept_1') 2. Set cookie with `new Date().getTime()` value ``` -example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '$now') +example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '$now$') ``` 3. Set cookie which will expire in 3 days From 72ccde5c7dd679883d9f2cea8dbd76ef8bbf6eb3 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Thu, 1 Dec 2022 13:52:59 +0300 Subject: [PATCH 02/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 846682e7..98b92e6e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.4", + "version": "1.7.5", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From 6eef28a8752005da0a0a01309dd7f691d21d31d0 Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Thu, 1 Dec 2022 17:52:59 +0300 Subject: [PATCH 03/70] add `trusted-set-cookie-reload` scriptlet. AG-17983 Squashed commit of the following: commit 4687d818189d5c8f53eb66fc40d971a8590b4ba5 Author: Slava Leleka Date: Thu Dec 1 16:45:03 2022 +0200 refactor cookie utils commit dbf9de45ff8fc9702529e1f610d2aa8fffd41228 Author: Slava Leleka Date: Thu Dec 1 15:55:06 2022 +0200 fix comment for getTrustedCookieOffsetMs commit f1f59eca2162ab7c0b6482d17f9b126c31551cf4 Author: Slava Leleka Date: Thu Dec 1 15:18:54 2022 +0200 update trusted set cookie scriptlet description commit 67dec237c96c1c6258e569832007a7ff00c0e5af Author: Slava Leleka Date: Thu Dec 1 15:15:52 2022 +0200 improve comment for parseKeywordValue() commit 57755a5d88ece225c8103d3413a28e50ef9ce5e3 Author: Slava Leleka Date: Thu Dec 1 15:08:49 2022 +0200 fix trusted-set-cookie-reload examples commit 5d6e4749b263975f98d4c9f08bc88641e069321a Author: Slava Leleka Date: Thu Dec 1 15:03:16 2022 +0200 fix comment for getTrustedCookieOffsetMs commit 43e6a7372474444c06987c88c9755666f8b49473 Author: Slava Leleka Date: Thu Dec 1 15:02:45 2022 +0200 fiix type for concatCookieNameValuePath commit 55ea745b5cd3035337c873335a4f92e7b7031f83 Author: Slava Leleka Date: Thu Dec 1 14:39:17 2022 +0200 update changelog commit bbe5a91b698b1c3f1e6685654a3a7215b47e351b Merge: f2ff553 72ccde5 Author: Slava Leleka Date: Thu Dec 1 14:35:46 2022 +0200 merge master, resolve conflicts commit f2ff55309a146ed8269164c5bd3104242276cf0d Author: Slava Leleka Date: Wed Nov 30 22:36:44 2022 +0200 refactor getLimitedCookieValue, log input value if it is invalid for set-cookie and set-cookie-reload commit 127bd9ad9197ad334870c3cd602eb55865bc5617 Author: Slava Leleka Date: Wed Nov 30 22:33:05 2022 +0200 fix trusted set cookie scriptlets invalid offsetExpiresSec logging commit 6cc0fe5b6c6e397a5a96b1b04aedb0e3c7bc4b48 Author: Slava Leleka Date: Wed Nov 30 22:31:43 2022 +0200 use guard expression for set-cookie and set-cookie-reload commit 3560bdd8d00a892326cb045f9edc0f2cbcbec716 Author: Slava Leleka Date: Wed Nov 30 22:24:45 2022 +0200 fix description typo commit ec045e9bbc6b4841002f17dc285ab0f67c6f67d3 Author: Slava Leleka Date: Wed Nov 30 22:00:30 2022 +0200 add trusted-set-cookie-reload scriptlet --- CHANGELOG.md | 6 +- src/helpers/cookie-utils.js | 52 +++++-- src/helpers/parse-keyword-value.js | 5 + src/scriptlets/scriptlets-list.js | 1 + src/scriptlets/set-cookie-reload.js | 32 +++-- src/scriptlets/set-cookie.js | 20 ++- src/scriptlets/trusted-set-cookie-reload.js | 134 ++++++++++++++++++ src/scriptlets/trusted-set-cookie.js | 85 ++++------- tests/scriptlets/index.test.js | 1 + .../trusted-set-cookie-reload.test.js | 116 +++++++++++++++ 10 files changed, 357 insertions(+), 95 deletions(-) create mode 100644 src/scriptlets/trusted-set-cookie-reload.js create mode 100644 tests/scriptlets/trusted-set-cookie-reload.test.js diff --git a/CHANGELOG.md b/CHANGELOG.md index e336ede5..367cab62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # Scriptlets and Redirect Resources Changelog -## v1.7.5 +## v1.7.6 + +### Added + +* new scriptlet `trusted-set-cookie-reload` ### Fixed diff --git a/src/helpers/cookie-utils.js b/src/helpers/cookie-utils.js index d8927c8e..7fe1954f 100644 --- a/src/helpers/cookie-utils.js +++ b/src/helpers/cookie-utils.js @@ -1,5 +1,4 @@ import { nativeIsNaN } from './number-utils'; -import { logMessage } from './log-message'; /** * @typedef { import('../scriptlets/index').Source } Source @@ -12,7 +11,7 @@ import { logMessage } from './log-message'; * * @returns {boolean} */ -export const isValidCookieRawPath = (rawPath) => rawPath === '/' || rawPath === 'none'; +export const isValidCookiePath = (rawPath) => rawPath === '/' || rawPath === 'none'; /** * Returns 'path=/' if rawPath is '/' @@ -28,25 +27,19 @@ export const getCookiePath = (rawPath) => { } // otherwise do not set path as invalid // the same for pathArg === 'none' - // return ''; }; /** * Combines input cookie name, value, and path into string. * - * @param {Source} source * @param {string} rawName * @param {string} rawValue * @param {string} rawPath * - * @returns {string} string OR `null` if path is not supported + * @returns {string|null} string OR `null` if path is not supported */ -export const concatCookieNameValuePath = (source, rawName, rawValue, rawPath) => { - if (!isValidCookieRawPath(rawPath)) { - logMessage(source, `Invalid cookie path: '${rawPath}'`); - return null; - } +export const concatCookieNameValuePath = (rawName, rawValue, rawPath) => { // eslint-disable-next-line max-len return `${encodeURIComponent(rawName)}=${encodeURIComponent(rawValue)}; ${getCookiePath(rawPath)};`; }; @@ -54,12 +47,11 @@ export const concatCookieNameValuePath = (source, rawName, rawValue, rawPath) => /** * Gets supported cookie value * - * @param {Source} source * @param {string} value input cookie value * * @returns {string|null} valid cookie string if ok OR null if not */ -export const getLimitedCookieValue = (source, value) => { +export const getLimitedCookieValue = (value) => { if (!value) { return null; } @@ -88,11 +80,9 @@ export const getLimitedCookieValue = (source, value) => { } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); if (nativeIsNaN(validValue)) { - logMessage(source, `Invalid cookie value: '${value}'`); return null; } if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { - logMessage(source, `Invalid cookie value: '${value}'`); return null; } } else { @@ -152,3 +142,37 @@ export const isCookieSetWithValue = (cookieString, name, value) => { return name === cookieName && value === cookieValue; }); }; + +/** + * Returns parsed offset expired number of ms or null if `offsetExpiresSec` is invalid + * + * @param {string} offsetExpiresSec input offset param in seconds + * @returns {number|null} number is milliseconds OR null + */ +export const getTrustedCookieOffsetMs = (offsetExpiresSec) => { + if (!offsetExpiresSec) { + return null; + } + + const ONE_YEAR_EXPIRATION_KEYWORD = '1year'; + const ONE_DAY_EXPIRATION_KEYWORD = '1day'; + + const MS_IN_SEC = 1000; + const SECONDS_IN_YEAR = 365 * 24 * 60 * 60; + const SECONDS_IN_DAY = 24 * 60 * 60; + + let parsedSec; + // Set predefined expire value if corresponding keyword was passed + if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_YEAR; + } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_DAY; + } else { + parsedSec = Number.parseInt(offsetExpiresSec, 10); + // If offsetExpiresSec has been parsed to NaN - do not set cookie at all + if (Number.isNaN(parsedSec)) { + return null; + } + } + return parsedSec * MS_IN_SEC; +}; diff --git a/src/helpers/parse-keyword-value.js b/src/helpers/parse-keyword-value.js index f2785af6..3e0ee557 100644 --- a/src/helpers/parse-keyword-value.js +++ b/src/helpers/parse-keyword-value.js @@ -1,6 +1,11 @@ /** * Modifies passed keyword value according to its purpose. * Returns initial value if it's not a keyword. + * + * Supported keywords: + * - '$now$' - returns current time in ms, e.g 1667915146503 + * - '$currentDate$' - returns current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * * @param {string} rawValue * @returns {string} */ diff --git a/src/scriptlets/scriptlets-list.js b/src/scriptlets/scriptlets-list.js index 0a9141f4..e718d182 100644 --- a/src/scriptlets/scriptlets-list.js +++ b/src/scriptlets/scriptlets-list.js @@ -51,5 +51,6 @@ export * from './no-topics'; export * from './trusted-replace-xhr-response'; export * from './xml-prune'; export * from './trusted-set-cookie'; +export * from './trusted-set-cookie-reload'; export * from './trusted-replace-fetch-response'; export * from './trusted-set-local-storage-item'; diff --git a/src/scriptlets/set-cookie-reload.js b/src/scriptlets/set-cookie-reload.js index b7d83ce6..f3290c82 100644 --- a/src/scriptlets/set-cookie-reload.js +++ b/src/scriptlets/set-cookie-reload.js @@ -5,9 +5,9 @@ import { isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, + isValidCookiePath, // following helpers should be imported and injected // because they are used by helpers above - isValidCookieRawPath, getCookiePath, } from '../helpers/index'; @@ -51,23 +51,29 @@ export function setCookieReload(source, name, value, path = '/') { return; } - const validValue = getLimitedCookieValue(source, value); + const validValue = getLimitedCookieValue(value); if (validValue === null) { - logMessage(source, `Invalid cookie value: '${validValue}'`); + logMessage(source, `Invalid cookie value: '${value}'`); return; } - const cookieData = concatCookieNameValuePath(source, name, validValue, path); + if (!isValidCookiePath(path)) { + logMessage(source, `Invalid cookie path: '${path}'`); + return; + } + + const cookieToSet = concatCookieNameValuePath(name, validValue, path); + if (!cookieToSet) { + return; + } - if (cookieData) { - document.cookie = cookieData; - hit(source); + document.cookie = cookieToSet; + hit(source); - // Only reload the page if cookie was set - // https://github.com/AdguardTeam/Scriptlets/issues/212 - if (isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); - } + // Only reload the page if cookie was set + // https://github.com/AdguardTeam/Scriptlets/issues/212 + if (isCookieSetWithValue(document.cookie, name, value)) { + window.location.reload(); } } @@ -82,6 +88,6 @@ setCookieReload.injections = [ isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, - isValidCookieRawPath, + isValidCookiePath, getCookiePath, ]; diff --git a/src/scriptlets/set-cookie.js b/src/scriptlets/set-cookie.js index 87e7eac1..3fe142a1 100644 --- a/src/scriptlets/set-cookie.js +++ b/src/scriptlets/set-cookie.js @@ -5,9 +5,9 @@ import { isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, + isValidCookiePath, // following helpers should be imported and injected // because they are used by helpers above - isValidCookieRawPath, getCookiePath, } from '../helpers/index'; @@ -47,18 +47,24 @@ import { */ /* eslint-enable max-len */ export function setCookie(source, name, value, path = '/') { - const validValue = getLimitedCookieValue(source, value); + const validValue = getLimitedCookieValue(value); if (validValue === null) { logMessage(source, `Invalid cookie value: '${validValue}'`); return; } - const cookieData = concatCookieNameValuePath(source, name, validValue, path); + if (!isValidCookiePath(path)) { + logMessage(source, `Invalid cookie path: '${path}'`); + return; + } - if (cookieData) { - hit(source); - document.cookie = cookieData; + const cookieToSet = concatCookieNameValuePath(name, validValue, path); + if (!cookieToSet) { + return; } + + hit(source); + document.cookie = cookieToSet; } setCookie.names = [ @@ -72,6 +78,6 @@ setCookie.injections = [ isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, - isValidCookieRawPath, + isValidCookiePath, getCookiePath, ]; diff --git a/src/scriptlets/trusted-set-cookie-reload.js b/src/scriptlets/trusted-set-cookie-reload.js new file mode 100644 index 00000000..49506bcd --- /dev/null +++ b/src/scriptlets/trusted-set-cookie-reload.js @@ -0,0 +1,134 @@ +import { + hit, + logMessage, + nativeIsNaN, + isCookieSetWithValue, + concatCookieNameValuePath, + isValidCookiePath, + parseKeywordValue, + getTrustedCookieOffsetMs, + // following helpers should be imported and injected + // because they are used by helpers above + getCookiePath, +} from '../helpers/index'; + +/* eslint-disable max-len */ +/** + * @trustedScriptlet trusted-set-cookie-reload + * + * @description + * Sets a cookie with arbitrary name and value, + * and with optional ability to offset cookie attribute 'expires' and set path. + * Also reloads the current page after the cookie setting. + * If reloading option is not needed, use the [`trusted-set-cookie` scriptlet](#trusted-set-cookie). + * + * **Syntax** + * ``` + * example.org#%#//scriptlet('trusted-set-cookie-reload', name, value[, offsetExpiresSec[, path]]) + * ``` + * + * - `name` - required, cookie name to be set + * - `value` - required, cookie value. Possible values: + * - arbitrary value + * - empty string for no value + * - `$now$` keyword for setting current time in ms, e.g 1667915146503 + * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * - 'offsetExpiresSec' - optional, offset from current time in seconds, after which cookie should expire; defaults to no offset + * Possible values: + * - positive integer in seconds + * - `1year` keyword for setting expiration date to one year + * - `1day` keyword for setting expiration date to one day + * - `path` - optional, argument for setting cookie path, defaults to `/`; possible values: + * - `/` — root path + * - `none` — to set no path at all + * + * **Examples** + * 1. Set cookie and reload the page after it + * ``` + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept') + * ``` + * + * 2. Set cookie with `new Date().getTime()` value and reload the page after it + * ``` + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', '$now$') + * ``` + * + * 3. Set cookie which will expire in 3 days and reload the page after it + * ``` + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '259200') + * ``` + * + * 4. Set cookie which will expire in one year and reload the page after it + * ``` + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '1year') + * ``` + * + * 5. Set cookie with no 'expire' and no path, reload the page after it + * ``` + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'decline', '', 'none') + * ``` + */ +/* eslint-enable max-len */ + +export function trustedSetCookieReload(source, name, value, offsetExpiresSec = '', path = '/') { + if (typeof name === 'undefined') { + logMessage(source, 'Cookie name should be specified.'); + return; + } + if (typeof value === 'undefined') { + logMessage(source, 'Cookie value should be specified.'); + return; + } + + // Prevent infinite reloads if cookie was already set or blocked by the browser + // https://github.com/AdguardTeam/Scriptlets/issues/212 + if (isCookieSetWithValue(document.cookie, name, value)) { + return; + } + + const parsedValue = parseKeywordValue(value); + + if (!isValidCookiePath(path)) { + logMessage(source, `Invalid cookie path: '${path}'`); + return; + } + + let cookieToSet = concatCookieNameValuePath(name, parsedValue, path); + if (!cookieToSet) { + return; + } + + const parsedOffsetExpiresMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetExpiresMs) { + logMessage(source, `Invalid offsetExpiresSec value: ${offsetExpiresSec}`); + return; + } + const expires = Date.now() + parsedOffsetExpiresMs; + cookieToSet += ` expires=${new Date(expires).toUTCString()};`; + + document.cookie = cookieToSet; + hit(source); + + // Only reload the page if cookie was set + // https://github.com/AdguardTeam/Scriptlets/issues/212 + if (isCookieSetWithValue(document.cookie, name, value)) { + window.location.reload(); + } +} + +trustedSetCookieReload.names = [ + 'trusted-set-cookie-reload', + // trusted scriptlets support no aliases +]; + +trustedSetCookieReload.injections = [ + hit, + logMessage, + nativeIsNaN, + isCookieSetWithValue, + concatCookieNameValuePath, + isValidCookiePath, + getTrustedCookieOffsetMs, + parseKeywordValue, + getCookiePath, +]; diff --git a/src/scriptlets/trusted-set-cookie.js b/src/scriptlets/trusted-set-cookie.js index 5459df37..deb64383 100644 --- a/src/scriptlets/trusted-set-cookie.js +++ b/src/scriptlets/trusted-set-cookie.js @@ -4,10 +4,11 @@ import { nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, + isValidCookiePath, parseKeywordValue, + getTrustedCookieOffsetMs, // following helpers should be imported and injected // because they are used by helpers above - isValidCookieRawPath, getCookiePath, } from '../helpers/index'; @@ -16,25 +17,25 @@ import { * @trustedScriptlet trusted-set-cookie * * @description - * Sets a cookie with arbitrary name and value, with optional path - * and the ability to reload the page after cookie was set. + * Sets a cookie with arbitrary name and value, + * and with optional ability to offset cookie attribute 'expires' and set path. * * **Syntax** * ``` - * example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, reload[, path]]]) + * example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, path]]) * ``` * * - `name` - required, cookie name to be set * - `value` - required, cookie value. Possible values: * - arbitrary value * - empty string for no value - * - `$now$` keyword for setting current time + * - `$now$` keyword for setting current time in ms, e.g 1667915146503 + * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' * - `offsetExpiresSec` - optional, offset from current time in seconds, after which cookie should expire; defaults to no offset * Possible values: * - positive integer in seconds * - `1year` keyword for setting expiration date to one year * - `1day` keyword for setting expiration date to one day - * - `reload` - optional, boolean. Argument for reloading page after cookie is set. Defaults to `false` * - `path` - optional, argument for setting cookie path, defaults to `/`; possible values: * - `/` — root path * - `none` — to set no path at all @@ -60,83 +61,46 @@ import { * ``` * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '1year') * ``` - * 5. Reload the page if cookie was successfully set - * ``` - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'true') - * ``` * - * 6. Set cookie with no path + * 5. Set cookie with no path * ``` - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', '', 'none') + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'none') * ``` */ /* eslint-enable max-len */ -export function trustedSetCookie(source, name, value, offsetExpiresSec = '', reload = 'false', path = '/') { +export function trustedSetCookie(source, name, value, offsetExpiresSec = '', path = '/') { if (typeof name === 'undefined') { logMessage(source, 'Cookie name should be specified.'); return; } - if (typeof value === 'undefined') { logMessage(source, 'Cookie value should be specified.'); return; } - // Prevent infinite reloads if cookie was already set or blocked by the browser - // https://github.com/AdguardTeam/Scriptlets/issues/212 - if (reload === 'true' && isCookieSetWithValue(document.cookie, name, value)) { + const parsedValue = parseKeywordValue(value); + + if (!isValidCookiePath(path)) { + logMessage(source, `Invalid cookie path: '${path}'`); return; } - const ONE_YEAR_EXPIRATION_KEYWORD = '1year'; - const ONE_DAY_EXPIRATION_KEYWORD = '1day'; - - const parsedValue = parseKeywordValue(value); - - let cookieToSet = concatCookieNameValuePath(source, name, parsedValue, path); + let cookieToSet = concatCookieNameValuePath(name, parsedValue, path); if (!cookieToSet) { return; } - // Set expiration date if offsetExpiresSec was passed - if (offsetExpiresSec) { - const MS_IN_SEC = 1000; - const SECONDS_IN_YEAR = 365 * 24 * 60 * 60; - const SECONDS_IN_DAY = 24 * 60 * 60; - - let parsedOffsetExpiresSec; - - // Set predefined expire value if corresponding keyword was passed - if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { - parsedOffsetExpiresSec = SECONDS_IN_YEAR; - } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { - parsedOffsetExpiresSec = SECONDS_IN_DAY; - } else { - parsedOffsetExpiresSec = Number.parseInt(offsetExpiresSec, 10); - - // If offsetExpiresSec has been parsed to NaN - do not set cookie at all - if (Number.isNaN(parsedOffsetExpiresSec)) { - const message = `log: Invalid offsetExpiresSec value: ${offsetExpiresSec}`; - logMessage(source, message); - return; - } - } - - const expires = Date.now() + parsedOffsetExpiresSec * MS_IN_SEC; - cookieToSet += ` expires=${new Date(expires).toUTCString()};`; + const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, `Invalid offsetExpiresSec value: ${offsetExpiresSec}`); + return; } + const expires = Date.now() + parsedOffsetMs; + cookieToSet += ` expires=${new Date(expires).toUTCString()};`; - if (cookieToSet) { - document.cookie = cookieToSet; - hit(source); - - // Only reload the page if cookie was set - // https://github.com/AdguardTeam/Scriptlets/issues/212 - if (reload === 'true' && isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); - } - } + document.cookie = cookieToSet; + hit(source); } trustedSetCookie.names = [ @@ -150,7 +114,8 @@ trustedSetCookie.injections = [ nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, - isValidCookieRawPath, + isValidCookiePath, + getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath, ]; diff --git a/tests/scriptlets/index.test.js b/tests/scriptlets/index.test.js index 06adf3bb..34e89d7c 100644 --- a/tests/scriptlets/index.test.js +++ b/tests/scriptlets/index.test.js @@ -48,5 +48,6 @@ import './trusted-replace-xhr-response.test'; import './xml-prune.test'; import './trusted-click-element.test'; import './trusted-set-cookie.test'; +import './trusted-set-cookie-reload.test'; import './trusted-replace-fetch-response.test'; import './trusted-set-local-storage-item.test'; diff --git a/tests/scriptlets/trusted-set-cookie-reload.test.js b/tests/scriptlets/trusted-set-cookie-reload.test.js new file mode 100644 index 00000000..c030016a --- /dev/null +++ b/tests/scriptlets/trusted-set-cookie-reload.test.js @@ -0,0 +1,116 @@ +/* eslint-disable no-underscore-dangle */ +import { + runScriptlet, + clearGlobalProps, + clearCookie, +} from '../helpers'; + +const { test, module } = QUnit; +const name = 'trusted-set-cookie-reload'; + +const beforeEach = () => { + window.__debug = () => { + window.hit = 'FIRED'; + }; +}; + +const afterEach = () => { + clearGlobalProps('hit', '__debug'); +}; + +module(name, { beforeEach, afterEach }); + +test('Set cookie string', (assert) => { + let cName = '__test-cookie-reload_OK'; + let cValue = 'OK'; + runScriptlet(name, [cName, cValue]); + assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); + assert.strictEqual(document.cookie.includes(cName), true, 'Cookie name has been set'); + assert.strictEqual(document.cookie.includes(cValue), true, 'Cookie value has been set'); + clearCookie(cName); + + cName = '__test-cookie-reload_0'; + cValue = 0; + runScriptlet(name, [cName, cValue, '', '']); + assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); + assert.strictEqual(document.cookie.includes(cName), true, 'Cookie name has been set'); + assert.strictEqual(document.cookie.includes(cValue), true, 'Cookie value has been set'); + clearCookie(cName); + + cName = 'trackingSettings'; + cValue = '{%22ads%22:false%2C%22performance%22:false}'; + runScriptlet(name, [cName, cValue]); + + assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); + assert.strictEqual(document.cookie.includes(cName), true, 'Cookie name has been set'); + assert.strictEqual(document.cookie.includes(encodeURIComponent(cValue)), true, 'Cookie value has been set'); + clearCookie(cName); +}); + +test('Set cookie with current time value', (assert) => { + const cName = '__test-cookie-reload_OK'; + const cValue = '$now$'; + + runScriptlet(name, [cName, cValue]); + + assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); + assert.strictEqual(document.cookie.includes(cName), true, 'Cookie name has been set'); + + // Some time will pass between calling scriptlet + // and qunit running assertion + const tolerance = 20; + const cookieValue = document.cookie.split('=')[1]; + const currentTime = new Date().getTime(); + const timeDiff = currentTime - cookieValue; + + assert.ok(timeDiff < tolerance, 'Cookie value has been set to current time'); + + clearCookie(cName); +}); + +test('Set cookie with expires', (assert) => { + const cName = '__test-cookie-reload_expires'; + const cValue = 'expires'; + const expiresSec = 2; + + runScriptlet(name, [cName, cValue, `${expiresSec}`]); + + assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); + assert.strictEqual(document.cookie.includes(cName), true, 'Cookie name has been set'); + assert.strictEqual(document.cookie.includes(cValue), true, 'Cookie value has been set'); + + const done = assert.async(); + + setTimeout(() => { + assert.strictEqual(document.cookie.includes(cName), false, 'Cookie name has been deleted'); + assert.strictEqual(document.cookie.includes(cValue), false, 'Cookie value has been deleted'); + clearCookie(cName); + done(); + }, expiresSec * 1000); +}); + +test('Set cookie with negative expires', (assert) => { + const cName = '__test-cookie-reload_expires_negative'; + const cValue = 'expires'; + const expiresSec = -2; + + runScriptlet(name, [cName, cValue, `${expiresSec}`]); + + assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); + assert.strictEqual(document.cookie.includes(cName), false, 'Cookie name has not been set'); + assert.strictEqual(document.cookie.includes(cValue), false, 'Cookie value has not been set'); + clearCookie(cName); +}); + +test('Set cookie with invalid expires', (assert) => { + const cName = '__test-cookie-reload_expires_invalid'; + const cValue = 'expires'; + const expiresSec = 'invalid_value'; + + runScriptlet(name, [cName, cValue, `${expiresSec}`]); + + assert.strictEqual(window.hit, undefined, 'Hit was not fired'); + assert.strictEqual(document.cookie.includes(cName), false, 'Cookie name has not been set'); + assert.strictEqual(document.cookie.includes(cValue), false, 'Cookie value has not been set'); + clearCookie(cName); +}); From ea7bb5bef153ca94415cc00615596fdf54aebd1c Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Thu, 1 Dec 2022 17:53:13 +0300 Subject: [PATCH 04/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 98b92e6e..2df789f8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.5", + "version": "1.7.6", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From 0f735e5378c96d87c5aa5b73855b35867023ac3c Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Thu, 1 Dec 2022 18:19:29 +0300 Subject: [PATCH 05/70] deploy: update dist v1.7.6 --- dist/build.txt | 2 +- dist/redirects.yml | 2 +- dist/scriptlets.corelibs.json | 24 +- dist/scriptlets.js | 2425 ++++++++++++------------------ dist/umd/scriptlets.umd.js | 2425 ++++++++++++------------------ wiki/about-trusted-scriptlets.md | 75 +- 6 files changed, 1951 insertions(+), 3002 deletions(-) diff --git a/dist/build.txt b/dist/build.txt index 23f2750c..f38eda9d 100644 --- a/dist/build.txt +++ b/dist/build.txt @@ -1 +1 @@ -version=1.7.3 \ No newline at end of file +version=1.7.6 \ No newline at end of file diff --git a/dist/redirects.yml b/dist/redirects.yml index 21a7e86d..da8cd735 100644 --- a/dist/redirects.yml +++ b/dist/redirects.yml @@ -1,6 +1,6 @@ # # AdGuard Scriptlets (Redirects Source) -# Version 1.7.3 +# Version 1.7.6 # - title: 1x1-transparent.gif description: |- diff --git a/dist/scriptlets.corelibs.json b/dist/scriptlets.corelibs.json index 7ca94c06..00e3b90b 100644 --- a/dist/scriptlets.corelibs.json +++ b/dist/scriptlets.corelibs.json @@ -1,5 +1,5 @@ { - "version": "1.7.3", + "version": "1.7.6", "scriptlets": [ { "names": [ @@ -111,7 +111,7 @@ "ubo-set", "abp-override-property-read" ], - "scriptlet": "function setConstant(source,args){function noopFunc(){}function trueFunc(){return!0}function falseFunc(){return!1}function noopPromiseReject(){return Promise.reject()}function noopPromiseResolve(){var responseBody=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"{}\",responseUrl=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",responseType=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"default\";if(\"undefined\"!=typeof Response){var response=new Response(responseBody,{status:200,statusText:\"OK\"});return Object.defineProperties(response,{url:{value:responseUrl},type:{value:responseType}}),Promise.resolve(response)}}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&isEmptyObject(base)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function isEmptyObject(obj){return 0===Object.keys(obj).length}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,value,stack){if(property&&function(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(shouldAbortInlineOrInjectedScript(stackMatch,stackTrace))return!0;var stackRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(stackMatch),refinedStackTrace=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).join(\"\\n\");return Object.getOwnPropertyDescriptor(RegExp.prototype,\"test\").value.call(stackRegexp,refinedStackTrace)}(stack,(new Error).stack)){var constantValue,num;if(\"undefined\"===value)constantValue=void 0;else if(\"false\"===value)constantValue=!1;else if(\"true\"===value)constantValue=!0;else if(\"null\"===value)constantValue=null;else if(\"emptyArr\"===value)constantValue=[];else if(\"emptyObj\"===value)constantValue={};else if(\"noopFunc\"===value)constantValue=noopFunc;else if(\"trueFunc\"===value)constantValue=trueFunc;else if(\"falseFunc\"===value)constantValue=falseFunc;else if(\"noopPromiseResolve\"===value)constantValue=noopPromiseResolve;else if(\"noopPromiseReject\"===value)constantValue=noopPromiseReject;else if(/^\\d+$/.test(value)){if(num=constantValue=parseFloat(value),(Number.isNaN||window.isNaN)(num))return;if(Math.abs(constantValue)>32767)return}else if(\"-1\"===value)constantValue=-1;else if(\"\"===value)constantValue=\"\";else if(\"yes\"===value)constantValue=\"yes\";else{if(\"no\"!==value)return;constantValue=\"no\"}var canceled=!1,mustCancel=function(value){return canceled||(canceled=void 0!==value&&void 0!==constantValue&&typeof value!=typeof constantValue&&null!==value)},trapProp=function(base,prop,configurable,handler){if(!handler.init(base[prop]))return!1;var prevSetter,origDescriptor=Object.getOwnPropertyDescriptor(base,prop);if(origDescriptor instanceof Object){if(!origDescriptor.configurable){var message=\"set-constant: property '\".concat(prop,\"' is not configurable\");return function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,message),!1}base[prop]=constantValue,origDescriptor.set instanceof Function&&(prevSetter=origDescriptor.set)}return Object.defineProperty(base,prop,{configurable:configurable,get:function(){return handler.get()},set:function(a){void 0!==prevSetter&&prevSetter(a),handler.set(a)}}),!0};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain,inChainPropHandler={factValue:void 0,init:function(a){return this.factValue=a,!0},get:function(){return this.factValue},set:function(a){this.factValue!==a&&(this.factValue=a,a instanceof Object&&setChainPropAccess(a,chain))}},endPropHandler={init:function(a){return!mustCancel(a)},get:function(){return constantValue},set:function(a){mustCancel(a)&&(constantValue=a)}};if(chain)if(void 0===base||null!==base[prop]){(base instanceof Object||\"object\"==typeof base)&&isEmptyObject(base)&&trapProp(base,prop,!0,inChainPropHandler);var propValue=owner[prop];(propValue instanceof Object||\"object\"==typeof propValue&&null!==propValue)&&setChainPropAccess(propValue,chain),trapProp(base,prop,!0,inChainPropHandler)}else trapProp(base,prop,!0,inChainPropHandler);else trapProp(base,prop,!1,endPropHandler)&&function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}(window,property)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function setConstant(source,args){function noopFunc(){}function trueFunc(){return!0}function falseFunc(){return!1}function noopPromiseReject(){return Promise.reject()}function noopPromiseResolve(){var responseBody=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"{}\",responseUrl=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",responseType=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"default\";if(\"undefined\"!=typeof Response){var response=new Response(responseBody,{status:200,statusText:\"OK\"});return Object.defineProperties(response,{url:{value:responseUrl},type:{value:responseType}}),Promise.resolve(response)}}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&isEmptyObject(base)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function isEmptyObject(obj){return 0===Object.keys(obj).length}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,value,stack){if(property&&function(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(shouldAbortInlineOrInjectedScript(stackMatch,stackTrace))return!0;var stackRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(stackMatch),refinedStackTrace=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).join(\"\\n\");return Object.getOwnPropertyDescriptor(RegExp.prototype,\"test\").value.call(stackRegexp,refinedStackTrace)}(stack,(new Error).stack)){var constantValue,num;if(\"undefined\"===value)constantValue=void 0;else if(\"false\"===value)constantValue=!1;else if(\"true\"===value)constantValue=!0;else if(\"null\"===value)constantValue=null;else if(\"emptyArr\"===value)constantValue=[];else if(\"emptyObj\"===value)constantValue={};else if(\"noopFunc\"===value)constantValue=noopFunc;else if(\"trueFunc\"===value)constantValue=trueFunc;else if(\"falseFunc\"===value)constantValue=falseFunc;else if(\"noopPromiseResolve\"===value)constantValue=noopPromiseResolve;else if(\"noopPromiseReject\"===value)constantValue=noopPromiseReject;else if(/^\\d+$/.test(value)){if(num=constantValue=parseFloat(value),(Number.isNaN||window.isNaN)(num))return;if(Math.abs(constantValue)>32767)return}else if(\"-1\"===value)constantValue=-1;else if(\"\"===value)constantValue=\"\";else if(\"yes\"===value)constantValue=\"yes\";else{if(\"no\"!==value)return;constantValue=\"no\"}var canceled=!1,mustCancel=function(value){return canceled||(canceled=void 0!==value&&void 0!==constantValue&&typeof value!=typeof constantValue&&null!==value)},trapProp=function(base,prop,configurable,handler){if(!handler.init(base[prop]))return!1;var prevSetter,origDescriptor=Object.getOwnPropertyDescriptor(base,prop);if(origDescriptor instanceof Object){if(!origDescriptor.configurable){var message=\"Property '\".concat(prop,\"' is not configurable\");return function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,message),!1}base[prop]=constantValue,origDescriptor.set instanceof Function&&(prevSetter=origDescriptor.set)}return Object.defineProperty(base,prop,{configurable:configurable,get:function(){return handler.get()},set:function(a){void 0!==prevSetter&&prevSetter(a),handler.set(a)}}),!0};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain,inChainPropHandler={factValue:void 0,init:function(a){return this.factValue=a,!0},get:function(){return this.factValue},set:function(a){this.factValue!==a&&(this.factValue=a,a instanceof Object&&setChainPropAccess(a,chain))}},endPropHandler={init:function(a){return!mustCancel(a)},get:function(){return constantValue},set:function(a){mustCancel(a)&&(constantValue=a)}};if(chain)if(void 0===base||null!==base[prop]){(base instanceof Object||\"object\"==typeof base)&&isEmptyObject(base)&&trapProp(base,prop,!0,inChainPropHandler);var propValue=owner[prop];(propValue instanceof Object||\"object\"==typeof propValue&&null!==propValue)&&setChainPropAccess(propValue,chain),trapProp(base,prop,!0,inChainPropHandler)}else trapProp(base,prop,!0,inChainPropHandler);else trapProp(base,prop,!1,endPropHandler)&&function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}(window,property)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -352,13 +352,13 @@ "names": [ "set-cookie" ], - "scriptlet": "function setCookie(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function getLimitedCookieValue(source,value){if(!value)return null;var validValue,num;if(\"true\"===value)validValue=\"true\";else if(\"True\"===value)validValue=\"True\";else if(\"false\"===value)validValue=\"false\";else if(\"False\"===value)validValue=\"False\";else if(\"yes\"===value)validValue=\"yes\";else if(\"Yes\"===value)validValue=\"Yes\";else if(\"Y\"===value)validValue=\"Y\";else if(\"no\"===value)validValue=\"no\";else if(\"ok\"===value)validValue=\"ok\";else if(\"OK\"===value)validValue=\"OK\";else{if(!/^\\d+$/.test(value))return null;if(validValue=parseFloat(value),num=validValue,(Number.isNaN||window.isNaN)(num))return logMessage(source,\"Invalid cookie value: '\".concat(value,\"'\")),null;if(Math.abs(validValue)<0||Math.abs(validValue)>15)return logMessage(source,\"Invalid cookie value: '\".concat(value,\"'\")),null}return validValue}function concatCookieNameValuePath(source,rawName,rawValue,rawPath){return function(rawPath){return\"/\"===rawPath||\"none\"===rawPath}(rawPath)?\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath)):(logMessage(source,\"Invalid cookie path: '\".concat(rawPath,\"'\")),null)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var path=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"/\",validValue=getLimitedCookieValue(source,value);if(null!==validValue){var cookieData=concatCookieNameValuePath(source,name,validValue,path);cookieData&&(hit(source),document.cookie=cookieData)}else logMessage(source,\"Invalid cookie value: '\".concat(validValue,\"'\"))}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function setCookie(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function getLimitedCookieValue(value){if(!value)return null;var validValue,num;if(\"true\"===value)validValue=\"true\";else if(\"True\"===value)validValue=\"True\";else if(\"false\"===value)validValue=\"false\";else if(\"False\"===value)validValue=\"False\";else if(\"yes\"===value)validValue=\"yes\";else if(\"Yes\"===value)validValue=\"Yes\";else if(\"Y\"===value)validValue=\"Y\";else if(\"no\"===value)validValue=\"no\";else if(\"ok\"===value)validValue=\"ok\";else if(\"OK\"===value)validValue=\"OK\";else{if(!/^\\d+$/.test(value))return null;if(validValue=parseFloat(value),num=validValue,(Number.isNaN||window.isNaN)(num))return null;if(Math.abs(validValue)<0||Math.abs(validValue)>15)return null}return validValue}function concatCookieNameValuePath(rawName,rawValue,rawPath){return\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath),\";\")}function isValidCookiePath(rawPath){return\"/\"===rawPath||\"none\"===rawPath}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var path=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"/\",validValue=getLimitedCookieValue(value);if(null!==validValue)if(isValidCookiePath(path)){var cookieToSet=concatCookieNameValuePath(name,validValue,path);cookieToSet&&(hit(source),document.cookie=cookieToSet)}else logMessage(source,\"Invalid cookie path: '\".concat(path,\"'\"));else logMessage(source,\"Invalid cookie value: '\".concat(validValue,\"'\"))}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "set-cookie-reload" ], - "scriptlet": "function setCookieReload(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function isCookieSetWithValue(cookieString,name,value){return cookieString.split(\";\").some((function(cookieStr){var pos=cookieStr.indexOf(\"=\");if(-1===pos)return!1;var cookieName=cookieStr.slice(0,pos).trim(),cookieValue=cookieStr.slice(pos+1).trim();return name===cookieName&&value===cookieValue}))}function getLimitedCookieValue(source,value){if(!value)return null;var validValue,num;if(\"true\"===value)validValue=\"true\";else if(\"True\"===value)validValue=\"True\";else if(\"false\"===value)validValue=\"false\";else if(\"False\"===value)validValue=\"False\";else if(\"yes\"===value)validValue=\"yes\";else if(\"Yes\"===value)validValue=\"Yes\";else if(\"Y\"===value)validValue=\"Y\";else if(\"no\"===value)validValue=\"no\";else if(\"ok\"===value)validValue=\"ok\";else if(\"OK\"===value)validValue=\"OK\";else{if(!/^\\d+$/.test(value))return null;if(validValue=parseFloat(value),num=validValue,(Number.isNaN||window.isNaN)(num))return logMessage(source,\"Invalid cookie value: '\".concat(value,\"'\")),null;if(Math.abs(validValue)<0||Math.abs(validValue)>15)return logMessage(source,\"Invalid cookie value: '\".concat(value,\"'\")),null}return validValue}function concatCookieNameValuePath(source,rawName,rawValue,rawPath){return function(rawPath){return\"/\"===rawPath||\"none\"===rawPath}(rawPath)?\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath)):(logMessage(source,\"Invalid cookie path: '\".concat(rawPath,\"'\")),null)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var path=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"/\";if(!isCookieSetWithValue(name,value)){var validValue=getLimitedCookieValue(source,value);if(null!==validValue){var cookieData=concatCookieNameValuePath(source,name,validValue,path);cookieData&&(document.cookie=cookieData,hit(source),isCookieSetWithValue(document.cookie,name,value)&&window.location.reload())}else logMessage(source,\"Invalid cookie value: '\".concat(validValue,\"'\"))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function setCookieReload(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function isCookieSetWithValue(cookieString,name,value){return cookieString.split(\";\").some((function(cookieStr){var pos=cookieStr.indexOf(\"=\");if(-1===pos)return!1;var cookieName=cookieStr.slice(0,pos).trim(),cookieValue=cookieStr.slice(pos+1).trim();return name===cookieName&&value===cookieValue}))}function getLimitedCookieValue(value){if(!value)return null;var validValue,num;if(\"true\"===value)validValue=\"true\";else if(\"True\"===value)validValue=\"True\";else if(\"false\"===value)validValue=\"false\";else if(\"False\"===value)validValue=\"False\";else if(\"yes\"===value)validValue=\"yes\";else if(\"Yes\"===value)validValue=\"Yes\";else if(\"Y\"===value)validValue=\"Y\";else if(\"no\"===value)validValue=\"no\";else if(\"ok\"===value)validValue=\"ok\";else if(\"OK\"===value)validValue=\"OK\";else{if(!/^\\d+$/.test(value))return null;if(validValue=parseFloat(value),num=validValue,(Number.isNaN||window.isNaN)(num))return null;if(Math.abs(validValue)<0||Math.abs(validValue)>15)return null}return validValue}function concatCookieNameValuePath(rawName,rawValue,rawPath){return\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath),\";\")}function isValidCookiePath(rawPath){return\"/\"===rawPath||\"none\"===rawPath}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var path=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"/\";if(!isCookieSetWithValue(name,value)){var validValue=getLimitedCookieValue(value);if(null!==validValue)if(isValidCookiePath(path)){var cookieToSet=concatCookieNameValuePath(name,validValue,path);cookieToSet&&(document.cookie=cookieToSet,hit(source),isCookieSetWithValue(document.cookie,name,value)&&window.location.reload())}else logMessage(source,\"Invalid cookie path: '\".concat(path,\"'\"));else logMessage(source,\"Invalid cookie value: '\".concat(value,\"'\"))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -379,7 +379,7 @@ "ubo-no-fetch-if.js", "ubo-no-fetch-if" ], - "scriptlet": "function preventFetch(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function getFetchData(args){var fetchUrl,fetchInit,request,fetchPropsObj={};if(args[0]instanceof Request){var requestData=(request=args[0],getRequestProps().map((function(key){return[key,request[key]]})).reduce((function(acc,el){var key=el[0],value=el[1];return acc[key]=value,acc}),{}));fetchUrl=requestData.url,fetchInit=requestData}else fetchUrl=args[0],fetchInit=args[1];return fetchPropsObj.url=fetchUrl,fetchInit instanceof Object&&Object.keys(fetchInit).forEach((function(prop){fetchPropsObj[prop]=fetchInit[prop]})),fetchPropsObj}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function noopPromiseResolve(){var responseBody=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"{}\",responseUrl=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",responseType=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"default\";if(\"undefined\"!=typeof Response){var response=new Response(responseBody,{status:200,statusText:\"OK\"});return Object.defineProperties(response,{url:{value:responseUrl},type:{value:responseType}}),Promise.resolve(response)}}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,propsToMatchStr,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(propsToMatchStr=propsToMatch,PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=getRequestProps(),propsObj={},propsToMatchStr.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToMatch){var responseBody=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"emptyObj\",responseType=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"default\";if(\"undefined\"!=typeof fetch&&\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Response){var strResponseBody;if(\"emptyObj\"===responseBody)strResponseBody=\"{}\";else{if(\"emptyArr\"!==responseBody)return;strResponseBody=\"[]\"}if(\"default\"===responseType||\"opaque\"===responseType){var handlerWrapper=function(target,thisArg,args){var fetchData=getFetchData(args);return void 0===propsToMatch?(logMessage(source,\"fetch( \".concat(objectToString(fetchData),\" )\"),!0),hit(source),Reflect.apply(target,thisArg,args)):matchRequestProps(source,propsToMatch,fetchData)?(hit(source),noopPromiseResolve(strResponseBody,fetchData.url,responseType)):Reflect.apply(target,thisArg,args)};fetch=new Proxy(fetch,{apply:handlerWrapper})}else logMessage(source,\"Invalid parameter: \".concat(responseType))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventFetch(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function getFetchData(args){var fetchUrl,fetchInit,request,fetchPropsObj={};if(args[0]instanceof Request){var requestData=(request=args[0],[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"].map((function(key){return[key,request[key]]})).reduce((function(acc,el){var key=el[0],value=el[1];return acc[key]=value,acc}),{}));fetchUrl=requestData.url,fetchInit=requestData}else fetchUrl=args[0],fetchInit=args[1];return fetchPropsObj.url=fetchUrl,fetchInit instanceof Object&&Object.keys(fetchInit).forEach((function(prop){fetchPropsObj[prop]=fetchInit[prop]})),fetchPropsObj}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function noopPromiseResolve(){var responseBody=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"{}\",responseUrl=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",responseType=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"default\";if(\"undefined\"!=typeof Response){var response=new Response(responseBody,{status:200,statusText:\"OK\"});return Object.defineProperties(response,{url:{value:responseUrl},type:{value:responseType}}),Promise.resolve(response)}}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToMatch){var responseBody=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"emptyObj\",responseType=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"default\";if(\"undefined\"!=typeof fetch&&\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Response){var strResponseBody;if(\"emptyObj\"===responseBody)strResponseBody=\"{}\";else{if(\"emptyArr\"!==responseBody)return;strResponseBody=\"[]\"}if(\"default\"===responseType||\"opaque\"===responseType){var handlerWrapper=function(target,thisArg,args){var fetchData=getFetchData(args);return void 0===propsToMatch?(logMessage(source,\"fetch( \".concat(objectToString(fetchData),\" )\"),!0),hit(source),Reflect.apply(target,thisArg,args)):matchRequestProps(source,propsToMatch,fetchData)?(hit(source),noopPromiseResolve(strResponseBody,fetchData.url,responseType)):Reflect.apply(target,thisArg,args)};fetch=new Proxy(fetch,{apply:handlerWrapper})}else logMessage(source,\"Invalid parameter: \".concat(responseType))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -419,7 +419,7 @@ "ubo-no-xhr-if.js", "ubo-no-xhr-if" ], - "scriptlet": "function preventXHR(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function getNumberFromString(rawString){var num,parsedDelay=parseInt(rawString,10);return num=parsedDelay,(Number.isNaN||window.isNaN)(num)?null:parsedDelay}function nativeIsFinite(num){return(Number.isFinite||window.isFinite)(num)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToMatch,customResponseText){if(\"undefined\"!=typeof Proxy){var responseUrl,shouldPrevent=!1,response=\"\",responseText=\"\",openHandler={apply:function(target,thisArg,args){var xhrData={method:args[0],url:args[1]};return responseUrl=xhrData.url,void 0===propsToMatch?(logMessage(source,\"xhr( \".concat(objectToString(xhrData),\" )\"),!0),hit(source)):shouldPrevent=function(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,propsToMatchStr,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(propsToMatchStr=propsToMatch,PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=getRequestProps(),propsObj={},propsToMatchStr.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}(source,propsToMatch,xhrData),Reflect.apply(target,thisArg,args)}},sendHandler={apply:function(target,thisArg,args){if(!shouldPrevent)return Reflect.apply(target,thisArg,args);if(\"blob\"===thisArg.responseType&&(response=new Blob),\"arraybuffer\"===thisArg.responseType&&(response=new ArrayBuffer),customResponseText){var randomText=function(customResponseText){var customResponse=customResponseText;if(\"true\"===customResponse)return Math.random().toString(36).slice(-10);if(customResponse=customResponse.replace(\"length:\",\"\"),!/^\\d+-\\d+$/.test(customResponse))return null;var min,max,rangeMin=getNumberFromString(customResponse.split(\"-\")[0]),rangeMax=getNumberFromString(customResponse.split(\"-\")[1]);if(!nativeIsFinite(rangeMin)||!nativeIsFinite(rangeMax))return null;if(rangeMin>rangeMax){var temp=rangeMin;rangeMin=rangeMax,rangeMax=temp}return rangeMax>5e5?null:(customResponse=function(length){for(var result=\"\",characters=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~\",charactersLength=characters.length,i=0;i-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function getNumberFromString(rawString){var num,parsedDelay=parseInt(rawString,10);return num=parsedDelay,(Number.isNaN||window.isNaN)(num)?null:parsedDelay}function nativeIsFinite(num){return(Number.isFinite||window.isFinite)(num)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToMatch,customResponseText){if(\"undefined\"!=typeof Proxy){var responseUrl,shouldPrevent=!1,response=\"\",responseText=\"\",openHandler={apply:function(target,thisArg,args){var xhrData={method:args[0],url:args[1]};return responseUrl=xhrData.url,void 0===propsToMatch?(logMessage(source,\"xhr( \".concat(objectToString(xhrData),\" )\"),!0),hit(source)):shouldPrevent=function(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}(source,propsToMatch,xhrData),Reflect.apply(target,thisArg,args)}},sendHandler={apply:function(target,thisArg,args){if(!shouldPrevent)return Reflect.apply(target,thisArg,args);if(\"blob\"===thisArg.responseType&&(response=new Blob),\"arraybuffer\"===thisArg.responseType&&(response=new ArrayBuffer),customResponseText){var randomText=function(customResponseText){var customResponse=customResponseText;if(\"true\"===customResponse)return Math.random().toString(36).slice(-10);if(customResponse=customResponse.replace(\"length:\",\"\"),!/^\\d+-\\d+$/.test(customResponse))return null;var min,max,rangeMin=getNumberFromString(customResponse.split(\"-\")[0]),rangeMax=getNumberFromString(customResponse.split(\"-\")[1]);if(!nativeIsFinite(rangeMin)||!nativeIsFinite(rangeMax))return null;if(rangeMin>rangeMax){var temp=rangeMin;rangeMin=rangeMax,rangeMax=temp}return rangeMax>5e5?null:(customResponse=function(length){for(var result=\"\",characters=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~\",charactersLength=characters.length,i=0;i-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,propsToMatchStr,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(propsToMatchStr=propsToMatch,PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=getRequestProps(),propsObj={},propsToMatchStr.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=toRegExp(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function getXhrData(method,url,async,user,password){return{method:method,url:url,async:async,user:user,password:password}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var pattern=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",replacement=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",propsToMatch=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\";if(\"undefined\"!=typeof Proxy)if(\"\"!==pattern||\"\"===replacement){var xhrData,_ref,shouldLog=\"\"===pattern&&\"\"===replacement,nativeOpen=window.XMLHttpRequest.prototype.open,nativeSend=window.XMLHttpRequest.prototype.send,shouldReplace=!1,requestHeaders=[],openWrapper=function(target,thisArg,args){if(xhrData=getXhrData.apply(void 0,toConsumableArray(args)),shouldLog){var _message=\"log: xhr( \".concat(objectToString(xhrData),\" )\");return logMessage(source,_message,!0),hit(source),Reflect.apply(target,thisArg,args)}if(shouldReplace=matchRequestProps(source,propsToMatch,xhrData)){var setRequestHeaderHandler={apply:function(target,thisArg,args){return requestHeaders.push(args),Reflect.apply(target,thisArg,args)}};thisArg.setRequestHeader=new Proxy(thisArg.setRequestHeader,setRequestHeaderHandler)}return Reflect.apply(target,thisArg,args)},sendWrapper=(_ref=asyncToGenerator(regenerator.mark((function _callee(target,thisArg,args){var forgedRequest;return regenerator.wrap((function(_context){for(;;)switch(_context.prev=_context.next){case 0:if(shouldReplace){_context.next=2;break}return _context.abrupt(\"return\",Reflect.apply(target,thisArg,args));case 2:(forgedRequest=new XMLHttpRequest).addEventListener(\"readystatechange\",(function(){if(4===forgedRequest.readyState){var readyState=forgedRequest.readyState,response=forgedRequest.response,responseText=forgedRequest.responseText,responseURL=forgedRequest.responseURL,responseXML=forgedRequest.responseXML,status=forgedRequest.status,statusText=forgedRequest.statusText,content=responseText||response;if(\"string\"==typeof content){var patternRegexp=\"*\"===pattern?toRegExp():toRegExp(pattern),modifiedContent=content.replace(patternRegexp,replacement);Object.defineProperties(thisArg,{readyState:{value:readyState},response:{value:modifiedContent},responseText:{value:modifiedContent},responseURL:{value:responseURL},responseXML:{value:responseXML},status:{value:status},statusText:{value:statusText}}),setTimeout((function(){var stateEvent=new Event(\"readystatechange\");thisArg.dispatchEvent(stateEvent);var loadEvent=new Event(\"load\");thisArg.dispatchEvent(loadEvent);var loadEndEvent=new Event(\"loadend\");thisArg.dispatchEvent(loadEndEvent)}),1),hit(source)}}})),nativeOpen.apply(forgedRequest,[xhrData.method,xhrData.url]),requestHeaders.forEach((function(header){var name=header[0],value=header[1];forgedRequest.setRequestHeader(name,value)})),requestHeaders=[],_context.prev=7,nativeSend.call(forgedRequest,args),_context.next=14;break;case 11:return _context.prev=11,_context.t0=_context.catch(7),_context.abrupt(\"return\",Reflect.apply(target,thisArg,args));case 14:return _context.abrupt(\"return\",void 0);case 15:case\"end\":return _context.stop()}}),_callee,null,[[7,11]])}))),function(_x,_x2,_x3){return _ref.apply(this,arguments)}),openHandler={apply:openWrapper},sendHandler={apply:sendWrapper};XMLHttpRequest.prototype.open=new Proxy(XMLHttpRequest.prototype.open,openHandler),XMLHttpRequest.prototype.send=new Proxy(XMLHttpRequest.prototype.send,sendHandler)}else{logMessage(source,\"Pattern argument should not be empty string.\")}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function trustedReplaceXhrResponse(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=toRegExp(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function getXhrData(method,url,async,user,password){return{method:method,url:url,async:async,user:user,password:password}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var pattern=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",replacement=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",propsToMatch=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\";if(\"undefined\"!=typeof Proxy)if(\"\"!==pattern||\"\"===replacement){var xhrData,shouldLog=\"\"===pattern&&\"\"===replacement,nativeOpen=window.XMLHttpRequest.prototype.open,nativeSend=window.XMLHttpRequest.prototype.send,shouldReplace=!1,requestHeaders=[],openWrapper=function(target,thisArg,args){if(xhrData=getXhrData.apply(null,args),shouldLog){var _message=\"xhr( \".concat(objectToString(xhrData),\" )\");return logMessage(source,_message,!0),hit(source),Reflect.apply(target,thisArg,args)}if(shouldReplace=matchRequestProps(source,propsToMatch,xhrData)){var setRequestHeaderHandler={apply:function(target,thisArg,args){return requestHeaders.push(args),Reflect.apply(target,thisArg,args)}};thisArg.setRequestHeader=new Proxy(thisArg.setRequestHeader,setRequestHeaderHandler)}return Reflect.apply(target,thisArg,args)},sendWrapper=function(target,thisArg,args){if(!shouldReplace)return Reflect.apply(target,thisArg,args);var forgedRequest=new XMLHttpRequest;forgedRequest.addEventListener(\"readystatechange\",(function(){if(4===forgedRequest.readyState){var readyState=forgedRequest.readyState,response=forgedRequest.response,responseText=forgedRequest.responseText,responseURL=forgedRequest.responseURL,responseXML=forgedRequest.responseXML,status=forgedRequest.status,statusText=forgedRequest.statusText,content=responseText||response;if(\"string\"==typeof content){var patternRegexp=\"*\"===pattern?toRegExp():toRegExp(pattern),modifiedContent=content.replace(patternRegexp,replacement);Object.defineProperties(thisArg,{readyState:{value:readyState},response:{value:modifiedContent},responseText:{value:modifiedContent},responseURL:{value:responseURL},responseXML:{value:responseXML},status:{value:status},statusText:{value:statusText}}),setTimeout((function(){var stateEvent=new Event(\"readystatechange\");thisArg.dispatchEvent(stateEvent);var loadEvent=new Event(\"load\");thisArg.dispatchEvent(loadEvent);var loadEndEvent=new Event(\"loadend\");thisArg.dispatchEvent(loadEndEvent)}),1),hit(source)}}})),nativeOpen.apply(forgedRequest,[xhrData.method,xhrData.url]),requestHeaders.forEach((function(header){var name=header[0],value=header[1];forgedRequest.setRequestHeader(name,value)})),requestHeaders=[];try{nativeSend.call(forgedRequest,args)}catch(_unused){return Reflect.apply(target,thisArg,args)}},openHandler={apply:openWrapper},sendHandler={apply:sendWrapper};XMLHttpRequest.prototype.open=new Proxy(XMLHttpRequest.prototype.open,openHandler),XMLHttpRequest.prototype.send=new Proxy(XMLHttpRequest.prototype.send,sendHandler)}else{logMessage(source,\"Pattern argument should not be empty string.\")}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -471,13 +471,19 @@ "names": [ "trusted-set-cookie" ], - "scriptlet": "function trustedSetCookie(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function isCookieSetWithValue(cookieString,name,value){return cookieString.split(\";\").some((function(cookieStr){var pos=cookieStr.indexOf(\"=\");if(-1===pos)return!1;var cookieName=cookieStr.slice(0,pos).trim(),cookieValue=cookieStr.slice(pos+1).trim();return name===cookieName&&value===cookieValue}))}function concatCookieNameValuePath(source,rawName,rawValue,rawPath){return function(rawPath){return\"/\"===rawPath||\"none\"===rawPath}(rawPath)?\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath)):(logMessage(source,\"Invalid cookie path: '\".concat(rawPath,\"'\")),null)}function parseKeywordValue(rawValue){var parsedValue=rawValue;return\"$now$\"===rawValue?parsedValue=Date.now().toString():\"$currentDate$\"===rawValue&&(parsedValue=Date()),parsedValue}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var offsetExpiresSec=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\",reload=arguments.length>4&&void 0!==arguments[4]?arguments[4]:\"false\",path=arguments.length>5&&void 0!==arguments[5]?arguments[5]:\"/\";if(void 0!==name)if(void 0!==value){if(\"true\"!==reload||!isCookieSetWithValue(document.cookie,name,value)){var ONE_YEAR_EXPIRATION_KEYWORD=\"1year\",ONE_DAY_EXPIRATION_KEYWORD=\"1day\",cookieToSet=concatCookieNameValuePath(source,name,parseKeywordValue(value),path);if(cookieToSet){if(offsetExpiresSec){var parsedOffsetExpiresSec,MS_IN_SEC=1e3;if(offsetExpiresSec===ONE_YEAR_EXPIRATION_KEYWORD)parsedOffsetExpiresSec=31536e3;else if(offsetExpiresSec===ONE_DAY_EXPIRATION_KEYWORD)parsedOffsetExpiresSec=86400;else if(parsedOffsetExpiresSec=Number.parseInt(offsetExpiresSec,10),Number.isNaN(parsedOffsetExpiresSec)){return void logMessage(source,\"log: Invalid offsetExpiresSec value: \".concat(offsetExpiresSec))}var expires=Date.now()+parsedOffsetExpiresSec*MS_IN_SEC;cookieToSet+=\" expires=\".concat(new Date(expires).toUTCString(),\";\")}cookieToSet&&(document.cookie=cookieToSet,hit(source),\"true\"===reload&&isCookieSetWithValue(document.cookie,name,value)&&window.location.reload())}}}else logMessage(source,\"Cookie value should be specified.\");else logMessage(source,\"Cookie name should be specified.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function trustedSetCookie(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function concatCookieNameValuePath(rawName,rawValue,rawPath){return\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath),\";\")}function isValidCookiePath(rawPath){return\"/\"===rawPath||\"none\"===rawPath}function getTrustedCookieOffsetMs(offsetExpiresSec){if(!offsetExpiresSec)return null;var parsedSec;if(\"1year\"===offsetExpiresSec)parsedSec=31536e3;else if(\"1day\"===offsetExpiresSec)parsedSec=86400;else if(parsedSec=Number.parseInt(offsetExpiresSec,10),Number.isNaN(parsedSec))return null;return 1e3*parsedSec}function parseKeywordValue(rawValue){var parsedValue=rawValue;return\"$now$\"===rawValue?parsedValue=Date.now().toString():\"$currentDate$\"===rawValue&&(parsedValue=Date()),parsedValue}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var offsetExpiresSec=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\",path=arguments.length>4&&void 0!==arguments[4]?arguments[4]:\"/\";if(void 0!==name)if(void 0!==value){var parsedValue=parseKeywordValue(value);if(isValidCookiePath(path)){var cookieToSet=concatCookieNameValuePath(name,parsedValue,path);if(cookieToSet){var parsedOffsetMs=getTrustedCookieOffsetMs(offsetExpiresSec);if(parsedOffsetMs){var expires=Date.now()+parsedOffsetMs;cookieToSet+=\" expires=\".concat(new Date(expires).toUTCString(),\";\"),document.cookie=cookieToSet,hit(source)}else logMessage(source,\"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec))}}else logMessage(source,\"Invalid cookie path: '\".concat(path,\"'\"))}else logMessage(source,\"Cookie value should be specified.\");else logMessage(source,\"Cookie name should be specified.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + }, + { + "names": [ + "trusted-set-cookie-reload" + ], + "scriptlet": "function trustedSetCookieReload(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function isCookieSetWithValue(cookieString,name,value){return cookieString.split(\";\").some((function(cookieStr){var pos=cookieStr.indexOf(\"=\");if(-1===pos)return!1;var cookieName=cookieStr.slice(0,pos).trim(),cookieValue=cookieStr.slice(pos+1).trim();return name===cookieName&&value===cookieValue}))}function concatCookieNameValuePath(rawName,rawValue,rawPath){return\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath),\";\")}function isValidCookiePath(rawPath){return\"/\"===rawPath||\"none\"===rawPath}function getTrustedCookieOffsetMs(offsetExpiresSec){if(!offsetExpiresSec)return null;var parsedSec;if(\"1year\"===offsetExpiresSec)parsedSec=31536e3;else if(\"1day\"===offsetExpiresSec)parsedSec=86400;else if(parsedSec=Number.parseInt(offsetExpiresSec,10),Number.isNaN(parsedSec))return null;return 1e3*parsedSec}function parseKeywordValue(rawValue){var parsedValue=rawValue;return\"$now$\"===rawValue?parsedValue=Date.now().toString():\"$currentDate$\"===rawValue&&(parsedValue=Date()),parsedValue}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var offsetExpiresSec=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\",path=arguments.length>4&&void 0!==arguments[4]?arguments[4]:\"/\";if(void 0!==name)if(void 0!==value){if(!isCookieSetWithValue(document.cookie,name,value)){var parsedValue=parseKeywordValue(value);if(isValidCookiePath(path)){var cookieToSet=concatCookieNameValuePath(name,parsedValue,path);if(cookieToSet){var parsedOffsetExpiresMs=getTrustedCookieOffsetMs(offsetExpiresSec);if(parsedOffsetExpiresMs){var expires=Date.now()+parsedOffsetExpiresMs;cookieToSet+=\" expires=\".concat(new Date(expires).toUTCString(),\";\"),document.cookie=cookieToSet,hit(source),isCookieSetWithValue(document.cookie,name,value)&&window.location.reload()}else logMessage(source,\"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec))}}else logMessage(source,\"Invalid cookie path: '\".concat(path,\"'\"))}}else logMessage(source,\"Cookie value should be specified.\");else logMessage(source,\"Cookie name should be specified.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "trusted-replace-fetch-response" ], - "scriptlet": "function trustedReplaceFetchResponse(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function getFetchData(args){var fetchUrl,fetchInit,request,fetchPropsObj={};if(args[0]instanceof Request){var requestData=(request=args[0],getRequestProps().map((function(key){return[key,request[key]]})).reduce((function(acc,el){var key=el[0],value=el[1];return acc[key]=value,acc}),{}));fetchUrl=requestData.url,fetchInit=requestData}else fetchUrl=args[0],fetchInit=args[1];return fetchPropsObj.url=fetchUrl,fetchInit instanceof Object&&Object.keys(fetchInit).forEach((function(prop){fetchPropsObj[prop]=fetchInit[prop]})),fetchPropsObj}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,propsToMatchStr,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(propsToMatchStr=propsToMatch,PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=getRequestProps(),propsObj={},propsToMatchStr.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=toRegExp(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var pattern=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",replacement=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",propsToMatch=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\";if(\"undefined\"!=typeof fetch&&\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Response)if(\"\"!==pattern||\"\"===replacement){var fetchData,_ref,shouldLog=\"\"===pattern&&\"\"===replacement,nativeFetch=fetch,handlerWrapper=(_ref=asyncToGenerator(regenerator.mark((function _callee(target,thisArg,args){var forgeResponse;return regenerator.wrap((function(_context){for(;;)switch(_context.prev=_context.next){case 0:if(fetchData=getFetchData(args),!shouldLog){_context.next=5;break}return logMessage(source,\"fetch( \".concat(objectToString(fetchData),\" )\"),!0),hit(source),_context.abrupt(\"return\",Reflect.apply(target,thisArg,args));case 5:if(matchRequestProps(source,propsToMatch,fetchData)){_context.next=8;break}return _context.abrupt(\"return\",Reflect.apply(target,thisArg,args));case 8:return forgeResponse=function(response,textContent){var bodyUsed=response.bodyUsed,headers=response.headers,ok=response.ok,redirected=response.redirected,status=response.status,statusText=response.statusText,type=response.type,url=response.url,forgedResponse=new Response(textContent,{status:status,statusText:statusText,headers:headers});return Object.defineProperties(forgedResponse,{url:{value:url},type:{value:type},ok:{value:ok},bodyUsed:{value:bodyUsed},redirected:{value:redirected}}),forgedResponse},_context.abrupt(\"return\",nativeFetch.apply(void 0,toConsumableArray(args)).then((function(response){return response.text().then((function(bodyText){var patternRegexp=\"*\"===pattern?toRegExp():toRegExp(pattern),modifiedTextContent=bodyText.replace(patternRegexp,replacement),forgedResponse=forgeResponse(response,modifiedTextContent);return hit(source),forgedResponse})).catch((function(){var fetchDataStr=objectToString(fetchData),message=\"Response body can't be converted to text: \".concat(fetchDataStr);return logMessage(source,message),Reflect.apply(target,thisArg,args)}))})).catch((function(){return Reflect.apply(target,thisArg,args)})));case 10:case\"end\":return _context.stop()}}),_callee)}))),function(_x,_x2,_x3){return _ref.apply(this,arguments)});fetch=new Proxy(fetch,{apply:handlerWrapper})}else logMessage(source,\"Pattern argument should not be empty string.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function trustedReplaceFetchResponse(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function getFetchData(args){var fetchUrl,fetchInit,request,fetchPropsObj={};if(args[0]instanceof Request){var requestData=(request=args[0],[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"].map((function(key){return[key,request[key]]})).reduce((function(acc,el){var key=el[0],value=el[1];return acc[key]=value,acc}),{}));fetchUrl=requestData.url,fetchInit=requestData}else fetchUrl=args[0],fetchInit=args[1];return fetchPropsObj.url=fetchUrl,fetchInit instanceof Object&&Object.keys(fetchInit).forEach((function(prop){fetchPropsObj[prop]=fetchInit[prop]})),fetchPropsObj}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=toRegExp(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var pattern=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",replacement=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",propsToMatch=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\";if(\"undefined\"!=typeof fetch&&\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Response)if(\"\"!==pattern||\"\"===replacement){var fetchData,shouldLog=\"\"===pattern&&\"\"===replacement,nativeFetch=fetch,handlerWrapper=function(target,thisArg,args){return fetchData=getFetchData(args),shouldLog?(logMessage(source,\"fetch( \".concat(objectToString(fetchData),\" )\"),!0),hit(source),Reflect.apply(target,thisArg,args)):matchRequestProps(source,propsToMatch,fetchData)?nativeFetch.apply(void 0,toConsumableArray(args)).then((function(response){return response.text().then((function(bodyText){var patternRegexp=\"*\"===pattern?toRegExp():toRegExp(pattern),modifiedTextContent=bodyText.replace(patternRegexp,replacement),forgedResponse=function(response,textContent){var bodyUsed=response.bodyUsed,headers=response.headers,ok=response.ok,redirected=response.redirected,status=response.status,statusText=response.statusText,type=response.type,url=response.url,forgedResponse=new Response(textContent,{status:status,statusText:statusText,headers:headers});return Object.defineProperties(forgedResponse,{url:{value:url},type:{value:type},ok:{value:ok},bodyUsed:{value:bodyUsed},redirected:{value:redirected}}),forgedResponse}(response,modifiedTextContent);return hit(source),forgedResponse})).catch((function(){var fetchDataStr=objectToString(fetchData),message=\"Response body can't be converted to text: \".concat(fetchDataStr);return logMessage(source,message),Reflect.apply(target,thisArg,args)}))})).catch((function(){return Reflect.apply(target,thisArg,args)})):Reflect.apply(target,thisArg,args)};fetch=new Proxy(fetch,{apply:handlerWrapper})}else logMessage(source,\"Pattern argument should not be empty string.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ diff --git a/dist/scriptlets.js b/dist/scriptlets.js index a6d245cd..a7842603 100644 --- a/dist/scriptlets.js +++ b/dist/scriptlets.js @@ -1,7 +1,7 @@ /** * AdGuard Scriptlets - * Version 1.7.3 + * Version 1.7.6 */ (function () { @@ -891,28 +891,6 @@ return !!item; }; - /** - * @typedef { import('../scriptlets/index').Source } Source - */ - - /** - * Conditionally logs message to console. - * Convention is to log messages by source.verbose if such log - * is not a part of scriptlet's functionality, eg on invalid input, - * and use 'forced' argument otherwise. - * @param {Source} source required - * @param {string} message required, message to log - * @param {boolean} [forced=false] to log message unconditionally - */ - var logMessage = function logMessage(source, message) { - var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - if (forced || source.verbose) { - // eslint-disable-next-line no-console - console.log("".concat(source.name, ": ").concat(message)); - } - }; - /** * @typedef { import('../scriptlets/index').Source } Source */ @@ -925,7 +903,7 @@ * @returns {boolean} */ - var isValidCookieRawPath = function isValidCookieRawPath(rawPath) { + var isValidCookiePath = function isValidCookiePath(rawPath) { return rawPath === '/' || rawPath === 'none'; }; /** @@ -942,7 +920,6 @@ return 'path=/'; } // otherwise do not set path as invalid // the same for pathArg === 'none' - // return ''; @@ -950,33 +927,26 @@ /** * Combines input cookie name, value, and path into string. * - * @param {Source} source * @param {string} rawName * @param {string} rawValue * @param {string} rawPath * - * @returns {string} string OR `null` if path is not supported + * @returns {string|null} string OR `null` if path is not supported */ - var concatCookieNameValuePath = function concatCookieNameValuePath(source, rawName, rawValue, rawPath) { - if (!isValidCookieRawPath(rawPath)) { - logMessage(source, "Invalid cookie path: '".concat(rawPath, "'")); - return null; - } // eslint-disable-next-line max-len - - - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath)); + var concatCookieNameValuePath = function concatCookieNameValuePath(rawName, rawValue, rawPath) { + // eslint-disable-next-line max-len + return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); }; /** * Gets supported cookie value * - * @param {Source} source * @param {string} value input cookie value * * @returns {string|null} valid cookie string if ok OR null if not */ - var getLimitedCookieValue = function getLimitedCookieValue(source, value) { + var getLimitedCookieValue = function getLimitedCookieValue(value) { if (!value) { return null; } @@ -1007,12 +977,10 @@ validValue = parseFloat(value); if (nativeIsNaN(validValue)) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); return null; } if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); return null; } } else { @@ -1071,6 +1039,39 @@ return name === cookieName && value === cookieValue; }); }; + /** + * Returns parsed offset expired number of ms or null if `offsetExpiresSec` is invalid + * + * @param {string} offsetExpiresSec input offset param in seconds + * @returns {number|null} number is milliseconds OR null + */ + + var getTrustedCookieOffsetMs = function getTrustedCookieOffsetMs(offsetExpiresSec) { + if (!offsetExpiresSec) { + return null; + } + + var ONE_YEAR_EXPIRATION_KEYWORD = '1year'; + var ONE_DAY_EXPIRATION_KEYWORD = '1day'; + var MS_IN_SEC = 1000; + var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; + var SECONDS_IN_DAY = 24 * 60 * 60; + var parsedSec; // Set predefined expire value if corresponding keyword was passed + + if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_YEAR; + } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_DAY; + } else { + parsedSec = Number.parseInt(offsetExpiresSec, 10); // If offsetExpiresSec has been parsed to NaN - do not set cookie at all + + if (Number.isNaN(parsedSec)) { + return null; + } + } + + return parsedSec * MS_IN_SEC; + }; /** * Noop function @@ -1471,7 +1472,7 @@ * @returns {string[]} */ - var getRequestProps$1 = function getRequestProps() { + var getRequestProps = function getRequestProps() { return ['url', 'method', 'headers', 'body', 'mode', 'credentials', 'cache', 'redirect', 'referrer', 'referrerPolicy', 'integrity', 'keepalive', 'signal']; }; /** @@ -1480,9 +1481,8 @@ * @returns {Object} data object */ - var getRequestData = function getRequestData(request) { - var requestInitOptions = getRequestProps$1(); + var requestInitOptions = getRequestProps(); var entries = requestInitOptions.map(function (key) { // if request has no such option, value will be undefined var value = request[key]; @@ -1551,7 +1551,7 @@ var parseMatchProps = function parseMatchProps(propsToMatchStr) { var PROPS_DIVIDER = ' '; var PAIRS_MARKER = ':'; - var LEGAL_MATCH_PROPS = getRequestProps$1(); + var LEGAL_MATCH_PROPS = getRequestProps(); var propsObj = {}; var props = propsToMatchStr.split(PROPS_DIVIDER); props.forEach(function (prop) { @@ -1596,6 +1596,28 @@ return matchData; }; + /** + * @typedef { import('../scriptlets/index').Source } Source + */ + + /** + * Conditionally logs message to console. + * Convention is to log messages by source.verbose if such log + * is not a part of scriptlet's functionality, eg on invalid input, + * and use 'forced' argument otherwise. + * @param {Source} source required + * @param {string} message required, message to log + * @param {boolean} [forced=false] to log message unconditionally + */ + var logMessage = function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + if (forced || source.verbose) { + // eslint-disable-next-line no-console + console.log("".concat(source.name, ": ").concat(message)); + } + }; + /** * @typedef { import('../scriptlets/index').Source } Source */ @@ -2130,6 +2152,11 @@ /** * Modifies passed keyword value according to its purpose. * Returns initial value if it's not a keyword. + * + * Supported keywords: + * - '$now$' - returns current time in ms, e.g 1667915146503 + * - '$currentDate$' - returns current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * * @param {string} rawValue * @returns {string} */ @@ -3485,7 +3512,7 @@ if (origDescriptor instanceof Object) { // This check is required to avoid defining non-configurable props if (!origDescriptor.configurable) { - var message = "set-constant: property '".concat(prop, "' is not configurable"); + var message = "Property '".concat(prop, "' is not configurable"); logMessage(source, message); return false; } @@ -5652,22 +5679,29 @@ function setCookie$1(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; - var validValue = getLimitedCookieValue(source, value); + var validValue = getLimitedCookieValue(value); if (validValue === null) { logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); return; } - var cookieData = concatCookieNameValuePath(source, name, validValue, path); + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + + var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (cookieData) { - hit(source); - document.cookie = cookieData; + if (!cookieToSet) { + return; } + + hit(source); + document.cookie = cookieToSet; } setCookie$1.names = ['set-cookie']; - setCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookieRawPath, getCookiePath]; + setCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath]; /** * @scriptlet set-cookie-reload @@ -5712,27 +5746,34 @@ return; } - var validValue = getLimitedCookieValue(source, value); + var validValue = getLimitedCookieValue(value); if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + logMessage(source, "Invalid cookie value: '".concat(value, "'")); return; } - var cookieData = concatCookieNameValuePath(source, name, validValue, path); + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } - if (cookieData) { - document.cookie = cookieData; - hit(source); // Only reload the page if cookie was set - // https://github.com/AdguardTeam/Scriptlets/issues/212 + var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); - } + if (!cookieToSet) { + return; + } + + document.cookie = cookieToSet; + hit(source); // Only reload the page if cookie was set + // https://github.com/AdguardTeam/Scriptlets/issues/212 + + if (isCookieSetWithValue(document.cookie, name, value)) { + window.location.reload(); } } setCookieReload$1.names = ['set-cookie-reload']; - setCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookieRawPath, getCookiePath]; + setCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath]; /** * @scriptlet hide-in-shadow-dom @@ -6014,7 +6055,7 @@ } preventFetch$1.names = ['prevent-fetch', // aliases are needed for matching the related scriptlet converted into our syntax 'no-fetch-if.js', 'ubo-no-fetch-if.js', 'ubo-no-fetch-if']; - preventFetch$1.injections = [hit, getFetchData, objectToString, noopPromiseResolve, matchRequestProps, logMessage, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; + preventFetch$1.injections = [hit, getFetchData, objectToString, noopPromiseResolve, matchRequestProps, logMessage, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; /* eslint-disable max-len */ @@ -6550,7 +6591,7 @@ } preventXHR$1.names = ['prevent-xhr', // aliases are needed for matching the related scriptlet converted into our syntax 'no-xhr-if.js', 'ubo-no-xhr-if.js', 'ubo-no-xhr-if']; - preventXHR$1.injections = [hit, logMessage, objectToString, matchRequestProps, generateRandomResponse, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries, getNumberFromString, nativeIsFinite, nativeIsNaN, parseMatchProps, validateParsedData, getMatchPropsData, getRandomIntInclusive, getRandomStrByLength]; + preventXHR$1.injections = [hit, logMessage, objectToString, matchRequestProps, generateRandomResponse, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries, getNumberFromString, nativeIsFinite, nativeIsNaN, parseMatchProps, validateParsedData, getMatchPropsData, getRequestProps, getRandomIntInclusive, getRandomStrByLength]; /** * @scriptlet close-window @@ -6986,1052 +7027,208 @@ noTopics$1.names = ['no-topics']; noTopics$1.injections = [hit, noopPromiseResolve]; - function createCommonjsModule(fn) { - var module = { exports: {} }; - return fn(module, module.exports), module.exports; - } - - function commonjsRequire (target) { - throw new Error('Could not dynamically require "' + target + '". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.'); - } + /* eslint-disable max-len */ /** - * Copyright (c) 2014-present, Facebook, Inc. + * @trustedScriptlet trusted-replace-xhr-response + * + * @description + * Replaces response content of `xhr` requests if **all** given parameters match. + * + * **Syntax** + * ``` + * example.org#%#//scriptlet('trusted-replace-xhr-response'[, pattern, replacement[, propsToMatch]]) + * ``` + * + * - pattern - optional, argument for matching contents of responseText that should be replaced. If set, `replacement` is required; + * possible values: + * - '*' to match all text content + * - non-empty string + * - regular expression + * - replacement — optional, should be set if `pattern` is set. String to replace matched content with. Empty string to remove content. + * - propsToMatch — optional, string of space-separated properties to match for extra condition; possible props: + * - string or regular expression for matching the URL passed to `.open()` call; + * - colon-separated pairs name:value where + * - name - name is string or regular expression for matching XMLHttpRequest property name + * - value is string or regular expression for matching the value of the option passed to `.open()` call + * + * > Usage with no arguments will log XMLHttpRequest objects to browser console; + * which is useful for debugging but not permitted for production filter lists. + * + * **Examples** + * 1. Log all XMLHttpRequests + * ``` + * example.org#%#//scriptlet('trusted-replace-xhr-response') + * ``` + * + * 2. Replace text content of XMLHttpRequests with specific url + * ``` + * example.org#%#//scriptlet('trusted-replace-xhr-response', 'adb_detect:true', 'adb_detect:false', 'example.org') + * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', 'example.org') + * ``` + * + * 3. Remove all text content of XMLHttpRequests with specific request method + * ``` + * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'method:GET') + * ``` * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. + * 4. Replace text content of XMLHttpRequests matching by URL regex and request methods + * ``` + * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', '/\.m3u8/ method:/GET|HEAD/') + * ``` + * 5. Remove all text content of all XMLHttpRequests for example.com + * ``` + * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'example.com') + * ``` */ - var runtime_1 = createCommonjsModule(function (module) { - var runtime = function (exports) { - - var Op = Object.prototype; - var hasOwn = Op.hasOwnProperty; - var undefined$1; // More compressible than void 0. - - var $Symbol = typeof Symbol === "function" ? Symbol : {}; - var iteratorSymbol = $Symbol.iterator || "@@iterator"; - var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; - var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; - - function define(obj, key, value) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - return obj[key]; - } - - try { - // IE 8 has a broken Object.defineProperty that only works on DOM objects. - define({}, ""); - } catch (err) { - define = function define(obj, key, value) { - return obj[key] = value; - }; - } - function wrap(innerFn, outerFn, self, tryLocsList) { - // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. - var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; - var generator = Object.create(protoGenerator.prototype); - var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next, - // .throw, and .return methods. - - generator._invoke = makeInvokeMethod(innerFn, self, context); - return generator; - } + /* eslint-enable max-len */ - exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion - // record like context.tryEntries[i].completion. This interface could - // have been (and was previously) designed to take a closure to be - // invoked without arguments, but in all the cases we care about we - // already have an existing method we want to call, so there's no need - // to create a new function object. We can even get away with assuming - // the method takes exactly one argument, since that happens to be true - // in every case, so we don't have to touch the arguments object. The - // only additional allocation required is the completion record, which - // has a stable shape and so hopefully should be cheap to allocate. + function trustedReplaceXhrResponse$1(source) { + var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - function tryCatch(fn, obj, arg) { - try { - return { - type: "normal", - arg: fn.call(obj, arg) - }; - } catch (err) { - return { - type: "throw", - arg: err - }; - } - } + // do nothing if browser does not support Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy + if (typeof Proxy === 'undefined') { + return; + } // Only allow pattern as empty string for logging purposes - var GenStateSuspendedStart = "suspendedStart"; - var GenStateSuspendedYield = "suspendedYield"; - var GenStateExecuting = "executing"; - var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as - // breaking out of the dispatch switch statement. - var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and - // .constructor.prototype properties for functions that return Generator - // objects. For full spec compliance, you may wish to configure your - // minifier not to mangle the names of these two functions. + if (pattern === '' && replacement !== '') { + var message = 'Pattern argument should not be empty string.'; + logMessage(source, message); + return; + } - function Generator() {} + var shouldLog = pattern === '' && replacement === ''; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var shouldReplace = false; + var xhrData; + var requestHeaders = []; - function GeneratorFunction() {} + var openWrapper = function openWrapper(target, thisArg, args) { + // eslint-disable-next-line prefer-spread + xhrData = getXhrData.apply(null, args); - function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that - // don't natively support it. + if (shouldLog) { + // Log if no propsToMatch given + var _message = "xhr( ".concat(objectToString(xhrData), " )"); + logMessage(source, _message, true); + hit(source); + return Reflect.apply(target, thisArg, args); + } - var IteratorPrototype = {}; + shouldReplace = matchRequestProps(source, propsToMatch, xhrData); // Trap setRequestHeader of target xhr object to mimic request headers later - IteratorPrototype[iteratorSymbol] = function () { - return this; - }; + if (shouldReplace) { + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + // Collect headers + requestHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; - var getProto = Object.getPrototypeOf; - var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; // setRequestHeader can only be called on open xhr object, + // so we can safely proxy it here - if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { - // This environment has a native %IteratorPrototype%; use it instead - // of the polyfill. - IteratorPrototype = NativeIteratorPrototype; + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); } - var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); - GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; - GeneratorFunctionPrototype.constructor = GeneratorFunction; - GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"); // Helper for defining the .next, .throw, and .return methods of the - // Iterator interface in terms of a single ._invoke method. + return Reflect.apply(target, thisArg, args); + }; - function defineIteratorMethods(prototype) { - ["next", "throw", "return"].forEach(function (method) { - define(prototype, method, function (arg) { - return this._invoke(method, arg); - }); - }); + var sendWrapper = function sendWrapper(target, thisArg, args) { + if (!shouldReplace) { + return Reflect.apply(target, thisArg, args); } + /** + * Create separate XHR request with original request's input + * to be able to collect response data without triggering + * listeners on original XHR object + */ - exports.isGeneratorFunction = function (genFun) { - var ctor = typeof genFun === "function" && genFun.constructor; - return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can - // do is to check its .name property. - (ctor.displayName || ctor.name) === "GeneratorFunction" : false; - }; - exports.mark = function (genFun) { - if (Object.setPrototypeOf) { - Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); - } else { - genFun.__proto__ = GeneratorFunctionPrototype; - define(genFun, toStringTagSymbol, "GeneratorFunction"); + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener('readystatechange', function () { + if (forgedRequest.readyState !== 4) { + return; } - genFun.prototype = Object.create(Gp); - return genFun; - }; // Within the body of any async function, `await x` is transformed to - // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test - // `hasOwn.call(value, "__await")` to determine if the yielded value is - // meant to be awaited. - - - exports.awrap = function (arg) { - return { - __await: arg - }; - }; - - function AsyncIterator(generator, PromiseImpl) { - function invoke(method, arg, resolve, reject) { - var record = tryCatch(generator[method], generator, arg); + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; // Extract content from response - if (record.type === "throw") { - reject(record.arg); - } else { - var result = record.arg; - var value = result.value; - - if (value && typeof value === "object" && hasOwn.call(value, "__await")) { - return PromiseImpl.resolve(value.__await).then(function (value) { - invoke("next", value, resolve, reject); - }, function (err) { - invoke("throw", err, resolve, reject); - }); - } + var content = responseText || response; - return PromiseImpl.resolve(value).then(function (unwrapped) { - // When a yielded Promise is resolved, its final value becomes - // the .value of the Promise<{value,done}> result for the - // current iteration. - result.value = unwrapped; - resolve(result); - }, function (error) { - // If a rejected Promise was yielded, throw the rejection back - // into the async generator function so it can be handled there. - return invoke("throw", error, resolve, reject); - }); - } + if (typeof content !== 'string') { + return; } - var previousPromise; + var patternRegexp = pattern === '*' ? toRegExp() : toRegExp(pattern); + var modifiedContent = content.replace(patternRegexp, replacement); // Manually put required values into target XHR object + // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied - function enqueue(method, arg) { - function callInvokeWithMethodAndArg() { - return new PromiseImpl(function (resolve, reject) { - invoke(method, arg, resolve, reject); - }); + Object.defineProperties(thisArg, { + readyState: { + value: readyState + }, + response: { + value: modifiedContent + }, + responseText: { + value: modifiedContent + }, + responseURL: { + value: responseURL + }, + responseXML: { + value: responseXML + }, + status: { + value: status + }, + statusText: { + value: statusText } + }); // Mock events - return previousPromise = // If enqueue has been called before, then we want to wait until - // all previous Promises have been resolved before calling invoke, - // so that results are always delivered in the correct order. If - // enqueue has not been called before, then it is important to - // call invoke immediately, without waiting on a callback to fire, - // so that the async generator function has the opportunity to do - // any necessary setup in a predictable way. This predictability - // is why the Promise constructor synchronously invokes its - // executor callback, and why async functions synchronously - // execute code before the first await. Since we implement simple - // async functions in terms of async generators, it is especially - // important to get this right, even though it requires care. - previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later - // invocations of the iterator. - callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); - } // Define the unified helper method that is used to implement .next, - // .throw, and .return (see defineIteratorMethods). + setTimeout(function () { + var stateEvent = new Event('readystatechange'); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event('load'); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event('loadend'); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); // Mimic request headers before sending + // setRequestHeader can only be called on open request objects + requestHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + requestHeaders = []; - this._invoke = enqueue; + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); } - defineIteratorMethods(AsyncIterator.prototype); - - AsyncIterator.prototype[asyncIteratorSymbol] = function () { - return this; - }; - - exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of - // AsyncIterator objects; they just return a Promise for the value of - // the final result produced by the iterator. - - exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { - if (PromiseImpl === void 0) PromiseImpl = Promise; - var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); - return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator. - : iter.next().then(function (result) { - return result.done ? result.value : iter.next(); - }); - }; - - function makeInvokeMethod(innerFn, self, context) { - var state = GenStateSuspendedStart; - return function invoke(method, arg) { - if (state === GenStateExecuting) { - throw new Error("Generator is already running"); - } - - if (state === GenStateCompleted) { - if (method === "throw") { - throw arg; - } // Be forgiving, per 25.3.3.3.3 of the spec: - // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume - - - return doneResult(); - } - - context.method = method; - context.arg = arg; - - while (true) { - var delegate = context.delegate; - - if (delegate) { - var delegateResult = maybeInvokeDelegate(delegate, context); - - if (delegateResult) { - if (delegateResult === ContinueSentinel) continue; - return delegateResult; - } - } - - if (context.method === "next") { - // Setting context._sent for legacy support of Babel's - // function.sent implementation. - context.sent = context._sent = context.arg; - } else if (context.method === "throw") { - if (state === GenStateSuspendedStart) { - state = GenStateCompleted; - throw context.arg; - } - - context.dispatchException(context.arg); - } else if (context.method === "return") { - context.abrupt("return", context.arg); - } - - state = GenStateExecuting; - var record = tryCatch(innerFn, self, context); - - if (record.type === "normal") { - // If an exception is thrown from innerFn, we leave state === - // GenStateExecuting and loop back for another invocation. - state = context.done ? GenStateCompleted : GenStateSuspendedYield; - - if (record.arg === ContinueSentinel) { - continue; - } - - return { - value: record.arg, - done: context.done - }; - } else if (record.type === "throw") { - state = GenStateCompleted; // Dispatch the exception by looping back around to the - // context.dispatchException(context.arg) call above. - - context.method = "throw"; - context.arg = record.arg; - } - } - }; - } // Call delegate.iterator[context.method](context.arg) and handle the - // result, either by returning a { value, done } result from the - // delegate iterator, or by modifying context.method and context.arg, - // setting context.delegate to null, and returning the ContinueSentinel. - - - function maybeInvokeDelegate(delegate, context) { - var method = delegate.iterator[context.method]; - - if (method === undefined$1) { - // A .throw or .return when the delegate iterator has no .throw - // method always terminates the yield* loop. - context.delegate = null; - - if (context.method === "throw") { - // Note: ["return"] must be used for ES3 parsing compatibility. - if (delegate.iterator["return"]) { - // If the delegate iterator has a return method, give it a - // chance to clean up. - context.method = "return"; - context.arg = undefined$1; - maybeInvokeDelegate(delegate, context); - - if (context.method === "throw") { - // If maybeInvokeDelegate(context) changed context.method from - // "return" to "throw", let that override the TypeError below. - return ContinueSentinel; - } - } - - context.method = "throw"; - context.arg = new TypeError("The iterator does not provide a 'throw' method"); - } - - return ContinueSentinel; - } - - var record = tryCatch(method, delegate.iterator, context.arg); - - if (record.type === "throw") { - context.method = "throw"; - context.arg = record.arg; - context.delegate = null; - return ContinueSentinel; - } - - var info = record.arg; - - if (!info) { - context.method = "throw"; - context.arg = new TypeError("iterator result is not an object"); - context.delegate = null; - return ContinueSentinel; - } - - if (info.done) { - // Assign the result of the finished delegate to the temporary - // variable specified by delegate.resultName (see delegateYield). - context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield). - - context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the - // exception, let the outer generator proceed normally. If - // context.method was "next", forget context.arg since it has been - // "consumed" by the delegate iterator. If context.method was - // "return", allow the original .return call to continue in the - // outer generator. - - if (context.method !== "return") { - context.method = "next"; - context.arg = undefined$1; - } - } else { - // Re-yield the result returned by the delegate method. - return info; - } // The delegate iterator is finished, so forget it and continue with - // the outer generator. - - - context.delegate = null; - return ContinueSentinel; - } // Define Generator.prototype.{next,throw,return} in terms of the - // unified ._invoke helper method. - - - defineIteratorMethods(Gp); - define(Gp, toStringTagSymbol, "Generator"); // A Generator should always return itself as the iterator object when the - // @@iterator function is called on it. Some browsers' implementations of the - // iterator prototype chain incorrectly implement this, causing the Generator - // object to not be returned from this call. This ensures that doesn't happen. - // See https://github.com/facebook/regenerator/issues/274 for more details. - - Gp[iteratorSymbol] = function () { - return this; - }; - - Gp.toString = function () { - return "[object Generator]"; - }; - - function pushTryEntry(locs) { - var entry = { - tryLoc: locs[0] - }; - - if (1 in locs) { - entry.catchLoc = locs[1]; - } - - if (2 in locs) { - entry.finallyLoc = locs[2]; - entry.afterLoc = locs[3]; - } - - this.tryEntries.push(entry); - } - - function resetTryEntry(entry) { - var record = entry.completion || {}; - record.type = "normal"; - delete record.arg; - entry.completion = record; - } - - function Context(tryLocsList) { - // The root entry object (effectively a try statement without a catch - // or a finally block) gives us a place to store values thrown from - // locations where there is no enclosing try statement. - this.tryEntries = [{ - tryLoc: "root" - }]; - tryLocsList.forEach(pushTryEntry, this); - this.reset(true); - } - - exports.keys = function (object) { - var keys = []; - - for (var key in object) { - keys.push(key); - } - - keys.reverse(); // Rather than returning an object with a next method, we keep - // things simple and return the next function itself. - - return function next() { - while (keys.length) { - var key = keys.pop(); - - if (key in object) { - next.value = key; - next.done = false; - return next; - } - } // To avoid creating an additional object, we just hang the .value - // and .done properties off the next function object itself. This - // also ensures that the minifier will not anonymize the function. - - - next.done = true; - return next; - }; - }; - - function values(iterable) { - if (iterable) { - var iteratorMethod = iterable[iteratorSymbol]; - - if (iteratorMethod) { - return iteratorMethod.call(iterable); - } - - if (typeof iterable.next === "function") { - return iterable; - } - - if (!isNaN(iterable.length)) { - var i = -1, - next = function next() { - while (++i < iterable.length) { - if (hasOwn.call(iterable, i)) { - next.value = iterable[i]; - next.done = false; - return next; - } - } - - next.value = undefined$1; - next.done = true; - return next; - }; - - return next.next = next; - } - } // Return an iterator with no values. - - - return { - next: doneResult - }; - } - - exports.values = values; - - function doneResult() { - return { - value: undefined$1, - done: true - }; - } - - Context.prototype = { - constructor: Context, - reset: function reset(skipTempReset) { - this.prev = 0; - this.next = 0; // Resetting context._sent for legacy support of Babel's - // function.sent implementation. - - this.sent = this._sent = undefined$1; - this.done = false; - this.delegate = null; - this.method = "next"; - this.arg = undefined$1; - this.tryEntries.forEach(resetTryEntry); - - if (!skipTempReset) { - for (var name in this) { - // Not sure about the optimal order of these conditions: - if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) { - this[name] = undefined$1; - } - } - } - }, - stop: function stop() { - this.done = true; - var rootEntry = this.tryEntries[0]; - var rootRecord = rootEntry.completion; - - if (rootRecord.type === "throw") { - throw rootRecord.arg; - } - - return this.rval; - }, - dispatchException: function dispatchException(exception) { - if (this.done) { - throw exception; - } - - var context = this; - - function handle(loc, caught) { - record.type = "throw"; - record.arg = exception; - context.next = loc; - - if (caught) { - // If the dispatched exception was caught by a catch block, - // then let that catch block handle the exception normally. - context.method = "next"; - context.arg = undefined$1; - } - - return !!caught; - } - - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - var record = entry.completion; - - if (entry.tryLoc === "root") { - // Exception thrown outside of any try block that could handle - // it, so set the completion value of the entire function to - // throw the exception. - return handle("end"); - } - - if (entry.tryLoc <= this.prev) { - var hasCatch = hasOwn.call(entry, "catchLoc"); - var hasFinally = hasOwn.call(entry, "finallyLoc"); - - if (hasCatch && hasFinally) { - if (this.prev < entry.catchLoc) { - return handle(entry.catchLoc, true); - } else if (this.prev < entry.finallyLoc) { - return handle(entry.finallyLoc); - } - } else if (hasCatch) { - if (this.prev < entry.catchLoc) { - return handle(entry.catchLoc, true); - } - } else if (hasFinally) { - if (this.prev < entry.finallyLoc) { - return handle(entry.finallyLoc); - } - } else { - throw new Error("try statement without catch or finally"); - } - } - } - }, - abrupt: function abrupt(type, arg) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - - if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { - var finallyEntry = entry; - break; - } - } - - if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) { - // Ignore the finally entry if control is not jumping to a - // location outside the try/catch block. - finallyEntry = null; - } - - var record = finallyEntry ? finallyEntry.completion : {}; - record.type = type; - record.arg = arg; - - if (finallyEntry) { - this.method = "next"; - this.next = finallyEntry.finallyLoc; - return ContinueSentinel; - } - - return this.complete(record); - }, - complete: function complete(record, afterLoc) { - if (record.type === "throw") { - throw record.arg; - } - - if (record.type === "break" || record.type === "continue") { - this.next = record.arg; - } else if (record.type === "return") { - this.rval = this.arg = record.arg; - this.method = "return"; - this.next = "end"; - } else if (record.type === "normal" && afterLoc) { - this.next = afterLoc; - } - - return ContinueSentinel; - }, - finish: function finish(finallyLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - - if (entry.finallyLoc === finallyLoc) { - this.complete(entry.completion, entry.afterLoc); - resetTryEntry(entry); - return ContinueSentinel; - } - } - }, - "catch": function _catch(tryLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - - if (entry.tryLoc === tryLoc) { - var record = entry.completion; - - if (record.type === "throw") { - var thrown = record.arg; - resetTryEntry(entry); - } - - return thrown; - } - } // The context.catch method must only be called with a location - // argument that corresponds to a known catch block. - - - throw new Error("illegal catch attempt"); - }, - delegateYield: function delegateYield(iterable, resultName, nextLoc) { - this.delegate = { - iterator: values(iterable), - resultName: resultName, - nextLoc: nextLoc - }; - - if (this.method === "next") { - // Deliberately forget the last sent value so that we don't - // accidentally pass it on to the delegate. - this.arg = undefined$1; - } - - return ContinueSentinel; - } - }; // Regardless of whether this script is executing as a CommonJS module - // or not, return the runtime object so that we can declare the variable - // regeneratorRuntime in the outer scope, which allows this module to be - // injected easily by `bin/regenerator --include-runtime script.js`. - - return exports; - }( // If this script is executing as a CommonJS module, use module.exports - // as the regeneratorRuntime namespace. Otherwise create a new empty - // object. Either way, the resulting object will be used to initialize - // the regeneratorRuntime variable at the top of this file. - module.exports ); - - try { - regeneratorRuntime = runtime; - } catch (accidentalStrictMode) { - // This module should not be running in strict mode, so the above - // assignment should always work unless something is misconfigured. Just - // in case runtime.js accidentally runs in strict mode, we can escape - // strict mode using a global Function call. This could conceivably fail - // if a Content Security Policy forbids using Function, but in that case - // the proper solution is to fix the accidental strict mode problem. If - // you've misconfigured your bundler to force strict mode and applied a - // CSP to forbid Function, and you're not willing to fix either of those - // problems, please detail your unique predicament in a GitHub issue. - Function("r", "regeneratorRuntime = r")(runtime); - } - }); - - var regenerator$1 = runtime_1; - - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } - - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - - _next(undefined); - }); - }; - } - - var asyncToGenerator$1 = _asyncToGenerator; - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; - } - - var arrayLikeToArray = _arrayLikeToArray; - - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return arrayLikeToArray(arr); - } - - var arrayWithoutHoles = _arrayWithoutHoles; - - function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); - } - - var iterableToArray = _iterableToArray; - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); - } - - var unsupportedIterableToArray = _unsupportedIterableToArray; - - function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - var nonIterableSpread = _nonIterableSpread; - - function _toConsumableArray(arr) { - return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread(); - } - - var toConsumableArray$1 = _toConsumableArray; - - /* eslint-disable max-len */ - - /** - * @trustedScriptlet trusted-replace-xhr-response - * - * @description - * Replaces response content of `xhr` requests if **all** given parameters match. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response'[, pattern, replacement[, propsToMatch]]) - * ``` - * - * - pattern - optional, argument for matching contents of responseText that should be replaced. If set, `replacement` is required; - * possible values: - * - '*' to match all text content - * - non-empty string - * - regular expression - * - replacement — optional, should be set if `pattern` is set. String to replace matched content with. Empty string to remove content. - * - propsToMatch — optional, string of space-separated properties to match for extra condition; possible props: - * - string or regular expression for matching the URL passed to `.open()` call; - * - colon-separated pairs name:value where - * - name - name is string or regular expression for matching XMLHttpRequest property name - * - value is string or regular expression for matching the value of the option passed to `.open()` call - * - * > Usage with no arguments will log XMLHttpRequest objects to browser console; - * which is useful for debugging but not permitted for production filter lists. - * - * **Examples** - * 1. Log all XMLHttpRequests - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response') - * ``` - * - * 2. Replace text content of XMLHttpRequests with specific url - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response', 'adb_detect:true', 'adb_detect:false', 'example.org') - * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', 'example.org') - * ``` - * - * 3. Remove all text content of XMLHttpRequests with specific request method - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'method:GET') - * ``` - * - * 4. Replace text content of XMLHttpRequests matching by URL regex and request methods - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', '/\.m3u8/ method:/GET|HEAD/') - * ``` - * 5. Remove all text content of all XMLHttpRequests for example.com - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'example.com') - * ``` - */ - - /* eslint-enable max-len */ - - function trustedReplaceXhrResponse$1(source) { - var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - - // do nothing if browser does not support Proxy (e.g. Internet Explorer) - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy - if (typeof Proxy === 'undefined') { - return; - } // Only allow pattern as empty string for logging purposes - - - if (pattern === '' && replacement !== '') { - var message = 'Pattern argument should not be empty string.'; - logMessage(source, message); - return; - } - - var shouldLog = pattern === '' && replacement === ''; - var nativeOpen = window.XMLHttpRequest.prototype.open; - var nativeSend = window.XMLHttpRequest.prototype.send; - var shouldReplace = false; - var xhrData; - var requestHeaders = []; - - var openWrapper = function openWrapper(target, thisArg, args) { - xhrData = getXhrData.apply(void 0, toConsumableArray$1(args)); - - if (shouldLog) { - // Log if no propsToMatch given - var _message = "log: xhr( ".concat(objectToString(xhrData), " )"); - - logMessage(source, _message, true); - hit(source); - return Reflect.apply(target, thisArg, args); - } - - shouldReplace = matchRequestProps(source, propsToMatch, xhrData); // Trap setRequestHeader of target xhr object to mimic request headers later - - if (shouldReplace) { - var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { - // Collect headers - requestHeaders.push(args); - return Reflect.apply(target, thisArg, args); - }; - - var setRequestHeaderHandler = { - apply: setRequestHeaderWrapper - }; // setRequestHeader can only be called on open xhr object, - // so we can safely proxy it here - - thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); - } - - return Reflect.apply(target, thisArg, args); - }; - - var sendWrapper = /*#__PURE__*/function () { - var _ref = asyncToGenerator$1( /*#__PURE__*/regenerator$1.mark(function _callee(target, thisArg, args) { - var forgedRequest; - return regenerator$1.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (shouldReplace) { - _context.next = 2; - break; - } - - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 2: - /** - * Create separate XHR request with original request's input - * to be able to collect response data without triggering - * listeners on original XHR object - */ - forgedRequest = new XMLHttpRequest(); - forgedRequest.addEventListener('readystatechange', function () { - if (forgedRequest.readyState !== 4) { - return; - } - - var readyState = forgedRequest.readyState, - response = forgedRequest.response, - responseText = forgedRequest.responseText, - responseURL = forgedRequest.responseURL, - responseXML = forgedRequest.responseXML, - status = forgedRequest.status, - statusText = forgedRequest.statusText; // Extract content from response - - var content = responseText || response; - - if (typeof content !== 'string') { - return; - } - - var patternRegexp = pattern === '*' ? toRegExp() : toRegExp(pattern); - var modifiedContent = content.replace(patternRegexp, replacement); // Manually put required values into target XHR object - // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied - - Object.defineProperties(thisArg, { - readyState: { - value: readyState - }, - response: { - value: modifiedContent - }, - responseText: { - value: modifiedContent - }, - responseURL: { - value: responseURL - }, - responseXML: { - value: responseXML - }, - status: { - value: status - }, - statusText: { - value: statusText - } - }); // Mock events - - setTimeout(function () { - var stateEvent = new Event('readystatechange'); - thisArg.dispatchEvent(stateEvent); - var loadEvent = new Event('load'); - thisArg.dispatchEvent(loadEvent); - var loadEndEvent = new Event('loadend'); - thisArg.dispatchEvent(loadEndEvent); - }, 1); - hit(source); - }); - nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); // Mimic request headers before sending - // setRequestHeader can only be called on open request objects - - requestHeaders.forEach(function (header) { - var name = header[0]; - var value = header[1]; - forgedRequest.setRequestHeader(name, value); - }); - requestHeaders = []; - _context.prev = 7; - nativeSend.call(forgedRequest, args); - _context.next = 14; - break; - - case 11: - _context.prev = 11; - _context.t0 = _context["catch"](7); - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 14: - return _context.abrupt("return", undefined); - - case 15: - case "end": - return _context.stop(); - } - } - }, _callee, null, [[7, 11]]); - })); - - return function sendWrapper(_x, _x2, _x3) { - return _ref.apply(this, arguments); - }; - }(); + return undefined; + }; var openHandler = { apply: openWrapper @@ -8044,7 +7241,7 @@ } trustedReplaceXhrResponse$1.names = ['trusted-replace-xhr-response' // trusted scriptlets support no aliases ]; - trustedReplaceXhrResponse$1.injections = [hit, logMessage, toRegExp, objectToString, matchRequestProps, getXhrData, getMatchPropsData, validateParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries]; + trustedReplaceXhrResponse$1.injections = [hit, logMessage, toRegExp, objectToString, matchRequestProps, getXhrData, getMatchPropsData, getRequestProps, validateParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries]; /* eslint-disable max-len */ @@ -8276,25 +7473,25 @@ * @trustedScriptlet trusted-set-cookie * * @description - * Sets a cookie with arbitrary name and value, with optional path - * and the ability to reload the page after cookie was set. + * Sets a cookie with arbitrary name and value, + * and with optional ability to offset cookie attribute 'expires' and set path. * * **Syntax** * ``` - * example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, reload[, path]]]) + * example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, path]]) * ``` * * - `name` - required, cookie name to be set * - `value` - required, cookie value. Possible values: * - arbitrary value * - empty string for no value - * - `$now$` keyword for setting current time - * - 'offsetExpiresSec' - optional, offset from current time in seconds, after which cookie should expire; defaults to no offset + * - `$now$` keyword for setting current time in ms, e.g 1667915146503 + * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * - `offsetExpiresSec` - optional, offset from current time in seconds, after which cookie should expire; defaults to no offset * Possible values: * - positive integer in seconds * - `1year` keyword for setting expiration date to one year * - `1day` keyword for setting expiration date to one day - * - 'reload' - optional, boolean. Argument for reloading page after cookie is set. Defaults to `false` * - `path` - optional, argument for setting cookie path, defaults to `/`; possible values: * - `/` — root path * - `none` — to set no path at all @@ -8308,7 +7505,7 @@ * * 2. Set cookie with `new Date().getTime()` value * ``` - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '$now') + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '$now$') * ``` * * 3. Set cookie which will expire in 3 days @@ -8320,23 +7517,121 @@ * ``` * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '1year') * ``` - * 5. Reload the page if cookie was successfully set + * + * 5. Set cookie with no path + * ``` + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'none') + * ``` + */ + + /* eslint-enable max-len */ + + function trustedSetCookie$1(source, name, value) { + var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; + + if (typeof name === 'undefined') { + logMessage(source, 'Cookie name should be specified.'); + return; + } + + if (typeof value === 'undefined') { + logMessage(source, 'Cookie value should be specified.'); + return; + } + + var parsedValue = parseKeywordValue(value); + + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); + + if (!cookieToSet) { + return; + } + + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + document.cookie = cookieToSet; + hit(source); + } + trustedSetCookie$1.names = ['trusted-set-cookie' // trusted scriptlets support no aliases + ]; + trustedSetCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; + + /* eslint-disable max-len */ + + /** + * @trustedScriptlet trusted-set-cookie-reload + * + * @description + * Sets a cookie with arbitrary name and value, + * and with optional ability to offset cookie attribute 'expires' and set path. + * Also reloads the current page after the cookie setting. + * If reloading option is not needed, use the [`trusted-set-cookie` scriptlet](#trusted-set-cookie). + * + * **Syntax** + * ``` + * example.org#%#//scriptlet('trusted-set-cookie-reload', name, value[, offsetExpiresSec[, path]]) + * ``` + * + * - `name` - required, cookie name to be set + * - `value` - required, cookie value. Possible values: + * - arbitrary value + * - empty string for no value + * - `$now$` keyword for setting current time in ms, e.g 1667915146503 + * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * - 'offsetExpiresSec' - optional, offset from current time in seconds, after which cookie should expire; defaults to no offset + * Possible values: + * - positive integer in seconds + * - `1year` keyword for setting expiration date to one year + * - `1day` keyword for setting expiration date to one day + * - `path` - optional, argument for setting cookie path, defaults to `/`; possible values: + * - `/` — root path + * - `none` — to set no path at all + * + * **Examples** + * 1. Set cookie and reload the page after it + * ``` + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept') + * ``` + * + * 2. Set cookie with `new Date().getTime()` value and reload the page after it + * ``` + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', '$now$') + * ``` + * + * 3. Set cookie which will expire in 3 days and reload the page after it + * ``` + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '259200') + * ``` + * + * 4. Set cookie which will expire in one year and reload the page after it * ``` - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'true') + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '1year') * ``` * - * 6. Set cookie with no path + * 5. Set cookie with no 'expire' and no path, reload the page after it * ``` - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', '', 'none') + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'decline', '', 'none') * ``` */ /* eslint-enable max-len */ - function trustedSetCookie$1(source, name, value) { + function trustedSetCookieReload$1(source, name, value) { var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - var reload = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'false'; - var path = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : '/'; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; if (typeof name === 'undefined') { logMessage(source, 'Cookie name should be specified.'); @@ -8350,57 +7645,90 @@ // https://github.com/AdguardTeam/Scriptlets/issues/212 - if (reload === 'true' && isCookieSetWithValue(document.cookie, name, value)) { + if (isCookieSetWithValue(document.cookie, name, value)) { return; } - var ONE_YEAR_EXPIRATION_KEYWORD = '1year'; - var ONE_DAY_EXPIRATION_KEYWORD = '1day'; var parsedValue = parseKeywordValue(value); - var cookieToSet = concatCookieNameValuePath(source, name, parsedValue, path); - if (!cookieToSet) { + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; - } // Set expiration date if offsetExpiresSec was passed - + } - if (offsetExpiresSec) { - var MS_IN_SEC = 1000; - var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; - var SECONDS_IN_DAY = 24 * 60 * 60; - var parsedOffsetExpiresSec; // Set predefined expire value if corresponding keyword was passed + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { - parsedOffsetExpiresSec = SECONDS_IN_YEAR; - } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { - parsedOffsetExpiresSec = SECONDS_IN_DAY; - } else { - parsedOffsetExpiresSec = Number.parseInt(offsetExpiresSec, 10); // If offsetExpiresSec has been parsed to NaN - do not set cookie at all + if (!cookieToSet) { + return; + } - if (Number.isNaN(parsedOffsetExpiresSec)) { - var message = "log: Invalid offsetExpiresSec value: ".concat(offsetExpiresSec); - logMessage(source, message); - return; - } - } + var parsedOffsetExpiresMs = getTrustedCookieOffsetMs(offsetExpiresSec); - var expires = Date.now() + parsedOffsetExpiresSec * MS_IN_SEC; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + if (!parsedOffsetExpiresMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; } - if (cookieToSet) { - document.cookie = cookieToSet; - hit(source); // Only reload the page if cookie was set - // https://github.com/AdguardTeam/Scriptlets/issues/212 + var expires = Date.now() + parsedOffsetExpiresMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + document.cookie = cookieToSet; + hit(source); // Only reload the page if cookie was set + // https://github.com/AdguardTeam/Scriptlets/issues/212 - if (reload === 'true' && isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); - } + if (isCookieSetWithValue(document.cookie, name, value)) { + window.location.reload(); } } - trustedSetCookie$1.names = ['trusted-set-cookie' // trusted scriptlets support no aliases + trustedSetCookieReload$1.names = ['trusted-set-cookie-reload' // trusted scriptlets support no aliases ]; - trustedSetCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookieRawPath, parseKeywordValue, getCookiePath]; + trustedSetCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; + + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; + } + + var arrayLikeToArray = _arrayLikeToArray; + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return arrayLikeToArray(arr); + } + + var arrayWithoutHoles = _arrayWithoutHoles; + + function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); + } + + var iterableToArray = _iterableToArray; + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); + } + + var unsupportedIterableToArray = _unsupportedIterableToArray; + + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + var nonIterableSpread = _nonIterableSpread; + + function _toConsumableArray(arr) { + return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread(); + } + + var toConsumableArray$1 = _toConsumableArray; /* eslint-disable max-len */ @@ -8485,109 +7813,84 @@ var shouldReplace = false; var fetchData; - var handlerWrapper = /*#__PURE__*/function () { - var _ref = asyncToGenerator$1( /*#__PURE__*/regenerator$1.mark(function _callee(target, thisArg, args) { - var forgeResponse; - return regenerator$1.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - fetchData = getFetchData(args); - - if (!shouldLog) { - _context.next = 5; - break; - } - - // log if no propsToMatch given - logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); - hit(source); - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 5: - shouldReplace = matchRequestProps(source, propsToMatch, fetchData); + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + fetchData = getFetchData(args); - if (shouldReplace) { - _context.next = 8; - break; - } + if (shouldLog) { + // log if no propsToMatch given + logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); + hit(source); + return Reflect.apply(target, thisArg, args); + } - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 8: - /** - * Create new Response object using original response' properties - * and given text as body content - * @param {Response} response original response to copy properties from - * @param {string} textContent text to set as body content - * @returns {Response} - */ - forgeResponse = function forgeResponse(response, textContent) { - var bodyUsed = response.bodyUsed, - headers = response.headers, - ok = response.ok, - redirected = response.redirected, - status = response.status, - statusText = response.statusText, - type = response.type, - url = response.url; // eslint-disable-next-line compat/compat - - var forgedResponse = new Response(textContent, { - status: status, - statusText: statusText, - headers: headers - }); // Manually set properties which can't be set by Response constructor - - Object.defineProperties(forgedResponse, { - url: { - value: url - }, - type: { - value: type - }, - ok: { - value: ok - }, - bodyUsed: { - value: bodyUsed - }, - redirected: { - value: redirected - } - }); - return forgedResponse; - }; - - return _context.abrupt("return", nativeFetch.apply(void 0, toConsumableArray$1(args)).then(function (response) { - return response.text().then(function (bodyText) { - var patternRegexp = pattern === '*' ? toRegExp() : toRegExp(pattern); - var modifiedTextContent = bodyText.replace(patternRegexp, replacement); - var forgedResponse = forgeResponse(response, modifiedTextContent); - hit(source); - return forgedResponse; - }).catch(function () { - // log if response body can't be converted to a string - var fetchDataStr = objectToString(fetchData); - var message = "Response body can't be converted to text: ".concat(fetchDataStr); - logMessage(source, message); - return Reflect.apply(target, thisArg, args); - }); - }).catch(function () { - return Reflect.apply(target, thisArg, args); - })); + shouldReplace = matchRequestProps(source, propsToMatch, fetchData); - case 10: - case "end": - return _context.stop(); - } + if (!shouldReplace) { + return Reflect.apply(target, thisArg, args); + } + /** + * Create new Response object using original response' properties + * and given text as body content + * @param {Response} response original response to copy properties from + * @param {string} textContent text to set as body content + * @returns {Response} + */ + + + var forgeResponse = function forgeResponse(response, textContent) { + var bodyUsed = response.bodyUsed, + headers = response.headers, + ok = response.ok, + redirected = response.redirected, + status = response.status, + statusText = response.statusText, + type = response.type, + url = response.url; // eslint-disable-next-line compat/compat + + var forgedResponse = new Response(textContent, { + status: status, + statusText: statusText, + headers: headers + }); // Manually set properties which can't be set by Response constructor + + Object.defineProperties(forgedResponse, { + url: { + value: url + }, + type: { + value: type + }, + ok: { + value: ok + }, + bodyUsed: { + value: bodyUsed + }, + redirected: { + value: redirected } - }, _callee); - })); - - return function handlerWrapper(_x, _x2, _x3) { - return _ref.apply(this, arguments); + }); + return forgedResponse; }; - }(); + + return nativeFetch.apply(void 0, toConsumableArray$1(args)).then(function (response) { + return response.text().then(function (bodyText) { + var patternRegexp = pattern === '*' ? toRegExp() : toRegExp(pattern); + var modifiedTextContent = bodyText.replace(patternRegexp, replacement); + var forgedResponse = forgeResponse(response, modifiedTextContent); + hit(source); + return forgedResponse; + }).catch(function () { + // log if response body can't be converted to a string + var fetchDataStr = objectToString(fetchData); + var message = "Response body can't be converted to text: ".concat(fetchDataStr); + logMessage(source, message); + return Reflect.apply(target, thisArg, args); + }); + }).catch(function () { + return Reflect.apply(target, thisArg, args); + }); + }; var fetchHandler = { apply: handlerWrapper @@ -8595,7 +7898,7 @@ fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign } trustedReplaceFetchResponse$1.names = ['trusted-replace-fetch-response']; - trustedReplaceFetchResponse$1.injections = [hit, logMessage, getFetchData, objectToString, matchRequestProps, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; + trustedReplaceFetchResponse$1.injections = [hit, logMessage, getFetchData, objectToString, matchRequestProps, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; /* eslint-disable max-len */ @@ -8724,6 +8027,7 @@ trustedReplaceXhrResponse: trustedReplaceXhrResponse$1, xmlPrune: xmlPrune$1, trustedSetCookie: trustedSetCookie$1, + trustedSetCookieReload: trustedSetCookieReload$1, trustedReplaceFetchResponse: trustedReplaceFetchResponse$1, trustedSetLocalStorageItem: trustedSetLocalStorageItem$1 }); @@ -12795,6 +12099,10 @@ resolve: resolveYamlMerge }); + function commonjsRequire (target) { + throw new Error('Could not dynamically require "' + target + '". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.'); + } + /*eslint-disable no-bitwise*/ @@ -20813,6 +20121,10 @@ return getObjectFromEntries(entries); } + function getRequestProps() { + return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; + } + function getObjectEntries(object) { var keys = Object.keys(object); var entries = []; @@ -22537,6 +21849,10 @@ return matchData; } + function getRequestProps() { + return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; + } + function getRandomIntInclusive(min, max) { min = Math.ceil(min); max = Math.floor(max); @@ -23596,7 +22912,7 @@ if (origDescriptor instanceof Object) { if (!origDescriptor.configurable) { - var message = "set-constant: property '".concat(prop, "' is not configurable"); + var message = "Property '".concat(prop, "' is not configurable"); logMessage(source, message); return false; } @@ -23915,19 +23231,26 @@ function setCookie(source, args) { function setCookie(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; - var validValue = getLimitedCookieValue(source, value); + var validValue = getLimitedCookieValue(value); if (validValue === null) { logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); return; } - var cookieData = concatCookieNameValuePath(source, name, validValue, path); + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + + var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (cookieData) { - hit(source); - document.cookie = cookieData; + if (!cookieToSet) { + return; } + + hit(source); + document.cookie = cookieToSet; } function hit(source, message) { @@ -23992,7 +23315,7 @@ return native(num); } - function getLimitedCookieValue(source, value) { + function getLimitedCookieValue(value) { if (!value) { return null; } @@ -24023,12 +23346,10 @@ validValue = parseFloat(value); if (nativeIsNaN(validValue)) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); return null; } if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); return null; } } else { @@ -24038,16 +23359,11 @@ return validValue; } - function concatCookieNameValuePath(source, rawName, rawValue, rawPath) { - if (!isValidCookieRawPath(rawPath)) { - logMessage(source, "Invalid cookie path: '".concat(rawPath, "'")); - return null; - } - - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath)); + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); } - function isValidCookieRawPath(rawPath) { + function isValidCookiePath(rawPath) { return rawPath === "/" || rawPath === "none"; } @@ -24072,26 +23388,33 @@ function setCookieReload(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; - if (isCookieSetWithValue(name, value)) { + if (isCookieSetWithValue(name, value)) { + return; + } + + var validValue = getLimitedCookieValue(value); + + if (validValue === null) { + logMessage(source, "Invalid cookie value: '".concat(value, "'")); + return; + } + + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var validValue = getLimitedCookieValue(source, value); + var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + if (!cookieToSet) { return; } - var cookieData = concatCookieNameValuePath(source, name, validValue, path); - - if (cookieData) { - document.cookie = cookieData; - hit(source); + document.cookie = cookieToSet; + hit(source); - if (isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); - } + if (isCookieSetWithValue(document.cookie, name, value)) { + window.location.reload(); } } @@ -24171,7 +23494,7 @@ }); } - function getLimitedCookieValue(source, value) { + function getLimitedCookieValue(value) { if (!value) { return null; } @@ -24202,12 +23525,10 @@ validValue = parseFloat(value); if (nativeIsNaN(validValue)) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); return null; } if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); return null; } } else { @@ -24217,16 +23538,11 @@ return validValue; } - function concatCookieNameValuePath(source, rawName, rawValue, rawPath) { - if (!isValidCookieRawPath(rawPath)) { - logMessage(source, "Invalid cookie path: '".concat(rawPath, "'")); - return null; - } - - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath)); + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); } - function isValidCookieRawPath(rawPath) { + function isValidCookiePath(rawPath) { return rawPath === "/" || rawPath === "none"; } @@ -24902,98 +24218,72 @@ var shouldReplace = false; var fetchData; - var handlerWrapper = function () { - var _ref = asyncToGenerator(regenerator.mark(function _callee(target, thisArg, args) { - var forgeResponse; - return regenerator.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - fetchData = getFetchData(args); - - if (!shouldLog) { - _context.next = 5; - break; - } - - logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); - hit(source); - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 5: - shouldReplace = matchRequestProps(source, propsToMatch, fetchData); - - if (shouldReplace) { - _context.next = 8; - break; - } - - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 8: - forgeResponse = function forgeResponse(response, textContent) { - var bodyUsed = response.bodyUsed, - headers = response.headers, - ok = response.ok, - redirected = response.redirected, - status = response.status, - statusText = response.statusText, - type = response.type, - url = response.url; - var forgedResponse = new Response(textContent, { - status: status, - statusText: statusText, - headers: headers - }); - Object.defineProperties(forgedResponse, { - url: { - value: url - }, - type: { - value: type - }, - ok: { - value: ok - }, - bodyUsed: { - value: bodyUsed - }, - redirected: { - value: redirected - } - }); - return forgedResponse; - }; - - return _context.abrupt("return", nativeFetch.apply(void 0, toConsumableArray(args)).then(function (response) { - return response.text().then(function (bodyText) { - var patternRegexp = pattern === "*" ? toRegExp() : toRegExp(pattern); - var modifiedTextContent = bodyText.replace(patternRegexp, replacement); - var forgedResponse = forgeResponse(response, modifiedTextContent); - hit(source); - return forgedResponse; - }).catch(function () { - var fetchDataStr = objectToString(fetchData); - var message = "Response body can't be converted to text: ".concat(fetchDataStr); - logMessage(source, message); - return Reflect.apply(target, thisArg, args); - }); - }).catch(function () { - return Reflect.apply(target, thisArg, args); - })); - - case 10: - case "end": - return _context.stop(); - } - } - }, _callee); - })); + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + fetchData = getFetchData(args); + + if (shouldLog) { + logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); + hit(source); + return Reflect.apply(target, thisArg, args); + } + + shouldReplace = matchRequestProps(source, propsToMatch, fetchData); + + if (!shouldReplace) { + return Reflect.apply(target, thisArg, args); + } - return function handlerWrapper(_x, _x2, _x3) { - return _ref.apply(this, arguments); + var forgeResponse = function forgeResponse(response, textContent) { + var bodyUsed = response.bodyUsed, + headers = response.headers, + ok = response.ok, + redirected = response.redirected, + status = response.status, + statusText = response.statusText, + type = response.type, + url = response.url; + var forgedResponse = new Response(textContent, { + status: status, + statusText: statusText, + headers: headers + }); + Object.defineProperties(forgedResponse, { + url: { + value: url + }, + type: { + value: type + }, + ok: { + value: ok + }, + bodyUsed: { + value: bodyUsed + }, + redirected: { + value: redirected + } + }); + return forgedResponse; }; - }(); + + return nativeFetch.apply(void 0, toConsumableArray(args)).then(function (response) { + return response.text().then(function (bodyText) { + var patternRegexp = pattern === "*" ? toRegExp() : toRegExp(pattern); + var modifiedTextContent = bodyText.replace(patternRegexp, replacement); + var forgedResponse = forgeResponse(response, modifiedTextContent); + hit(source); + return forgedResponse; + }).catch(function () { + var fetchDataStr = objectToString(fetchData); + var message = "Response body can't be converted to text: ".concat(fetchDataStr); + logMessage(source, message); + return Reflect.apply(target, thisArg, args); + }); + }).catch(function () { + return Reflect.apply(target, thisArg, args); + }); + }; var fetchHandler = { apply: handlerWrapper @@ -25173,6 +24463,10 @@ return getObjectFromEntries(entries); } + function getRequestProps() { + return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; + } + function getObjectEntries(object) { var keys = Object.keys(object); var entries = []; @@ -25260,10 +24554,10 @@ var requestHeaders = []; var openWrapper = function openWrapper(target, thisArg, args) { - xhrData = getXhrData.apply(void 0, toConsumableArray(args)); + xhrData = getXhrData.apply(null, args); if (shouldLog) { - var _message = "log: xhr( ".concat(objectToString(xhrData), " )"); + var _message = "xhr( ".concat(objectToString(xhrData), " )"); logMessage(source, _message, true); hit(source); @@ -25287,107 +24581,81 @@ return Reflect.apply(target, thisArg, args); }; - var sendWrapper = function () { - var _ref = asyncToGenerator(regenerator.mark(function _callee(target, thisArg, args) { - var forgedRequest; - return regenerator.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (shouldReplace) { - _context.next = 2; - break; - } - - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 2: - forgedRequest = new XMLHttpRequest(); - forgedRequest.addEventListener("readystatechange", function () { - if (forgedRequest.readyState !== 4) { - return; - } - - var readyState = forgedRequest.readyState, - response = forgedRequest.response, - responseText = forgedRequest.responseText, - responseURL = forgedRequest.responseURL, - responseXML = forgedRequest.responseXML, - status = forgedRequest.status, - statusText = forgedRequest.statusText; - var content = responseText || response; - - if (typeof content !== "string") { - return; - } - - var patternRegexp = pattern === "*" ? toRegExp() : toRegExp(pattern); - var modifiedContent = content.replace(patternRegexp, replacement); - Object.defineProperties(thisArg, { - readyState: { - value: readyState - }, - response: { - value: modifiedContent - }, - responseText: { - value: modifiedContent - }, - responseURL: { - value: responseURL - }, - responseXML: { - value: responseXML - }, - status: { - value: status - }, - statusText: { - value: statusText - } - }); - setTimeout(function () { - var stateEvent = new Event("readystatechange"); - thisArg.dispatchEvent(stateEvent); - var loadEvent = new Event("load"); - thisArg.dispatchEvent(loadEvent); - var loadEndEvent = new Event("loadend"); - thisArg.dispatchEvent(loadEndEvent); - }, 1); - hit(source); - }); - nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); - requestHeaders.forEach(function (header) { - var name = header[0]; - var value = header[1]; - forgedRequest.setRequestHeader(name, value); - }); - requestHeaders = []; - _context.prev = 7; - nativeSend.call(forgedRequest, args); - _context.next = 14; - break; - - case 11: - _context.prev = 11; - _context.t0 = _context["catch"](7); - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 14: - return _context.abrupt("return", undefined); - - case 15: - case "end": - return _context.stop(); - } + var sendWrapper = function sendWrapper(target, thisArg, args) { + if (!shouldReplace) { + return Reflect.apply(target, thisArg, args); + } + + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener("readystatechange", function () { + if (forgedRequest.readyState !== 4) { + return; + } + + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; + var content = responseText || response; + + if (typeof content !== "string") { + return; + } + + var patternRegexp = pattern === "*" ? toRegExp() : toRegExp(pattern); + var modifiedContent = content.replace(patternRegexp, replacement); + Object.defineProperties(thisArg, { + readyState: { + value: readyState + }, + response: { + value: modifiedContent + }, + responseText: { + value: modifiedContent + }, + responseURL: { + value: responseURL + }, + responseXML: { + value: responseXML + }, + status: { + value: status + }, + statusText: { + value: statusText } - }, _callee, null, [[7, 11]]); - })); + }); + setTimeout(function () { + var stateEvent = new Event("readystatechange"); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event("load"); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event("loadend"); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + requestHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + requestHeaders = []; - return function sendWrapper(_x, _x2, _x3) { - return _ref.apply(this, arguments); - }; - }(); + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); + } + + return undefined; + }; var openHandler = { apply: openWrapper @@ -25527,6 +24795,10 @@ return matchData; } + function getRequestProps() { + return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; + } + function validateParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); @@ -25603,8 +24875,7 @@ function trustedSetCookie(source, args) { function trustedSetCookie(source, name, value) { var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - var reload = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "false"; - var path = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : "/"; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; if (typeof name === "undefined") { logMessage(source, "Cookie name should be specified."); @@ -25616,51 +24887,202 @@ return; } - if (reload === "true" && isCookieSetWithValue(document.cookie, name, value)) { + var parsedValue = parseKeywordValue(value); + + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var ONE_YEAR_EXPIRATION_KEYWORD = "1year"; - var ONE_DAY_EXPIRATION_KEYWORD = "1day"; - var parsedValue = parseKeywordValue(value); - var cookieToSet = concatCookieNameValuePath(source, name, parsedValue, path); + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); if (!cookieToSet) { return; } - if (offsetExpiresSec) { - var MS_IN_SEC = 1e3; - var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; - var SECONDS_IN_DAY = 24 * 60 * 60; - var parsedOffsetExpiresSec; + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); - if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { - parsedOffsetExpiresSec = SECONDS_IN_YEAR; - } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { - parsedOffsetExpiresSec = SECONDS_IN_DAY; - } else { - parsedOffsetExpiresSec = Number.parseInt(offsetExpiresSec, 10); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } - if (Number.isNaN(parsedOffsetExpiresSec)) { - var message = "log: Invalid offsetExpiresSec value: ".concat(offsetExpiresSec); - logMessage(source, message); - return; + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + document.cookie = cookieToSet; + hit(source); + } + + function hit(source, message) { + if (source.verbose !== true) { + return; + } + + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + + if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + + var LOG_MARKER = "log: "; + + if (message) { + if (message.indexOf(LOG_MARKER) === -1) { + log("".concat(prefix, " message:\n").concat(message)); + } else { + log(message.slice(LOG_MARKER.length)); } } - var expires = Date.now() + parsedOffsetExpiresSec * MS_IN_SEC; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + log("".concat(prefix, " trace start")); + + if (trace) { + trace(); + } + + log("".concat(prefix, " trace end")); + } catch (e) {} + + if (typeof window.__debug === "function") { + window.__debug(source); } + } - if (cookieToSet) { - document.cookie = cookieToSet; - hit(source); + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + if (forced || source.verbose) { + console.log("".concat(source.name, ": ").concat(message)); + } + } + + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); + } + + function isValidCookiePath(rawPath) { + return rawPath === "/" || rawPath === "none"; + } + + function getTrustedCookieOffsetMs(offsetExpiresSec) { + if (!offsetExpiresSec) { + return null; + } + + var ONE_YEAR_EXPIRATION_KEYWORD = "1year"; + var ONE_DAY_EXPIRATION_KEYWORD = "1day"; + var MS_IN_SEC = 1e3; + var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; + var SECONDS_IN_DAY = 24 * 60 * 60; + var parsedSec; - if (reload === "true" && isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); + if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_YEAR; + } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_DAY; + } else { + parsedSec = Number.parseInt(offsetExpiresSec, 10); + + if (Number.isNaN(parsedSec)) { + return null; } } + + return parsedSec * MS_IN_SEC; + } + + function parseKeywordValue(rawValue) { + var NOW_VALUE_KEYWORD = "$now$"; + var CURRENT_DATE_KEYWORD = "$currentDate$"; + var parsedValue = rawValue; + + if (rawValue === NOW_VALUE_KEYWORD) { + parsedValue = Date.now().toString(); + } else if (rawValue === CURRENT_DATE_KEYWORD) { + parsedValue = Date(); + } + + return parsedValue; + } + + function getCookiePath(rawPath) { + if (rawPath === "/") { + return "path=/"; + } + + return ""; + } + + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + + try { + trustedSetCookie.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + + function trustedSetCookieReload(source, args) { + function trustedSetCookieReload(source, name, value) { + var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; + + if (typeof name === "undefined") { + logMessage(source, "Cookie name should be specified."); + return; + } + + if (typeof value === "undefined") { + logMessage(source, "Cookie value should be specified."); + return; + } + + if (isCookieSetWithValue(document.cookie, name, value)) { + return; + } + + var parsedValue = parseKeywordValue(value); + + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); + + if (!cookieToSet) { + return; + } + + var parsedOffsetExpiresMs = getTrustedCookieOffsetMs(offsetExpiresSec); + + if (!parsedOffsetExpiresMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + + var expires = Date.now() + parsedOffsetExpiresMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + document.cookie = cookieToSet; + hit(source); + + if (isCookieSetWithValue(document.cookie, name, value)) { + window.location.reload(); + } } function hit(source, message) { @@ -25734,17 +25156,39 @@ }); } - function concatCookieNameValuePath(source, rawName, rawValue, rawPath) { - if (!isValidCookieRawPath(rawPath)) { - logMessage(source, "Invalid cookie path: '".concat(rawPath, "'")); + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); + } + + function isValidCookiePath(rawPath) { + return rawPath === "/" || rawPath === "none"; + } + + function getTrustedCookieOffsetMs(offsetExpiresSec) { + if (!offsetExpiresSec) { return null; } - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath)); - } + var ONE_YEAR_EXPIRATION_KEYWORD = "1year"; + var ONE_DAY_EXPIRATION_KEYWORD = "1day"; + var MS_IN_SEC = 1e3; + var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; + var SECONDS_IN_DAY = 24 * 60 * 60; + var parsedSec; - function isValidCookieRawPath(rawPath) { - return rawPath === "/" || rawPath === "none"; + if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_YEAR; + } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_DAY; + } else { + parsedSec = Number.parseInt(offsetExpiresSec, 10); + + if (Number.isNaN(parsedSec)) { + return null; + } + } + + return parsedSec * MS_IN_SEC; } function parseKeywordValue(rawValue) { @@ -25772,7 +25216,7 @@ var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { - trustedSetCookie.apply(this, updatedArgs); + trustedSetCookieReload.apply(this, updatedArgs); } catch (e) { console.log(e); } @@ -26350,6 +25794,7 @@ "trusted-replace-fetch-response": trustedReplaceFetchResponse, "trusted-replace-xhr-response": trustedReplaceXhrResponse, "trusted-set-cookie": trustedSetCookie, + "trusted-set-cookie-reload": trustedSetCookieReload, "trusted-set-local-storage-item": trustedSetLocalStorageItem, "xml-prune": xmlPrune, "xml-prune.js": xmlPrune, diff --git a/dist/umd/scriptlets.umd.js b/dist/umd/scriptlets.umd.js index 2adcca8a..5813aff9 100644 --- a/dist/umd/scriptlets.umd.js +++ b/dist/umd/scriptlets.umd.js @@ -1,7 +1,7 @@ /** * AdGuard Scriptlets - * Version 1.7.3 + * Version 1.7.6 */ (function (factory) { @@ -893,28 +893,6 @@ return !!item; }; - /** - * @typedef { import('../scriptlets/index').Source } Source - */ - - /** - * Conditionally logs message to console. - * Convention is to log messages by source.verbose if such log - * is not a part of scriptlet's functionality, eg on invalid input, - * and use 'forced' argument otherwise. - * @param {Source} source required - * @param {string} message required, message to log - * @param {boolean} [forced=false] to log message unconditionally - */ - var logMessage = function logMessage(source, message) { - var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - if (forced || source.verbose) { - // eslint-disable-next-line no-console - console.log("".concat(source.name, ": ").concat(message)); - } - }; - /** * @typedef { import('../scriptlets/index').Source } Source */ @@ -927,7 +905,7 @@ * @returns {boolean} */ - var isValidCookieRawPath = function isValidCookieRawPath(rawPath) { + var isValidCookiePath = function isValidCookiePath(rawPath) { return rawPath === '/' || rawPath === 'none'; }; /** @@ -944,7 +922,6 @@ return 'path=/'; } // otherwise do not set path as invalid // the same for pathArg === 'none' - // return ''; @@ -952,33 +929,26 @@ /** * Combines input cookie name, value, and path into string. * - * @param {Source} source * @param {string} rawName * @param {string} rawValue * @param {string} rawPath * - * @returns {string} string OR `null` if path is not supported + * @returns {string|null} string OR `null` if path is not supported */ - var concatCookieNameValuePath = function concatCookieNameValuePath(source, rawName, rawValue, rawPath) { - if (!isValidCookieRawPath(rawPath)) { - logMessage(source, "Invalid cookie path: '".concat(rawPath, "'")); - return null; - } // eslint-disable-next-line max-len - - - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath)); + var concatCookieNameValuePath = function concatCookieNameValuePath(rawName, rawValue, rawPath) { + // eslint-disable-next-line max-len + return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); }; /** * Gets supported cookie value * - * @param {Source} source * @param {string} value input cookie value * * @returns {string|null} valid cookie string if ok OR null if not */ - var getLimitedCookieValue = function getLimitedCookieValue(source, value) { + var getLimitedCookieValue = function getLimitedCookieValue(value) { if (!value) { return null; } @@ -1009,12 +979,10 @@ validValue = parseFloat(value); if (nativeIsNaN(validValue)) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); return null; } if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); return null; } } else { @@ -1073,6 +1041,39 @@ return name === cookieName && value === cookieValue; }); }; + /** + * Returns parsed offset expired number of ms or null if `offsetExpiresSec` is invalid + * + * @param {string} offsetExpiresSec input offset param in seconds + * @returns {number|null} number is milliseconds OR null + */ + + var getTrustedCookieOffsetMs = function getTrustedCookieOffsetMs(offsetExpiresSec) { + if (!offsetExpiresSec) { + return null; + } + + var ONE_YEAR_EXPIRATION_KEYWORD = '1year'; + var ONE_DAY_EXPIRATION_KEYWORD = '1day'; + var MS_IN_SEC = 1000; + var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; + var SECONDS_IN_DAY = 24 * 60 * 60; + var parsedSec; // Set predefined expire value if corresponding keyword was passed + + if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_YEAR; + } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_DAY; + } else { + parsedSec = Number.parseInt(offsetExpiresSec, 10); // If offsetExpiresSec has been parsed to NaN - do not set cookie at all + + if (Number.isNaN(parsedSec)) { + return null; + } + } + + return parsedSec * MS_IN_SEC; + }; /** * Noop function @@ -1473,7 +1474,7 @@ * @returns {string[]} */ - var getRequestProps$1 = function getRequestProps() { + var getRequestProps = function getRequestProps() { return ['url', 'method', 'headers', 'body', 'mode', 'credentials', 'cache', 'redirect', 'referrer', 'referrerPolicy', 'integrity', 'keepalive', 'signal']; }; /** @@ -1482,9 +1483,8 @@ * @returns {Object} data object */ - var getRequestData = function getRequestData(request) { - var requestInitOptions = getRequestProps$1(); + var requestInitOptions = getRequestProps(); var entries = requestInitOptions.map(function (key) { // if request has no such option, value will be undefined var value = request[key]; @@ -1553,7 +1553,7 @@ var parseMatchProps = function parseMatchProps(propsToMatchStr) { var PROPS_DIVIDER = ' '; var PAIRS_MARKER = ':'; - var LEGAL_MATCH_PROPS = getRequestProps$1(); + var LEGAL_MATCH_PROPS = getRequestProps(); var propsObj = {}; var props = propsToMatchStr.split(PROPS_DIVIDER); props.forEach(function (prop) { @@ -1598,6 +1598,28 @@ return matchData; }; + /** + * @typedef { import('../scriptlets/index').Source } Source + */ + + /** + * Conditionally logs message to console. + * Convention is to log messages by source.verbose if such log + * is not a part of scriptlet's functionality, eg on invalid input, + * and use 'forced' argument otherwise. + * @param {Source} source required + * @param {string} message required, message to log + * @param {boolean} [forced=false] to log message unconditionally + */ + var logMessage = function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + if (forced || source.verbose) { + // eslint-disable-next-line no-console + console.log("".concat(source.name, ": ").concat(message)); + } + }; + /** * @typedef { import('../scriptlets/index').Source } Source */ @@ -2132,6 +2154,11 @@ /** * Modifies passed keyword value according to its purpose. * Returns initial value if it's not a keyword. + * + * Supported keywords: + * - '$now$' - returns current time in ms, e.g 1667915146503 + * - '$currentDate$' - returns current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * * @param {string} rawValue * @returns {string} */ @@ -3487,7 +3514,7 @@ if (origDescriptor instanceof Object) { // This check is required to avoid defining non-configurable props if (!origDescriptor.configurable) { - var message = "set-constant: property '".concat(prop, "' is not configurable"); + var message = "Property '".concat(prop, "' is not configurable"); logMessage(source, message); return false; } @@ -5654,22 +5681,29 @@ function setCookie$1(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; - var validValue = getLimitedCookieValue(source, value); + var validValue = getLimitedCookieValue(value); if (validValue === null) { logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); return; } - var cookieData = concatCookieNameValuePath(source, name, validValue, path); + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + + var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (cookieData) { - hit(source); - document.cookie = cookieData; + if (!cookieToSet) { + return; } + + hit(source); + document.cookie = cookieToSet; } setCookie$1.names = ['set-cookie']; - setCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookieRawPath, getCookiePath]; + setCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath]; /** * @scriptlet set-cookie-reload @@ -5714,27 +5748,34 @@ return; } - var validValue = getLimitedCookieValue(source, value); + var validValue = getLimitedCookieValue(value); if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + logMessage(source, "Invalid cookie value: '".concat(value, "'")); return; } - var cookieData = concatCookieNameValuePath(source, name, validValue, path); + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } - if (cookieData) { - document.cookie = cookieData; - hit(source); // Only reload the page if cookie was set - // https://github.com/AdguardTeam/Scriptlets/issues/212 + var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); - } + if (!cookieToSet) { + return; + } + + document.cookie = cookieToSet; + hit(source); // Only reload the page if cookie was set + // https://github.com/AdguardTeam/Scriptlets/issues/212 + + if (isCookieSetWithValue(document.cookie, name, value)) { + window.location.reload(); } } setCookieReload$1.names = ['set-cookie-reload']; - setCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookieRawPath, getCookiePath]; + setCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, getLimitedCookieValue, concatCookieNameValuePath, isValidCookiePath, getCookiePath]; /** * @scriptlet hide-in-shadow-dom @@ -6016,7 +6057,7 @@ } preventFetch$1.names = ['prevent-fetch', // aliases are needed for matching the related scriptlet converted into our syntax 'no-fetch-if.js', 'ubo-no-fetch-if.js', 'ubo-no-fetch-if']; - preventFetch$1.injections = [hit, getFetchData, objectToString, noopPromiseResolve, matchRequestProps, logMessage, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; + preventFetch$1.injections = [hit, getFetchData, objectToString, noopPromiseResolve, matchRequestProps, logMessage, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; /* eslint-disable max-len */ @@ -6552,7 +6593,7 @@ } preventXHR$1.names = ['prevent-xhr', // aliases are needed for matching the related scriptlet converted into our syntax 'no-xhr-if.js', 'ubo-no-xhr-if.js', 'ubo-no-xhr-if']; - preventXHR$1.injections = [hit, logMessage, objectToString, matchRequestProps, generateRandomResponse, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries, getNumberFromString, nativeIsFinite, nativeIsNaN, parseMatchProps, validateParsedData, getMatchPropsData, getRandomIntInclusive, getRandomStrByLength]; + preventXHR$1.injections = [hit, logMessage, objectToString, matchRequestProps, generateRandomResponse, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries, getNumberFromString, nativeIsFinite, nativeIsNaN, parseMatchProps, validateParsedData, getMatchPropsData, getRequestProps, getRandomIntInclusive, getRandomStrByLength]; /** * @scriptlet close-window @@ -6988,1052 +7029,208 @@ noTopics$1.names = ['no-topics']; noTopics$1.injections = [hit, noopPromiseResolve]; - function createCommonjsModule(fn) { - var module = { exports: {} }; - return fn(module, module.exports), module.exports; - } - - function commonjsRequire (target) { - throw new Error('Could not dynamically require "' + target + '". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.'); - } + /* eslint-disable max-len */ /** - * Copyright (c) 2014-present, Facebook, Inc. + * @trustedScriptlet trusted-replace-xhr-response + * + * @description + * Replaces response content of `xhr` requests if **all** given parameters match. + * + * **Syntax** + * ``` + * example.org#%#//scriptlet('trusted-replace-xhr-response'[, pattern, replacement[, propsToMatch]]) + * ``` + * + * - pattern - optional, argument for matching contents of responseText that should be replaced. If set, `replacement` is required; + * possible values: + * - '*' to match all text content + * - non-empty string + * - regular expression + * - replacement — optional, should be set if `pattern` is set. String to replace matched content with. Empty string to remove content. + * - propsToMatch — optional, string of space-separated properties to match for extra condition; possible props: + * - string or regular expression for matching the URL passed to `.open()` call; + * - colon-separated pairs name:value where + * - name - name is string or regular expression for matching XMLHttpRequest property name + * - value is string or regular expression for matching the value of the option passed to `.open()` call + * + * > Usage with no arguments will log XMLHttpRequest objects to browser console; + * which is useful for debugging but not permitted for production filter lists. + * + * **Examples** + * 1. Log all XMLHttpRequests + * ``` + * example.org#%#//scriptlet('trusted-replace-xhr-response') + * ``` + * + * 2. Replace text content of XMLHttpRequests with specific url + * ``` + * example.org#%#//scriptlet('trusted-replace-xhr-response', 'adb_detect:true', 'adb_detect:false', 'example.org') + * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', 'example.org') + * ``` + * + * 3. Remove all text content of XMLHttpRequests with specific request method + * ``` + * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'method:GET') + * ``` * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. + * 4. Replace text content of XMLHttpRequests matching by URL regex and request methods + * ``` + * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', '/\.m3u8/ method:/GET|HEAD/') + * ``` + * 5. Remove all text content of all XMLHttpRequests for example.com + * ``` + * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'example.com') + * ``` */ - var runtime_1 = createCommonjsModule(function (module) { - var runtime = function (exports) { - - var Op = Object.prototype; - var hasOwn = Op.hasOwnProperty; - var undefined$1; // More compressible than void 0. - - var $Symbol = typeof Symbol === "function" ? Symbol : {}; - var iteratorSymbol = $Symbol.iterator || "@@iterator"; - var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; - var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; - - function define(obj, key, value) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - return obj[key]; - } - - try { - // IE 8 has a broken Object.defineProperty that only works on DOM objects. - define({}, ""); - } catch (err) { - define = function define(obj, key, value) { - return obj[key] = value; - }; - } - function wrap(innerFn, outerFn, self, tryLocsList) { - // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. - var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; - var generator = Object.create(protoGenerator.prototype); - var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next, - // .throw, and .return methods. - - generator._invoke = makeInvokeMethod(innerFn, self, context); - return generator; - } + /* eslint-enable max-len */ - exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion - // record like context.tryEntries[i].completion. This interface could - // have been (and was previously) designed to take a closure to be - // invoked without arguments, but in all the cases we care about we - // already have an existing method we want to call, so there's no need - // to create a new function object. We can even get away with assuming - // the method takes exactly one argument, since that happens to be true - // in every case, so we don't have to touch the arguments object. The - // only additional allocation required is the completion record, which - // has a stable shape and so hopefully should be cheap to allocate. + function trustedReplaceXhrResponse$1(source) { + var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - function tryCatch(fn, obj, arg) { - try { - return { - type: "normal", - arg: fn.call(obj, arg) - }; - } catch (err) { - return { - type: "throw", - arg: err - }; - } - } + // do nothing if browser does not support Proxy (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy + if (typeof Proxy === 'undefined') { + return; + } // Only allow pattern as empty string for logging purposes - var GenStateSuspendedStart = "suspendedStart"; - var GenStateSuspendedYield = "suspendedYield"; - var GenStateExecuting = "executing"; - var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as - // breaking out of the dispatch switch statement. - var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and - // .constructor.prototype properties for functions that return Generator - // objects. For full spec compliance, you may wish to configure your - // minifier not to mangle the names of these two functions. + if (pattern === '' && replacement !== '') { + var message = 'Pattern argument should not be empty string.'; + logMessage(source, message); + return; + } - function Generator() {} + var shouldLog = pattern === '' && replacement === ''; + var nativeOpen = window.XMLHttpRequest.prototype.open; + var nativeSend = window.XMLHttpRequest.prototype.send; + var shouldReplace = false; + var xhrData; + var requestHeaders = []; - function GeneratorFunction() {} + var openWrapper = function openWrapper(target, thisArg, args) { + // eslint-disable-next-line prefer-spread + xhrData = getXhrData.apply(null, args); - function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that - // don't natively support it. + if (shouldLog) { + // Log if no propsToMatch given + var _message = "xhr( ".concat(objectToString(xhrData), " )"); + logMessage(source, _message, true); + hit(source); + return Reflect.apply(target, thisArg, args); + } - var IteratorPrototype = {}; + shouldReplace = matchRequestProps(source, propsToMatch, xhrData); // Trap setRequestHeader of target xhr object to mimic request headers later - IteratorPrototype[iteratorSymbol] = function () { - return this; - }; + if (shouldReplace) { + var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { + // Collect headers + requestHeaders.push(args); + return Reflect.apply(target, thisArg, args); + }; - var getProto = Object.getPrototypeOf; - var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); + var setRequestHeaderHandler = { + apply: setRequestHeaderWrapper + }; // setRequestHeader can only be called on open xhr object, + // so we can safely proxy it here - if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { - // This environment has a native %IteratorPrototype%; use it instead - // of the polyfill. - IteratorPrototype = NativeIteratorPrototype; + thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); } - var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); - GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; - GeneratorFunctionPrototype.constructor = GeneratorFunction; - GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"); // Helper for defining the .next, .throw, and .return methods of the - // Iterator interface in terms of a single ._invoke method. + return Reflect.apply(target, thisArg, args); + }; - function defineIteratorMethods(prototype) { - ["next", "throw", "return"].forEach(function (method) { - define(prototype, method, function (arg) { - return this._invoke(method, arg); - }); - }); + var sendWrapper = function sendWrapper(target, thisArg, args) { + if (!shouldReplace) { + return Reflect.apply(target, thisArg, args); } + /** + * Create separate XHR request with original request's input + * to be able to collect response data without triggering + * listeners on original XHR object + */ - exports.isGeneratorFunction = function (genFun) { - var ctor = typeof genFun === "function" && genFun.constructor; - return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can - // do is to check its .name property. - (ctor.displayName || ctor.name) === "GeneratorFunction" : false; - }; - exports.mark = function (genFun) { - if (Object.setPrototypeOf) { - Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); - } else { - genFun.__proto__ = GeneratorFunctionPrototype; - define(genFun, toStringTagSymbol, "GeneratorFunction"); + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener('readystatechange', function () { + if (forgedRequest.readyState !== 4) { + return; } - genFun.prototype = Object.create(Gp); - return genFun; - }; // Within the body of any async function, `await x` is transformed to - // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test - // `hasOwn.call(value, "__await")` to determine if the yielded value is - // meant to be awaited. - - - exports.awrap = function (arg) { - return { - __await: arg - }; - }; - - function AsyncIterator(generator, PromiseImpl) { - function invoke(method, arg, resolve, reject) { - var record = tryCatch(generator[method], generator, arg); + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; // Extract content from response - if (record.type === "throw") { - reject(record.arg); - } else { - var result = record.arg; - var value = result.value; - - if (value && typeof value === "object" && hasOwn.call(value, "__await")) { - return PromiseImpl.resolve(value.__await).then(function (value) { - invoke("next", value, resolve, reject); - }, function (err) { - invoke("throw", err, resolve, reject); - }); - } + var content = responseText || response; - return PromiseImpl.resolve(value).then(function (unwrapped) { - // When a yielded Promise is resolved, its final value becomes - // the .value of the Promise<{value,done}> result for the - // current iteration. - result.value = unwrapped; - resolve(result); - }, function (error) { - // If a rejected Promise was yielded, throw the rejection back - // into the async generator function so it can be handled there. - return invoke("throw", error, resolve, reject); - }); - } + if (typeof content !== 'string') { + return; } - var previousPromise; + var patternRegexp = pattern === '*' ? toRegExp() : toRegExp(pattern); + var modifiedContent = content.replace(patternRegexp, replacement); // Manually put required values into target XHR object + // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied - function enqueue(method, arg) { - function callInvokeWithMethodAndArg() { - return new PromiseImpl(function (resolve, reject) { - invoke(method, arg, resolve, reject); - }); + Object.defineProperties(thisArg, { + readyState: { + value: readyState + }, + response: { + value: modifiedContent + }, + responseText: { + value: modifiedContent + }, + responseURL: { + value: responseURL + }, + responseXML: { + value: responseXML + }, + status: { + value: status + }, + statusText: { + value: statusText } + }); // Mock events - return previousPromise = // If enqueue has been called before, then we want to wait until - // all previous Promises have been resolved before calling invoke, - // so that results are always delivered in the correct order. If - // enqueue has not been called before, then it is important to - // call invoke immediately, without waiting on a callback to fire, - // so that the async generator function has the opportunity to do - // any necessary setup in a predictable way. This predictability - // is why the Promise constructor synchronously invokes its - // executor callback, and why async functions synchronously - // execute code before the first await. Since we implement simple - // async functions in terms of async generators, it is especially - // important to get this right, even though it requires care. - previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later - // invocations of the iterator. - callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); - } // Define the unified helper method that is used to implement .next, - // .throw, and .return (see defineIteratorMethods). + setTimeout(function () { + var stateEvent = new Event('readystatechange'); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event('load'); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event('loadend'); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); // Mimic request headers before sending + // setRequestHeader can only be called on open request objects + requestHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + requestHeaders = []; - this._invoke = enqueue; + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); } - defineIteratorMethods(AsyncIterator.prototype); - - AsyncIterator.prototype[asyncIteratorSymbol] = function () { - return this; - }; - - exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of - // AsyncIterator objects; they just return a Promise for the value of - // the final result produced by the iterator. - - exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { - if (PromiseImpl === void 0) PromiseImpl = Promise; - var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); - return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator. - : iter.next().then(function (result) { - return result.done ? result.value : iter.next(); - }); - }; - - function makeInvokeMethod(innerFn, self, context) { - var state = GenStateSuspendedStart; - return function invoke(method, arg) { - if (state === GenStateExecuting) { - throw new Error("Generator is already running"); - } - - if (state === GenStateCompleted) { - if (method === "throw") { - throw arg; - } // Be forgiving, per 25.3.3.3.3 of the spec: - // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume - - - return doneResult(); - } - - context.method = method; - context.arg = arg; - - while (true) { - var delegate = context.delegate; - - if (delegate) { - var delegateResult = maybeInvokeDelegate(delegate, context); - - if (delegateResult) { - if (delegateResult === ContinueSentinel) continue; - return delegateResult; - } - } - - if (context.method === "next") { - // Setting context._sent for legacy support of Babel's - // function.sent implementation. - context.sent = context._sent = context.arg; - } else if (context.method === "throw") { - if (state === GenStateSuspendedStart) { - state = GenStateCompleted; - throw context.arg; - } - - context.dispatchException(context.arg); - } else if (context.method === "return") { - context.abrupt("return", context.arg); - } - - state = GenStateExecuting; - var record = tryCatch(innerFn, self, context); - - if (record.type === "normal") { - // If an exception is thrown from innerFn, we leave state === - // GenStateExecuting and loop back for another invocation. - state = context.done ? GenStateCompleted : GenStateSuspendedYield; - - if (record.arg === ContinueSentinel) { - continue; - } - - return { - value: record.arg, - done: context.done - }; - } else if (record.type === "throw") { - state = GenStateCompleted; // Dispatch the exception by looping back around to the - // context.dispatchException(context.arg) call above. - - context.method = "throw"; - context.arg = record.arg; - } - } - }; - } // Call delegate.iterator[context.method](context.arg) and handle the - // result, either by returning a { value, done } result from the - // delegate iterator, or by modifying context.method and context.arg, - // setting context.delegate to null, and returning the ContinueSentinel. - - - function maybeInvokeDelegate(delegate, context) { - var method = delegate.iterator[context.method]; - - if (method === undefined$1) { - // A .throw or .return when the delegate iterator has no .throw - // method always terminates the yield* loop. - context.delegate = null; - - if (context.method === "throw") { - // Note: ["return"] must be used for ES3 parsing compatibility. - if (delegate.iterator["return"]) { - // If the delegate iterator has a return method, give it a - // chance to clean up. - context.method = "return"; - context.arg = undefined$1; - maybeInvokeDelegate(delegate, context); - - if (context.method === "throw") { - // If maybeInvokeDelegate(context) changed context.method from - // "return" to "throw", let that override the TypeError below. - return ContinueSentinel; - } - } - - context.method = "throw"; - context.arg = new TypeError("The iterator does not provide a 'throw' method"); - } - - return ContinueSentinel; - } - - var record = tryCatch(method, delegate.iterator, context.arg); - - if (record.type === "throw") { - context.method = "throw"; - context.arg = record.arg; - context.delegate = null; - return ContinueSentinel; - } - - var info = record.arg; - - if (!info) { - context.method = "throw"; - context.arg = new TypeError("iterator result is not an object"); - context.delegate = null; - return ContinueSentinel; - } - - if (info.done) { - // Assign the result of the finished delegate to the temporary - // variable specified by delegate.resultName (see delegateYield). - context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield). - - context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the - // exception, let the outer generator proceed normally. If - // context.method was "next", forget context.arg since it has been - // "consumed" by the delegate iterator. If context.method was - // "return", allow the original .return call to continue in the - // outer generator. - - if (context.method !== "return") { - context.method = "next"; - context.arg = undefined$1; - } - } else { - // Re-yield the result returned by the delegate method. - return info; - } // The delegate iterator is finished, so forget it and continue with - // the outer generator. - - - context.delegate = null; - return ContinueSentinel; - } // Define Generator.prototype.{next,throw,return} in terms of the - // unified ._invoke helper method. - - - defineIteratorMethods(Gp); - define(Gp, toStringTagSymbol, "Generator"); // A Generator should always return itself as the iterator object when the - // @@iterator function is called on it. Some browsers' implementations of the - // iterator prototype chain incorrectly implement this, causing the Generator - // object to not be returned from this call. This ensures that doesn't happen. - // See https://github.com/facebook/regenerator/issues/274 for more details. - - Gp[iteratorSymbol] = function () { - return this; - }; - - Gp.toString = function () { - return "[object Generator]"; - }; - - function pushTryEntry(locs) { - var entry = { - tryLoc: locs[0] - }; - - if (1 in locs) { - entry.catchLoc = locs[1]; - } - - if (2 in locs) { - entry.finallyLoc = locs[2]; - entry.afterLoc = locs[3]; - } - - this.tryEntries.push(entry); - } - - function resetTryEntry(entry) { - var record = entry.completion || {}; - record.type = "normal"; - delete record.arg; - entry.completion = record; - } - - function Context(tryLocsList) { - // The root entry object (effectively a try statement without a catch - // or a finally block) gives us a place to store values thrown from - // locations where there is no enclosing try statement. - this.tryEntries = [{ - tryLoc: "root" - }]; - tryLocsList.forEach(pushTryEntry, this); - this.reset(true); - } - - exports.keys = function (object) { - var keys = []; - - for (var key in object) { - keys.push(key); - } - - keys.reverse(); // Rather than returning an object with a next method, we keep - // things simple and return the next function itself. - - return function next() { - while (keys.length) { - var key = keys.pop(); - - if (key in object) { - next.value = key; - next.done = false; - return next; - } - } // To avoid creating an additional object, we just hang the .value - // and .done properties off the next function object itself. This - // also ensures that the minifier will not anonymize the function. - - - next.done = true; - return next; - }; - }; - - function values(iterable) { - if (iterable) { - var iteratorMethod = iterable[iteratorSymbol]; - - if (iteratorMethod) { - return iteratorMethod.call(iterable); - } - - if (typeof iterable.next === "function") { - return iterable; - } - - if (!isNaN(iterable.length)) { - var i = -1, - next = function next() { - while (++i < iterable.length) { - if (hasOwn.call(iterable, i)) { - next.value = iterable[i]; - next.done = false; - return next; - } - } - - next.value = undefined$1; - next.done = true; - return next; - }; - - return next.next = next; - } - } // Return an iterator with no values. - - - return { - next: doneResult - }; - } - - exports.values = values; - - function doneResult() { - return { - value: undefined$1, - done: true - }; - } - - Context.prototype = { - constructor: Context, - reset: function reset(skipTempReset) { - this.prev = 0; - this.next = 0; // Resetting context._sent for legacy support of Babel's - // function.sent implementation. - - this.sent = this._sent = undefined$1; - this.done = false; - this.delegate = null; - this.method = "next"; - this.arg = undefined$1; - this.tryEntries.forEach(resetTryEntry); - - if (!skipTempReset) { - for (var name in this) { - // Not sure about the optimal order of these conditions: - if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) { - this[name] = undefined$1; - } - } - } - }, - stop: function stop() { - this.done = true; - var rootEntry = this.tryEntries[0]; - var rootRecord = rootEntry.completion; - - if (rootRecord.type === "throw") { - throw rootRecord.arg; - } - - return this.rval; - }, - dispatchException: function dispatchException(exception) { - if (this.done) { - throw exception; - } - - var context = this; - - function handle(loc, caught) { - record.type = "throw"; - record.arg = exception; - context.next = loc; - - if (caught) { - // If the dispatched exception was caught by a catch block, - // then let that catch block handle the exception normally. - context.method = "next"; - context.arg = undefined$1; - } - - return !!caught; - } - - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - var record = entry.completion; - - if (entry.tryLoc === "root") { - // Exception thrown outside of any try block that could handle - // it, so set the completion value of the entire function to - // throw the exception. - return handle("end"); - } - - if (entry.tryLoc <= this.prev) { - var hasCatch = hasOwn.call(entry, "catchLoc"); - var hasFinally = hasOwn.call(entry, "finallyLoc"); - - if (hasCatch && hasFinally) { - if (this.prev < entry.catchLoc) { - return handle(entry.catchLoc, true); - } else if (this.prev < entry.finallyLoc) { - return handle(entry.finallyLoc); - } - } else if (hasCatch) { - if (this.prev < entry.catchLoc) { - return handle(entry.catchLoc, true); - } - } else if (hasFinally) { - if (this.prev < entry.finallyLoc) { - return handle(entry.finallyLoc); - } - } else { - throw new Error("try statement without catch or finally"); - } - } - } - }, - abrupt: function abrupt(type, arg) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - - if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { - var finallyEntry = entry; - break; - } - } - - if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) { - // Ignore the finally entry if control is not jumping to a - // location outside the try/catch block. - finallyEntry = null; - } - - var record = finallyEntry ? finallyEntry.completion : {}; - record.type = type; - record.arg = arg; - - if (finallyEntry) { - this.method = "next"; - this.next = finallyEntry.finallyLoc; - return ContinueSentinel; - } - - return this.complete(record); - }, - complete: function complete(record, afterLoc) { - if (record.type === "throw") { - throw record.arg; - } - - if (record.type === "break" || record.type === "continue") { - this.next = record.arg; - } else if (record.type === "return") { - this.rval = this.arg = record.arg; - this.method = "return"; - this.next = "end"; - } else if (record.type === "normal" && afterLoc) { - this.next = afterLoc; - } - - return ContinueSentinel; - }, - finish: function finish(finallyLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - - if (entry.finallyLoc === finallyLoc) { - this.complete(entry.completion, entry.afterLoc); - resetTryEntry(entry); - return ContinueSentinel; - } - } - }, - "catch": function _catch(tryLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - - if (entry.tryLoc === tryLoc) { - var record = entry.completion; - - if (record.type === "throw") { - var thrown = record.arg; - resetTryEntry(entry); - } - - return thrown; - } - } // The context.catch method must only be called with a location - // argument that corresponds to a known catch block. - - - throw new Error("illegal catch attempt"); - }, - delegateYield: function delegateYield(iterable, resultName, nextLoc) { - this.delegate = { - iterator: values(iterable), - resultName: resultName, - nextLoc: nextLoc - }; - - if (this.method === "next") { - // Deliberately forget the last sent value so that we don't - // accidentally pass it on to the delegate. - this.arg = undefined$1; - } - - return ContinueSentinel; - } - }; // Regardless of whether this script is executing as a CommonJS module - // or not, return the runtime object so that we can declare the variable - // regeneratorRuntime in the outer scope, which allows this module to be - // injected easily by `bin/regenerator --include-runtime script.js`. - - return exports; - }( // If this script is executing as a CommonJS module, use module.exports - // as the regeneratorRuntime namespace. Otherwise create a new empty - // object. Either way, the resulting object will be used to initialize - // the regeneratorRuntime variable at the top of this file. - module.exports ); - - try { - regeneratorRuntime = runtime; - } catch (accidentalStrictMode) { - // This module should not be running in strict mode, so the above - // assignment should always work unless something is misconfigured. Just - // in case runtime.js accidentally runs in strict mode, we can escape - // strict mode using a global Function call. This could conceivably fail - // if a Content Security Policy forbids using Function, but in that case - // the proper solution is to fix the accidental strict mode problem. If - // you've misconfigured your bundler to force strict mode and applied a - // CSP to forbid Function, and you're not willing to fix either of those - // problems, please detail your unique predicament in a GitHub issue. - Function("r", "regeneratorRuntime = r")(runtime); - } - }); - - var regenerator$1 = runtime_1; - - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } - - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - - _next(undefined); - }); - }; - } - - var asyncToGenerator$1 = _asyncToGenerator; - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; - } - - var arrayLikeToArray = _arrayLikeToArray; - - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return arrayLikeToArray(arr); - } - - var arrayWithoutHoles = _arrayWithoutHoles; - - function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); - } - - var iterableToArray = _iterableToArray; - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); - } - - var unsupportedIterableToArray = _unsupportedIterableToArray; - - function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - var nonIterableSpread = _nonIterableSpread; - - function _toConsumableArray(arr) { - return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread(); - } - - var toConsumableArray$1 = _toConsumableArray; - - /* eslint-disable max-len */ - - /** - * @trustedScriptlet trusted-replace-xhr-response - * - * @description - * Replaces response content of `xhr` requests if **all** given parameters match. - * - * **Syntax** - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response'[, pattern, replacement[, propsToMatch]]) - * ``` - * - * - pattern - optional, argument for matching contents of responseText that should be replaced. If set, `replacement` is required; - * possible values: - * - '*' to match all text content - * - non-empty string - * - regular expression - * - replacement — optional, should be set if `pattern` is set. String to replace matched content with. Empty string to remove content. - * - propsToMatch — optional, string of space-separated properties to match for extra condition; possible props: - * - string or regular expression for matching the URL passed to `.open()` call; - * - colon-separated pairs name:value where - * - name - name is string or regular expression for matching XMLHttpRequest property name - * - value is string or regular expression for matching the value of the option passed to `.open()` call - * - * > Usage with no arguments will log XMLHttpRequest objects to browser console; - * which is useful for debugging but not permitted for production filter lists. - * - * **Examples** - * 1. Log all XMLHttpRequests - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response') - * ``` - * - * 2. Replace text content of XMLHttpRequests with specific url - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response', 'adb_detect:true', 'adb_detect:false', 'example.org') - * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', 'example.org') - * ``` - * - * 3. Remove all text content of XMLHttpRequests with specific request method - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'method:GET') - * ``` - * - * 4. Replace text content of XMLHttpRequests matching by URL regex and request methods - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response', '/#EXT-X-VMAP-AD-BREAK[\s\S]*?/', '#EXT-X-ENDLIST', '/\.m3u8/ method:/GET|HEAD/') - * ``` - * 5. Remove all text content of all XMLHttpRequests for example.com - * ``` - * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'example.com') - * ``` - */ - - /* eslint-enable max-len */ - - function trustedReplaceXhrResponse$1(source) { - var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - - // do nothing if browser does not support Proxy (e.g. Internet Explorer) - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy - if (typeof Proxy === 'undefined') { - return; - } // Only allow pattern as empty string for logging purposes - - - if (pattern === '' && replacement !== '') { - var message = 'Pattern argument should not be empty string.'; - logMessage(source, message); - return; - } - - var shouldLog = pattern === '' && replacement === ''; - var nativeOpen = window.XMLHttpRequest.prototype.open; - var nativeSend = window.XMLHttpRequest.prototype.send; - var shouldReplace = false; - var xhrData; - var requestHeaders = []; - - var openWrapper = function openWrapper(target, thisArg, args) { - xhrData = getXhrData.apply(void 0, toConsumableArray$1(args)); - - if (shouldLog) { - // Log if no propsToMatch given - var _message = "log: xhr( ".concat(objectToString(xhrData), " )"); - - logMessage(source, _message, true); - hit(source); - return Reflect.apply(target, thisArg, args); - } - - shouldReplace = matchRequestProps(source, propsToMatch, xhrData); // Trap setRequestHeader of target xhr object to mimic request headers later - - if (shouldReplace) { - var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { - // Collect headers - requestHeaders.push(args); - return Reflect.apply(target, thisArg, args); - }; - - var setRequestHeaderHandler = { - apply: setRequestHeaderWrapper - }; // setRequestHeader can only be called on open xhr object, - // so we can safely proxy it here - - thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); - } - - return Reflect.apply(target, thisArg, args); - }; - - var sendWrapper = /*#__PURE__*/function () { - var _ref = asyncToGenerator$1( /*#__PURE__*/regenerator$1.mark(function _callee(target, thisArg, args) { - var forgedRequest; - return regenerator$1.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (shouldReplace) { - _context.next = 2; - break; - } - - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 2: - /** - * Create separate XHR request with original request's input - * to be able to collect response data without triggering - * listeners on original XHR object - */ - forgedRequest = new XMLHttpRequest(); - forgedRequest.addEventListener('readystatechange', function () { - if (forgedRequest.readyState !== 4) { - return; - } - - var readyState = forgedRequest.readyState, - response = forgedRequest.response, - responseText = forgedRequest.responseText, - responseURL = forgedRequest.responseURL, - responseXML = forgedRequest.responseXML, - status = forgedRequest.status, - statusText = forgedRequest.statusText; // Extract content from response - - var content = responseText || response; - - if (typeof content !== 'string') { - return; - } - - var patternRegexp = pattern === '*' ? toRegExp() : toRegExp(pattern); - var modifiedContent = content.replace(patternRegexp, replacement); // Manually put required values into target XHR object - // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied - - Object.defineProperties(thisArg, { - readyState: { - value: readyState - }, - response: { - value: modifiedContent - }, - responseText: { - value: modifiedContent - }, - responseURL: { - value: responseURL - }, - responseXML: { - value: responseXML - }, - status: { - value: status - }, - statusText: { - value: statusText - } - }); // Mock events - - setTimeout(function () { - var stateEvent = new Event('readystatechange'); - thisArg.dispatchEvent(stateEvent); - var loadEvent = new Event('load'); - thisArg.dispatchEvent(loadEvent); - var loadEndEvent = new Event('loadend'); - thisArg.dispatchEvent(loadEndEvent); - }, 1); - hit(source); - }); - nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); // Mimic request headers before sending - // setRequestHeader can only be called on open request objects - - requestHeaders.forEach(function (header) { - var name = header[0]; - var value = header[1]; - forgedRequest.setRequestHeader(name, value); - }); - requestHeaders = []; - _context.prev = 7; - nativeSend.call(forgedRequest, args); - _context.next = 14; - break; - - case 11: - _context.prev = 11; - _context.t0 = _context["catch"](7); - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 14: - return _context.abrupt("return", undefined); - - case 15: - case "end": - return _context.stop(); - } - } - }, _callee, null, [[7, 11]]); - })); - - return function sendWrapper(_x, _x2, _x3) { - return _ref.apply(this, arguments); - }; - }(); + return undefined; + }; var openHandler = { apply: openWrapper @@ -8046,7 +7243,7 @@ } trustedReplaceXhrResponse$1.names = ['trusted-replace-xhr-response' // trusted scriptlets support no aliases ]; - trustedReplaceXhrResponse$1.injections = [hit, logMessage, toRegExp, objectToString, matchRequestProps, getXhrData, getMatchPropsData, validateParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries]; + trustedReplaceXhrResponse$1.injections = [hit, logMessage, toRegExp, objectToString, matchRequestProps, getXhrData, getMatchPropsData, getRequestProps, validateParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries]; /* eslint-disable max-len */ @@ -8278,25 +7475,25 @@ * @trustedScriptlet trusted-set-cookie * * @description - * Sets a cookie with arbitrary name and value, with optional path - * and the ability to reload the page after cookie was set. + * Sets a cookie with arbitrary name and value, + * and with optional ability to offset cookie attribute 'expires' and set path. * * **Syntax** * ``` - * example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, reload[, path]]]) + * example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, path]]) * ``` * * - `name` - required, cookie name to be set * - `value` - required, cookie value. Possible values: * - arbitrary value * - empty string for no value - * - `$now$` keyword for setting current time - * - 'offsetExpiresSec' - optional, offset from current time in seconds, after which cookie should expire; defaults to no offset + * - `$now$` keyword for setting current time in ms, e.g 1667915146503 + * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * - `offsetExpiresSec` - optional, offset from current time in seconds, after which cookie should expire; defaults to no offset * Possible values: * - positive integer in seconds * - `1year` keyword for setting expiration date to one year * - `1day` keyword for setting expiration date to one day - * - 'reload' - optional, boolean. Argument for reloading page after cookie is set. Defaults to `false` * - `path` - optional, argument for setting cookie path, defaults to `/`; possible values: * - `/` — root path * - `none` — to set no path at all @@ -8310,7 +7507,7 @@ * * 2. Set cookie with `new Date().getTime()` value * ``` - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '$now') + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', '$now$') * ``` * * 3. Set cookie which will expire in 3 days @@ -8322,23 +7519,121 @@ * ``` * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '1year') * ``` - * 5. Reload the page if cookie was successfully set + * + * 5. Set cookie with no path + * ``` + * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'none') + * ``` + */ + + /* eslint-enable max-len */ + + function trustedSetCookie$1(source, name, value) { + var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; + + if (typeof name === 'undefined') { + logMessage(source, 'Cookie name should be specified.'); + return; + } + + if (typeof value === 'undefined') { + logMessage(source, 'Cookie value should be specified.'); + return; + } + + var parsedValue = parseKeywordValue(value); + + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); + + if (!cookieToSet) { + return; + } + + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + document.cookie = cookieToSet; + hit(source); + } + trustedSetCookie$1.names = ['trusted-set-cookie' // trusted scriptlets support no aliases + ]; + trustedSetCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; + + /* eslint-disable max-len */ + + /** + * @trustedScriptlet trusted-set-cookie-reload + * + * @description + * Sets a cookie with arbitrary name and value, + * and with optional ability to offset cookie attribute 'expires' and set path. + * Also reloads the current page after the cookie setting. + * If reloading option is not needed, use the [`trusted-set-cookie` scriptlet](#trusted-set-cookie). + * + * **Syntax** + * ``` + * example.org#%#//scriptlet('trusted-set-cookie-reload', name, value[, offsetExpiresSec[, path]]) + * ``` + * + * - `name` - required, cookie name to be set + * - `value` - required, cookie value. Possible values: + * - arbitrary value + * - empty string for no value + * - `$now$` keyword for setting current time in ms, e.g 1667915146503 + * - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' + * - 'offsetExpiresSec' - optional, offset from current time in seconds, after which cookie should expire; defaults to no offset + * Possible values: + * - positive integer in seconds + * - `1year` keyword for setting expiration date to one year + * - `1day` keyword for setting expiration date to one day + * - `path` - optional, argument for setting cookie path, defaults to `/`; possible values: + * - `/` — root path + * - `none` — to set no path at all + * + * **Examples** + * 1. Set cookie and reload the page after it + * ``` + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept') + * ``` + * + * 2. Set cookie with `new Date().getTime()` value and reload the page after it + * ``` + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', '$now$') + * ``` + * + * 3. Set cookie which will expire in 3 days and reload the page after it + * ``` + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '259200') + * ``` + * + * 4. Set cookie which will expire in one year and reload the page after it * ``` - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'true') + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '1year') * ``` * - * 6. Set cookie with no path + * 5. Set cookie with no 'expire' and no path, reload the page after it * ``` - * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', '', 'none') + * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'decline', '', 'none') * ``` */ /* eslint-enable max-len */ - function trustedSetCookie$1(source, name, value) { + function trustedSetCookieReload$1(source, name, value) { var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - var reload = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'false'; - var path = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : '/'; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; if (typeof name === 'undefined') { logMessage(source, 'Cookie name should be specified.'); @@ -8352,57 +7647,90 @@ // https://github.com/AdguardTeam/Scriptlets/issues/212 - if (reload === 'true' && isCookieSetWithValue(document.cookie, name, value)) { + if (isCookieSetWithValue(document.cookie, name, value)) { return; } - var ONE_YEAR_EXPIRATION_KEYWORD = '1year'; - var ONE_DAY_EXPIRATION_KEYWORD = '1day'; var parsedValue = parseKeywordValue(value); - var cookieToSet = concatCookieNameValuePath(source, name, parsedValue, path); - if (!cookieToSet) { + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; - } // Set expiration date if offsetExpiresSec was passed - + } - if (offsetExpiresSec) { - var MS_IN_SEC = 1000; - var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; - var SECONDS_IN_DAY = 24 * 60 * 60; - var parsedOffsetExpiresSec; // Set predefined expire value if corresponding keyword was passed + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { - parsedOffsetExpiresSec = SECONDS_IN_YEAR; - } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { - parsedOffsetExpiresSec = SECONDS_IN_DAY; - } else { - parsedOffsetExpiresSec = Number.parseInt(offsetExpiresSec, 10); // If offsetExpiresSec has been parsed to NaN - do not set cookie at all + if (!cookieToSet) { + return; + } - if (Number.isNaN(parsedOffsetExpiresSec)) { - var message = "log: Invalid offsetExpiresSec value: ".concat(offsetExpiresSec); - logMessage(source, message); - return; - } - } + var parsedOffsetExpiresMs = getTrustedCookieOffsetMs(offsetExpiresSec); - var expires = Date.now() + parsedOffsetExpiresSec * MS_IN_SEC; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + if (!parsedOffsetExpiresMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; } - if (cookieToSet) { - document.cookie = cookieToSet; - hit(source); // Only reload the page if cookie was set - // https://github.com/AdguardTeam/Scriptlets/issues/212 + var expires = Date.now() + parsedOffsetExpiresMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + document.cookie = cookieToSet; + hit(source); // Only reload the page if cookie was set + // https://github.com/AdguardTeam/Scriptlets/issues/212 - if (reload === 'true' && isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); - } + if (isCookieSetWithValue(document.cookie, name, value)) { + window.location.reload(); } } - trustedSetCookie$1.names = ['trusted-set-cookie' // trusted scriptlets support no aliases + trustedSetCookieReload$1.names = ['trusted-set-cookie-reload' // trusted scriptlets support no aliases ]; - trustedSetCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookieRawPath, parseKeywordValue, getCookiePath]; + trustedSetCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; + + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; + } + + var arrayLikeToArray = _arrayLikeToArray; + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return arrayLikeToArray(arr); + } + + var arrayWithoutHoles = _arrayWithoutHoles; + + function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); + } + + var iterableToArray = _iterableToArray; + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); + } + + var unsupportedIterableToArray = _unsupportedIterableToArray; + + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + var nonIterableSpread = _nonIterableSpread; + + function _toConsumableArray(arr) { + return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread(); + } + + var toConsumableArray$1 = _toConsumableArray; /* eslint-disable max-len */ @@ -8487,109 +7815,84 @@ var shouldReplace = false; var fetchData; - var handlerWrapper = /*#__PURE__*/function () { - var _ref = asyncToGenerator$1( /*#__PURE__*/regenerator$1.mark(function _callee(target, thisArg, args) { - var forgeResponse; - return regenerator$1.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - fetchData = getFetchData(args); - - if (!shouldLog) { - _context.next = 5; - break; - } - - // log if no propsToMatch given - logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); - hit(source); - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 5: - shouldReplace = matchRequestProps(source, propsToMatch, fetchData); + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + fetchData = getFetchData(args); - if (shouldReplace) { - _context.next = 8; - break; - } + if (shouldLog) { + // log if no propsToMatch given + logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); + hit(source); + return Reflect.apply(target, thisArg, args); + } - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 8: - /** - * Create new Response object using original response' properties - * and given text as body content - * @param {Response} response original response to copy properties from - * @param {string} textContent text to set as body content - * @returns {Response} - */ - forgeResponse = function forgeResponse(response, textContent) { - var bodyUsed = response.bodyUsed, - headers = response.headers, - ok = response.ok, - redirected = response.redirected, - status = response.status, - statusText = response.statusText, - type = response.type, - url = response.url; // eslint-disable-next-line compat/compat - - var forgedResponse = new Response(textContent, { - status: status, - statusText: statusText, - headers: headers - }); // Manually set properties which can't be set by Response constructor - - Object.defineProperties(forgedResponse, { - url: { - value: url - }, - type: { - value: type - }, - ok: { - value: ok - }, - bodyUsed: { - value: bodyUsed - }, - redirected: { - value: redirected - } - }); - return forgedResponse; - }; - - return _context.abrupt("return", nativeFetch.apply(void 0, toConsumableArray$1(args)).then(function (response) { - return response.text().then(function (bodyText) { - var patternRegexp = pattern === '*' ? toRegExp() : toRegExp(pattern); - var modifiedTextContent = bodyText.replace(patternRegexp, replacement); - var forgedResponse = forgeResponse(response, modifiedTextContent); - hit(source); - return forgedResponse; - }).catch(function () { - // log if response body can't be converted to a string - var fetchDataStr = objectToString(fetchData); - var message = "Response body can't be converted to text: ".concat(fetchDataStr); - logMessage(source, message); - return Reflect.apply(target, thisArg, args); - }); - }).catch(function () { - return Reflect.apply(target, thisArg, args); - })); + shouldReplace = matchRequestProps(source, propsToMatch, fetchData); - case 10: - case "end": - return _context.stop(); - } + if (!shouldReplace) { + return Reflect.apply(target, thisArg, args); + } + /** + * Create new Response object using original response' properties + * and given text as body content + * @param {Response} response original response to copy properties from + * @param {string} textContent text to set as body content + * @returns {Response} + */ + + + var forgeResponse = function forgeResponse(response, textContent) { + var bodyUsed = response.bodyUsed, + headers = response.headers, + ok = response.ok, + redirected = response.redirected, + status = response.status, + statusText = response.statusText, + type = response.type, + url = response.url; // eslint-disable-next-line compat/compat + + var forgedResponse = new Response(textContent, { + status: status, + statusText: statusText, + headers: headers + }); // Manually set properties which can't be set by Response constructor + + Object.defineProperties(forgedResponse, { + url: { + value: url + }, + type: { + value: type + }, + ok: { + value: ok + }, + bodyUsed: { + value: bodyUsed + }, + redirected: { + value: redirected } - }, _callee); - })); - - return function handlerWrapper(_x, _x2, _x3) { - return _ref.apply(this, arguments); + }); + return forgedResponse; }; - }(); + + return nativeFetch.apply(void 0, toConsumableArray$1(args)).then(function (response) { + return response.text().then(function (bodyText) { + var patternRegexp = pattern === '*' ? toRegExp() : toRegExp(pattern); + var modifiedTextContent = bodyText.replace(patternRegexp, replacement); + var forgedResponse = forgeResponse(response, modifiedTextContent); + hit(source); + return forgedResponse; + }).catch(function () { + // log if response body can't be converted to a string + var fetchDataStr = objectToString(fetchData); + var message = "Response body can't be converted to text: ".concat(fetchDataStr); + logMessage(source, message); + return Reflect.apply(target, thisArg, args); + }); + }).catch(function () { + return Reflect.apply(target, thisArg, args); + }); + }; var fetchHandler = { apply: handlerWrapper @@ -8597,7 +7900,7 @@ fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign } trustedReplaceFetchResponse$1.names = ['trusted-replace-fetch-response']; - trustedReplaceFetchResponse$1.injections = [hit, logMessage, getFetchData, objectToString, matchRequestProps, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; + trustedReplaceFetchResponse$1.injections = [hit, logMessage, getFetchData, objectToString, matchRequestProps, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; /* eslint-disable max-len */ @@ -8726,6 +8029,7 @@ trustedReplaceXhrResponse: trustedReplaceXhrResponse$1, xmlPrune: xmlPrune$1, trustedSetCookie: trustedSetCookie$1, + trustedSetCookieReload: trustedSetCookieReload$1, trustedReplaceFetchResponse: trustedReplaceFetchResponse$1, trustedSetLocalStorageItem: trustedSetLocalStorageItem$1 }); @@ -12797,6 +12101,10 @@ resolve: resolveYamlMerge }); + function commonjsRequire (target) { + throw new Error('Could not dynamically require "' + target + '". Please configure the dynamicRequireTargets option of @rollup/plugin-commonjs appropriately for this require call to behave properly.'); + } + /*eslint-disable no-bitwise*/ @@ -20815,6 +20123,10 @@ return getObjectFromEntries(entries); } + function getRequestProps() { + return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; + } + function getObjectEntries(object) { var keys = Object.keys(object); var entries = []; @@ -22539,6 +21851,10 @@ return matchData; } + function getRequestProps() { + return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; + } + function getRandomIntInclusive(min, max) { min = Math.ceil(min); max = Math.floor(max); @@ -23598,7 +22914,7 @@ if (origDescriptor instanceof Object) { if (!origDescriptor.configurable) { - var message = "set-constant: property '".concat(prop, "' is not configurable"); + var message = "Property '".concat(prop, "' is not configurable"); logMessage(source, message); return false; } @@ -23917,19 +23233,26 @@ function setCookie(source, args) { function setCookie(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; - var validValue = getLimitedCookieValue(source, value); + var validValue = getLimitedCookieValue(value); if (validValue === null) { logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); return; } - var cookieData = concatCookieNameValuePath(source, name, validValue, path); + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + + var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (cookieData) { - hit(source); - document.cookie = cookieData; + if (!cookieToSet) { + return; } + + hit(source); + document.cookie = cookieToSet; } function hit(source, message) { @@ -23994,7 +23317,7 @@ return native(num); } - function getLimitedCookieValue(source, value) { + function getLimitedCookieValue(value) { if (!value) { return null; } @@ -24025,12 +23348,10 @@ validValue = parseFloat(value); if (nativeIsNaN(validValue)) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); return null; } if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); return null; } } else { @@ -24040,16 +23361,11 @@ return validValue; } - function concatCookieNameValuePath(source, rawName, rawValue, rawPath) { - if (!isValidCookieRawPath(rawPath)) { - logMessage(source, "Invalid cookie path: '".concat(rawPath, "'")); - return null; - } - - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath)); + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); } - function isValidCookieRawPath(rawPath) { + function isValidCookiePath(rawPath) { return rawPath === "/" || rawPath === "none"; } @@ -24074,26 +23390,33 @@ function setCookieReload(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; - if (isCookieSetWithValue(name, value)) { + if (isCookieSetWithValue(name, value)) { + return; + } + + var validValue = getLimitedCookieValue(value); + + if (validValue === null) { + logMessage(source, "Invalid cookie value: '".concat(value, "'")); + return; + } + + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var validValue = getLimitedCookieValue(source, value); + var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + if (!cookieToSet) { return; } - var cookieData = concatCookieNameValuePath(source, name, validValue, path); - - if (cookieData) { - document.cookie = cookieData; - hit(source); + document.cookie = cookieToSet; + hit(source); - if (isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); - } + if (isCookieSetWithValue(document.cookie, name, value)) { + window.location.reload(); } } @@ -24173,7 +23496,7 @@ }); } - function getLimitedCookieValue(source, value) { + function getLimitedCookieValue(value) { if (!value) { return null; } @@ -24204,12 +23527,10 @@ validValue = parseFloat(value); if (nativeIsNaN(validValue)) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); return null; } if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { - logMessage(source, "Invalid cookie value: '".concat(value, "'")); return null; } } else { @@ -24219,16 +23540,11 @@ return validValue; } - function concatCookieNameValuePath(source, rawName, rawValue, rawPath) { - if (!isValidCookieRawPath(rawPath)) { - logMessage(source, "Invalid cookie path: '".concat(rawPath, "'")); - return null; - } - - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath)); + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); } - function isValidCookieRawPath(rawPath) { + function isValidCookiePath(rawPath) { return rawPath === "/" || rawPath === "none"; } @@ -24904,98 +24220,72 @@ var shouldReplace = false; var fetchData; - var handlerWrapper = function () { - var _ref = asyncToGenerator(regenerator.mark(function _callee(target, thisArg, args) { - var forgeResponse; - return regenerator.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - fetchData = getFetchData(args); - - if (!shouldLog) { - _context.next = 5; - break; - } - - logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); - hit(source); - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 5: - shouldReplace = matchRequestProps(source, propsToMatch, fetchData); - - if (shouldReplace) { - _context.next = 8; - break; - } - - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 8: - forgeResponse = function forgeResponse(response, textContent) { - var bodyUsed = response.bodyUsed, - headers = response.headers, - ok = response.ok, - redirected = response.redirected, - status = response.status, - statusText = response.statusText, - type = response.type, - url = response.url; - var forgedResponse = new Response(textContent, { - status: status, - statusText: statusText, - headers: headers - }); - Object.defineProperties(forgedResponse, { - url: { - value: url - }, - type: { - value: type - }, - ok: { - value: ok - }, - bodyUsed: { - value: bodyUsed - }, - redirected: { - value: redirected - } - }); - return forgedResponse; - }; - - return _context.abrupt("return", nativeFetch.apply(void 0, toConsumableArray(args)).then(function (response) { - return response.text().then(function (bodyText) { - var patternRegexp = pattern === "*" ? toRegExp() : toRegExp(pattern); - var modifiedTextContent = bodyText.replace(patternRegexp, replacement); - var forgedResponse = forgeResponse(response, modifiedTextContent); - hit(source); - return forgedResponse; - }).catch(function () { - var fetchDataStr = objectToString(fetchData); - var message = "Response body can't be converted to text: ".concat(fetchDataStr); - logMessage(source, message); - return Reflect.apply(target, thisArg, args); - }); - }).catch(function () { - return Reflect.apply(target, thisArg, args); - })); - - case 10: - case "end": - return _context.stop(); - } - } - }, _callee); - })); + var handlerWrapper = function handlerWrapper(target, thisArg, args) { + fetchData = getFetchData(args); + + if (shouldLog) { + logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); + hit(source); + return Reflect.apply(target, thisArg, args); + } + + shouldReplace = matchRequestProps(source, propsToMatch, fetchData); + + if (!shouldReplace) { + return Reflect.apply(target, thisArg, args); + } - return function handlerWrapper(_x, _x2, _x3) { - return _ref.apply(this, arguments); + var forgeResponse = function forgeResponse(response, textContent) { + var bodyUsed = response.bodyUsed, + headers = response.headers, + ok = response.ok, + redirected = response.redirected, + status = response.status, + statusText = response.statusText, + type = response.type, + url = response.url; + var forgedResponse = new Response(textContent, { + status: status, + statusText: statusText, + headers: headers + }); + Object.defineProperties(forgedResponse, { + url: { + value: url + }, + type: { + value: type + }, + ok: { + value: ok + }, + bodyUsed: { + value: bodyUsed + }, + redirected: { + value: redirected + } + }); + return forgedResponse; }; - }(); + + return nativeFetch.apply(void 0, toConsumableArray(args)).then(function (response) { + return response.text().then(function (bodyText) { + var patternRegexp = pattern === "*" ? toRegExp() : toRegExp(pattern); + var modifiedTextContent = bodyText.replace(patternRegexp, replacement); + var forgedResponse = forgeResponse(response, modifiedTextContent); + hit(source); + return forgedResponse; + }).catch(function () { + var fetchDataStr = objectToString(fetchData); + var message = "Response body can't be converted to text: ".concat(fetchDataStr); + logMessage(source, message); + return Reflect.apply(target, thisArg, args); + }); + }).catch(function () { + return Reflect.apply(target, thisArg, args); + }); + }; var fetchHandler = { apply: handlerWrapper @@ -25175,6 +24465,10 @@ return getObjectFromEntries(entries); } + function getRequestProps() { + return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; + } + function getObjectEntries(object) { var keys = Object.keys(object); var entries = []; @@ -25262,10 +24556,10 @@ var requestHeaders = []; var openWrapper = function openWrapper(target, thisArg, args) { - xhrData = getXhrData.apply(void 0, toConsumableArray(args)); + xhrData = getXhrData.apply(null, args); if (shouldLog) { - var _message = "log: xhr( ".concat(objectToString(xhrData), " )"); + var _message = "xhr( ".concat(objectToString(xhrData), " )"); logMessage(source, _message, true); hit(source); @@ -25289,107 +24583,81 @@ return Reflect.apply(target, thisArg, args); }; - var sendWrapper = function () { - var _ref = asyncToGenerator(regenerator.mark(function _callee(target, thisArg, args) { - var forgedRequest; - return regenerator.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (shouldReplace) { - _context.next = 2; - break; - } - - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 2: - forgedRequest = new XMLHttpRequest(); - forgedRequest.addEventListener("readystatechange", function () { - if (forgedRequest.readyState !== 4) { - return; - } - - var readyState = forgedRequest.readyState, - response = forgedRequest.response, - responseText = forgedRequest.responseText, - responseURL = forgedRequest.responseURL, - responseXML = forgedRequest.responseXML, - status = forgedRequest.status, - statusText = forgedRequest.statusText; - var content = responseText || response; - - if (typeof content !== "string") { - return; - } - - var patternRegexp = pattern === "*" ? toRegExp() : toRegExp(pattern); - var modifiedContent = content.replace(patternRegexp, replacement); - Object.defineProperties(thisArg, { - readyState: { - value: readyState - }, - response: { - value: modifiedContent - }, - responseText: { - value: modifiedContent - }, - responseURL: { - value: responseURL - }, - responseXML: { - value: responseXML - }, - status: { - value: status - }, - statusText: { - value: statusText - } - }); - setTimeout(function () { - var stateEvent = new Event("readystatechange"); - thisArg.dispatchEvent(stateEvent); - var loadEvent = new Event("load"); - thisArg.dispatchEvent(loadEvent); - var loadEndEvent = new Event("loadend"); - thisArg.dispatchEvent(loadEndEvent); - }, 1); - hit(source); - }); - nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); - requestHeaders.forEach(function (header) { - var name = header[0]; - var value = header[1]; - forgedRequest.setRequestHeader(name, value); - }); - requestHeaders = []; - _context.prev = 7; - nativeSend.call(forgedRequest, args); - _context.next = 14; - break; - - case 11: - _context.prev = 11; - _context.t0 = _context["catch"](7); - return _context.abrupt("return", Reflect.apply(target, thisArg, args)); - - case 14: - return _context.abrupt("return", undefined); - - case 15: - case "end": - return _context.stop(); - } + var sendWrapper = function sendWrapper(target, thisArg, args) { + if (!shouldReplace) { + return Reflect.apply(target, thisArg, args); + } + + var forgedRequest = new XMLHttpRequest(); + forgedRequest.addEventListener("readystatechange", function () { + if (forgedRequest.readyState !== 4) { + return; + } + + var readyState = forgedRequest.readyState, + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; + var content = responseText || response; + + if (typeof content !== "string") { + return; + } + + var patternRegexp = pattern === "*" ? toRegExp() : toRegExp(pattern); + var modifiedContent = content.replace(patternRegexp, replacement); + Object.defineProperties(thisArg, { + readyState: { + value: readyState + }, + response: { + value: modifiedContent + }, + responseText: { + value: modifiedContent + }, + responseURL: { + value: responseURL + }, + responseXML: { + value: responseXML + }, + status: { + value: status + }, + statusText: { + value: statusText } - }, _callee, null, [[7, 11]]); - })); + }); + setTimeout(function () { + var stateEvent = new Event("readystatechange"); + thisArg.dispatchEvent(stateEvent); + var loadEvent = new Event("load"); + thisArg.dispatchEvent(loadEvent); + var loadEndEvent = new Event("loadend"); + thisArg.dispatchEvent(loadEndEvent); + }, 1); + hit(source); + }); + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + requestHeaders.forEach(function (header) { + var name = header[0]; + var value = header[1]; + forgedRequest.setRequestHeader(name, value); + }); + requestHeaders = []; - return function sendWrapper(_x, _x2, _x3) { - return _ref.apply(this, arguments); - }; - }(); + try { + nativeSend.call(forgedRequest, args); + } catch (_unused) { + return Reflect.apply(target, thisArg, args); + } + + return undefined; + }; var openHandler = { apply: openWrapper @@ -25529,6 +24797,10 @@ return matchData; } + function getRequestProps() { + return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; + } + function validateParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); @@ -25605,8 +24877,7 @@ function trustedSetCookie(source, args) { function trustedSetCookie(source, name, value) { var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - var reload = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "false"; - var path = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : "/"; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; if (typeof name === "undefined") { logMessage(source, "Cookie name should be specified."); @@ -25618,51 +24889,202 @@ return; } - if (reload === "true" && isCookieSetWithValue(document.cookie, name, value)) { + var parsedValue = parseKeywordValue(value); + + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var ONE_YEAR_EXPIRATION_KEYWORD = "1year"; - var ONE_DAY_EXPIRATION_KEYWORD = "1day"; - var parsedValue = parseKeywordValue(value); - var cookieToSet = concatCookieNameValuePath(source, name, parsedValue, path); + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); if (!cookieToSet) { return; } - if (offsetExpiresSec) { - var MS_IN_SEC = 1e3; - var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; - var SECONDS_IN_DAY = 24 * 60 * 60; - var parsedOffsetExpiresSec; + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); - if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { - parsedOffsetExpiresSec = SECONDS_IN_YEAR; - } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { - parsedOffsetExpiresSec = SECONDS_IN_DAY; - } else { - parsedOffsetExpiresSec = Number.parseInt(offsetExpiresSec, 10); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } - if (Number.isNaN(parsedOffsetExpiresSec)) { - var message = "log: Invalid offsetExpiresSec value: ".concat(offsetExpiresSec); - logMessage(source, message); - return; + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + document.cookie = cookieToSet; + hit(source); + } + + function hit(source, message) { + if (source.verbose !== true) { + return; + } + + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + + if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + + var LOG_MARKER = "log: "; + + if (message) { + if (message.indexOf(LOG_MARKER) === -1) { + log("".concat(prefix, " message:\n").concat(message)); + } else { + log(message.slice(LOG_MARKER.length)); } } - var expires = Date.now() + parsedOffsetExpiresSec * MS_IN_SEC; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + log("".concat(prefix, " trace start")); + + if (trace) { + trace(); + } + + log("".concat(prefix, " trace end")); + } catch (e) {} + + if (typeof window.__debug === "function") { + window.__debug(source); } + } - if (cookieToSet) { - document.cookie = cookieToSet; - hit(source); + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + if (forced || source.verbose) { + console.log("".concat(source.name, ": ").concat(message)); + } + } + + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); + } + + function isValidCookiePath(rawPath) { + return rawPath === "/" || rawPath === "none"; + } + + function getTrustedCookieOffsetMs(offsetExpiresSec) { + if (!offsetExpiresSec) { + return null; + } + + var ONE_YEAR_EXPIRATION_KEYWORD = "1year"; + var ONE_DAY_EXPIRATION_KEYWORD = "1day"; + var MS_IN_SEC = 1e3; + var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; + var SECONDS_IN_DAY = 24 * 60 * 60; + var parsedSec; - if (reload === "true" && isCookieSetWithValue(document.cookie, name, value)) { - window.location.reload(); + if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_YEAR; + } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_DAY; + } else { + parsedSec = Number.parseInt(offsetExpiresSec, 10); + + if (Number.isNaN(parsedSec)) { + return null; } } + + return parsedSec * MS_IN_SEC; + } + + function parseKeywordValue(rawValue) { + var NOW_VALUE_KEYWORD = "$now$"; + var CURRENT_DATE_KEYWORD = "$currentDate$"; + var parsedValue = rawValue; + + if (rawValue === NOW_VALUE_KEYWORD) { + parsedValue = Date.now().toString(); + } else if (rawValue === CURRENT_DATE_KEYWORD) { + parsedValue = Date(); + } + + return parsedValue; + } + + function getCookiePath(rawPath) { + if (rawPath === "/") { + return "path=/"; + } + + return ""; + } + + var updatedArgs = args ? [].concat(source).concat(args) : [source]; + + try { + trustedSetCookie.apply(this, updatedArgs); + } catch (e) { + console.log(e); + } + } + + function trustedSetCookieReload(source, args) { + function trustedSetCookieReload(source, name, value) { + var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; + var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; + + if (typeof name === "undefined") { + logMessage(source, "Cookie name should be specified."); + return; + } + + if (typeof value === "undefined") { + logMessage(source, "Cookie value should be specified."); + return; + } + + if (isCookieSetWithValue(document.cookie, name, value)) { + return; + } + + var parsedValue = parseKeywordValue(value); + + if (!isValidCookiePath(path)) { + logMessage(source, "Invalid cookie path: '".concat(path, "'")); + return; + } + + var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); + + if (!cookieToSet) { + return; + } + + var parsedOffsetExpiresMs = getTrustedCookieOffsetMs(offsetExpiresSec); + + if (!parsedOffsetExpiresMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + + var expires = Date.now() + parsedOffsetExpiresMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); + document.cookie = cookieToSet; + hit(source); + + if (isCookieSetWithValue(document.cookie, name, value)) { + window.location.reload(); + } } function hit(source, message) { @@ -25736,17 +25158,39 @@ }); } - function concatCookieNameValuePath(source, rawName, rawValue, rawPath) { - if (!isValidCookieRawPath(rawPath)) { - logMessage(source, "Invalid cookie path: '".concat(rawPath, "'")); + function concatCookieNameValuePath(rawName, rawValue, rawPath) { + return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); + } + + function isValidCookiePath(rawPath) { + return rawPath === "/" || rawPath === "none"; + } + + function getTrustedCookieOffsetMs(offsetExpiresSec) { + if (!offsetExpiresSec) { return null; } - return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath)); - } + var ONE_YEAR_EXPIRATION_KEYWORD = "1year"; + var ONE_DAY_EXPIRATION_KEYWORD = "1day"; + var MS_IN_SEC = 1e3; + var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; + var SECONDS_IN_DAY = 24 * 60 * 60; + var parsedSec; - function isValidCookieRawPath(rawPath) { - return rawPath === "/" || rawPath === "none"; + if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_YEAR; + } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { + parsedSec = SECONDS_IN_DAY; + } else { + parsedSec = Number.parseInt(offsetExpiresSec, 10); + + if (Number.isNaN(parsedSec)) { + return null; + } + } + + return parsedSec * MS_IN_SEC; } function parseKeywordValue(rawValue) { @@ -25774,7 +25218,7 @@ var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { - trustedSetCookie.apply(this, updatedArgs); + trustedSetCookieReload.apply(this, updatedArgs); } catch (e) { console.log(e); } @@ -26352,6 +25796,7 @@ "trusted-replace-fetch-response": trustedReplaceFetchResponse, "trusted-replace-xhr-response": trustedReplaceXhrResponse, "trusted-set-cookie": trustedSetCookie, + "trusted-set-cookie-reload": trustedSetCookieReload, "trusted-set-local-storage-item": trustedSetLocalStorageItem, "xml-prune": xmlPrune, "xml-prune.js": xmlPrune, diff --git a/wiki/about-trusted-scriptlets.md b/wiki/about-trusted-scriptlets.md index 348b7844..57e27097 100644 --- a/wiki/about-trusted-scriptlets.md +++ b/wiki/about-trusted-scriptlets.md @@ -2,6 +2,7 @@ * [trusted-click-element](#trusted-click-element) * [trusted-replace-fetch-response](#trusted-replace-fetch-response) * [trusted-replace-xhr-response](#trusted-replace-xhr-response) +* [trusted-set-cookie-reload](#trusted-set-cookie-reload) * [trusted-set-cookie](#trusted-set-cookie) * [trusted-set-local-storage-item](#trusted-set-local-storage-item) * * * @@ -169,27 +170,83 @@ which is useful for debugging but not permitted for production filter lists. [Redirect source](../src/scriptlets/trusted-replace-xhr-response.js) * * * +### ⚡️ trusted-set-cookie-reload + +Sets a cookie with arbitrary name and value, +and with optional ability to offset cookie attribute 'expires' and set path. +Also reloads the current page after the cookie setting. +If reloading option is not needed, use the [`trusted-set-cookie` scriptlet](#trusted-set-cookie). + +**Syntax** +``` +example.org#%#//scriptlet('trusted-set-cookie-reload', name, value[, offsetExpiresSec[, path]]) +``` + +- `name` - required, cookie name to be set +- `value` - required, cookie value. Possible values: + - arbitrary value + - empty string for no value + - `$now$` keyword for setting current time in ms, e.g 1667915146503 + - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' +- 'offsetExpiresSec' - optional, offset from current time in seconds, after which cookie should expire; defaults to no offset +Possible values: + - positive integer in seconds + - `1year` keyword for setting expiration date to one year + - `1day` keyword for setting expiration date to one day +- `path` - optional, argument for setting cookie path, defaults to `/`; possible values: + - `/` — root path + - `none` — to set no path at all + +**Examples** +1. Set cookie and reload the page after it +``` +example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept') +``` + +2. Set cookie with `new Date().getTime()` value and reload the page after it +``` +example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', '$now$') +``` + +3. Set cookie which will expire in 3 days and reload the page after it +``` +example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '259200') +``` + +4. Set cookie which will expire in one year and reload the page after it +``` +example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'accept', '1year') +``` + +5. Set cookie with no 'expire' and no path, reload the page after it +``` +example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'decline', '', 'none') +``` + +[Redirect source](../src/scriptlets/trusted-set-cookie-reload.js) +* * * + ### ⚡️ trusted-set-cookie -Sets a cookie with arbitrary name and value, with optional path -and the ability to reload the page after cookie was set. +Sets a cookie with arbitrary name and value, +and with optional ability to offset cookie attribute 'expires' and set path. **Syntax** ``` -example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, reload[, path]]]) +example.org#%#//scriptlet('trusted-set-cookie', name, value[, offsetExpiresSec[, path]]) ``` - `name` - required, cookie name to be set - `value` - required, cookie value. Possible values: - arbitrary value - empty string for no value - - `$now$` keyword for setting current time + - `$now$` keyword for setting current time in ms, e.g 1667915146503 + - `$currentDate$` keyword for setting current time as string, e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' - `offsetExpiresSec` - optional, offset from current time in seconds, after which cookie should expire; defaults to no offset Possible values: - positive integer in seconds - `1year` keyword for setting expiration date to one year - `1day` keyword for setting expiration date to one day -- `reload` - optional, boolean. Argument for reloading page after cookie is set. Defaults to `false` - `path` - optional, argument for setting cookie path, defaults to `/`; possible values: - `/` — root path - `none` — to set no path at all @@ -215,14 +272,10 @@ example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '259200' ``` example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'accept', '1year') ``` -5. Reload the page if cookie was successfully set -``` -example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'true') -``` -6. Set cookie with no path +5. Set cookie with no path ``` -example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', '', 'none') +example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'none') ``` [Redirect source](../src/scriptlets/trusted-set-cookie.js) From c98787f02b8f7ac47a3637db942439b70e1a74cb Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Tue, 6 Dec 2022 16:51:02 +0300 Subject: [PATCH 06/70] AG-13369 fix 1.7 bugs Merge in ADGUARD-FILTERS/scriptlets from fix/AG-13369_02 to master Squashed commit of the following: commit b0d62d717c773654f734c7930eea003a5732f77f Author: Stanislav A Date: Tue Dec 6 16:08:57 2022 +0300 add TODO for POST requests testcases commit 2b1c0f785b5114de8f298fde839f2eb31a396750 Author: Stanislav A Date: Tue Dec 6 15:31:44 2022 +0300 update dist due to changes in hit() commit 46a6444c413acd95abc9e91fd0bbce0d17bc0989 Author: Stanislav A Date: Tue Dec 6 15:24:11 2022 +0300 add multiline testcase for trusted-replace-* scriptlets and fix prevent-bab redirect commit e6fa5c80f883413b88f432d427ad208d2388f2f4 Author: Stanislav A Date: Tue Dec 6 14:44:37 2022 +0300 improve prevent-bab redirect commit cc1fed9db292c826e0fa100b5bf928e5587c37dc Author: Stanislav A Date: Tue Dec 6 14:42:03 2022 +0300 improve getLimitedStorageItemValue helper commit 54ac72c4f8919cfdc5d52352feddbf0471036b68 Author: Stanislav A Date: Tue Dec 6 14:32:53 2022 +0300 cut out hit logging logic commit de0c85d44036e446902e28f39ebde125fe2e762e Author: Stanislav A Date: Tue Dec 6 14:20:10 2022 +0300 fix misc for tests and typos commit b82d4c8cb0818d7c671b6cb315a1a1b7ba5faeb0 Author: Stanislav A Date: Tue Dec 6 14:04:20 2022 +0300 use node-qunit-puppeteer v2.1.1 commit c1f34c6b975f53fc0fa825d18ae2abd9d7b7d9c3 Author: Stanislav A Date: Mon Dec 5 22:06:27 2022 +0300 fix empty object in chain testcases commit 360a1c4b8a34d03cfa217e7e08e68ef57f215a62 Author: Stanislav A Date: Mon Dec 5 21:38:36 2022 +0300 fix abort-on-property-write testcase commit 4d878a2d7960f80b02d7a319fc74dfe2f938cc37 Author: Stanislav A Date: Mon Dec 5 21:36:54 2022 +0300 fix abort-on-stack-trace testcase commit 877e0a37b1c1b60e94b96b7a406da9d5c7e95790 Author: Stanislav A Date: Mon Dec 5 20:34:03 2022 +0300 fix adjust-* scriptlets logging tests commit 4403a03f2c29e0ef701d778aaa2cb67894e1e358 Author: Stanislav A Date: Mon Dec 5 20:26:57 2022 +0300 fix close-window scriptlet commit 4e62bb35c696ce5822201b45168990ee421c03db Author: Stanislav A Date: Mon Dec 5 20:11:29 2022 +0300 clear global props at debug-current-inline-script tests commit 0b13247284d8049e48e17f3fae60794cfb0a88f3 Author: Stanislav A Date: Mon Dec 5 19:55:52 2022 +0300 fix no-topics test commit 6d93cfd1f0e7998a4a3b1e664440686570fec548 Author: Stanislav A Date: Mon Dec 5 19:23:41 2022 +0300 remove alias check for prevent-bab scriptlet commit d9dfce60d894d3cc34a3ee24ca5110d521196183 Author: Stanislav A Date: Mon Dec 5 18:53:21 2022 +0300 fix set-constant imports and test cases commit 0f6adba99bf8ba9aaea53e57417734f57472d891 Author: Stanislav A Date: Mon Dec 5 16:41:31 2022 +0300 copy helper fix to set-local-storage-item commit 8d08b97b2e02f462ef9cd242eef914f64f2a6ff1 Author: Stanislav A Date: Mon Dec 5 16:38:27 2022 +0300 fix getLimitedStorageItemValue not being able to return empty string value commit 7313786bbd5b72ae42a9c87848cefb461c747c34 Author: Stanislav A Date: Mon Dec 5 16:12:54 2022 +0300 fix trusted-set-local-storage-item test ... and 15 more commits --- .eslintrc | 6 + dist/redirect-files/amazon-apstag.js | 10 +- dist/redirect-files/ati-smarttag.js | 10 +- dist/redirect-files/didomi-loader.js | 10 +- dist/redirect-files/fingerprintjs2.js | 10 +- dist/redirect-files/fingerprintjs3.js | 10 +- dist/redirect-files/gemius.js | 10 +- dist/redirect-files/google-analytics-ga.js | 10 +- dist/redirect-files/google-analytics.js | 10 +- dist/redirect-files/google-ima3.js | 10 +- .../googlesyndication-adsbygoogle.js | 10 +- dist/redirect-files/googletagservices-gpt.js | 10 +- dist/redirect-files/matomo.js | 10 +- dist/redirect-files/metrika-yandex-tag.js | 10 +- dist/redirect-files/metrika-yandex-watch.js | 10 +- dist/redirect-files/naver-wcslog.js | 10 +- dist/redirect-files/noeval.js | 19 +- dist/redirect-files/pardot-1.0.js | 10 +- dist/redirect-files/prebid-ads.js | 10 +- dist/redirect-files/prebid.js | 10 +- dist/redirect-files/prevent-bab.js | 14 +- dist/redirect-files/prevent-bab2.js | 10 +- dist/redirect-files/prevent-fab-3.2.0.js | 10 +- dist/redirect-files/prevent-popads-net.js | 10 +- .../scorecardresearch-beacon.js | 10 +- dist/redirect-files/set-popads-dummy.js | 10 +- dist/redirects.json | 59 +- dist/redirects.yml | 271 +- dist/scriptlets.corelibs.json | 112 +- dist/scriptlets.js | 7707 ++++------------- dist/umd/scriptlets.umd.js | 7707 ++++------------- package.json | 8 +- src/helpers/cookie-utils.js | 4 - src/helpers/hit.js | 14 +- src/helpers/storage-utils.js | 16 +- src/redirects/prevent-bab.js | 8 +- src/scriptlets/close-window.js | 3 +- src/scriptlets/json-prune.js | 13 +- src/scriptlets/noeval.js | 7 +- src/scriptlets/prevent-bab.js | 18 +- src/scriptlets/prevent-fetch.js | 7 +- src/scriptlets/prevent-window-open.js | 2 +- src/scriptlets/set-constant.js | 6 + src/scriptlets/set-local-storage-item.js | 8 +- src/scriptlets/set-session-storage-item.js | 9 +- .../trusted-replace-fetch-response.js | 5 +- .../trusted-replace-xhr-response.js | 2 +- src/scriptlets/trusted-set-cookie-reload.js | 16 +- src/scriptlets/trusted-set-cookie.js | 16 +- tests/index.js | 14 +- tests/redirects/noeval.test.js | 2 +- .../abort-current-inline-script.test.js | 3 +- .../abort-on-property-write.test.js | 4 +- tests/scriptlets/abort-on-stack-trace.test.js | 11 +- tests/scriptlets/adjust-setInterval.test.js | 2 +- tests/scriptlets/adjust-setTimeout.test.js | 2 +- .../debug-current-inline-script.test.js | 37 +- tests/scriptlets/index.test.js | 2 - tests/scriptlets/json-prune.test.js | 12 +- tests/scriptlets/log-addEventListener.test.js | 3 +- tests/scriptlets/log-eval.test.js | 4 +- tests/scriptlets/no-topics.test.js | 7 +- tests/scriptlets/noeval.test.js | 2 +- tests/scriptlets/nowebrtc.test.js | 2 +- tests/scriptlets/prevent-bab.test.js | 18 - tests/scriptlets/prevent-fetch.test.js | 53 +- .../prevent-requestAnimationFrame.test.js | 2 +- tests/scriptlets/prevent-setInterval.test.js | 2 +- tests/scriptlets/prevent-setTimeout.test.js | 6 +- tests/scriptlets/prevent-window-open.test.js | 4 +- tests/scriptlets/prevent-xhr.test.js | 2 +- tests/scriptlets/remove-attr.test.js | 14 +- tests/scriptlets/remove-class.test.js | 2 +- tests/scriptlets/set-constant.test.js | 17 +- tests/scriptlets/set-cookie-reload.test.js | 88 - .../trusted-replace-fetch-response.test.js | 49 +- .../trusted-replace-xhr-response.test.js | 42 +- .../trusted-set-cookie-reload.test.js | 116 - tests/scriptlets/trusted-set-cookie.test.js | 19 +- .../trusted-set-local-storage-item.test.js | 18 +- yarn.lock | 709 +- 81 files changed, 4689 insertions(+), 12866 deletions(-) delete mode 100644 tests/scriptlets/set-cookie-reload.test.js delete mode 100644 tests/scriptlets/trusted-set-cookie-reload.test.js diff --git a/.eslintrc b/.eslintrc index d997e1b5..4c108115 100644 --- a/.eslintrc +++ b/.eslintrc @@ -11,6 +11,12 @@ "qunit": true }, "rules": { + "max-len": [ + "error", + { + "code": 120 + } + ], "indent": ["error", 4, { "SwitchCase": 1}], "no-param-reassign": 0, "no-shadow": 0, diff --git a/dist/redirect-files/amazon-apstag.js b/dist/redirect-files/amazon-apstag.js index f8f63b3e..fa49dfcf 100644 --- a/dist/redirect-files/amazon-apstag.js +++ b/dist/redirect-files/amazon-apstag.js @@ -13,7 +13,7 @@ window.apstag = apstagWrapper; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -33,14 +33,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/ati-smarttag.js b/dist/redirect-files/ati-smarttag.js index 445fb960..0f88cb30 100644 --- a/dist/redirect-files/ati-smarttag.js +++ b/dist/redirect-files/ati-smarttag.js @@ -75,7 +75,7 @@ window.ATInternet = smartTagWrapper; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -95,14 +95,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/didomi-loader.js b/dist/redirect-files/didomi-loader.js index 940e14d5..0ba27726 100644 --- a/dist/redirect-files/didomi-loader.js +++ b/dist/redirect-files/didomi-loader.js @@ -112,7 +112,7 @@ } hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -132,14 +132,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/fingerprintjs2.js b/dist/redirect-files/fingerprintjs2.js index 7cbbc306..429611aa 100644 --- a/dist/redirect-files/fingerprintjs2.js +++ b/dist/redirect-files/fingerprintjs2.js @@ -21,7 +21,7 @@ window.Fingerprint2 = Fingerprint2; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -41,14 +41,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/fingerprintjs3.js b/dist/redirect-files/fingerprintjs3.js index 339857c1..49f1109c 100644 --- a/dist/redirect-files/fingerprintjs3.js +++ b/dist/redirect-files/fingerprintjs3.js @@ -22,7 +22,7 @@ window.FingerprintJS = new FingerprintJS; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -42,14 +42,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/gemius.js b/dist/redirect-files/gemius.js index 51dc632d..b5d2e3f2 100644 --- a/dist/redirect-files/gemius.js +++ b/dist/redirect-files/gemius.js @@ -11,7 +11,7 @@ window.GemiusPlayer = GemiusPlayer; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -31,14 +31,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/google-analytics-ga.js b/dist/redirect-files/google-analytics-ga.js index 9248937f..d8ff0bdf 100644 --- a/dist/redirect-files/google-analytics-ga.js +++ b/dist/redirect-files/google-analytics-ga.js @@ -73,7 +73,7 @@ window._gat = gat; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -93,14 +93,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/google-analytics.js b/dist/redirect-files/google-analytics.js index 3b94ad51..a2eaf31a 100644 --- a/dist/redirect-files/google-analytics.js +++ b/dist/redirect-files/google-analytics.js @@ -75,7 +75,7 @@ } hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -95,14 +95,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/google-ima3.js b/dist/redirect-files/google-ima3.js index d2e0a677..f762c580 100644 --- a/dist/redirect-files/google-ima3.js +++ b/dist/redirect-files/google-ima3.js @@ -545,7 +545,7 @@ window.google.ima = ima; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -565,14 +565,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/googlesyndication-adsbygoogle.js b/dist/redirect-files/googlesyndication-adsbygoogle.js index 425dbb33..f455f86a 100644 --- a/dist/redirect-files/googlesyndication-adsbygoogle.js +++ b/dist/redirect-files/googlesyndication-adsbygoogle.js @@ -53,7 +53,7 @@ hit(source); } } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -73,14 +73,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/googletagservices-gpt.js b/dist/redirect-files/googletagservices-gpt.js index 8c005edb..929d5616 100644 --- a/dist/redirect-files/googletagservices-gpt.js +++ b/dist/redirect-files/googletagservices-gpt.js @@ -205,7 +205,7 @@ } hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -225,14 +225,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/matomo.js b/dist/redirect-files/matomo.js index ecdb78af..9642ecee 100644 --- a/dist/redirect-files/matomo.js +++ b/dist/redirect-files/matomo.js @@ -18,7 +18,7 @@ window.Piwik = matomoWrapper; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -38,14 +38,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/metrika-yandex-tag.js b/dist/redirect-files/metrika-yandex-tag.js index 1dbf3c3c..917edded 100644 --- a/dist/redirect-files/metrika-yandex-tag.js +++ b/dist/redirect-files/metrika-yandex-tag.js @@ -68,7 +68,7 @@ } hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -88,14 +88,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/metrika-yandex-watch.js b/dist/redirect-files/metrika-yandex-watch.js index e62fbf40..a2871f18 100644 --- a/dist/redirect-files/metrika-yandex-watch.js +++ b/dist/redirect-files/metrika-yandex-watch.js @@ -52,7 +52,7 @@ } hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -72,14 +72,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/naver-wcslog.js b/dist/redirect-files/naver-wcslog.js index c449be8b..5c649ebe 100644 --- a/dist/redirect-files/naver-wcslog.js +++ b/dist/redirect-files/naver-wcslog.js @@ -7,7 +7,7 @@ }; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -27,14 +27,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/noeval.js b/dist/redirect-files/noeval.js index 3f298542..5d75ad3a 100644 --- a/dist/redirect-files/noeval.js +++ b/dist/redirect-files/noeval.js @@ -1,10 +1,11 @@ (function(source, args) { function noeval(source) { window.eval = function evalWrapper(s) { - hit(source, "AdGuard has prevented eval:\n".concat(s)); + hit(source); + logMessage(source, "AdGuard has prevented eval:\n".concat(s), true); }.bind(); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -24,14 +25,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -42,6 +35,12 @@ window.__debug(source); } } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + if (forced || source.verbose) { + console.log("".concat(source.name, ": ").concat(message)); + } + } const updatedArgs = args ? [].concat(source).concat(args) : [ source ]; try { noeval.apply(this, updatedArgs); diff --git a/dist/redirect-files/pardot-1.0.js b/dist/redirect-files/pardot-1.0.js index 135cf6ac..1ea1a97b 100644 --- a/dist/redirect-files/pardot-1.0.js +++ b/dist/redirect-files/pardot-1.0.js @@ -24,7 +24,7 @@ piTracker(); hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -44,14 +44,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/prebid-ads.js b/dist/redirect-files/prebid-ads.js index eb673bbc..ec9a7397 100644 --- a/dist/redirect-files/prebid-ads.js +++ b/dist/redirect-files/prebid-ads.js @@ -4,7 +4,7 @@ window.isAdBlockActive = false; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -24,14 +24,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/prebid.js b/dist/redirect-files/prebid.js index 31ab409b..f6ed6b1a 100644 --- a/dist/redirect-files/prebid.js +++ b/dist/redirect-files/prebid.js @@ -38,7 +38,7 @@ window.pbjs = pbjsWrapper; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -58,14 +58,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/prevent-bab.js b/dist/redirect-files/prevent-bab.js index 06eb7173..1ff360c6 100644 --- a/dist/redirect-files/prevent-bab.js +++ b/dist/redirect-files/prevent-bab.js @@ -1,5 +1,5 @@ (function(source, args) { - function preventBab(source) { + function preventBab$1(source) { var nativeSetTimeout = window.setTimeout; var babRegex = /\.bab_elementid.$/; var timeoutWrapper = function timeoutWrapper(callback) { @@ -50,7 +50,7 @@ }; window.eval = evalWrapper.bind(window); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -70,14 +70,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -90,7 +82,7 @@ } const updatedArgs = args ? [].concat(source).concat(args) : [ source ]; try { - preventBab.apply(this, updatedArgs); + preventBab$1.apply(this, updatedArgs); } catch (e) { console.log(e); } diff --git a/dist/redirect-files/prevent-bab2.js b/dist/redirect-files/prevent-bab2.js index c259f6f3..ec9827bf 100644 --- a/dist/redirect-files/prevent-bab2.js +++ b/dist/redirect-files/prevent-bab2.js @@ -17,7 +17,7 @@ window.nH7eXzOsG = 858; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -37,14 +37,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/prevent-fab-3.2.0.js b/dist/redirect-files/prevent-fab-3.2.0.js index 9666eb37..dea370bb 100644 --- a/dist/redirect-files/prevent-fab-3.2.0.js +++ b/dist/redirect-files/prevent-fab-3.2.0.js @@ -65,7 +65,7 @@ Object.defineProperty(window, "sniffAdBlock", getsetfab); } } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -85,14 +85,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/prevent-popads-net.js b/dist/redirect-files/prevent-popads-net.js index d5cb66e5..d1041256 100644 --- a/dist/redirect-files/prevent-popads-net.js +++ b/dist/redirect-files/prevent-popads-net.js @@ -35,7 +35,7 @@ function randomId() { return Math.random().toString(36).substr(2, 9); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -55,14 +55,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/scorecardresearch-beacon.js b/dist/redirect-files/scorecardresearch-beacon.js index 2d784439..42f96716 100644 --- a/dist/redirect-files/scorecardresearch-beacon.js +++ b/dist/redirect-files/scorecardresearch-beacon.js @@ -8,7 +8,7 @@ }; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -28,14 +28,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirect-files/set-popads-dummy.js b/dist/redirect-files/set-popads-dummy.js index 4e027d2c..ae437e9c 100644 --- a/dist/redirect-files/set-popads-dummy.js +++ b/dist/redirect-files/set-popads-dummy.js @@ -17,7 +17,7 @@ } }); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -37,14 +37,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/redirects.json b/dist/redirects.json index ebdc72c8..2c799de2 100644 --- a/dist/redirects.json +++ b/dist/redirects.json @@ -158,21 +158,21 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIGFwc3RhZ1dyYXBwZXI9e2ZldGNoQmlkczpmdW5jdGlvbihhLGIpeyJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKFtdKX0saW5pdDpub29wRnVuYyxzZXREaXNwbGF5Qmlkczpub29wRnVuYyx0YXJnZXRpbmdLZXlzOm5vb3BGdW5jfTt3aW5kb3cuYXBzdGFnPWFwc3RhZ1dyYXBwZXIsZnVuY3Rpb24oc291cmNlLG1lc3NhZ2Upe2lmKCEwPT09c291cmNlLnZlcmJvc2Upe3RyeXt2YXIgbG9nPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdHJhY2U9Y29uc29sZS50cmFjZS5iaW5kKGNvbnNvbGUpLHByZWZpeD1zb3VyY2UucnVsZVRleHR8fCIiO2lmKHNvdXJjZS5kb21haW5OYW1lKXt2YXIgcnVsZVN0YXJ0SW5kZXgsQUdfU0NSSVBUTEVUX01BUktFUj0iIyUjLy8iLFVCT19TQ1JJUFRMRVRfTUFSS0VSPSIjIytqcyI7c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik+LTE/cnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik6c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpKTt2YXIgcnVsZVBhcnQ9c291cmNlLnJ1bGVUZXh0LnNsaWNlKHJ1bGVTdGFydEluZGV4KTtwcmVmaXg9IiIuY29uY2F0KHNvdXJjZS5kb21haW5OYW1lKS5jb25jYXQocnVsZVBhcnQpfXZhciBMT0dfTUFSS0VSPSJsb2c6ICI7bWVzc2FnZSYmKC0xPT09bWVzc2FnZS5pbmRleE9mKExPR19NQVJLRVIpP2xvZygiIi5jb25jYXQocHJlZml4LCIgbWVzc2FnZTpcbiIpLmNvbmNhdChtZXNzYWdlKSk6bG9nKG1lc3NhZ2Uuc2xpY2UoTE9HX01BUktFUi5sZW5ndGgpKSksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6ImFtYXpvbi1hcHN0YWciLGFyZ3M6W119LFtdKTs=" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIGFwc3RhZ1dyYXBwZXI9e2ZldGNoQmlkczpmdW5jdGlvbihhLGIpeyJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKFtdKX0saW5pdDpub29wRnVuYyxzZXREaXNwbGF5Qmlkczpub29wRnVuYyx0YXJnZXRpbmdLZXlzOm5vb3BGdW5jfTt3aW5kb3cuYXBzdGFnPWFwc3RhZ1dyYXBwZXIsZnVuY3Rpb24oc291cmNlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX1sb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIHN0YXJ0IikpLHRyYWNlJiZ0cmFjZSgpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2UgZW5kIikpfWNhdGNoKGUpe30iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9fZGVidWcmJndpbmRvdy5fX2RlYnVnKHNvdXJjZSl9fShzb3VyY2UpfSkuYXBwbHkodGhpcyx1cGRhdGVkQXJncyl9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9fSh7bmFtZToiYW1hem9uLWFwc3RhZyIsYXJnczpbXX0sW10pOw==" }, { "title": "ati-smarttag", "aliases": [], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIHNldE5vb3BGdW5jV3JhcHBlcj17c2V0Om5vb3BGdW5jfSxzZW5kTm9vcEZ1bmNXcmFwcGVyPXtzZW5kOm5vb3BGdW5jfSx0YWc9ZnVuY3Rpb24oKXt9O3RhZy5wcm90b3R5cGU9e3NldENvbmZpZzpub29wRnVuYyxzZXRQYXJhbTpub29wRnVuYyxkaXNwYXRjaDpub29wRnVuYyxjdXN0b21WYXJzOnNldE5vb3BGdW5jV3JhcHBlcixwdWJsaXNoZXI6c2V0Tm9vcEZ1bmNXcmFwcGVyLG9yZGVyOnNldE5vb3BGdW5jV3JhcHBlcixjbGljazpzZW5kTm9vcEZ1bmNXcmFwcGVyLGNsaWNrTGlzdGVuZXI6c2VuZE5vb3BGdW5jV3JhcHBlcixpbnRlcm5hbFNlYXJjaDp7c2V0Om5vb3BGdW5jLHNlbmQ6bm9vcEZ1bmN9LGVjb21tZXJjZTp7ZGlzcGxheUNhcnQ6e3Byb2R1Y3RzOnNldE5vb3BGdW5jV3JhcHBlcixjYXJ0OnNldE5vb3BGdW5jV3JhcHBlcn0sdXBkYXRlQ2FydDp7Y2FydDpzZXROb29wRnVuY1dyYXBwZXJ9LGRpc3BsYXlQcm9kdWN0Ontwcm9kdWN0czpzZXROb29wRnVuY1dyYXBwZXJ9LGRpc3BsYXlQYWdlUHJvZHVjdDp7cHJvZHVjdHM6c2V0Tm9vcEZ1bmNXcmFwcGVyfSxhZGRQcm9kdWN0Ontwcm9kdWN0czpzZXROb29wRnVuY1dyYXBwZXJ9LHJlbW92ZVByb2R1Y3Q6e3Byb2R1Y3RzOnNldE5vb3BGdW5jV3JhcHBlcn19LGlkZW50aWZpZWRWaXNpdG9yOnt1bnNldDpub29wRnVuY30scGFnZTp7c2V0Om5vb3BGdW5jLHNlbmQ6bm9vcEZ1bmN9LHNlbGZQcm9tb3Rpb246e2FkZDpub29wRnVuYyxzZW5kOm5vb3BGdW5jfSxwcml2YWN5OntzZXRWaXNpdG9yTW9kZTpub29wRnVuYyxnZXRWaXNpdG9yTW9kZTpub29wRnVuYyxoaXQ6bm9vcEZ1bmN9LHJpY2hNZWRpYTp7YWRkOm5vb3BGdW5jLHNlbmQ6bm9vcEZ1bmMscmVtb3ZlOm5vb3BGdW5jLHJlbW92ZUFsbDpub29wRnVuY319O3ZhciBzbWFydFRhZ1dyYXBwZXI9e1RyYWNrZXI6e1RhZzpmdW5jdGlvbigpe3JldHVybiBuZXcgdGFnfX19O3dpbmRvdy5BVEludGVybmV0PXNtYXJ0VGFnV3JhcHBlcixmdW5jdGlvbihzb3VyY2UsbWVzc2FnZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9dmFyIExPR19NQVJLRVI9ImxvZzogIjttZXNzYWdlJiYoLTE9PT1tZXNzYWdlLmluZGV4T2YoTE9HX01BUktFUik/bG9nKCIiLmNvbmNhdChwcmVmaXgsIiBtZXNzYWdlOlxuIikuY29uY2F0KG1lc3NhZ2UpKTpsb2cobWVzc2FnZS5zbGljZShMT0dfTUFSS0VSLmxlbmd0aCkpKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIHN0YXJ0IikpLHRyYWNlJiZ0cmFjZSgpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2UgZW5kIikpfWNhdGNoKGUpe30iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9fZGVidWcmJndpbmRvdy5fX2RlYnVnKHNvdXJjZSl9fShzb3VyY2UpfSkuYXBwbHkodGhpcyx1cGRhdGVkQXJncyl9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9fSh7bmFtZToiYXRpLXNtYXJ0dGFnIixhcmdzOltdfSxbXSk7" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIHNldE5vb3BGdW5jV3JhcHBlcj17c2V0Om5vb3BGdW5jfSxzZW5kTm9vcEZ1bmNXcmFwcGVyPXtzZW5kOm5vb3BGdW5jfSx0YWc9ZnVuY3Rpb24oKXt9O3RhZy5wcm90b3R5cGU9e3NldENvbmZpZzpub29wRnVuYyxzZXRQYXJhbTpub29wRnVuYyxkaXNwYXRjaDpub29wRnVuYyxjdXN0b21WYXJzOnNldE5vb3BGdW5jV3JhcHBlcixwdWJsaXNoZXI6c2V0Tm9vcEZ1bmNXcmFwcGVyLG9yZGVyOnNldE5vb3BGdW5jV3JhcHBlcixjbGljazpzZW5kTm9vcEZ1bmNXcmFwcGVyLGNsaWNrTGlzdGVuZXI6c2VuZE5vb3BGdW5jV3JhcHBlcixpbnRlcm5hbFNlYXJjaDp7c2V0Om5vb3BGdW5jLHNlbmQ6bm9vcEZ1bmN9LGVjb21tZXJjZTp7ZGlzcGxheUNhcnQ6e3Byb2R1Y3RzOnNldE5vb3BGdW5jV3JhcHBlcixjYXJ0OnNldE5vb3BGdW5jV3JhcHBlcn0sdXBkYXRlQ2FydDp7Y2FydDpzZXROb29wRnVuY1dyYXBwZXJ9LGRpc3BsYXlQcm9kdWN0Ontwcm9kdWN0czpzZXROb29wRnVuY1dyYXBwZXJ9LGRpc3BsYXlQYWdlUHJvZHVjdDp7cHJvZHVjdHM6c2V0Tm9vcEZ1bmNXcmFwcGVyfSxhZGRQcm9kdWN0Ontwcm9kdWN0czpzZXROb29wRnVuY1dyYXBwZXJ9LHJlbW92ZVByb2R1Y3Q6e3Byb2R1Y3RzOnNldE5vb3BGdW5jV3JhcHBlcn19LGlkZW50aWZpZWRWaXNpdG9yOnt1bnNldDpub29wRnVuY30scGFnZTp7c2V0Om5vb3BGdW5jLHNlbmQ6bm9vcEZ1bmN9LHNlbGZQcm9tb3Rpb246e2FkZDpub29wRnVuYyxzZW5kOm5vb3BGdW5jfSxwcml2YWN5OntzZXRWaXNpdG9yTW9kZTpub29wRnVuYyxnZXRWaXNpdG9yTW9kZTpub29wRnVuYyxoaXQ6bm9vcEZ1bmN9LHJpY2hNZWRpYTp7YWRkOm5vb3BGdW5jLHNlbmQ6bm9vcEZ1bmMscmVtb3ZlOm5vb3BGdW5jLHJlbW92ZUFsbDpub29wRnVuY319O3ZhciBzbWFydFRhZ1dyYXBwZXI9e1RyYWNrZXI6e1RhZzpmdW5jdGlvbigpe3JldHVybiBuZXcgdGFnfX19O3dpbmRvdy5BVEludGVybmV0PXNtYXJ0VGFnV3JhcHBlcixmdW5jdGlvbihzb3VyY2Upe2lmKCEwPT09c291cmNlLnZlcmJvc2Upe3RyeXt2YXIgbG9nPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdHJhY2U9Y29uc29sZS50cmFjZS5iaW5kKGNvbnNvbGUpLHByZWZpeD1zb3VyY2UucnVsZVRleHR8fCIiO2lmKHNvdXJjZS5kb21haW5OYW1lKXt2YXIgcnVsZVN0YXJ0SW5kZXgsQUdfU0NSSVBUTEVUX01BUktFUj0iIyUjLy8iLFVCT19TQ1JJUFRMRVRfTUFSS0VSPSIjIytqcyI7c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik+LTE/cnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik6c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpKTt2YXIgcnVsZVBhcnQ9c291cmNlLnJ1bGVUZXh0LnNsaWNlKHJ1bGVTdGFydEluZGV4KTtwcmVmaXg9IiIuY29uY2F0KHNvdXJjZS5kb21haW5OYW1lKS5jb25jYXQocnVsZVBhcnQpfWxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJhdGktc21hcnR0YWciLGFyZ3M6W119LFtdKTs=" }, { "title": "didomi-loader", "aliases": [], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31mdW5jdGlvbiBub29wQXJyYXkoKXtyZXR1cm5bXX1mdW5jdGlvbiB0cnVlRnVuYygpe3JldHVybiEwfWZ1bmN0aW9uIGZhbHNlRnVuYygpe3JldHVybiExfWNvbnN0IHVwZGF0ZWRBcmdzPWFyZ3M/W10uY29uY2F0KHNvdXJjZSkuY29uY2F0KGFyZ3MpOltzb3VyY2VdO3RyeXsoZnVuY3Rpb24oc291cmNlKXtmdW5jdGlvbiBVc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvclN1YnNjcmliZSgpe31mdW5jdGlvbiBVc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvcigpe31Vc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvclN1YnNjcmliZS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBVc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvclN1YnNjcmliZX0sVXNlckNvbnNlbnRTdGF0dXNGb3JWZW5kb3JTdWJzY3JpYmUucHJvdG90eXBlLnN1YnNjcmliZT1ub29wRnVuYyxVc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvci5wcm90b3R5cGUuZmlyc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFVzZXJDb25zZW50U3RhdHVzRm9yVmVuZG9yU3Vic2NyaWJlfSxVc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvci5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBVc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvclN1YnNjcmliZX0sVXNlckNvbnNlbnRTdGF0dXNGb3JWZW5kb3IucHJvdG90eXBlLnN1YnNjcmliZT1ub29wRnVuYzt2YXIgRGlkb21pV3JhcHBlcj17aXNDb25zZW50UmVxdWlyZWQ6ZmFsc2VGdW5jLGdldFVzZXJDb25zZW50U3RhdHVzRm9yUHVycG9zZTp0cnVlRnVuYyxnZXRVc2VyQ29uc2VudFN0YXR1czp0cnVlRnVuYyxnZXRVc2VyU3RhdHVzOm5vb3BGdW5jLGdldFJlcXVpcmVkUHVycG9zZXM6bm9vcEFycmF5LGdldFVzZXJDb25zZW50U3RhdHVzRm9yVmVuZG9yOnRydWVGdW5jLFB1cnBvc2VzOntDb29raWVzOiJjb29raWVzIn0sbm90aWNlOntjb25maWd1cmU6bm9vcEZ1bmMsaGlkZTpub29wRnVuYyxpc1Zpc2libGU6ZmFsc2VGdW5jLHNob3c6bm9vcEZ1bmMsc2hvd0RhdGFQcm9jZXNzaW5nOnRydWVGdW5jfSxpc1VzZXJDb25zZW50U3RhdHVzUGFydGlhbDpmYWxzZUZ1bmMsb246ZnVuY3Rpb24oKXtyZXR1cm57YWN0aW9uczp7fSxlbWl0dGVyOnt9LHNlcnZpY2VzOnt9LHN0b3JlOnt9fX0sc2hvdWxkQ29uc2VudEJlQ29sbGVjdGVkOmZhbHNlRnVuYyxnZXRVc2VyQ29uc2VudFN0YXR1c0ZvckFsbDpub29wRnVuYyxnZXRPYnNlcnZhYmxlT25Vc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvcjpmdW5jdGlvbigpe3JldHVybiBuZXcgVXNlckNvbnNlbnRTdGF0dXNGb3JWZW5kb3J9fTt3aW5kb3cuRGlkb21pPURpZG9taVdyYXBwZXIsd2luZG93LmRpZG9taVN0YXRlPXtkaWRvbWlFeHBlcmltZW50SWQ6IiIsZGlkb21pRXhwZXJpbWVudFVzZXJHcm91cDoiIixkaWRvbWlHRFBSQXBwbGllczoxLGRpZG9taUlBQkNvbnNlbnQ6IiIsZGlkb21pUHVycG9zZXNDb25zZW50OiIiLGRpZG9taVB1cnBvc2VzQ29uc2VudERlbmllZDoiIixkaWRvbWlQdXJwb3Nlc0NvbnNlbnRVbmtub3duOiIiLGRpZG9taVZlbmRvcnNDb25zZW50OiIiLGRpZG9taVZlbmRvcnNDb25zZW50RGVuaWVkOiIiLGRpZG9taVZlbmRvcnNDb25zZW50VW5rbm93bjoiIixkaWRvbWlWZW5kb3JzUmF3Q29uc2VudDoiIixkaWRvbWlWZW5kb3JzUmF3Q29uc2VudERlbmllZDoiIixkaWRvbWlWZW5kb3JzUmF3Q29uc2VudFVua25vd246IiJ9O3ZhciB0Y0RhdGE9e2V2ZW50U3RhdHVzOiJ0Y2xvYWRlZCIsZ2RwckFwcGxpZXM6ITEsbGlzdGVuZXJJZDpub29wRnVuYyx2ZW5kb3I6e2NvbnNlbnRzOltdfSxwdXJwb3NlOntjb25zZW50czpbXX19O3dpbmRvdy5fX3RjZmFwaT1mdW5jdGlvbihjb21tYW5kLHZlcnNpb24sY2FsbGJhY2speyJmdW5jdGlvbiI9PXR5cGVvZiBjYWxsYmFjayYmInJlbW92ZUV2ZW50TGlzdGVuZXIiIT09Y29tbWFuZCYmY2FsbGJhY2sodGNEYXRhLCEwKX07dmFyIGRpZG9taUV2ZW50TGlzdGVuZXJzV3JhcHBlcj17c3R1YjohMCxwdXNoOm5vb3BGdW5jfTt3aW5kb3cuZGlkb21pRXZlbnRMaXN0ZW5lcnM9ZGlkb21pRXZlbnRMaXN0ZW5lcnNXcmFwcGVyO3ZhciBkaWRvbWlPblJlYWR5V3JhcHBlcj17c3R1YjohMCxwdXNoOmZ1bmN0aW9uKGFyZyl7ImZ1bmN0aW9uIj09dHlwZW9mIGFyZyYmKCJjb21wbGV0ZSIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGFyZyh3aW5kb3cuRGlkb21pKSl9KSk6c2V0VGltZW91dChhcmcod2luZG93LkRpZG9taSkpKX19O3dpbmRvdy5kaWRvbWlPblJlYWR5PXdpbmRvdy5kaWRvbWlPblJlYWR5fHxkaWRvbWlPblJlYWR5V3JhcHBlcixBcnJheS5pc0FycmF5KHdpbmRvdy5kaWRvbWlPblJlYWR5KSYmd2luZG93LmRpZG9taU9uUmVhZHkuZm9yRWFjaCgoZnVuY3Rpb24oYXJnKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYXJnKXRyeXtzZXRUaW1lb3V0KGFyZyh3aW5kb3cuRGlkb21pKSl9Y2F0Y2goZSl7fX0pKSxmdW5jdGlvbihzb3VyY2UsbWVzc2FnZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9dmFyIExPR19NQVJLRVI9ImxvZzogIjttZXNzYWdlJiYoLTE9PT1tZXNzYWdlLmluZGV4T2YoTE9HX01BUktFUik/bG9nKCIiLmNvbmNhdChwcmVmaXgsIiBtZXNzYWdlOlxuIikuY29uY2F0KG1lc3NhZ2UpKTpsb2cobWVzc2FnZS5zbGljZShMT0dfTUFSS0VSLmxlbmd0aCkpKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIHN0YXJ0IikpLHRyYWNlJiZ0cmFjZSgpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2UgZW5kIikpfWNhdGNoKGUpe30iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9fZGVidWcmJndpbmRvdy5fX2RlYnVnKHNvdXJjZSl9fShzb3VyY2UpfSkuYXBwbHkodGhpcyx1cGRhdGVkQXJncyl9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9fSh7bmFtZToiZGlkb21pLWxvYWRlciIsYXJnczpbXX0sW10pOw==" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31mdW5jdGlvbiBub29wQXJyYXkoKXtyZXR1cm5bXX1mdW5jdGlvbiB0cnVlRnVuYygpe3JldHVybiEwfWZ1bmN0aW9uIGZhbHNlRnVuYygpe3JldHVybiExfWNvbnN0IHVwZGF0ZWRBcmdzPWFyZ3M/W10uY29uY2F0KHNvdXJjZSkuY29uY2F0KGFyZ3MpOltzb3VyY2VdO3RyeXsoZnVuY3Rpb24oc291cmNlKXtmdW5jdGlvbiBVc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvclN1YnNjcmliZSgpe31mdW5jdGlvbiBVc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvcigpe31Vc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvclN1YnNjcmliZS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBVc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvclN1YnNjcmliZX0sVXNlckNvbnNlbnRTdGF0dXNGb3JWZW5kb3JTdWJzY3JpYmUucHJvdG90eXBlLnN1YnNjcmliZT1ub29wRnVuYyxVc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvci5wcm90b3R5cGUuZmlyc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFVzZXJDb25zZW50U3RhdHVzRm9yVmVuZG9yU3Vic2NyaWJlfSxVc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvci5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBVc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvclN1YnNjcmliZX0sVXNlckNvbnNlbnRTdGF0dXNGb3JWZW5kb3IucHJvdG90eXBlLnN1YnNjcmliZT1ub29wRnVuYzt2YXIgRGlkb21pV3JhcHBlcj17aXNDb25zZW50UmVxdWlyZWQ6ZmFsc2VGdW5jLGdldFVzZXJDb25zZW50U3RhdHVzRm9yUHVycG9zZTp0cnVlRnVuYyxnZXRVc2VyQ29uc2VudFN0YXR1czp0cnVlRnVuYyxnZXRVc2VyU3RhdHVzOm5vb3BGdW5jLGdldFJlcXVpcmVkUHVycG9zZXM6bm9vcEFycmF5LGdldFVzZXJDb25zZW50U3RhdHVzRm9yVmVuZG9yOnRydWVGdW5jLFB1cnBvc2VzOntDb29raWVzOiJjb29raWVzIn0sbm90aWNlOntjb25maWd1cmU6bm9vcEZ1bmMsaGlkZTpub29wRnVuYyxpc1Zpc2libGU6ZmFsc2VGdW5jLHNob3c6bm9vcEZ1bmMsc2hvd0RhdGFQcm9jZXNzaW5nOnRydWVGdW5jfSxpc1VzZXJDb25zZW50U3RhdHVzUGFydGlhbDpmYWxzZUZ1bmMsb246ZnVuY3Rpb24oKXtyZXR1cm57YWN0aW9uczp7fSxlbWl0dGVyOnt9LHNlcnZpY2VzOnt9LHN0b3JlOnt9fX0sc2hvdWxkQ29uc2VudEJlQ29sbGVjdGVkOmZhbHNlRnVuYyxnZXRVc2VyQ29uc2VudFN0YXR1c0ZvckFsbDpub29wRnVuYyxnZXRPYnNlcnZhYmxlT25Vc2VyQ29uc2VudFN0YXR1c0ZvclZlbmRvcjpmdW5jdGlvbigpe3JldHVybiBuZXcgVXNlckNvbnNlbnRTdGF0dXNGb3JWZW5kb3J9fTt3aW5kb3cuRGlkb21pPURpZG9taVdyYXBwZXIsd2luZG93LmRpZG9taVN0YXRlPXtkaWRvbWlFeHBlcmltZW50SWQ6IiIsZGlkb21pRXhwZXJpbWVudFVzZXJHcm91cDoiIixkaWRvbWlHRFBSQXBwbGllczoxLGRpZG9taUlBQkNvbnNlbnQ6IiIsZGlkb21pUHVycG9zZXNDb25zZW50OiIiLGRpZG9taVB1cnBvc2VzQ29uc2VudERlbmllZDoiIixkaWRvbWlQdXJwb3Nlc0NvbnNlbnRVbmtub3duOiIiLGRpZG9taVZlbmRvcnNDb25zZW50OiIiLGRpZG9taVZlbmRvcnNDb25zZW50RGVuaWVkOiIiLGRpZG9taVZlbmRvcnNDb25zZW50VW5rbm93bjoiIixkaWRvbWlWZW5kb3JzUmF3Q29uc2VudDoiIixkaWRvbWlWZW5kb3JzUmF3Q29uc2VudERlbmllZDoiIixkaWRvbWlWZW5kb3JzUmF3Q29uc2VudFVua25vd246IiJ9O3ZhciB0Y0RhdGE9e2V2ZW50U3RhdHVzOiJ0Y2xvYWRlZCIsZ2RwckFwcGxpZXM6ITEsbGlzdGVuZXJJZDpub29wRnVuYyx2ZW5kb3I6e2NvbnNlbnRzOltdfSxwdXJwb3NlOntjb25zZW50czpbXX19O3dpbmRvdy5fX3RjZmFwaT1mdW5jdGlvbihjb21tYW5kLHZlcnNpb24sY2FsbGJhY2speyJmdW5jdGlvbiI9PXR5cGVvZiBjYWxsYmFjayYmInJlbW92ZUV2ZW50TGlzdGVuZXIiIT09Y29tbWFuZCYmY2FsbGJhY2sodGNEYXRhLCEwKX07dmFyIGRpZG9taUV2ZW50TGlzdGVuZXJzV3JhcHBlcj17c3R1YjohMCxwdXNoOm5vb3BGdW5jfTt3aW5kb3cuZGlkb21pRXZlbnRMaXN0ZW5lcnM9ZGlkb21pRXZlbnRMaXN0ZW5lcnNXcmFwcGVyO3ZhciBkaWRvbWlPblJlYWR5V3JhcHBlcj17c3R1YjohMCxwdXNoOmZ1bmN0aW9uKGFyZyl7ImZ1bmN0aW9uIj09dHlwZW9mIGFyZyYmKCJjb21wbGV0ZSIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGFyZyh3aW5kb3cuRGlkb21pKSl9KSk6c2V0VGltZW91dChhcmcod2luZG93LkRpZG9taSkpKX19O3dpbmRvdy5kaWRvbWlPblJlYWR5PXdpbmRvdy5kaWRvbWlPblJlYWR5fHxkaWRvbWlPblJlYWR5V3JhcHBlcixBcnJheS5pc0FycmF5KHdpbmRvdy5kaWRvbWlPblJlYWR5KSYmd2luZG93LmRpZG9taU9uUmVhZHkuZm9yRWFjaCgoZnVuY3Rpb24oYXJnKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYXJnKXRyeXtzZXRUaW1lb3V0KGFyZyh3aW5kb3cuRGlkb21pKSl9Y2F0Y2goZSl7fX0pKSxmdW5jdGlvbihzb3VyY2Upe2lmKCEwPT09c291cmNlLnZlcmJvc2Upe3RyeXt2YXIgbG9nPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdHJhY2U9Y29uc29sZS50cmFjZS5iaW5kKGNvbnNvbGUpLHByZWZpeD1zb3VyY2UucnVsZVRleHR8fCIiO2lmKHNvdXJjZS5kb21haW5OYW1lKXt2YXIgcnVsZVN0YXJ0SW5kZXgsQUdfU0NSSVBUTEVUX01BUktFUj0iIyUjLy8iLFVCT19TQ1JJUFRMRVRfTUFSS0VSPSIjIytqcyI7c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik+LTE/cnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik6c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpKTt2YXIgcnVsZVBhcnQ9c291cmNlLnJ1bGVUZXh0LnNsaWNlKHJ1bGVTdGFydEluZGV4KTtwcmVmaXg9IiIuY29uY2F0KHNvdXJjZS5kb21haW5OYW1lKS5jb25jYXQocnVsZVBhcnQpfWxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJkaWRvbWktbG9hZGVyIixhcmdzOltdfSxbXSk7" }, { "title": "fingerprintjs2", @@ -182,7 +182,7 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7Zm9yKHZhciBicm93c2VySWQ9IiIsaT0wO2k8ODtpKz0xKWJyb3dzZXJJZCs9KDY1NTM2Kk1hdGgucmFuZG9tKCkrNDA5NikudG9TdHJpbmcoMTYpLnNsaWNlKC00KTt2YXIgRmluZ2VycHJpbnQyPWZ1bmN0aW9uKCl7fTtGaW5nZXJwcmludDIucHJvdG90eXBlPXtnZXQ6RmluZ2VycHJpbnQyLmdldD1mdW5jdGlvbihvcHRpb25zLGNhbGxiYWNrKXtjYWxsYmFja3x8KGNhbGxiYWNrPW9wdGlvbnMpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7Y2FsbGJhY2smJmNhbGxiYWNrKGJyb3dzZXJJZCxbXSl9KSwxKX19LHdpbmRvdy5GaW5nZXJwcmludDI9RmluZ2VycHJpbnQyLGZ1bmN0aW9uKHNvdXJjZSxtZXNzYWdlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX12YXIgTE9HX01BUktFUj0ibG9nOiAiO21lc3NhZ2UmJigtMT09PW1lc3NhZ2UuaW5kZXhPZihMT0dfTUFSS0VSKT9sb2coIiIuY29uY2F0KHByZWZpeCwiIG1lc3NhZ2U6XG4iKS5jb25jYXQobWVzc2FnZSkpOmxvZyhtZXNzYWdlLnNsaWNlKExPR19NQVJLRVIubGVuZ3RoKSkpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJmaW5nZXJwcmludGpzMiIsYXJnczpbXX0sW10pOw==" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7Zm9yKHZhciBicm93c2VySWQ9IiIsaT0wO2k8ODtpKz0xKWJyb3dzZXJJZCs9KDY1NTM2Kk1hdGgucmFuZG9tKCkrNDA5NikudG9TdHJpbmcoMTYpLnNsaWNlKC00KTt2YXIgRmluZ2VycHJpbnQyPWZ1bmN0aW9uKCl7fTtGaW5nZXJwcmludDIucHJvdG90eXBlPXtnZXQ6RmluZ2VycHJpbnQyLmdldD1mdW5jdGlvbihvcHRpb25zLGNhbGxiYWNrKXtjYWxsYmFja3x8KGNhbGxiYWNrPW9wdGlvbnMpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7Y2FsbGJhY2smJmNhbGxiYWNrKGJyb3dzZXJJZCxbXSl9KSwxKX19LHdpbmRvdy5GaW5nZXJwcmludDI9RmluZ2VycHJpbnQyLGZ1bmN0aW9uKHNvdXJjZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6ImZpbmdlcnByaW50anMyIixhcmdzOltdfSxbXSk7" }, { "title": "fingerprintjs3", @@ -192,14 +192,14 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wU3RyKCl7cmV0dXJuIiJ9Y29uc3QgdXBkYXRlZEFyZ3M9YXJncz9bXS5jb25jYXQoc291cmNlKS5jb25jYXQoYXJncyk6W3NvdXJjZV07dHJ5eyhmdW5jdGlvbihzb3VyY2Upe3ZhciB2aXNpdG9ySWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGlkPSIiLGk9MDtpPDg7aSs9MSlpZCs9KDY1NTM2Kk1hdGgucmFuZG9tKCkrNDA5NikudG9TdHJpbmcoMTYpLnNsaWNlKC00KTtyZXR1cm4gaWR9KCksRmluZ2VycHJpbnRKUz1mdW5jdGlvbigpe307RmluZ2VycHJpbnRKUy5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBGaW5nZXJwcmludEpTKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh7dmlzaXRvcklkOnZpc2l0b3JJZH0pfSxoYXNoQ29tcG9uZW50czpub29wU3RyfSx3aW5kb3cuRmluZ2VycHJpbnRKUz1uZXcgRmluZ2VycHJpbnRKUyxmdW5jdGlvbihzb3VyY2UsbWVzc2FnZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9dmFyIExPR19NQVJLRVI9ImxvZzogIjttZXNzYWdlJiYoLTE9PT1tZXNzYWdlLmluZGV4T2YoTE9HX01BUktFUik/bG9nKCIiLmNvbmNhdChwcmVmaXgsIiBtZXNzYWdlOlxuIikuY29uY2F0KG1lc3NhZ2UpKTpsb2cobWVzc2FnZS5zbGljZShMT0dfTUFSS0VSLmxlbmd0aCkpKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIHN0YXJ0IikpLHRyYWNlJiZ0cmFjZSgpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2UgZW5kIikpfWNhdGNoKGUpe30iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9fZGVidWcmJndpbmRvdy5fX2RlYnVnKHNvdXJjZSl9fShzb3VyY2UpfSkuYXBwbHkodGhpcyx1cGRhdGVkQXJncyl9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9fSh7bmFtZToiZmluZ2VycHJpbnRqczMiLGFyZ3M6W119LFtdKTs=" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wU3RyKCl7cmV0dXJuIiJ9Y29uc3QgdXBkYXRlZEFyZ3M9YXJncz9bXS5jb25jYXQoc291cmNlKS5jb25jYXQoYXJncyk6W3NvdXJjZV07dHJ5eyhmdW5jdGlvbihzb3VyY2Upe3ZhciB2aXNpdG9ySWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGlkPSIiLGk9MDtpPDg7aSs9MSlpZCs9KDY1NTM2Kk1hdGgucmFuZG9tKCkrNDA5NikudG9TdHJpbmcoMTYpLnNsaWNlKC00KTtyZXR1cm4gaWR9KCksRmluZ2VycHJpbnRKUz1mdW5jdGlvbigpe307RmluZ2VycHJpbnRKUy5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBGaW5nZXJwcmludEpTKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh7dmlzaXRvcklkOnZpc2l0b3JJZH0pfSxoYXNoQ29tcG9uZW50czpub29wU3RyfSx3aW5kb3cuRmluZ2VycHJpbnRKUz1uZXcgRmluZ2VycHJpbnRKUyxmdW5jdGlvbihzb3VyY2Upe2lmKCEwPT09c291cmNlLnZlcmJvc2Upe3RyeXt2YXIgbG9nPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdHJhY2U9Y29uc29sZS50cmFjZS5iaW5kKGNvbnNvbGUpLHByZWZpeD1zb3VyY2UucnVsZVRleHR8fCIiO2lmKHNvdXJjZS5kb21haW5OYW1lKXt2YXIgcnVsZVN0YXJ0SW5kZXgsQUdfU0NSSVBUTEVUX01BUktFUj0iIyUjLy8iLFVCT19TQ1JJUFRMRVRfTUFSS0VSPSIjIytqcyI7c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik+LTE/cnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik6c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpKTt2YXIgcnVsZVBhcnQ9c291cmNlLnJ1bGVUZXh0LnNsaWNlKHJ1bGVTdGFydEluZGV4KTtwcmVmaXg9IiIuY29uY2F0KHNvdXJjZS5kb21haW5OYW1lKS5jb25jYXQocnVsZVBhcnQpfWxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJmaW5nZXJwcmludGpzMyIsYXJnczpbXX0sW10pOw==" }, { "title": "gemius", "aliases": [], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIEdlbWl1c1BsYXllcj1mdW5jdGlvbigpe307R2VtaXVzUGxheWVyLnByb3RvdHlwZT17c2V0VmlkZW9PYmplY3Q6bm9vcEZ1bmMsbmV3UHJvZ3JhbTpub29wRnVuYyxwcm9ncmFtRXZlbnQ6bm9vcEZ1bmMsbmV3QWQ6bm9vcEZ1bmMsYWRFdmVudDpub29wRnVuY30sd2luZG93LkdlbWl1c1BsYXllcj1HZW1pdXNQbGF5ZXIsZnVuY3Rpb24oc291cmNlLG1lc3NhZ2Upe2lmKCEwPT09c291cmNlLnZlcmJvc2Upe3RyeXt2YXIgbG9nPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdHJhY2U9Y29uc29sZS50cmFjZS5iaW5kKGNvbnNvbGUpLHByZWZpeD1zb3VyY2UucnVsZVRleHR8fCIiO2lmKHNvdXJjZS5kb21haW5OYW1lKXt2YXIgcnVsZVN0YXJ0SW5kZXgsQUdfU0NSSVBUTEVUX01BUktFUj0iIyUjLy8iLFVCT19TQ1JJUFRMRVRfTUFSS0VSPSIjIytqcyI7c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik+LTE/cnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik6c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpKTt2YXIgcnVsZVBhcnQ9c291cmNlLnJ1bGVUZXh0LnNsaWNlKHJ1bGVTdGFydEluZGV4KTtwcmVmaXg9IiIuY29uY2F0KHNvdXJjZS5kb21haW5OYW1lKS5jb25jYXQocnVsZVBhcnQpfXZhciBMT0dfTUFSS0VSPSJsb2c6ICI7bWVzc2FnZSYmKC0xPT09bWVzc2FnZS5pbmRleE9mKExPR19NQVJLRVIpP2xvZygiIi5jb25jYXQocHJlZml4LCIgbWVzc2FnZTpcbiIpLmNvbmNhdChtZXNzYWdlKSk6bG9nKG1lc3NhZ2Uuc2xpY2UoTE9HX01BUktFUi5sZW5ndGgpKSksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6ImdlbWl1cyIsYXJnczpbXX0sW10pOw==" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIEdlbWl1c1BsYXllcj1mdW5jdGlvbigpe307R2VtaXVzUGxheWVyLnByb3RvdHlwZT17c2V0VmlkZW9PYmplY3Q6bm9vcEZ1bmMsbmV3UHJvZ3JhbTpub29wRnVuYyxwcm9ncmFtRXZlbnQ6bm9vcEZ1bmMsbmV3QWQ6bm9vcEZ1bmMsYWRFdmVudDpub29wRnVuY30sd2luZG93LkdlbWl1c1BsYXllcj1HZW1pdXNQbGF5ZXIsZnVuY3Rpb24oc291cmNlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX1sb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIHN0YXJ0IikpLHRyYWNlJiZ0cmFjZSgpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2UgZW5kIikpfWNhdGNoKGUpe30iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9fZGVidWcmJndpbmRvdy5fX2RlYnVnKHNvdXJjZSl9fShzb3VyY2UpfSkuYXBwbHkodGhpcyx1cGRhdGVkQXJncyl9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9fSh7bmFtZToiZ2VtaXVzIixhcmdzOltdfSxbXSk7" }, { "title": "google-analytics-ga", @@ -209,7 +209,7 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7ZnVuY3Rpb24gR2FxKCl7fUdhcS5wcm90b3R5cGUuTmE9bm9vcEZ1bmMsR2FxLnByb3RvdHlwZS5PPW5vb3BGdW5jLEdhcS5wcm90b3R5cGUuU2E9bm9vcEZ1bmMsR2FxLnByb3RvdHlwZS5UYT1ub29wRnVuYyxHYXEucHJvdG90eXBlLlZhPW5vb3BGdW5jLEdhcS5wcm90b3R5cGUuX2NyZWF0ZUFzeW5jVHJhY2tlcj1ub29wRnVuYyxHYXEucHJvdG90eXBlLl9nZXRBc3luY1RyYWNrZXI9bm9vcEZ1bmMsR2FxLnByb3RvdHlwZS5fZ2V0UGx1Z2luPW5vb3BGdW5jLEdhcS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihkYXRhKXsiZnVuY3Rpb24iIT10eXBlb2YgZGF0YT8hMSE9PUFycmF5LmlzQXJyYXkoZGF0YSkmJigic3RyaW5nIj09dHlwZW9mIGRhdGFbMF0mJi8oXnxcLilfbGluayQvLnRlc3QoZGF0YVswXSkmJiJzdHJpbmciPT10eXBlb2YgZGF0YVsxXSYmd2luZG93LmxvY2F0aW9uLmFzc2lnbihkYXRhWzFdKSwiX3NldCI9PT1kYXRhWzBdJiYiaGl0Q2FsbGJhY2siPT09ZGF0YVsxXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRhdGFbMl0mJmRhdGFbMl0oKSk6ZGF0YSgpfTt2YXIgZ2FxPW5ldyBHYXEsYXN5bmNUcmFja2Vycz13aW5kb3cuX2dhcXx8W107aWYoQXJyYXkuaXNBcnJheShhc3luY1RyYWNrZXJzKSlmb3IoO2FzeW5jVHJhY2tlcnNbMF07KWdhcS5wdXNoKGFzeW5jVHJhY2tlcnMuc2hpZnQoKSk7ZnVuY3Rpb24gR2F0KCl7fXdpbmRvdy5fZ2FxPWdhcS5xZj1nYXE7dmFyIHRyYWNrZXI9WyJfYWRkSWdub3JlZE9yZ2FuaWMiLCJfYWRkSWdub3JlZFJlZiIsIl9hZGRJdGVtIiwiX2FkZE9yZ2FuaWMiLCJfYWRkVHJhbnMiLCJfY2xlYXJJZ25vcmVkT3JnYW5pYyIsIl9jbGVhcklnbm9yZWRSZWYiLCJfY2xlYXJPcmdhbmljIiwiX2Nvb2tpZVBhdGhDb3B5IiwiX2RlbGV0ZUN1c3RvbVZhciIsIl9nZXROYW1lIiwiX3NldEFjY291bnQiLCJfZ2V0QWNjb3VudCIsIl9nZXRDbGllbnRJbmZvIiwiX2dldERldGVjdEZsYXNoIiwiX2dldERldGVjdFRpdGxlIiwiX2dldExpbmtlclVybCIsIl9nZXRMb2NhbEdpZlBhdGgiLCJfZ2V0U2VydmljZU1vZGUiLCJfZ2V0VmVyc2lvbiIsIl9nZXRWaXNpdG9yQ3VzdG9tVmFyIiwiX2luaXREYXRhIiwiX2xpbmsiLCJfbGlua0J5UG9zdCIsIl9zZXRBbGxvd0FuY2hvciIsIl9zZXRBbGxvd0hhc2giLCJfc2V0QWxsb3dMaW5rZXIiLCJfc2V0Q2FtcENvbnRlbnRLZXkiLCJfc2V0Q2FtcE1lZGl1bUtleSIsIl9zZXRDYW1wTmFtZUtleSIsIl9zZXRDYW1wTk9LZXkiLCJfc2V0Q2FtcFNvdXJjZUtleSIsIl9zZXRDYW1wVGVybUtleSIsIl9zZXRDYW1wYWlnbkNvb2tpZVRpbWVvdXQiLCJfc2V0Q2FtcGFpZ25UcmFjayIsIl9zZXRDbGllbnRJbmZvIiwiX3NldENvb2tpZVBhdGgiLCJfc2V0Q29va2llUGVyc2lzdGVuY2UiLCJfc2V0Q29va2llVGltZW91dCIsIl9zZXRDdXN0b21WYXIiLCJfc2V0RGV0ZWN0Rmxhc2giLCJfc2V0RGV0ZWN0VGl0bGUiLCJfc2V0RG9tYWluTmFtZSIsIl9zZXRMb2NhbEdpZlBhdGgiLCJfc2V0TG9jYWxSZW1vdGVTZXJ2ZXJNb2RlIiwiX3NldExvY2FsU2VydmVyTW9kZSIsIl9zZXRSZWZlcnJlck92ZXJyaWRlIiwiX3NldFJlbW90ZVNlcnZlck1vZGUiLCJfc2V0U2FtcGxlUmF0ZSIsIl9zZXRTZXNzaW9uVGltZW91dCIsIl9zZXRTaXRlU3BlZWRTYW1wbGVSYXRlIiwiX3NldFNlc3Npb25Db29raWVUaW1lb3V0IiwiX3NldFZhciIsIl9zZXRWaXNpdG9yQ29va2llVGltZW91dCIsIl90cmFja0V2ZW50IiwiX3RyYWNrUGFnZUxvYWRUaW1lIiwiX3RyYWNrUGFnZXZpZXciLCJfdHJhY2tTb2NpYWwiLCJfdHJhY2tUaW1pbmciLCJfdHJhY2tUcmFucyIsIl92aXNpdENvZGUiXS5yZWR1Y2UoKGZ1bmN0aW9uKHJlcyxmdW5jTmFtZSl7cmV0dXJuIHJlc1tmdW5jTmFtZV09bm9vcEZ1bmMscmVzfSkse30pO3RyYWNrZXIuX2dldExpbmtlclVybD1mdW5jdGlvbihhKXtyZXR1cm4gYX0sdHJhY2tlci5fbGluaz1mdW5jdGlvbih1cmwpe2lmKCJzdHJpbmciPT10eXBlb2YgdXJsKXRyeXt3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybCl9Y2F0Y2goZSl7IWZ1bmN0aW9uKHNvdXJjZSxtZXNzYWdlKXsoYXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXXx8c291cmNlLnZlcmJvc2UpJiZjb25zb2xlLmxvZygiIi5jb25jYXQoc291cmNlLm5hbWUsIjogIikuY29uY2F0KG1lc3NhZ2UpKX0oc291cmNlLGUpfX0sR2F0LnByb3RvdHlwZS5fYW5vbnltaXplSVA9bm9vcEZ1bmMsR2F0LnByb3RvdHlwZS5fY3JlYXRlVHJhY2tlcj1ub29wRnVuYyxHYXQucHJvdG90eXBlLl9mb3JjZVNTTD1ub29wRnVuYyxHYXQucHJvdG90eXBlLl9nZXRQbHVnaW49bm9vcEZ1bmMsR2F0LnByb3RvdHlwZS5fZ2V0VHJhY2tlcj1mdW5jdGlvbigpe3JldHVybiB0cmFja2VyfSxHYXQucHJvdG90eXBlLl9nZXRUcmFja2VyQnlOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRyYWNrZXJ9LEdhdC5wcm90b3R5cGUuX2dldFRyYWNrZXJzPW5vb3BGdW5jLEdhdC5wcm90b3R5cGUuYWE9bm9vcEZ1bmMsR2F0LnByb3RvdHlwZS5hYj1ub29wRnVuYyxHYXQucHJvdG90eXBlLmhiPW5vb3BGdW5jLEdhdC5wcm90b3R5cGUubGE9bm9vcEZ1bmMsR2F0LnByb3RvdHlwZS5vYT1ub29wRnVuYyxHYXQucHJvdG90eXBlLnBhPW5vb3BGdW5jLEdhdC5wcm90b3R5cGUudT1ub29wRnVuYzt2YXIgZ2F0PW5ldyBHYXQ7d2luZG93Ll9nYXQ9Z2F0LGZ1bmN0aW9uKHNvdXJjZSxtZXNzYWdlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX12YXIgTE9HX01BUktFUj0ibG9nOiAiO21lc3NhZ2UmJigtMT09PW1lc3NhZ2UuaW5kZXhPZihMT0dfTUFSS0VSKT9sb2coIiIuY29uY2F0KHByZWZpeCwiIG1lc3NhZ2U6XG4iKS5jb25jYXQobWVzc2FnZSkpOmxvZyhtZXNzYWdlLnNsaWNlKExPR19NQVJLRVIubGVuZ3RoKSkpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJnb29nbGUtYW5hbHl0aWNzLWdhIixhcmdzOltdfSxbXSk7" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7ZnVuY3Rpb24gR2FxKCl7fUdhcS5wcm90b3R5cGUuTmE9bm9vcEZ1bmMsR2FxLnByb3RvdHlwZS5PPW5vb3BGdW5jLEdhcS5wcm90b3R5cGUuU2E9bm9vcEZ1bmMsR2FxLnByb3RvdHlwZS5UYT1ub29wRnVuYyxHYXEucHJvdG90eXBlLlZhPW5vb3BGdW5jLEdhcS5wcm90b3R5cGUuX2NyZWF0ZUFzeW5jVHJhY2tlcj1ub29wRnVuYyxHYXEucHJvdG90eXBlLl9nZXRBc3luY1RyYWNrZXI9bm9vcEZ1bmMsR2FxLnByb3RvdHlwZS5fZ2V0UGx1Z2luPW5vb3BGdW5jLEdhcS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihkYXRhKXsiZnVuY3Rpb24iIT10eXBlb2YgZGF0YT8hMSE9PUFycmF5LmlzQXJyYXkoZGF0YSkmJigic3RyaW5nIj09dHlwZW9mIGRhdGFbMF0mJi8oXnxcLilfbGluayQvLnRlc3QoZGF0YVswXSkmJiJzdHJpbmciPT10eXBlb2YgZGF0YVsxXSYmd2luZG93LmxvY2F0aW9uLmFzc2lnbihkYXRhWzFdKSwiX3NldCI9PT1kYXRhWzBdJiYiaGl0Q2FsbGJhY2siPT09ZGF0YVsxXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRhdGFbMl0mJmRhdGFbMl0oKSk6ZGF0YSgpfTt2YXIgZ2FxPW5ldyBHYXEsYXN5bmNUcmFja2Vycz13aW5kb3cuX2dhcXx8W107aWYoQXJyYXkuaXNBcnJheShhc3luY1RyYWNrZXJzKSlmb3IoO2FzeW5jVHJhY2tlcnNbMF07KWdhcS5wdXNoKGFzeW5jVHJhY2tlcnMuc2hpZnQoKSk7ZnVuY3Rpb24gR2F0KCl7fXdpbmRvdy5fZ2FxPWdhcS5xZj1nYXE7dmFyIHRyYWNrZXI9WyJfYWRkSWdub3JlZE9yZ2FuaWMiLCJfYWRkSWdub3JlZFJlZiIsIl9hZGRJdGVtIiwiX2FkZE9yZ2FuaWMiLCJfYWRkVHJhbnMiLCJfY2xlYXJJZ25vcmVkT3JnYW5pYyIsIl9jbGVhcklnbm9yZWRSZWYiLCJfY2xlYXJPcmdhbmljIiwiX2Nvb2tpZVBhdGhDb3B5IiwiX2RlbGV0ZUN1c3RvbVZhciIsIl9nZXROYW1lIiwiX3NldEFjY291bnQiLCJfZ2V0QWNjb3VudCIsIl9nZXRDbGllbnRJbmZvIiwiX2dldERldGVjdEZsYXNoIiwiX2dldERldGVjdFRpdGxlIiwiX2dldExpbmtlclVybCIsIl9nZXRMb2NhbEdpZlBhdGgiLCJfZ2V0U2VydmljZU1vZGUiLCJfZ2V0VmVyc2lvbiIsIl9nZXRWaXNpdG9yQ3VzdG9tVmFyIiwiX2luaXREYXRhIiwiX2xpbmsiLCJfbGlua0J5UG9zdCIsIl9zZXRBbGxvd0FuY2hvciIsIl9zZXRBbGxvd0hhc2giLCJfc2V0QWxsb3dMaW5rZXIiLCJfc2V0Q2FtcENvbnRlbnRLZXkiLCJfc2V0Q2FtcE1lZGl1bUtleSIsIl9zZXRDYW1wTmFtZUtleSIsIl9zZXRDYW1wTk9LZXkiLCJfc2V0Q2FtcFNvdXJjZUtleSIsIl9zZXRDYW1wVGVybUtleSIsIl9zZXRDYW1wYWlnbkNvb2tpZVRpbWVvdXQiLCJfc2V0Q2FtcGFpZ25UcmFjayIsIl9zZXRDbGllbnRJbmZvIiwiX3NldENvb2tpZVBhdGgiLCJfc2V0Q29va2llUGVyc2lzdGVuY2UiLCJfc2V0Q29va2llVGltZW91dCIsIl9zZXRDdXN0b21WYXIiLCJfc2V0RGV0ZWN0Rmxhc2giLCJfc2V0RGV0ZWN0VGl0bGUiLCJfc2V0RG9tYWluTmFtZSIsIl9zZXRMb2NhbEdpZlBhdGgiLCJfc2V0TG9jYWxSZW1vdGVTZXJ2ZXJNb2RlIiwiX3NldExvY2FsU2VydmVyTW9kZSIsIl9zZXRSZWZlcnJlck92ZXJyaWRlIiwiX3NldFJlbW90ZVNlcnZlck1vZGUiLCJfc2V0U2FtcGxlUmF0ZSIsIl9zZXRTZXNzaW9uVGltZW91dCIsIl9zZXRTaXRlU3BlZWRTYW1wbGVSYXRlIiwiX3NldFNlc3Npb25Db29raWVUaW1lb3V0IiwiX3NldFZhciIsIl9zZXRWaXNpdG9yQ29va2llVGltZW91dCIsIl90cmFja0V2ZW50IiwiX3RyYWNrUGFnZUxvYWRUaW1lIiwiX3RyYWNrUGFnZXZpZXciLCJfdHJhY2tTb2NpYWwiLCJfdHJhY2tUaW1pbmciLCJfdHJhY2tUcmFucyIsIl92aXNpdENvZGUiXS5yZWR1Y2UoKGZ1bmN0aW9uKHJlcyxmdW5jTmFtZSl7cmV0dXJuIHJlc1tmdW5jTmFtZV09bm9vcEZ1bmMscmVzfSkse30pO3RyYWNrZXIuX2dldExpbmtlclVybD1mdW5jdGlvbihhKXtyZXR1cm4gYX0sdHJhY2tlci5fbGluaz1mdW5jdGlvbih1cmwpe2lmKCJzdHJpbmciPT10eXBlb2YgdXJsKXRyeXt3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybCl9Y2F0Y2goZSl7IWZ1bmN0aW9uKHNvdXJjZSxtZXNzYWdlKXsoYXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXXx8c291cmNlLnZlcmJvc2UpJiZjb25zb2xlLmxvZygiIi5jb25jYXQoc291cmNlLm5hbWUsIjogIikuY29uY2F0KG1lc3NhZ2UpKX0oc291cmNlLGUpfX0sR2F0LnByb3RvdHlwZS5fYW5vbnltaXplSVA9bm9vcEZ1bmMsR2F0LnByb3RvdHlwZS5fY3JlYXRlVHJhY2tlcj1ub29wRnVuYyxHYXQucHJvdG90eXBlLl9mb3JjZVNTTD1ub29wRnVuYyxHYXQucHJvdG90eXBlLl9nZXRQbHVnaW49bm9vcEZ1bmMsR2F0LnByb3RvdHlwZS5fZ2V0VHJhY2tlcj1mdW5jdGlvbigpe3JldHVybiB0cmFja2VyfSxHYXQucHJvdG90eXBlLl9nZXRUcmFja2VyQnlOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRyYWNrZXJ9LEdhdC5wcm90b3R5cGUuX2dldFRyYWNrZXJzPW5vb3BGdW5jLEdhdC5wcm90b3R5cGUuYWE9bm9vcEZ1bmMsR2F0LnByb3RvdHlwZS5hYj1ub29wRnVuYyxHYXQucHJvdG90eXBlLmhiPW5vb3BGdW5jLEdhdC5wcm90b3R5cGUubGE9bm9vcEZ1bmMsR2F0LnByb3RvdHlwZS5vYT1ub29wRnVuYyxHYXQucHJvdG90eXBlLnBhPW5vb3BGdW5jLEdhdC5wcm90b3R5cGUudT1ub29wRnVuYzt2YXIgZ2F0PW5ldyBHYXQ7d2luZG93Ll9nYXQ9Z2F0LGZ1bmN0aW9uKHNvdXJjZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6Imdvb2dsZS1hbmFseXRpY3MtZ2EiLGFyZ3M6W119LFtdKTs=" }, { "title": "google-analytics", @@ -222,14 +222,14 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIFRyYWNrZXI9ZnVuY3Rpb24oKXt9LHByb3RvPVRyYWNrZXIucHJvdG90eXBlO3Byb3RvLmdldD1ub29wRnVuYyxwcm90by5zZXQ9bm9vcEZ1bmMscHJvdG8uc2VuZD1ub29wRnVuYzt2YXIgZ29vZ2xlQW5hbHl0aWNzTmFtZT13aW5kb3cuR29vZ2xlQW5hbHl0aWNzT2JqZWN0fHwiZ2EiO2Z1bmN0aW9uIGdhKGEpe3ZhciBsZW49YXJndW1lbnRzLmxlbmd0aDtpZigwIT09bGVuKXt2YXIgcmVwbGFjZXIsbGFzdEFyZz1hcmd1bWVudHNbbGVuLTFdO2xhc3RBcmcgaW5zdGFuY2VvZiBPYmplY3QmJm51bGwhPT1sYXN0QXJnJiYiZnVuY3Rpb24iPT10eXBlb2YgbGFzdEFyZy5oaXRDYWxsYmFjaz9yZXBsYWNlcj1sYXN0QXJnLmhpdENhbGxiYWNrOiJmdW5jdGlvbiI9PXR5cGVvZiBsYXN0QXJnJiYocmVwbGFjZXI9ZnVuY3Rpb24oKXtsYXN0QXJnKGdhLmNyZWF0ZSgpKX0pO3RyeXtzZXRUaW1lb3V0KHJlcGxhY2VyLDEpfWNhdGNoKGV4KXt9fX1nYS5jcmVhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFRyYWNrZXJ9LGdhLmdldEJ5TmFtZT1mdW5jdGlvbigpe3JldHVybiBuZXcgVHJhY2tlcn0sZ2EuZ2V0QWxsPWZ1bmN0aW9uKCl7cmV0dXJuW25ldyBUcmFja2VyXX0sZ2EucmVtb3ZlPW5vb3BGdW5jLGdhLmxvYWRlZD0hMCx3aW5kb3dbZ29vZ2xlQW5hbHl0aWNzTmFtZV09Z2E7dmFyIF93aW5kb3c9d2luZG93LGRhdGFMYXllcj1fd2luZG93LmRhdGFMYXllcixnb29nbGVfb3B0aW1pemU9X3dpbmRvdy5nb29nbGVfb3B0aW1pemU7aWYoZGF0YUxheWVyIGluc3RhbmNlb2YgT2JqZWN0IT0wKXtkYXRhTGF5ZXIuaGlkZSBpbnN0YW5jZW9mIE9iamVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIGRhdGFMYXllci5oaWRlLmVuZCYmZGF0YUxheWVyLmhpZGUuZW5kKCk7dmFyIGhhbmRsZUNhbGxiYWNrPWZ1bmN0aW9uKGRhdGFPYmosZnVuY05hbWUpe2RhdGFPYmomJiJmdW5jdGlvbiI9PXR5cGVvZiBkYXRhT2JqW2Z1bmNOYW1lXSYmc2V0VGltZW91dChkYXRhT2JqW2Z1bmNOYW1lXSl9O2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBkYXRhTGF5ZXIucHVzaCYmKGRhdGFMYXllci5wdXNoPWZ1bmN0aW9uKGRhdGEpe2lmKGRhdGEgaW5zdGFuY2VvZiBPYmplY3Qpe2Zvcih2YXIga2V5IGluIGhhbmRsZUNhbGxiYWNrKGRhdGEsImV2ZW50Q2FsbGJhY2siKSxkYXRhKWhhbmRsZUNhbGxiYWNrKGRhdGFba2V5XSwiZXZlbnRfY2FsbGJhY2siKTtkYXRhLmhhc093blByb3BlcnR5KCJldmVudENhbGxiYWNrIil8fGRhdGEuaGFzT3duUHJvcGVydHkoImV2ZW50Q2FsbGJhY2siKXx8W10ucHVzaC5jYWxsKHdpbmRvdy5kYXRhTGF5ZXIsZGF0YSl9cmV0dXJuIEFycmF5LmlzQXJyYXkoZGF0YSkmJmRhdGEuZm9yRWFjaCgoZnVuY3Rpb24oYXJnKXtoYW5kbGVDYWxsYmFjayhhcmcsImNhbGxiYWNrIil9KSksbm9vcEZ1bmN9KSxnb29nbGVfb3B0aW1pemUgaW5zdGFuY2VvZiBPYmplY3QmJiJmdW5jdGlvbiI9PXR5cGVvZiBnb29nbGVfb3B0aW1pemUuZ2V0KXt2YXIgZ29vZ2xlT3B0aW1pemVXcmFwcGVyPXtnZXQ6bm9vcEZ1bmN9O3dpbmRvdy5nb29nbGVfb3B0aW1pemU9Z29vZ2xlT3B0aW1pemVXcmFwcGVyfSFmdW5jdGlvbihzb3VyY2UsbWVzc2FnZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9dmFyIExPR19NQVJLRVI9ImxvZzogIjttZXNzYWdlJiYoLTE9PT1tZXNzYWdlLmluZGV4T2YoTE9HX01BUktFUik/bG9nKCIiLmNvbmNhdChwcmVmaXgsIiBtZXNzYWdlOlxuIikuY29uY2F0KG1lc3NhZ2UpKTpsb2cobWVzc2FnZS5zbGljZShMT0dfTUFSS0VSLmxlbmd0aCkpKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIHN0YXJ0IikpLHRyYWNlJiZ0cmFjZSgpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2UgZW5kIikpfWNhdGNoKGUpe30iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9fZGVidWcmJndpbmRvdy5fX2RlYnVnKHNvdXJjZSl9fShzb3VyY2UpfX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6Imdvb2dsZS1hbmFseXRpY3MiLGFyZ3M6W119LFtdKTs=" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIFRyYWNrZXI9ZnVuY3Rpb24oKXt9LHByb3RvPVRyYWNrZXIucHJvdG90eXBlO3Byb3RvLmdldD1ub29wRnVuYyxwcm90by5zZXQ9bm9vcEZ1bmMscHJvdG8uc2VuZD1ub29wRnVuYzt2YXIgZ29vZ2xlQW5hbHl0aWNzTmFtZT13aW5kb3cuR29vZ2xlQW5hbHl0aWNzT2JqZWN0fHwiZ2EiO2Z1bmN0aW9uIGdhKGEpe3ZhciBsZW49YXJndW1lbnRzLmxlbmd0aDtpZigwIT09bGVuKXt2YXIgcmVwbGFjZXIsbGFzdEFyZz1hcmd1bWVudHNbbGVuLTFdO2xhc3RBcmcgaW5zdGFuY2VvZiBPYmplY3QmJm51bGwhPT1sYXN0QXJnJiYiZnVuY3Rpb24iPT10eXBlb2YgbGFzdEFyZy5oaXRDYWxsYmFjaz9yZXBsYWNlcj1sYXN0QXJnLmhpdENhbGxiYWNrOiJmdW5jdGlvbiI9PXR5cGVvZiBsYXN0QXJnJiYocmVwbGFjZXI9ZnVuY3Rpb24oKXtsYXN0QXJnKGdhLmNyZWF0ZSgpKX0pO3RyeXtzZXRUaW1lb3V0KHJlcGxhY2VyLDEpfWNhdGNoKGV4KXt9fX1nYS5jcmVhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFRyYWNrZXJ9LGdhLmdldEJ5TmFtZT1mdW5jdGlvbigpe3JldHVybiBuZXcgVHJhY2tlcn0sZ2EuZ2V0QWxsPWZ1bmN0aW9uKCl7cmV0dXJuW25ldyBUcmFja2VyXX0sZ2EucmVtb3ZlPW5vb3BGdW5jLGdhLmxvYWRlZD0hMCx3aW5kb3dbZ29vZ2xlQW5hbHl0aWNzTmFtZV09Z2E7dmFyIF93aW5kb3c9d2luZG93LGRhdGFMYXllcj1fd2luZG93LmRhdGFMYXllcixnb29nbGVfb3B0aW1pemU9X3dpbmRvdy5nb29nbGVfb3B0aW1pemU7aWYoZGF0YUxheWVyIGluc3RhbmNlb2YgT2JqZWN0IT0wKXtkYXRhTGF5ZXIuaGlkZSBpbnN0YW5jZW9mIE9iamVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIGRhdGFMYXllci5oaWRlLmVuZCYmZGF0YUxheWVyLmhpZGUuZW5kKCk7dmFyIGhhbmRsZUNhbGxiYWNrPWZ1bmN0aW9uKGRhdGFPYmosZnVuY05hbWUpe2RhdGFPYmomJiJmdW5jdGlvbiI9PXR5cGVvZiBkYXRhT2JqW2Z1bmNOYW1lXSYmc2V0VGltZW91dChkYXRhT2JqW2Z1bmNOYW1lXSl9O2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBkYXRhTGF5ZXIucHVzaCYmKGRhdGFMYXllci5wdXNoPWZ1bmN0aW9uKGRhdGEpe2lmKGRhdGEgaW5zdGFuY2VvZiBPYmplY3Qpe2Zvcih2YXIga2V5IGluIGhhbmRsZUNhbGxiYWNrKGRhdGEsImV2ZW50Q2FsbGJhY2siKSxkYXRhKWhhbmRsZUNhbGxiYWNrKGRhdGFba2V5XSwiZXZlbnRfY2FsbGJhY2siKTtkYXRhLmhhc093blByb3BlcnR5KCJldmVudENhbGxiYWNrIil8fGRhdGEuaGFzT3duUHJvcGVydHkoImV2ZW50Q2FsbGJhY2siKXx8W10ucHVzaC5jYWxsKHdpbmRvdy5kYXRhTGF5ZXIsZGF0YSl9cmV0dXJuIEFycmF5LmlzQXJyYXkoZGF0YSkmJmRhdGEuZm9yRWFjaCgoZnVuY3Rpb24oYXJnKXtoYW5kbGVDYWxsYmFjayhhcmcsImNhbGxiYWNrIil9KSksbm9vcEZ1bmN9KSxnb29nbGVfb3B0aW1pemUgaW5zdGFuY2VvZiBPYmplY3QmJiJmdW5jdGlvbiI9PXR5cGVvZiBnb29nbGVfb3B0aW1pemUuZ2V0KXt2YXIgZ29vZ2xlT3B0aW1pemVXcmFwcGVyPXtnZXQ6bm9vcEZ1bmN9O3dpbmRvdy5nb29nbGVfb3B0aW1pemU9Z29vZ2xlT3B0aW1pemVXcmFwcGVyfSFmdW5jdGlvbihzb3VyY2Upe2lmKCEwPT09c291cmNlLnZlcmJvc2Upe3RyeXt2YXIgbG9nPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdHJhY2U9Y29uc29sZS50cmFjZS5iaW5kKGNvbnNvbGUpLHByZWZpeD1zb3VyY2UucnVsZVRleHR8fCIiO2lmKHNvdXJjZS5kb21haW5OYW1lKXt2YXIgcnVsZVN0YXJ0SW5kZXgsQUdfU0NSSVBUTEVUX01BUktFUj0iIyUjLy8iLFVCT19TQ1JJUFRMRVRfTUFSS0VSPSIjIytqcyI7c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik+LTE/cnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik6c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpKTt2YXIgcnVsZVBhcnQ9c291cmNlLnJ1bGVUZXh0LnNsaWNlKHJ1bGVTdGFydEluZGV4KTtwcmVmaXg9IiIuY29uY2F0KHNvdXJjZS5kb21haW5OYW1lKS5jb25jYXQocnVsZVBhcnQpfWxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9fSkuYXBwbHkodGhpcyx1cGRhdGVkQXJncyl9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9fSh7bmFtZToiZ29vZ2xlLWFuYWx5dGljcyIsYXJnczpbXX0sW10pOw==" }, { "title": "google-ima3", "aliases": [], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31mdW5jdGlvbiBsb2dNZXNzYWdlKHNvdXJjZSxtZXNzYWdlKXt2YXIgZm9yY2VkPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07KGZvcmNlZHx8c291cmNlLnZlcmJvc2UpJiZjb25zb2xlLmxvZygiIi5jb25jYXQoc291cmNlLm5hbWUsIjogIikuY29uY2F0KG1lc3NhZ2UpKX1jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIGltYT17fSxBZERpc3BsYXlDb250YWluZXI9ZnVuY3Rpb24oKXt9O0FkRGlzcGxheUNvbnRhaW5lci5wcm90b3R5cGUuZGVzdHJveT1ub29wRnVuYyxBZERpc3BsYXlDb250YWluZXIucHJvdG90eXBlLmluaXRpYWxpemU9bm9vcEZ1bmM7dmFyIEltYVNka1NldHRpbmdzPWZ1bmN0aW9uKCl7fTtJbWFTZGtTZXR0aW5ncy5Db21wYW5pb25CYWNrZmlsbE1vZGU9e0FMV0FZUzoiYWx3YXlzIixPTl9NQVNURVJfQUQ6Im9uX21hc3Rlcl9hZCJ9LEltYVNka1NldHRpbmdzLlZwYWlkTW9kZT17RElTQUJMRUQ6MCxFTkFCTEVEOjEsSU5TRUNVUkU6Mn0sSW1hU2RrU2V0dGluZ3MucHJvdG90eXBlPXtjOiEwLGY6e30saTohMSxsOiIiLHA6IiIscjowLHQ6IiIsdjoiIixnZXRDb21wYW5pb25CYWNrZmlsbDpub29wRnVuYyxnZXREaXNhYmxlQ3VzdG9tUGxheWJhY2tGb3JJT1MxMFBsdXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pfSxnZXREaXNhYmxlZEZsYXNoQWRzOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEZlYXR1cmVGbGFnczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZ9LGdldExvY2FsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmx9LGdldE51bVJlZGlyZWN0czpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJ9LGdldFBsYXllclR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50fSxnZXRQbGF5ZXJWZXJzaW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudn0sZ2V0UHBpZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB9LGdldFZwYWlkTW9kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN9LGlzQ29va2llc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jfSxpc1ZwYWlkQWRhcHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLk19LHNldENvbXBhbmlvbkJhY2tmaWxsOm5vb3BGdW5jLHNldEF1dG9QbGF5QWRCcmVha3M6ZnVuY3Rpb24oYSl7dGhpcy5LPWF9LHNldENvb2tpZXNFbmFibGVkOmZ1bmN0aW9uKGMpe3RoaXMuYz0hIWN9LHNldERpc2FibGVDdXN0b21QbGF5YmFja0ZvcklPUzEwUGx1czpmdW5jdGlvbihpKXt0aGlzLmk9ISFpfSxzZXREaXNhYmxlRmxhc2hBZHM6bm9vcEZ1bmMsc2V0RmVhdHVyZUZsYWdzOmZ1bmN0aW9uKGYpe3RoaXMuZj0hIWZ9LHNldElzVnBhaWRBZGFwdGVyOmZ1bmN0aW9uKGEpe3RoaXMuTT1hfSxzZXRMb2NhbGU6ZnVuY3Rpb24obCl7dGhpcy5sPSEhbH0sc2V0TnVtUmVkaXJlY3RzOmZ1bmN0aW9uKHIpe3RoaXMucj0hIXJ9LHNldFBhZ2VDb3JyZWxhdG9yOmZ1bmN0aW9uKGEpe3RoaXMuUj1hfSxzZXRQbGF5ZXJUeXBlOmZ1bmN0aW9uKHQpe3RoaXMudD0hIXR9LHNldFBsYXllclZlcnNpb246ZnVuY3Rpb24odil7dGhpcy52PSEhdn0sc2V0UHBpZDpmdW5jdGlvbihwKXt0aGlzLnA9ISFwfSxzZXRWcGFpZE1vZGU6ZnVuY3Rpb24oYSl7dGhpcy5DPWF9LHNldFNlc3Npb25JZDpub29wRnVuYyxzZXRTdHJlYW1Db3JyZWxhdG9yOm5vb3BGdW5jLHNldFZwYWlkQWxsb3dlZDpub29wRnVuYyxDb21wYW5pb25CYWNrZmlsbE1vZGU6e0FMV0FZUzoiYWx3YXlzIixPTl9NQVNURVJfQUQ6Im9uX21hc3Rlcl9hZCJ9LFZwYWlkTW9kZTp7RElTQUJMRUQ6MCxFTkFCTEVEOjEsSU5TRUNVUkU6Mn19O3ZhciBFdmVudEhhbmRsZXI9ZnVuY3Rpb24oKXt0aGlzLmxpc3RlbmVycz1uZXcgTWFwLHRoaXMuX2Rpc3BhdGNoPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbGlzdGVuZXJzPXRoaXMubGlzdGVuZXJzLmdldChlLnR5cGUpfHxbXSxfaT0wLF9BcnJheSRmcm9tPUFycmF5LmZyb20obGlzdGVuZXJzKTtfaTxfQXJyYXkkZnJvbS5sZW5ndGg7X2krKyl7dmFyIGxpc3RlbmVyPV9BcnJheSRmcm9tW19pXTt0cnl7bGlzdGVuZXIoZSl9Y2F0Y2gocil7bG9nTWVzc2FnZShzb3VyY2Uscil9fX0sdGhpcy5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsYyl7dGhpcy5saXN0ZW5lcnMuaGFzKHQpfHx0aGlzLmxpc3RlbmVycy5zZXQodCxuZXcgU2V0KSx0aGlzLmxpc3RlbmVycy5nZXQodCkuYWRkKGMpfSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxjKXt2YXIgX3RoaXMkbGlzdGVuZXJzJGdldDtudWxsPT09KF90aGlzJGxpc3RlbmVycyRnZXQ9dGhpcy5saXN0ZW5lcnMuZ2V0KHQpKXx8dm9pZCAwPT09X3RoaXMkbGlzdGVuZXJzJGdldHx8X3RoaXMkbGlzdGVuZXJzJGdldC5kZWxldGUoYyl9fSxBZHNNYW5hZ2VyPW5ldyBFdmVudEhhbmRsZXI7QWRzTWFuYWdlci52b2x1bWU9MSxBZHNNYW5hZ2VyLmNvbGxhcHNlPW5vb3BGdW5jLEFkc01hbmFnZXIuY29uZmlndXJlQWRzTWFuYWdlcj1ub29wRnVuYyxBZHNNYW5hZ2VyLmRlc3Ryb3k9bm9vcEZ1bmMsQWRzTWFuYWdlci5kaXNjYXJkQWRCcmVhaz1ub29wRnVuYyxBZHNNYW5hZ2VyLmV4cGFuZD1ub29wRnVuYyxBZHNNYW5hZ2VyLmZvY3VzPW5vb3BGdW5jLEFkc01hbmFnZXIuZ2V0QWRTa2lwcGFibGVTdGF0ZT1mdW5jdGlvbigpe3JldHVybiExfSxBZHNNYW5hZ2VyLmdldEN1ZVBvaW50cz1mdW5jdGlvbigpe3JldHVyblswXX0sQWRzTWFuYWdlci5nZXRDdXJyZW50QWQ9ZnVuY3Rpb24oKXtyZXR1cm4gY3VycmVudEFkfSxBZHNNYW5hZ2VyLmdldEN1cnJlbnRBZEN1ZVBvaW50cz1mdW5jdGlvbigpe3JldHVybltdfSxBZHNNYW5hZ2VyLmdldFJlbWFpbmluZ1RpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sQWRzTWFuYWdlci5nZXRWb2x1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52b2x1bWV9LEFkc01hbmFnZXIuaW5pdD1ub29wRnVuYyxBZHNNYW5hZ2VyLmlzQ3VzdG9tQ2xpY2tUcmFja2luZ1VzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sQWRzTWFuYWdlci5pc0N1c3RvbVBsYXliYWNrVXNlZD1mdW5jdGlvbigpe3JldHVybiExfSxBZHNNYW5hZ2VyLnBhdXNlPW5vb3BGdW5jLEFkc01hbmFnZXIucmVxdWVzdE5leHRBZEJyZWFrPW5vb3BGdW5jLEFkc01hbmFnZXIucmVzaXplPW5vb3BGdW5jLEFkc01hbmFnZXIucmVzdW1lPW5vb3BGdW5jLEFkc01hbmFnZXIuc2V0Vm9sdW1lPWZ1bmN0aW9uKHYpe3RoaXMudm9sdW1lPXZ9LEFkc01hbmFnZXIuc2tpcD1ub29wRnVuYyxBZHNNYW5hZ2VyLnN0YXJ0PWZ1bmN0aW9uKCl7Zm9yKHZhciBfaTI9MCxfYXJyPVtBZEV2ZW50LlR5cGUuQUxMX0FEU19DT01QTEVURUQsQWRFdmVudC5UeXBlLkNPTlRFTlRfUkVTVU1FX1JFUVVFU1RFRF07X2kyPF9hcnIubGVuZ3RoO19pMisrKXt2YXIgdHlwZT1fYXJyW19pMl07dHJ5e3RoaXMuX2Rpc3BhdGNoKG5ldyBpbWEuQWRFdmVudCh0eXBlKSl9Y2F0Y2goZSl7bG9nTWVzc2FnZShzb3VyY2UsZSl9fX0sQWRzTWFuYWdlci5zdG9wPW5vb3BGdW5jLEFkc01hbmFnZXIudXBkYXRlQWRzUmVuZGVyaW5nU2V0dGluZ3M9bm9vcEZ1bmM7dmFyIG1hbmFnZXI9T2JqZWN0LmNyZWF0ZShBZHNNYW5hZ2VyKSxBZHNNYW5hZ2VyTG9hZGVkRXZlbnQ9ZnVuY3Rpb24odHlwZSxhZHNSZXF1ZXN0LHVzZXJSZXF1ZXN0Q29udGV4dCl7dGhpcy50eXBlPXR5cGUsdGhpcy5hZHNSZXF1ZXN0PWFkc1JlcXVlc3QsdGhpcy51c2VyUmVxdWVzdENvbnRleHQ9dXNlclJlcXVlc3RDb250ZXh0fTtBZHNNYW5hZ2VyTG9hZGVkRXZlbnQucHJvdG90eXBlPXtnZXRBZHNNYW5hZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG1hbmFnZXJ9LGdldFVzZXJSZXF1ZXN0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVzZXJSZXF1ZXN0Q29udGV4dD90aGlzLnVzZXJSZXF1ZXN0Q29udGV4dDp7fX19LEFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlPXtBRFNfTUFOQUdFUl9MT0FERUQ6ImFkc01hbmFnZXJMb2FkZWQifTt2YXIgQWRzTG9hZGVyPUV2ZW50SGFuZGxlcjtBZHNMb2FkZXIucHJvdG90eXBlLnNldHRpbmdzPW5ldyBJbWFTZGtTZXR0aW5ncyxBZHNMb2FkZXIucHJvdG90eXBlLmNvbnRlbnRDb21wbGV0ZT1ub29wRnVuYyxBZHNMb2FkZXIucHJvdG90eXBlLmRlc3Ryb3k9bm9vcEZ1bmMsQWRzTG9hZGVyLnByb3RvdHlwZS5nZXRTZXR0aW5ncz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNldHRpbmdzfSxBZHNMb2FkZXIucHJvdG90eXBlLmdldFZlcnNpb249ZnVuY3Rpb24oKXtyZXR1cm4iMy40NTMuMCJ9LEFkc0xvYWRlci5wcm90b3R5cGUucmVxdWVzdEFkcz1mdW5jdGlvbihhZHNSZXF1ZXN0LHVzZXJSZXF1ZXN0Q29udGV4dCl7dmFyIF90aGlzPXRoaXM7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe3ZhciBBRFNfTUFOQUdFUl9MT0FERUQ9QWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVELGV2ZW50PW5ldyBpbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50KEFEU19NQU5BR0VSX0xPQURFRCxhZHNSZXF1ZXN0LHVzZXJSZXF1ZXN0Q29udGV4dCk7X3RoaXMuX2Rpc3BhdGNoKGV2ZW50KX0pKTt2YXIgZT1uZXcgaW1hLkFkRXJyb3IoImFkUGxheUVycm9yIiwxMjA1LDEyMDUsIlRoZSBicm93c2VyIHByZXZlbnRlZCBwbGF5YmFjayBpbml0aWF0ZWQgd2l0aG91dCB1c2VyIGludGVyYWN0aW9uLiIsYWRzUmVxdWVzdCx1c2VyUmVxdWVzdENvbnRleHQpO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXtfdGhpcy5fZGlzcGF0Y2gobmV3IGltYS5BZEVycm9yRXZlbnQoZSkpfSkpfTt2YXIgQWRzUmVuZGVyaW5nU2V0dGluZ3M9bm9vcEZ1bmMsQWRzUmVxdWVzdD1mdW5jdGlvbigpe307QWRzUmVxdWVzdC5wcm90b3R5cGU9e3NldEFkV2lsbEF1dG9QbGF5Om5vb3BGdW5jLHNldEFkV2lsbFBsYXlNdXRlZDpub29wRnVuYyxzZXRDb250aW51b3VzUGxheWJhY2s6bm9vcEZ1bmN9O3ZhciBBZFBvZEluZm89ZnVuY3Rpb24oKXt9O0FkUG9kSW5mby5wcm90b3R5cGU9e2dldEFkUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZ2V0SXNCdW1wZXI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2V0TWF4RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4tMX0sZ2V0UG9kSW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZ2V0VGltZU9mZnNldDpmdW5jdGlvbigpe3JldHVybiAwfSxnZXRUb3RhbEFkczpmdW5jdGlvbigpe3JldHVybiAxfX07dmFyIEFkPWZ1bmN0aW9uKCl7fTtBZC5wcm90b3R5cGU9e3BpOm5ldyBBZFBvZEluZm8sZ2V0QWRJZDpmdW5jdGlvbigpe3JldHVybiIifSxnZXRBZFBvZEluZm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5waX0sZ2V0QWRTeXN0ZW06ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0QWR2ZXJ0aXNlck5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0QXBpRnJhbWV3b3JrOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGdldENvbXBhbmlvbkFkczpmdW5jdGlvbigpe3JldHVybltdfSxnZXRDb250ZW50VHlwZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXRDcmVhdGl2ZUFkSWQ6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RGVhbElkOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldERlc2NyaXB0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDguNX0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldE1lZGlhVXJsOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGdldE1pblN1Z2dlc3RlZER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuLTJ9LGdldFNraXBUaW1lT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuLTF9LGdldFN1cnZleVVybDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxnZXRUaXRsZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXRUcmFmZmlja2luZ1BhcmFtZXRlcnNTdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0VWlFbGVtZW50czpmdW5jdGlvbigpe3JldHVyblsiIl19LGdldFVuaXZlcnNhbEFkSWRSZWdpc3RyeTpmdW5jdGlvbigpe3JldHVybiJ1bmtub3duIn0sZ2V0VW5pdmVyc2FsQWRJZHM6ZnVuY3Rpb24oKXtyZXR1cm5bIiJdfSxnZXRVbml2ZXJzYWxBZElkVmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4idW5rbm93biJ9LGdldFZhc3RNZWRpYUJpdHJhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZ2V0VmFzdE1lZGlhSGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldFZhc3RNZWRpYVdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldFdyYXBwZXJBZElkczpmdW5jdGlvbigpe3JldHVyblsiIl19LGdldFdyYXBwZXJBZFN5c3RlbXM6ZnVuY3Rpb24oKXtyZXR1cm5bIiJdfSxnZXRXcmFwcGVyQ3JlYXRpdmVJZHM6ZnVuY3Rpb24oKXtyZXR1cm5bIiJdfSxpc0xpbmVhcjpmdW5jdGlvbigpe3JldHVybiEwfSxpc1NraXBwYWJsZTpmdW5jdGlvbigpe3JldHVybiEwfX07dmFyIENvbXBhbmlvbkFkPWZ1bmN0aW9uKCl7fTtDb21wYW5pb25BZC5wcm90b3R5cGU9e2dldEFkU2xvdElkOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0Q29udGVudFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIDF9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDF9fTt2YXIgQWRFcnJvcj1mdW5jdGlvbih0eXBlLGNvZGUsdmFzdCxtZXNzYWdlLGFkc1JlcXVlc3QsdXNlclJlcXVlc3RDb250ZXh0KXt0aGlzLmVycm9yQ29kZT1jb2RlLHRoaXMubWVzc2FnZT1tZXNzYWdlLHRoaXMudHlwZT10eXBlLHRoaXMuYWRzUmVxdWVzdD1hZHNSZXF1ZXN0LHRoaXMudXNlclJlcXVlc3RDb250ZXh0PXVzZXJSZXF1ZXN0Q29udGV4dCx0aGlzLmdldEVycm9yQ29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sdGhpcy5nZXRJbm5lckVycm9yPWZ1bmN0aW9uKCl7fSx0aGlzLmdldE1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZXNzYWdlfSx0aGlzLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfSx0aGlzLmdldFZhc3RFcnJvckNvZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YXN0RXJyb3JDb2RlfSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkFkRXJyb3IgIi5jb25jYXQodGhpcy5lcnJvckNvZGUsIjogIikuY29uY2F0KHRoaXMubWVzc2FnZSl9fTtBZEVycm9yLkVycm9yQ29kZT17fSxBZEVycm9yLlR5cGU9e307dmFyIGN1cnJlbnRBZD1mdW5jdGlvbigpe3RyeXtmb3IodmFyIF9pMz0wLF9PYmplY3QkdmFsdWVzPU9iamVjdC52YWx1ZXMod2luZG93LnZpZGlibGUuX2dldENvbnRleHRzKCkpO19pMzxfT2JqZWN0JHZhbHVlcy5sZW5ndGg7X2kzKyspe3ZhciBfY3R4JGdldFBsYXllcixfY3R4JGdldFBsYXllciRkaXY7aWYobnVsbCE9PShfY3R4JGdldFBsYXllcj1fT2JqZWN0JHZhbHVlc1tfaTNdLmdldFBsYXllcigpKSYmdm9pZCAwIT09X2N0eCRnZXRQbGF5ZXImJm51bGwhPT0oX2N0eCRnZXRQbGF5ZXIkZGl2PV9jdHgkZ2V0UGxheWVyLmRpdikmJnZvaWQgMCE9PV9jdHgkZ2V0UGxheWVyJGRpdiYmX2N0eCRnZXRQbGF5ZXIkZGl2LmlubmVySFRNTC5pbmNsdWRlcygid3d3LmVuZ2FkZ2V0LmNvbSIpKXJldHVybiEwfX1jYXRjaChlKXt9cmV0dXJuITF9KCk/dm9pZCAwOm5ldyBBZCxBZEV2ZW50PWZ1bmN0aW9uKHR5cGUpe3RoaXMudHlwZT10eXBlfTtBZEV2ZW50LnByb3RvdHlwZT17Z2V0QWQ6ZnVuY3Rpb24oKXtyZXR1cm4gY3VycmVudEFkfSxnZXRBZERhdGE6ZnVuY3Rpb24oKXt9fSxBZEV2ZW50LlR5cGU9e0FEX0JSRUFLX1JFQURZOiJhZEJyZWFrUmVhZHkiLEFEX0JVRkZFUklORzoiYWRCdWZmZXJpbmciLEFEX0NBTl9QTEFZOiJhZENhblBsYXkiLEFEX01FVEFEQVRBOiJhZE1ldGFkYXRhIixBRF9QUk9HUkVTUzoiYWRQcm9ncmVzcyIsQUxMX0FEU19DT01QTEVURUQ6ImFsbEFkc0NvbXBsZXRlZCIsQ0xJQ0s6ImNsaWNrIixDT01QTEVURToiY29tcGxldGUiLENPTlRFTlRfUEFVU0VfUkVRVUVTVEVEOiJjb250ZW50UGF1c2VSZXF1ZXN0ZWQiLENPTlRFTlRfUkVTVU1FX1JFUVVFU1RFRDoiY29udGVudFJlc3VtZVJlcXVlc3RlZCIsRFVSQVRJT05fQ0hBTkdFOiJkdXJhdGlvbkNoYW5nZSIsRVhQQU5ERURfQ0hBTkdFRDoiZXhwYW5kZWRDaGFuZ2VkIixGSVJTVF9RVUFSVElMRToiZmlyc3RRdWFydGlsZSIsSU1QUkVTU0lPTjoiaW1wcmVzc2lvbiIsSU5URVJBQ1RJT046ImludGVyYWN0aW9uIixMSU5FQVJfQ0hBTkdFOiJsaW5lYXJDaGFuZ2UiLExJTkVBUl9DSEFOR0VEOiJsaW5lYXJDaGFuZ2VkIixMT0FERUQ6ImxvYWRlZCIsTE9HOiJsb2ciLE1JRFBPSU5UOiJtaWRwb2ludCIsUEFVU0VEOiJwYXVzZSIsUkVTVU1FRDoicmVzdW1lIixTS0lQUEFCTEVfU1RBVEVfQ0hBTkdFRDoic2tpcHBhYmxlU3RhdGVDaGFuZ2VkIixTS0lQUEVEOiJza2lwIixTVEFSVEVEOiJzdGFydCIsVEhJUkRfUVVBUlRJTEU6InRoaXJkUXVhcnRpbGUiLFVTRVJfQ0xPU0U6InVzZXJDbG9zZSIsVklERU9fQ0xJQ0tFRDoidmlkZW9DbGlja2VkIixWSURFT19JQ09OX0NMSUNLRUQ6InZpZGVvSWNvbkNsaWNrZWQiLFZJRVdBQkxFX0lNUFJFU1NJT046InZpZXdhYmxlX2ltcHJlc3Npb24iLFZPTFVNRV9DSEFOR0VEOiJ2b2x1bWVDaGFuZ2UiLFZPTFVNRV9NVVRFRDoibXV0ZSJ9O3ZhciBBZEVycm9yRXZlbnQ9ZnVuY3Rpb24oZXJyb3Ipe3RoaXMuZXJyb3I9ZXJyb3IsdGhpcy50eXBlPSJhZEVycm9yIix0aGlzLmdldEVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3J9LHRoaXMuZ2V0VXNlclJlcXVlc3RDb250ZXh0PWZ1bmN0aW9uKCl7dmFyIF90aGlzJGVycm9yO3JldHVybiBudWxsIT09KF90aGlzJGVycm9yPXRoaXMuZXJyb3IpJiZ2b2lkIDAhPT1fdGhpcyRlcnJvciYmX3RoaXMkZXJyb3IudXNlclJlcXVlc3RDb250ZXh0P3RoaXMuZXJyb3IudXNlclJlcXVlc3RDb250ZXh0Ont9fX07QWRFcnJvckV2ZW50LlR5cGU9e0FEX0VSUk9SOiJhZEVycm9yIn07dmFyIEN1c3RvbUNvbnRlbnRMb2FkZWRFdmVudD1mdW5jdGlvbigpe307Q3VzdG9tQ29udGVudExvYWRlZEV2ZW50LlR5cGU9e0NVU1RPTV9DT05URU5UX0xPQURFRDoiZGVwcmVjYXRlZC1ldmVudCJ9O3ZhciBDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzPWZ1bmN0aW9uKCl7fTtDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzLkNyZWF0aXZlVHlwZT17QUxMOiJBbGwiLEZMQVNIOiJGbGFzaCIsSU1BR0U6IkltYWdlIn0sQ29tcGFuaW9uQWRTZWxlY3Rpb25TZXR0aW5ncy5SZXNvdXJjZVR5cGU9e0FMTDoiQWxsIixIVE1MOiJIdG1sIixJRlJBTUU6IklGcmFtZSIsU1RBVElDOiJTdGF0aWMifSxDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzLlNpemVDcml0ZXJpYT17SUdOT1JFOiJJZ25vcmVTaXplIixTRUxFQ1RfRVhBQ1RfTUFUQ0g6IlNlbGVjdEV4YWN0TWF0Y2giLFNFTEVDVF9ORUFSX01BVENIOiJTZWxlY3ROZWFyTWF0Y2gifTt2YXIgQWRDdWVQb2ludHM9ZnVuY3Rpb24oKXt9O0FkQ3VlUG9pbnRzLnByb3RvdHlwZT17Z2V0Q3VlUG9pbnRzOmZ1bmN0aW9uKCl7cmV0dXJuW119LGdldEFkSWRSZWdpc3RyeTpmdW5jdGlvbigpe3JldHVybiIifSxnZXRBZElzVmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn19O3ZhciBBZFByb2dyZXNzRGF0YT1ub29wRnVuYztPYmplY3QuYXNzaWduKGltYSx7QWRDdWVQb2ludHM6QWRDdWVQb2ludHMsQWREaXNwbGF5Q29udGFpbmVyOkFkRGlzcGxheUNvbnRhaW5lcixBZEVycm9yOkFkRXJyb3IsQWRFcnJvckV2ZW50OkFkRXJyb3JFdmVudCxBZEV2ZW50OkFkRXZlbnQsQWRQb2RJbmZvOkFkUG9kSW5mbyxBZFByb2dyZXNzRGF0YTpBZFByb2dyZXNzRGF0YSxBZHNMb2FkZXI6QWRzTG9hZGVyLEFkc01hbmFnZXI6bWFuYWdlcixBZHNNYW5hZ2VyTG9hZGVkRXZlbnQ6QWRzTWFuYWdlckxvYWRlZEV2ZW50LEFkc1JlbmRlcmluZ1NldHRpbmdzOkFkc1JlbmRlcmluZ1NldHRpbmdzLEFkc1JlcXVlc3Q6QWRzUmVxdWVzdCxDb21wYW5pb25BZDpDb21wYW5pb25BZCxDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzOkNvbXBhbmlvbkFkU2VsZWN0aW9uU2V0dGluZ3MsQ3VzdG9tQ29udGVudExvYWRlZEV2ZW50OkN1c3RvbUNvbnRlbnRMb2FkZWRFdmVudCxncHRQcm94eUluc3RhbmNlOnt9LEltYVNka1NldHRpbmdzOkltYVNka1NldHRpbmdzLE9taWRBY2Nlc3NNb2RlOntET01BSU46ImRvbWFpbiIsRlVMTDoiZnVsbCIsTElNSVRFRDoibGltaXRlZCJ9LHNldHRpbmdzOm5ldyBJbWFTZGtTZXR0aW5ncyxVaUVsZW1lbnRzOntBRF9BVFRSSUJVVElPTjoiYWRBdHRyaWJ1dGlvbiIsQ09VTlRET1dOOiJjb3VudGRvd24ifSxVbml2ZXJzYWxBZElkSW5mbzpmdW5jdGlvbigpe30sVkVSU0lPTjoiMy40NTMuMCIsVmlld01vZGU6e0ZVTExTQ1JFRU46ImZ1bGxzY3JlZW4iLE5PUk1BTDoibm9ybWFsIn19KSx3aW5kb3cuZ29vZ2xlfHwod2luZG93Lmdvb2dsZT17fSksd2luZG93Lmdvb2dsZS5pbWE9aW1hLGZ1bmN0aW9uKHNvdXJjZSxtZXNzYWdlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX12YXIgTE9HX01BUktFUj0ibG9nOiAiO21lc3NhZ2UmJigtMT09PW1lc3NhZ2UuaW5kZXhPZihMT0dfTUFSS0VSKT9sb2coIiIuY29uY2F0KHByZWZpeCwiIG1lc3NhZ2U6XG4iKS5jb25jYXQobWVzc2FnZSkpOmxvZyhtZXNzYWdlLnNsaWNlKExPR19NQVJLRVIubGVuZ3RoKSkpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJnb29nbGUtaW1hMyIsYXJnczpbXX0sW10pOw==" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31mdW5jdGlvbiBsb2dNZXNzYWdlKHNvdXJjZSxtZXNzYWdlKXt2YXIgZm9yY2VkPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07KGZvcmNlZHx8c291cmNlLnZlcmJvc2UpJiZjb25zb2xlLmxvZygiIi5jb25jYXQoc291cmNlLm5hbWUsIjogIikuY29uY2F0KG1lc3NhZ2UpKX1jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIGltYT17fSxBZERpc3BsYXlDb250YWluZXI9ZnVuY3Rpb24oKXt9O0FkRGlzcGxheUNvbnRhaW5lci5wcm90b3R5cGUuZGVzdHJveT1ub29wRnVuYyxBZERpc3BsYXlDb250YWluZXIucHJvdG90eXBlLmluaXRpYWxpemU9bm9vcEZ1bmM7dmFyIEltYVNka1NldHRpbmdzPWZ1bmN0aW9uKCl7fTtJbWFTZGtTZXR0aW5ncy5Db21wYW5pb25CYWNrZmlsbE1vZGU9e0FMV0FZUzoiYWx3YXlzIixPTl9NQVNURVJfQUQ6Im9uX21hc3Rlcl9hZCJ9LEltYVNka1NldHRpbmdzLlZwYWlkTW9kZT17RElTQUJMRUQ6MCxFTkFCTEVEOjEsSU5TRUNVUkU6Mn0sSW1hU2RrU2V0dGluZ3MucHJvdG90eXBlPXtjOiEwLGY6e30saTohMSxsOiIiLHA6IiIscjowLHQ6IiIsdjoiIixnZXRDb21wYW5pb25CYWNrZmlsbDpub29wRnVuYyxnZXREaXNhYmxlQ3VzdG9tUGxheWJhY2tGb3JJT1MxMFBsdXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pfSxnZXREaXNhYmxlZEZsYXNoQWRzOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEZlYXR1cmVGbGFnczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZ9LGdldExvY2FsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmx9LGdldE51bVJlZGlyZWN0czpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJ9LGdldFBsYXllclR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50fSxnZXRQbGF5ZXJWZXJzaW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudn0sZ2V0UHBpZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB9LGdldFZwYWlkTW9kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN9LGlzQ29va2llc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jfSxpc1ZwYWlkQWRhcHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLk19LHNldENvbXBhbmlvbkJhY2tmaWxsOm5vb3BGdW5jLHNldEF1dG9QbGF5QWRCcmVha3M6ZnVuY3Rpb24oYSl7dGhpcy5LPWF9LHNldENvb2tpZXNFbmFibGVkOmZ1bmN0aW9uKGMpe3RoaXMuYz0hIWN9LHNldERpc2FibGVDdXN0b21QbGF5YmFja0ZvcklPUzEwUGx1czpmdW5jdGlvbihpKXt0aGlzLmk9ISFpfSxzZXREaXNhYmxlRmxhc2hBZHM6bm9vcEZ1bmMsc2V0RmVhdHVyZUZsYWdzOmZ1bmN0aW9uKGYpe3RoaXMuZj0hIWZ9LHNldElzVnBhaWRBZGFwdGVyOmZ1bmN0aW9uKGEpe3RoaXMuTT1hfSxzZXRMb2NhbGU6ZnVuY3Rpb24obCl7dGhpcy5sPSEhbH0sc2V0TnVtUmVkaXJlY3RzOmZ1bmN0aW9uKHIpe3RoaXMucj0hIXJ9LHNldFBhZ2VDb3JyZWxhdG9yOmZ1bmN0aW9uKGEpe3RoaXMuUj1hfSxzZXRQbGF5ZXJUeXBlOmZ1bmN0aW9uKHQpe3RoaXMudD0hIXR9LHNldFBsYXllclZlcnNpb246ZnVuY3Rpb24odil7dGhpcy52PSEhdn0sc2V0UHBpZDpmdW5jdGlvbihwKXt0aGlzLnA9ISFwfSxzZXRWcGFpZE1vZGU6ZnVuY3Rpb24oYSl7dGhpcy5DPWF9LHNldFNlc3Npb25JZDpub29wRnVuYyxzZXRTdHJlYW1Db3JyZWxhdG9yOm5vb3BGdW5jLHNldFZwYWlkQWxsb3dlZDpub29wRnVuYyxDb21wYW5pb25CYWNrZmlsbE1vZGU6e0FMV0FZUzoiYWx3YXlzIixPTl9NQVNURVJfQUQ6Im9uX21hc3Rlcl9hZCJ9LFZwYWlkTW9kZTp7RElTQUJMRUQ6MCxFTkFCTEVEOjEsSU5TRUNVUkU6Mn19O3ZhciBFdmVudEhhbmRsZXI9ZnVuY3Rpb24oKXt0aGlzLmxpc3RlbmVycz1uZXcgTWFwLHRoaXMuX2Rpc3BhdGNoPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbGlzdGVuZXJzPXRoaXMubGlzdGVuZXJzLmdldChlLnR5cGUpfHxbXSxfaT0wLF9BcnJheSRmcm9tPUFycmF5LmZyb20obGlzdGVuZXJzKTtfaTxfQXJyYXkkZnJvbS5sZW5ndGg7X2krKyl7dmFyIGxpc3RlbmVyPV9BcnJheSRmcm9tW19pXTt0cnl7bGlzdGVuZXIoZSl9Y2F0Y2gocil7bG9nTWVzc2FnZShzb3VyY2Uscil9fX0sdGhpcy5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsYyl7dGhpcy5saXN0ZW5lcnMuaGFzKHQpfHx0aGlzLmxpc3RlbmVycy5zZXQodCxuZXcgU2V0KSx0aGlzLmxpc3RlbmVycy5nZXQodCkuYWRkKGMpfSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxjKXt2YXIgX3RoaXMkbGlzdGVuZXJzJGdldDtudWxsPT09KF90aGlzJGxpc3RlbmVycyRnZXQ9dGhpcy5saXN0ZW5lcnMuZ2V0KHQpKXx8dm9pZCAwPT09X3RoaXMkbGlzdGVuZXJzJGdldHx8X3RoaXMkbGlzdGVuZXJzJGdldC5kZWxldGUoYyl9fSxBZHNNYW5hZ2VyPW5ldyBFdmVudEhhbmRsZXI7QWRzTWFuYWdlci52b2x1bWU9MSxBZHNNYW5hZ2VyLmNvbGxhcHNlPW5vb3BGdW5jLEFkc01hbmFnZXIuY29uZmlndXJlQWRzTWFuYWdlcj1ub29wRnVuYyxBZHNNYW5hZ2VyLmRlc3Ryb3k9bm9vcEZ1bmMsQWRzTWFuYWdlci5kaXNjYXJkQWRCcmVhaz1ub29wRnVuYyxBZHNNYW5hZ2VyLmV4cGFuZD1ub29wRnVuYyxBZHNNYW5hZ2VyLmZvY3VzPW5vb3BGdW5jLEFkc01hbmFnZXIuZ2V0QWRTa2lwcGFibGVTdGF0ZT1mdW5jdGlvbigpe3JldHVybiExfSxBZHNNYW5hZ2VyLmdldEN1ZVBvaW50cz1mdW5jdGlvbigpe3JldHVyblswXX0sQWRzTWFuYWdlci5nZXRDdXJyZW50QWQ9ZnVuY3Rpb24oKXtyZXR1cm4gY3VycmVudEFkfSxBZHNNYW5hZ2VyLmdldEN1cnJlbnRBZEN1ZVBvaW50cz1mdW5jdGlvbigpe3JldHVybltdfSxBZHNNYW5hZ2VyLmdldFJlbWFpbmluZ1RpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sQWRzTWFuYWdlci5nZXRWb2x1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52b2x1bWV9LEFkc01hbmFnZXIuaW5pdD1ub29wRnVuYyxBZHNNYW5hZ2VyLmlzQ3VzdG9tQ2xpY2tUcmFja2luZ1VzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sQWRzTWFuYWdlci5pc0N1c3RvbVBsYXliYWNrVXNlZD1mdW5jdGlvbigpe3JldHVybiExfSxBZHNNYW5hZ2VyLnBhdXNlPW5vb3BGdW5jLEFkc01hbmFnZXIucmVxdWVzdE5leHRBZEJyZWFrPW5vb3BGdW5jLEFkc01hbmFnZXIucmVzaXplPW5vb3BGdW5jLEFkc01hbmFnZXIucmVzdW1lPW5vb3BGdW5jLEFkc01hbmFnZXIuc2V0Vm9sdW1lPWZ1bmN0aW9uKHYpe3RoaXMudm9sdW1lPXZ9LEFkc01hbmFnZXIuc2tpcD1ub29wRnVuYyxBZHNNYW5hZ2VyLnN0YXJ0PWZ1bmN0aW9uKCl7Zm9yKHZhciBfaTI9MCxfYXJyPVtBZEV2ZW50LlR5cGUuQUxMX0FEU19DT01QTEVURUQsQWRFdmVudC5UeXBlLkNPTlRFTlRfUkVTVU1FX1JFUVVFU1RFRF07X2kyPF9hcnIubGVuZ3RoO19pMisrKXt2YXIgdHlwZT1fYXJyW19pMl07dHJ5e3RoaXMuX2Rpc3BhdGNoKG5ldyBpbWEuQWRFdmVudCh0eXBlKSl9Y2F0Y2goZSl7bG9nTWVzc2FnZShzb3VyY2UsZSl9fX0sQWRzTWFuYWdlci5zdG9wPW5vb3BGdW5jLEFkc01hbmFnZXIudXBkYXRlQWRzUmVuZGVyaW5nU2V0dGluZ3M9bm9vcEZ1bmM7dmFyIG1hbmFnZXI9T2JqZWN0LmNyZWF0ZShBZHNNYW5hZ2VyKSxBZHNNYW5hZ2VyTG9hZGVkRXZlbnQ9ZnVuY3Rpb24odHlwZSxhZHNSZXF1ZXN0LHVzZXJSZXF1ZXN0Q29udGV4dCl7dGhpcy50eXBlPXR5cGUsdGhpcy5hZHNSZXF1ZXN0PWFkc1JlcXVlc3QsdGhpcy51c2VyUmVxdWVzdENvbnRleHQ9dXNlclJlcXVlc3RDb250ZXh0fTtBZHNNYW5hZ2VyTG9hZGVkRXZlbnQucHJvdG90eXBlPXtnZXRBZHNNYW5hZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG1hbmFnZXJ9LGdldFVzZXJSZXF1ZXN0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVzZXJSZXF1ZXN0Q29udGV4dD90aGlzLnVzZXJSZXF1ZXN0Q29udGV4dDp7fX19LEFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlPXtBRFNfTUFOQUdFUl9MT0FERUQ6ImFkc01hbmFnZXJMb2FkZWQifTt2YXIgQWRzTG9hZGVyPUV2ZW50SGFuZGxlcjtBZHNMb2FkZXIucHJvdG90eXBlLnNldHRpbmdzPW5ldyBJbWFTZGtTZXR0aW5ncyxBZHNMb2FkZXIucHJvdG90eXBlLmNvbnRlbnRDb21wbGV0ZT1ub29wRnVuYyxBZHNMb2FkZXIucHJvdG90eXBlLmRlc3Ryb3k9bm9vcEZ1bmMsQWRzTG9hZGVyLnByb3RvdHlwZS5nZXRTZXR0aW5ncz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNldHRpbmdzfSxBZHNMb2FkZXIucHJvdG90eXBlLmdldFZlcnNpb249ZnVuY3Rpb24oKXtyZXR1cm4iMy40NTMuMCJ9LEFkc0xvYWRlci5wcm90b3R5cGUucmVxdWVzdEFkcz1mdW5jdGlvbihhZHNSZXF1ZXN0LHVzZXJSZXF1ZXN0Q29udGV4dCl7dmFyIF90aGlzPXRoaXM7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe3ZhciBBRFNfTUFOQUdFUl9MT0FERUQ9QWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVELGV2ZW50PW5ldyBpbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50KEFEU19NQU5BR0VSX0xPQURFRCxhZHNSZXF1ZXN0LHVzZXJSZXF1ZXN0Q29udGV4dCk7X3RoaXMuX2Rpc3BhdGNoKGV2ZW50KX0pKTt2YXIgZT1uZXcgaW1hLkFkRXJyb3IoImFkUGxheUVycm9yIiwxMjA1LDEyMDUsIlRoZSBicm93c2VyIHByZXZlbnRlZCBwbGF5YmFjayBpbml0aWF0ZWQgd2l0aG91dCB1c2VyIGludGVyYWN0aW9uLiIsYWRzUmVxdWVzdCx1c2VyUmVxdWVzdENvbnRleHQpO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXtfdGhpcy5fZGlzcGF0Y2gobmV3IGltYS5BZEVycm9yRXZlbnQoZSkpfSkpfTt2YXIgQWRzUmVuZGVyaW5nU2V0dGluZ3M9bm9vcEZ1bmMsQWRzUmVxdWVzdD1mdW5jdGlvbigpe307QWRzUmVxdWVzdC5wcm90b3R5cGU9e3NldEFkV2lsbEF1dG9QbGF5Om5vb3BGdW5jLHNldEFkV2lsbFBsYXlNdXRlZDpub29wRnVuYyxzZXRDb250aW51b3VzUGxheWJhY2s6bm9vcEZ1bmN9O3ZhciBBZFBvZEluZm89ZnVuY3Rpb24oKXt9O0FkUG9kSW5mby5wcm90b3R5cGU9e2dldEFkUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZ2V0SXNCdW1wZXI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2V0TWF4RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4tMX0sZ2V0UG9kSW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZ2V0VGltZU9mZnNldDpmdW5jdGlvbigpe3JldHVybiAwfSxnZXRUb3RhbEFkczpmdW5jdGlvbigpe3JldHVybiAxfX07dmFyIEFkPWZ1bmN0aW9uKCl7fTtBZC5wcm90b3R5cGU9e3BpOm5ldyBBZFBvZEluZm8sZ2V0QWRJZDpmdW5jdGlvbigpe3JldHVybiIifSxnZXRBZFBvZEluZm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5waX0sZ2V0QWRTeXN0ZW06ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0QWR2ZXJ0aXNlck5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0QXBpRnJhbWV3b3JrOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGdldENvbXBhbmlvbkFkczpmdW5jdGlvbigpe3JldHVybltdfSxnZXRDb250ZW50VHlwZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXRDcmVhdGl2ZUFkSWQ6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RGVhbElkOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldERlc2NyaXB0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDguNX0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldE1lZGlhVXJsOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGdldE1pblN1Z2dlc3RlZER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuLTJ9LGdldFNraXBUaW1lT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuLTF9LGdldFN1cnZleVVybDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxnZXRUaXRsZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXRUcmFmZmlja2luZ1BhcmFtZXRlcnNTdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0VWlFbGVtZW50czpmdW5jdGlvbigpe3JldHVyblsiIl19LGdldFVuaXZlcnNhbEFkSWRSZWdpc3RyeTpmdW5jdGlvbigpe3JldHVybiJ1bmtub3duIn0sZ2V0VW5pdmVyc2FsQWRJZHM6ZnVuY3Rpb24oKXtyZXR1cm5bIiJdfSxnZXRVbml2ZXJzYWxBZElkVmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4idW5rbm93biJ9LGdldFZhc3RNZWRpYUJpdHJhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZ2V0VmFzdE1lZGlhSGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldFZhc3RNZWRpYVdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldFdyYXBwZXJBZElkczpmdW5jdGlvbigpe3JldHVyblsiIl19LGdldFdyYXBwZXJBZFN5c3RlbXM6ZnVuY3Rpb24oKXtyZXR1cm5bIiJdfSxnZXRXcmFwcGVyQ3JlYXRpdmVJZHM6ZnVuY3Rpb24oKXtyZXR1cm5bIiJdfSxpc0xpbmVhcjpmdW5jdGlvbigpe3JldHVybiEwfSxpc1NraXBwYWJsZTpmdW5jdGlvbigpe3JldHVybiEwfX07dmFyIENvbXBhbmlvbkFkPWZ1bmN0aW9uKCl7fTtDb21wYW5pb25BZC5wcm90b3R5cGU9e2dldEFkU2xvdElkOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0Q29udGVudFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIDF9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDF9fTt2YXIgQWRFcnJvcj1mdW5jdGlvbih0eXBlLGNvZGUsdmFzdCxtZXNzYWdlLGFkc1JlcXVlc3QsdXNlclJlcXVlc3RDb250ZXh0KXt0aGlzLmVycm9yQ29kZT1jb2RlLHRoaXMubWVzc2FnZT1tZXNzYWdlLHRoaXMudHlwZT10eXBlLHRoaXMuYWRzUmVxdWVzdD1hZHNSZXF1ZXN0LHRoaXMudXNlclJlcXVlc3RDb250ZXh0PXVzZXJSZXF1ZXN0Q29udGV4dCx0aGlzLmdldEVycm9yQ29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sdGhpcy5nZXRJbm5lckVycm9yPWZ1bmN0aW9uKCl7fSx0aGlzLmdldE1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZXNzYWdlfSx0aGlzLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfSx0aGlzLmdldFZhc3RFcnJvckNvZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YXN0RXJyb3JDb2RlfSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkFkRXJyb3IgIi5jb25jYXQodGhpcy5lcnJvckNvZGUsIjogIikuY29uY2F0KHRoaXMubWVzc2FnZSl9fTtBZEVycm9yLkVycm9yQ29kZT17fSxBZEVycm9yLlR5cGU9e307dmFyIGN1cnJlbnRBZD1mdW5jdGlvbigpe3RyeXtmb3IodmFyIF9pMz0wLF9PYmplY3QkdmFsdWVzPU9iamVjdC52YWx1ZXMod2luZG93LnZpZGlibGUuX2dldENvbnRleHRzKCkpO19pMzxfT2JqZWN0JHZhbHVlcy5sZW5ndGg7X2kzKyspe3ZhciBfY3R4JGdldFBsYXllcixfY3R4JGdldFBsYXllciRkaXY7aWYobnVsbCE9PShfY3R4JGdldFBsYXllcj1fT2JqZWN0JHZhbHVlc1tfaTNdLmdldFBsYXllcigpKSYmdm9pZCAwIT09X2N0eCRnZXRQbGF5ZXImJm51bGwhPT0oX2N0eCRnZXRQbGF5ZXIkZGl2PV9jdHgkZ2V0UGxheWVyLmRpdikmJnZvaWQgMCE9PV9jdHgkZ2V0UGxheWVyJGRpdiYmX2N0eCRnZXRQbGF5ZXIkZGl2LmlubmVySFRNTC5pbmNsdWRlcygid3d3LmVuZ2FkZ2V0LmNvbSIpKXJldHVybiEwfX1jYXRjaChlKXt9cmV0dXJuITF9KCk/dm9pZCAwOm5ldyBBZCxBZEV2ZW50PWZ1bmN0aW9uKHR5cGUpe3RoaXMudHlwZT10eXBlfTtBZEV2ZW50LnByb3RvdHlwZT17Z2V0QWQ6ZnVuY3Rpb24oKXtyZXR1cm4gY3VycmVudEFkfSxnZXRBZERhdGE6ZnVuY3Rpb24oKXt9fSxBZEV2ZW50LlR5cGU9e0FEX0JSRUFLX1JFQURZOiJhZEJyZWFrUmVhZHkiLEFEX0JVRkZFUklORzoiYWRCdWZmZXJpbmciLEFEX0NBTl9QTEFZOiJhZENhblBsYXkiLEFEX01FVEFEQVRBOiJhZE1ldGFkYXRhIixBRF9QUk9HUkVTUzoiYWRQcm9ncmVzcyIsQUxMX0FEU19DT01QTEVURUQ6ImFsbEFkc0NvbXBsZXRlZCIsQ0xJQ0s6ImNsaWNrIixDT01QTEVURToiY29tcGxldGUiLENPTlRFTlRfUEFVU0VfUkVRVUVTVEVEOiJjb250ZW50UGF1c2VSZXF1ZXN0ZWQiLENPTlRFTlRfUkVTVU1FX1JFUVVFU1RFRDoiY29udGVudFJlc3VtZVJlcXVlc3RlZCIsRFVSQVRJT05fQ0hBTkdFOiJkdXJhdGlvbkNoYW5nZSIsRVhQQU5ERURfQ0hBTkdFRDoiZXhwYW5kZWRDaGFuZ2VkIixGSVJTVF9RVUFSVElMRToiZmlyc3RRdWFydGlsZSIsSU1QUkVTU0lPTjoiaW1wcmVzc2lvbiIsSU5URVJBQ1RJT046ImludGVyYWN0aW9uIixMSU5FQVJfQ0hBTkdFOiJsaW5lYXJDaGFuZ2UiLExJTkVBUl9DSEFOR0VEOiJsaW5lYXJDaGFuZ2VkIixMT0FERUQ6ImxvYWRlZCIsTE9HOiJsb2ciLE1JRFBPSU5UOiJtaWRwb2ludCIsUEFVU0VEOiJwYXVzZSIsUkVTVU1FRDoicmVzdW1lIixTS0lQUEFCTEVfU1RBVEVfQ0hBTkdFRDoic2tpcHBhYmxlU3RhdGVDaGFuZ2VkIixTS0lQUEVEOiJza2lwIixTVEFSVEVEOiJzdGFydCIsVEhJUkRfUVVBUlRJTEU6InRoaXJkUXVhcnRpbGUiLFVTRVJfQ0xPU0U6InVzZXJDbG9zZSIsVklERU9fQ0xJQ0tFRDoidmlkZW9DbGlja2VkIixWSURFT19JQ09OX0NMSUNLRUQ6InZpZGVvSWNvbkNsaWNrZWQiLFZJRVdBQkxFX0lNUFJFU1NJT046InZpZXdhYmxlX2ltcHJlc3Npb24iLFZPTFVNRV9DSEFOR0VEOiJ2b2x1bWVDaGFuZ2UiLFZPTFVNRV9NVVRFRDoibXV0ZSJ9O3ZhciBBZEVycm9yRXZlbnQ9ZnVuY3Rpb24oZXJyb3Ipe3RoaXMuZXJyb3I9ZXJyb3IsdGhpcy50eXBlPSJhZEVycm9yIix0aGlzLmdldEVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3J9LHRoaXMuZ2V0VXNlclJlcXVlc3RDb250ZXh0PWZ1bmN0aW9uKCl7dmFyIF90aGlzJGVycm9yO3JldHVybiBudWxsIT09KF90aGlzJGVycm9yPXRoaXMuZXJyb3IpJiZ2b2lkIDAhPT1fdGhpcyRlcnJvciYmX3RoaXMkZXJyb3IudXNlclJlcXVlc3RDb250ZXh0P3RoaXMuZXJyb3IudXNlclJlcXVlc3RDb250ZXh0Ont9fX07QWRFcnJvckV2ZW50LlR5cGU9e0FEX0VSUk9SOiJhZEVycm9yIn07dmFyIEN1c3RvbUNvbnRlbnRMb2FkZWRFdmVudD1mdW5jdGlvbigpe307Q3VzdG9tQ29udGVudExvYWRlZEV2ZW50LlR5cGU9e0NVU1RPTV9DT05URU5UX0xPQURFRDoiZGVwcmVjYXRlZC1ldmVudCJ9O3ZhciBDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzPWZ1bmN0aW9uKCl7fTtDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzLkNyZWF0aXZlVHlwZT17QUxMOiJBbGwiLEZMQVNIOiJGbGFzaCIsSU1BR0U6IkltYWdlIn0sQ29tcGFuaW9uQWRTZWxlY3Rpb25TZXR0aW5ncy5SZXNvdXJjZVR5cGU9e0FMTDoiQWxsIixIVE1MOiJIdG1sIixJRlJBTUU6IklGcmFtZSIsU1RBVElDOiJTdGF0aWMifSxDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzLlNpemVDcml0ZXJpYT17SUdOT1JFOiJJZ25vcmVTaXplIixTRUxFQ1RfRVhBQ1RfTUFUQ0g6IlNlbGVjdEV4YWN0TWF0Y2giLFNFTEVDVF9ORUFSX01BVENIOiJTZWxlY3ROZWFyTWF0Y2gifTt2YXIgQWRDdWVQb2ludHM9ZnVuY3Rpb24oKXt9O0FkQ3VlUG9pbnRzLnByb3RvdHlwZT17Z2V0Q3VlUG9pbnRzOmZ1bmN0aW9uKCl7cmV0dXJuW119LGdldEFkSWRSZWdpc3RyeTpmdW5jdGlvbigpe3JldHVybiIifSxnZXRBZElzVmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn19O3ZhciBBZFByb2dyZXNzRGF0YT1ub29wRnVuYztPYmplY3QuYXNzaWduKGltYSx7QWRDdWVQb2ludHM6QWRDdWVQb2ludHMsQWREaXNwbGF5Q29udGFpbmVyOkFkRGlzcGxheUNvbnRhaW5lcixBZEVycm9yOkFkRXJyb3IsQWRFcnJvckV2ZW50OkFkRXJyb3JFdmVudCxBZEV2ZW50OkFkRXZlbnQsQWRQb2RJbmZvOkFkUG9kSW5mbyxBZFByb2dyZXNzRGF0YTpBZFByb2dyZXNzRGF0YSxBZHNMb2FkZXI6QWRzTG9hZGVyLEFkc01hbmFnZXI6bWFuYWdlcixBZHNNYW5hZ2VyTG9hZGVkRXZlbnQ6QWRzTWFuYWdlckxvYWRlZEV2ZW50LEFkc1JlbmRlcmluZ1NldHRpbmdzOkFkc1JlbmRlcmluZ1NldHRpbmdzLEFkc1JlcXVlc3Q6QWRzUmVxdWVzdCxDb21wYW5pb25BZDpDb21wYW5pb25BZCxDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzOkNvbXBhbmlvbkFkU2VsZWN0aW9uU2V0dGluZ3MsQ3VzdG9tQ29udGVudExvYWRlZEV2ZW50OkN1c3RvbUNvbnRlbnRMb2FkZWRFdmVudCxncHRQcm94eUluc3RhbmNlOnt9LEltYVNka1NldHRpbmdzOkltYVNka1NldHRpbmdzLE9taWRBY2Nlc3NNb2RlOntET01BSU46ImRvbWFpbiIsRlVMTDoiZnVsbCIsTElNSVRFRDoibGltaXRlZCJ9LHNldHRpbmdzOm5ldyBJbWFTZGtTZXR0aW5ncyxVaUVsZW1lbnRzOntBRF9BVFRSSUJVVElPTjoiYWRBdHRyaWJ1dGlvbiIsQ09VTlRET1dOOiJjb3VudGRvd24ifSxVbml2ZXJzYWxBZElkSW5mbzpmdW5jdGlvbigpe30sVkVSU0lPTjoiMy40NTMuMCIsVmlld01vZGU6e0ZVTExTQ1JFRU46ImZ1bGxzY3JlZW4iLE5PUk1BTDoibm9ybWFsIn19KSx3aW5kb3cuZ29vZ2xlfHwod2luZG93Lmdvb2dsZT17fSksd2luZG93Lmdvb2dsZS5pbWE9aW1hLGZ1bmN0aW9uKHNvdXJjZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6Imdvb2dsZS1pbWEzIixhcmdzOltdfSxbXSk7" }, { "title": "googlesyndication-adsbygoogle", @@ -239,7 +239,7 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7d2luZG93LmFkc2J5Z29vZ2xlPXtsb2FkZWQ6ITAscHVzaDpmdW5jdGlvbihhcmcpe2lmKHZvaWQgMD09PXRoaXMubGVuZ3RoJiYodGhpcy5sZW5ndGg9MCx0aGlzLmxlbmd0aCs9MSksbnVsbCE9PWFyZyYmYXJnIGluc3RhbmNlb2YgT2JqZWN0JiYiT2JqZWN0Ij09PWFyZy5jb25zdHJ1Y3Rvci5uYW1lKWZvcih2YXIgX2k9MCxfT2JqZWN0JGtleXM9T2JqZWN0LmtleXMoYXJnKTtfaTxfT2JqZWN0JGtleXMubGVuZ3RoO19pKyspe3ZhciBrZXk9X09iamVjdCRrZXlzW19pXTtpZigiZnVuY3Rpb24iPT10eXBlb2YgYXJnW2tleV0pdHJ5e2FyZ1trZXldLmNhbGwodGhpcyx7fSl9Y2F0Y2goX3VudXNlZCl7fX19fTtmb3IodmFyIGFkRWxlbXM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmFkc2J5Z29vZ2xlIiksY3NzPSJoZWlnaHQ6MXB4IWltcG9ydGFudDttYXgtaGVpZ2h0OjFweCFpbXBvcnRhbnQ7bWF4LXdpZHRoOjFweCFpbXBvcnRhbnQ7d2lkdGg6MXB4IWltcG9ydGFudDsiLGV4ZWN1dGVkPSExLGk9MDtpPGFkRWxlbXMubGVuZ3RoO2krPTEpe3ZhciBhZEVsZW1DaGlsZE5vZGVzPWFkRWxlbXNbaV0uY2hpbGROb2RlcyxjaGlsZE5vZGVzUXVhbnRpdHk9YWRFbGVtQ2hpbGROb2Rlcy5sZW5ndGgsYXJlSWZyYW1lc0RlZmluZWQ9ITE7aWYoY2hpbGROb2Rlc1F1YW50aXR5PjAmJihhcmVJZnJhbWVzRGVmaW5lZD0yPT09Y2hpbGROb2Rlc1F1YW50aXR5JiYiaWZyYW1lIj09PWFkRWxlbUNoaWxkTm9kZXNbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmYWRFbGVtQ2hpbGROb2Rlc1swXS5pZC5pbmRleE9mKCJhc3dpZnRfIik+LTEmJiJpZnJhbWUiPT09YWRFbGVtQ2hpbGROb2Rlc1sxXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZhZEVsZW1DaGlsZE5vZGVzWzFdLmlkLmluZGV4T2YoImdvb2dsZV9hZHNfaWZyYW1lXyIpPi0xKSwhYXJlSWZyYW1lc0RlZmluZWQpe2FkRWxlbXNbaV0uc2V0QXR0cmlidXRlKCJkYXRhLWFkc2J5Z29vZ2xlLXN0YXR1cyIsImRvbmUiKTt2YXIgYXN3aWZ0SWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Fzd2lmdElmcmFtZS5pZD0iIi5jb25jYXQoImFzd2lmdF8iKS5jb25jYXQoaSksYXN3aWZ0SWZyYW1lLnN0eWxlPWNzcyxhZEVsZW1zW2ldLmFwcGVuZENoaWxkKGFzd2lmdElmcmFtZSk7dmFyIGlubmVyQXN3aWZ0SWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Fzd2lmdElmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW5uZXJBc3dpZnRJZnJhbWUpO3ZhciBnb29nbGVhZHNJZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Z29vZ2xlYWRzSWZyYW1lLmlkPSIiLmNvbmNhdCgiZ29vZ2xlX2Fkc19pZnJhbWVfIikuY29uY2F0KGkpLGdvb2dsZWFkc0lmcmFtZS5zdHlsZT1jc3MsYWRFbGVtc1tpXS5hcHBlbmRDaGlsZChnb29nbGVhZHNJZnJhbWUpO3ZhciBpbm5lckdvb2dsZWFkc0lmcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnb29nbGVhZHNJZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlubmVyR29vZ2xlYWRzSWZyYW1lKSxleGVjdXRlZD0hMH19ZXhlY3V0ZWQmJmZ1bmN0aW9uKHNvdXJjZSxtZXNzYWdlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX12YXIgTE9HX01BUktFUj0ibG9nOiAiO21lc3NhZ2UmJigtMT09PW1lc3NhZ2UuaW5kZXhPZihMT0dfTUFSS0VSKT9sb2coIiIuY29uY2F0KHByZWZpeCwiIG1lc3NhZ2U6XG4iKS5jb25jYXQobWVzc2FnZSkpOmxvZyhtZXNzYWdlLnNsaWNlKExPR19NQVJLRVIubGVuZ3RoKSkpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJnb29nbGVzeW5kaWNhdGlvbi1hZHNieWdvb2dsZSIsYXJnczpbXX0sW10pOw==" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7d2luZG93LmFkc2J5Z29vZ2xlPXtsb2FkZWQ6ITAscHVzaDpmdW5jdGlvbihhcmcpe2lmKHZvaWQgMD09PXRoaXMubGVuZ3RoJiYodGhpcy5sZW5ndGg9MCx0aGlzLmxlbmd0aCs9MSksbnVsbCE9PWFyZyYmYXJnIGluc3RhbmNlb2YgT2JqZWN0JiYiT2JqZWN0Ij09PWFyZy5jb25zdHJ1Y3Rvci5uYW1lKWZvcih2YXIgX2k9MCxfT2JqZWN0JGtleXM9T2JqZWN0LmtleXMoYXJnKTtfaTxfT2JqZWN0JGtleXMubGVuZ3RoO19pKyspe3ZhciBrZXk9X09iamVjdCRrZXlzW19pXTtpZigiZnVuY3Rpb24iPT10eXBlb2YgYXJnW2tleV0pdHJ5e2FyZ1trZXldLmNhbGwodGhpcyx7fSl9Y2F0Y2goX3VudXNlZCl7fX19fTtmb3IodmFyIGFkRWxlbXM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmFkc2J5Z29vZ2xlIiksY3NzPSJoZWlnaHQ6MXB4IWltcG9ydGFudDttYXgtaGVpZ2h0OjFweCFpbXBvcnRhbnQ7bWF4LXdpZHRoOjFweCFpbXBvcnRhbnQ7d2lkdGg6MXB4IWltcG9ydGFudDsiLGV4ZWN1dGVkPSExLGk9MDtpPGFkRWxlbXMubGVuZ3RoO2krPTEpe3ZhciBhZEVsZW1DaGlsZE5vZGVzPWFkRWxlbXNbaV0uY2hpbGROb2RlcyxjaGlsZE5vZGVzUXVhbnRpdHk9YWRFbGVtQ2hpbGROb2Rlcy5sZW5ndGgsYXJlSWZyYW1lc0RlZmluZWQ9ITE7aWYoY2hpbGROb2Rlc1F1YW50aXR5PjAmJihhcmVJZnJhbWVzRGVmaW5lZD0yPT09Y2hpbGROb2Rlc1F1YW50aXR5JiYiaWZyYW1lIj09PWFkRWxlbUNoaWxkTm9kZXNbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmYWRFbGVtQ2hpbGROb2Rlc1swXS5pZC5pbmRleE9mKCJhc3dpZnRfIik+LTEmJiJpZnJhbWUiPT09YWRFbGVtQ2hpbGROb2Rlc1sxXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZhZEVsZW1DaGlsZE5vZGVzWzFdLmlkLmluZGV4T2YoImdvb2dsZV9hZHNfaWZyYW1lXyIpPi0xKSwhYXJlSWZyYW1lc0RlZmluZWQpe2FkRWxlbXNbaV0uc2V0QXR0cmlidXRlKCJkYXRhLWFkc2J5Z29vZ2xlLXN0YXR1cyIsImRvbmUiKTt2YXIgYXN3aWZ0SWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Fzd2lmdElmcmFtZS5pZD0iIi5jb25jYXQoImFzd2lmdF8iKS5jb25jYXQoaSksYXN3aWZ0SWZyYW1lLnN0eWxlPWNzcyxhZEVsZW1zW2ldLmFwcGVuZENoaWxkKGFzd2lmdElmcmFtZSk7dmFyIGlubmVyQXN3aWZ0SWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Fzd2lmdElmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW5uZXJBc3dpZnRJZnJhbWUpO3ZhciBnb29nbGVhZHNJZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Z29vZ2xlYWRzSWZyYW1lLmlkPSIiLmNvbmNhdCgiZ29vZ2xlX2Fkc19pZnJhbWVfIikuY29uY2F0KGkpLGdvb2dsZWFkc0lmcmFtZS5zdHlsZT1jc3MsYWRFbGVtc1tpXS5hcHBlbmRDaGlsZChnb29nbGVhZHNJZnJhbWUpO3ZhciBpbm5lckdvb2dsZWFkc0lmcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnb29nbGVhZHNJZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlubmVyR29vZ2xlYWRzSWZyYW1lKSxleGVjdXRlZD0hMH19ZXhlY3V0ZWQmJmZ1bmN0aW9uKHNvdXJjZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6Imdvb2dsZXN5bmRpY2F0aW9uLWFkc2J5Z29vZ2xlIixhcmdzOltdfSxbXSk7" }, { "title": "googletagservices-gpt", @@ -249,35 +249,35 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31mdW5jdGlvbiBub29wVGhpcygpe3JldHVybiB0aGlzfWZ1bmN0aW9uIG5vb3BOdWxsKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gbm9vcEFycmF5KCl7cmV0dXJuW119ZnVuY3Rpb24gbm9vcFN0cigpe3JldHVybiIifWZ1bmN0aW9uIHRydWVGdW5jKCl7cmV0dXJuITB9Y29uc3QgdXBkYXRlZEFyZ3M9YXJncz9bXS5jb25jYXQoc291cmNlKS5jb25jYXQoYXJncyk6W3NvdXJjZV07dHJ5eyhmdW5jdGlvbihzb3VyY2Upe3ZhciBzbG90cz1uZXcgTWFwLHNsb3RzQnlJZD1uZXcgTWFwLGV2ZW50Q2FsbGJhY2tzPW5ldyBNYXAsYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihuYW1lLGxpc3RlbmVyKXtyZXR1cm4gZXZlbnRDYWxsYmFja3MuaGFzKG5hbWUpfHxldmVudENhbGxiYWNrcy5zZXQobmFtZSxuZXcgU2V0KSxldmVudENhbGxiYWNrcy5nZXQobmFtZSkuYWRkKGxpc3RlbmVyKSx0aGlzfSxyZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKG5hbWUsbGlzdGVuZXIpe3JldHVybiEhZXZlbnRDYWxsYmFja3MuaGFzKG5hbWUpJiZldmVudENhbGxiYWNrcy5nZXQobmFtZSkuZGVsZXRlKGxpc3RlbmVyKX0sZmlyZVNsb3RFdmVudD1mdW5jdGlvbihuYW1lLHNsb3Qpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe2Zvcih2YXIgc2l6ZT1bMCwwXSxjYWxsYmFja3NTZXQ9ZXZlbnRDYWxsYmFja3MuZ2V0KG5hbWUpfHxbXSxjYWxsYmFja0FycmF5PUFycmF5LmZyb20oY2FsbGJhY2tzU2V0KSxpPTA7aTxjYWxsYmFja0FycmF5Lmxlbmd0aDtpKz0xKWNhbGxiYWNrQXJyYXlbaV0oe2lzRW1wdHk6ITAsc2l6ZTpzaXplLHNsb3Q6c2xvdH0pO3Jlc29sdmUoKX0pKX0pKX0sY29tcGFuaW9uQWRzU2VydmljZT17YWRkRXZlbnRMaXN0ZW5lcjphZGRFdmVudExpc3RlbmVyLHJlbW92ZUV2ZW50TGlzdGVuZXI6cmVtb3ZlRXZlbnRMaXN0ZW5lcixlbmFibGVTeW5jTG9hZGluZzpub29wRnVuYyxzZXRSZWZyZXNoVW5maWxsZWRTbG90czpub29wRnVuYyxnZXRTbG90czpub29wQXJyYXl9LGNvbnRlbnRTZXJ2aWNlPXthZGRFdmVudExpc3RlbmVyOmFkZEV2ZW50TGlzdGVuZXIscmVtb3ZlRXZlbnRMaXN0ZW5lcjpyZW1vdmVFdmVudExpc3RlbmVyLHNldENvbnRlbnQ6bm9vcEZ1bmN9O2Z1bmN0aW9uIFBhc3NiYWNrU2xvdCgpe31mdW5jdGlvbiBTaXplTWFwcGluZ0J1aWxkZXIoKXt9ZnVuY3Rpb24gU2xvdChhZFVuaXRQYXRoLGNyZWF0aXZlcyxvcHREaXYpe3ZhciBfZG9jdW1lbnQkZ2V0RWxlbWVudEI7aWYodGhpcy5hZFVuaXRQYXRoPWFkVW5pdFBhdGgsdGhpcy5jcmVhdGl2ZXM9Y3JlYXRpdmVzLHRoaXMub3B0RGl2PW9wdERpdixzbG90c0J5SWQuaGFzKG9wdERpdikpcmV0dXJuIG51bGw9PT0oX2RvY3VtZW50JGdldEVsZW1lbnRCPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9wdERpdikpfHx2b2lkIDA9PT1fZG9jdW1lbnQkZ2V0RWxlbWVudEJ8fF9kb2N1bWVudCRnZXRFbGVtZW50Qi5yZW1vdmUoKSxzbG90c0J5SWQuZ2V0KG9wdERpdik7c2xvdHNCeUlkLnNldChvcHREaXYsdGhpcyl9UGFzc2JhY2tTbG90LnByb3RvdHlwZS5kaXNwbGF5PW5vb3BGdW5jLFBhc3NiYWNrU2xvdC5wcm90b3R5cGUuZ2V0PW5vb3BOdWxsLFBhc3NiYWNrU2xvdC5wcm90b3R5cGUuc2V0PW5vb3BUaGlzLFBhc3NiYWNrU2xvdC5wcm90b3R5cGUuc2V0Q2xpY2tVcmw9bm9vcFRoaXMsUGFzc2JhY2tTbG90LnByb3RvdHlwZS5zZXRUYWdGb3JDaGlsZERpcmVjdGVkVHJlYXRtZW50PW5vb3BUaGlzLFBhc3NiYWNrU2xvdC5wcm90b3R5cGUuc2V0VGFyZ2V0aW5nPW5vb3BUaGlzLFBhc3NiYWNrU2xvdC5wcm90b3R5cGUudXBkYXRlVGFyZ2V0aW5nRnJvbU1hcD1ub29wVGhpcyxTaXplTWFwcGluZ0J1aWxkZXIucHJvdG90eXBlLmFkZFNpemU9bm9vcFRoaXMsU2l6ZU1hcHBpbmdCdWlsZGVyLnByb3RvdHlwZS5idWlsZD1ub29wTnVsbCxTbG90LnByb3RvdHlwZS5hZGRTZXJ2aWNlPW5vb3BUaGlzLFNsb3QucHJvdG90eXBlLmNsZWFyQ2F0ZWdvcnlFeGNsdXNpb25zPW5vb3BUaGlzLFNsb3QucHJvdG90eXBlLmNsZWFyVGFyZ2V0aW5nPW5vb3BUaGlzLFNsb3QucHJvdG90eXBlLmRlZmluZVNpemVNYXBwaW5nPW5vb3BUaGlzLFNsb3QucHJvdG90eXBlLmdldD1ub29wTnVsbCxTbG90LnByb3RvdHlwZS5nZXRBZFVuaXRQYXRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRVbml0UGF0aH0sU2xvdC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlS2V5cz1ub29wQXJyYXksU2xvdC5wcm90b3R5cGUuZ2V0Q2F0ZWdvcnlFeGNsdXNpb25zPW5vb3BBcnJheSxTbG90LnByb3RvdHlwZS5nZXREb21JZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdERpdn0sU2xvdC5wcm90b3R5cGUuZ2V0U2xvdEVsZW1lbnRJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdERpdn0sU2xvdC5wcm90b3R5cGUuZ2V0U2xvdElkPW5vb3BUaGlzLFNsb3QucHJvdG90eXBlLmdldFNpemVzPW5vb3BBcnJheSxTbG90LnByb3RvdHlwZS5nZXRUYXJnZXRpbmc9bm9vcEFycmF5LFNsb3QucHJvdG90eXBlLmdldFRhcmdldGluZ0tleXM9bm9vcEFycmF5LFNsb3QucHJvdG90eXBlLnNldD1ub29wVGhpcyxTbG90LnByb3RvdHlwZS5zZXRDYXRlZ29yeUV4Y2x1c2lvbj1ub29wVGhpcyxTbG90LnByb3RvdHlwZS5zZXRDbGlja1VybD1ub29wVGhpcyxTbG90LnByb3RvdHlwZS5zZXRDb2xsYXBzZUVtcHR5RGl2PW5vb3BUaGlzLFNsb3QucHJvdG90eXBlLnNldFRhcmdldGluZz1ub29wVGhpczt2YXIgcHViQWRzU2VydmljZT17YWRkRXZlbnRMaXN0ZW5lcjphZGRFdmVudExpc3RlbmVyLHJlbW92ZUV2ZW50TGlzdGVuZXI6cmVtb3ZlRXZlbnRMaXN0ZW5lcixjbGVhcjpub29wRnVuYyxjbGVhckNhdGVnb3J5RXhjbHVzaW9uczpub29wVGhpcyxjbGVhclRhZ0ZvckNoaWxkRGlyZWN0ZWRUcmVhdG1lbnQ6bm9vcFRoaXMsY2xlYXJUYXJnZXRpbmc6bm9vcFRoaXMsY29sbGFwc2VFbXB0eURpdnM6bm9vcEZ1bmMsZGVmaW5lT3V0T2ZQYWdlUGFzc2JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFBhc3NiYWNrU2xvdH0sZGVmaW5lUGFzc2JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFBhc3NiYWNrU2xvdH0sZGlzYWJsZUluaXRpYWxMb2FkOm5vb3BGdW5jLGRpc3BsYXk6bm9vcEZ1bmMsZW5hYmxlQXN5bmNSZW5kZXJpbmc6bm9vcEZ1bmMsZW5hYmxlTGF6eUxvYWQ6bm9vcEZ1bmMsZW5hYmxlU2luZ2xlUmVxdWVzdDpub29wRnVuYyxlbmFibGVTeW5jUmVuZGVyaW5nOm5vb3BGdW5jLGVuYWJsZVZpZGVvQWRzOm5vb3BGdW5jLGdldDpub29wTnVsbCxnZXRBdHRyaWJ1dGVLZXlzOm5vb3BBcnJheSxnZXRUYXJnZXRpbmc6bm9vcEFycmF5LGdldFRhcmdldGluZ0tleXM6bm9vcEFycmF5LGdldFNsb3RzOm5vb3BBcnJheSxpc0luaXRpYWxMb2FkRGlzYWJsZWQ6dHJ1ZUZ1bmMscmVmcmVzaDpub29wRnVuYyxzZXQ6bm9vcFRoaXMsc2V0Q2F0ZWdvcnlFeGNsdXNpb246bm9vcFRoaXMsc2V0Q2VudGVyaW5nOm5vb3BGdW5jLHNldENvb2tpZU9wdGlvbnM6bm9vcFRoaXMsc2V0Rm9yY2VTYWZlRnJhbWU6bm9vcFRoaXMsc2V0TG9jYXRpb246bm9vcFRoaXMsc2V0UHVibGlzaGVyUHJvdmlkZWRJZDpub29wVGhpcyxzZXRSZXF1ZXN0Tm9uUGVyc29uYWxpemVkQWRzOm5vb3BUaGlzLHNldFNhZmVGcmFtZUNvbmZpZzpub29wVGhpcyxzZXRUYWdGb3JDaGlsZERpcmVjdGVkVHJlYXRtZW50Om5vb3BUaGlzLHNldFRhcmdldGluZzpub29wVGhpcyxzZXRWaWRlb0NvbnRlbnQ6bm9vcFRoaXMsdXBkYXRlQ29ycmVsYXRvcjpub29wRnVuY30sZ2V0TmV3U2xvdD1mdW5jdGlvbihhZFVuaXRQYXRoLGNyZWF0aXZlcyxvcHREaXYpe3JldHVybiBuZXcgU2xvdChhZFVuaXRQYXRoLGNyZWF0aXZlcyxvcHREaXYpfSxfd2luZG93JGdvb2dsZXRhZz13aW5kb3cuZ29vZ2xldGFnLGdvb2dsZXRhZz12b2lkIDA9PT1fd2luZG93JGdvb2dsZXRhZz97fTpfd2luZG93JGdvb2dsZXRhZyxfZ29vZ2xldGFnJGNtZD1nb29nbGV0YWcuY21kLGNtZD12b2lkIDA9PT1fZ29vZ2xldGFnJGNtZD9bXTpfZ29vZ2xldGFnJGNtZDtmb3IoZ29vZ2xldGFnLmFwaVJlYWR5PSEwLGdvb2dsZXRhZy5jbWQ9W10sZ29vZ2xldGFnLmNtZC5wdXNoPWZ1bmN0aW9uKGEpe3RyeXthKCl9Y2F0Y2goZXgpe31yZXR1cm4gMX0sZ29vZ2xldGFnLmNvbXBhbmlvbkFkcz1mdW5jdGlvbigpe3JldHVybiBjb21wYW5pb25BZHNTZXJ2aWNlfSxnb29nbGV0YWcuY29udGVudD1mdW5jdGlvbigpe3JldHVybiBjb250ZW50U2VydmljZX0sZ29vZ2xldGFnLmRlZmluZU91dE9mUGFnZVNsb3Q9Z2V0TmV3U2xvdCxnb29nbGV0YWcuZGVmaW5lU2xvdD1nZXROZXdTbG90LGdvb2dsZXRhZy5kZXN0cm95U2xvdHM9ZnVuY3Rpb24oKXtzbG90cy5jbGVhcigpLHNsb3RzQnlJZC5jbGVhcigpfSxnb29nbGV0YWcuZGlzYWJsZVB1Ymxpc2hlckNvbnNvbGU9bm9vcEZ1bmMsZ29vZ2xldGFnLmRpc3BsYXk9ZnVuY3Rpb24oYXJnKXt2YXIgaWQ7aWQ9bnVsbCE9YXJnJiZhcmcuZ2V0U2xvdEVsZW1lbnRJZD9hcmcuZ2V0U2xvdEVsZW1lbnRJZCgpOm51bGwhPWFyZyYmYXJnLm5vZGVUeXBlP2FyZy5pZDpTdHJpbmcoYXJnKSxmdW5jdGlvbihzbG90KXtpZihzbG90KXt2YXIgaWQ9c2xvdC5nZXRTbG90RWxlbWVudElkKCk7aWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKXt2YXIgcGFyZW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtwYXJlbnQmJnBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSksZmlyZVNsb3RFdmVudCgic2xvdFJlbmRlckVuZGVkIixzbG90KSxmaXJlU2xvdEV2ZW50KCJzbG90UmVxdWVzdGVkIixzbG90KSxmaXJlU2xvdEV2ZW50KCJzbG90UmVzcG9uc2VSZWNlaXZlZCIsc2xvdCksZmlyZVNsb3RFdmVudCgic2xvdE9ubG9hZCIsc2xvdCksZmlyZVNsb3RFdmVudCgiaW1wcmVzc2lvblZpZXdhYmxlIixzbG90KX19fShzbG90c0J5SWQuZ2V0KGlkKSl9LGdvb2dsZXRhZy5lbmFibGVTZXJ2aWNlcz1ub29wRnVuYyxnb29nbGV0YWcuZ2V0VmVyc2lvbj1ub29wU3RyLGdvb2dsZXRhZy5wdWJhZHM9ZnVuY3Rpb24oKXtyZXR1cm4gcHViQWRzU2VydmljZX0sZ29vZ2xldGFnLnB1YmFkc1JlYWR5PSEwLGdvb2dsZXRhZy5zZXRBZElmcmFtZVRpdGxlPW5vb3BGdW5jLGdvb2dsZXRhZy5zaXplTWFwcGluZz1mdW5jdGlvbigpe3JldHVybiBuZXcgU2l6ZU1hcHBpbmdCdWlsZGVyfSx3aW5kb3cuZ29vZ2xldGFnPWdvb2dsZXRhZzswIT09Y21kLmxlbmd0aDspZ29vZ2xldGFnLmNtZC5wdXNoKGNtZC5zaGlmdCgpKTshZnVuY3Rpb24oc291cmNlLG1lc3NhZ2Upe2lmKCEwPT09c291cmNlLnZlcmJvc2Upe3RyeXt2YXIgbG9nPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdHJhY2U9Y29uc29sZS50cmFjZS5iaW5kKGNvbnNvbGUpLHByZWZpeD1zb3VyY2UucnVsZVRleHR8fCIiO2lmKHNvdXJjZS5kb21haW5OYW1lKXt2YXIgcnVsZVN0YXJ0SW5kZXgsQUdfU0NSSVBUTEVUX01BUktFUj0iIyUjLy8iLFVCT19TQ1JJUFRMRVRfTUFSS0VSPSIjIytqcyI7c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik+LTE/cnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik6c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpKTt2YXIgcnVsZVBhcnQ9c291cmNlLnJ1bGVUZXh0LnNsaWNlKHJ1bGVTdGFydEluZGV4KTtwcmVmaXg9IiIuY29uY2F0KHNvdXJjZS5kb21haW5OYW1lKS5jb25jYXQocnVsZVBhcnQpfXZhciBMT0dfTUFSS0VSPSJsb2c6ICI7bWVzc2FnZSYmKC0xPT09bWVzc2FnZS5pbmRleE9mKExPR19NQVJLRVIpP2xvZygiIi5jb25jYXQocHJlZml4LCIgbWVzc2FnZTpcbiIpLmNvbmNhdChtZXNzYWdlKSk6bG9nKG1lc3NhZ2Uuc2xpY2UoTE9HX01BUktFUi5sZW5ndGgpKSksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6Imdvb2dsZXRhZ3NlcnZpY2VzLWdwdCIsYXJnczpbXX0sW10pOw==" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31mdW5jdGlvbiBub29wVGhpcygpe3JldHVybiB0aGlzfWZ1bmN0aW9uIG5vb3BOdWxsKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gbm9vcEFycmF5KCl7cmV0dXJuW119ZnVuY3Rpb24gbm9vcFN0cigpe3JldHVybiIifWZ1bmN0aW9uIHRydWVGdW5jKCl7cmV0dXJuITB9Y29uc3QgdXBkYXRlZEFyZ3M9YXJncz9bXS5jb25jYXQoc291cmNlKS5jb25jYXQoYXJncyk6W3NvdXJjZV07dHJ5eyhmdW5jdGlvbihzb3VyY2Upe3ZhciBzbG90cz1uZXcgTWFwLHNsb3RzQnlJZD1uZXcgTWFwLGV2ZW50Q2FsbGJhY2tzPW5ldyBNYXAsYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihuYW1lLGxpc3RlbmVyKXtyZXR1cm4gZXZlbnRDYWxsYmFja3MuaGFzKG5hbWUpfHxldmVudENhbGxiYWNrcy5zZXQobmFtZSxuZXcgU2V0KSxldmVudENhbGxiYWNrcy5nZXQobmFtZSkuYWRkKGxpc3RlbmVyKSx0aGlzfSxyZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKG5hbWUsbGlzdGVuZXIpe3JldHVybiEhZXZlbnRDYWxsYmFja3MuaGFzKG5hbWUpJiZldmVudENhbGxiYWNrcy5nZXQobmFtZSkuZGVsZXRlKGxpc3RlbmVyKX0sZmlyZVNsb3RFdmVudD1mdW5jdGlvbihuYW1lLHNsb3Qpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocmVzb2x2ZSl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe2Zvcih2YXIgc2l6ZT1bMCwwXSxjYWxsYmFja3NTZXQ9ZXZlbnRDYWxsYmFja3MuZ2V0KG5hbWUpfHxbXSxjYWxsYmFja0FycmF5PUFycmF5LmZyb20oY2FsbGJhY2tzU2V0KSxpPTA7aTxjYWxsYmFja0FycmF5Lmxlbmd0aDtpKz0xKWNhbGxiYWNrQXJyYXlbaV0oe2lzRW1wdHk6ITAsc2l6ZTpzaXplLHNsb3Q6c2xvdH0pO3Jlc29sdmUoKX0pKX0pKX0sY29tcGFuaW9uQWRzU2VydmljZT17YWRkRXZlbnRMaXN0ZW5lcjphZGRFdmVudExpc3RlbmVyLHJlbW92ZUV2ZW50TGlzdGVuZXI6cmVtb3ZlRXZlbnRMaXN0ZW5lcixlbmFibGVTeW5jTG9hZGluZzpub29wRnVuYyxzZXRSZWZyZXNoVW5maWxsZWRTbG90czpub29wRnVuYyxnZXRTbG90czpub29wQXJyYXl9LGNvbnRlbnRTZXJ2aWNlPXthZGRFdmVudExpc3RlbmVyOmFkZEV2ZW50TGlzdGVuZXIscmVtb3ZlRXZlbnRMaXN0ZW5lcjpyZW1vdmVFdmVudExpc3RlbmVyLHNldENvbnRlbnQ6bm9vcEZ1bmN9O2Z1bmN0aW9uIFBhc3NiYWNrU2xvdCgpe31mdW5jdGlvbiBTaXplTWFwcGluZ0J1aWxkZXIoKXt9ZnVuY3Rpb24gU2xvdChhZFVuaXRQYXRoLGNyZWF0aXZlcyxvcHREaXYpe3ZhciBfZG9jdW1lbnQkZ2V0RWxlbWVudEI7aWYodGhpcy5hZFVuaXRQYXRoPWFkVW5pdFBhdGgsdGhpcy5jcmVhdGl2ZXM9Y3JlYXRpdmVzLHRoaXMub3B0RGl2PW9wdERpdixzbG90c0J5SWQuaGFzKG9wdERpdikpcmV0dXJuIG51bGw9PT0oX2RvY3VtZW50JGdldEVsZW1lbnRCPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9wdERpdikpfHx2b2lkIDA9PT1fZG9jdW1lbnQkZ2V0RWxlbWVudEJ8fF9kb2N1bWVudCRnZXRFbGVtZW50Qi5yZW1vdmUoKSxzbG90c0J5SWQuZ2V0KG9wdERpdik7c2xvdHNCeUlkLnNldChvcHREaXYsdGhpcyl9UGFzc2JhY2tTbG90LnByb3RvdHlwZS5kaXNwbGF5PW5vb3BGdW5jLFBhc3NiYWNrU2xvdC5wcm90b3R5cGUuZ2V0PW5vb3BOdWxsLFBhc3NiYWNrU2xvdC5wcm90b3R5cGUuc2V0PW5vb3BUaGlzLFBhc3NiYWNrU2xvdC5wcm90b3R5cGUuc2V0Q2xpY2tVcmw9bm9vcFRoaXMsUGFzc2JhY2tTbG90LnByb3RvdHlwZS5zZXRUYWdGb3JDaGlsZERpcmVjdGVkVHJlYXRtZW50PW5vb3BUaGlzLFBhc3NiYWNrU2xvdC5wcm90b3R5cGUuc2V0VGFyZ2V0aW5nPW5vb3BUaGlzLFBhc3NiYWNrU2xvdC5wcm90b3R5cGUudXBkYXRlVGFyZ2V0aW5nRnJvbU1hcD1ub29wVGhpcyxTaXplTWFwcGluZ0J1aWxkZXIucHJvdG90eXBlLmFkZFNpemU9bm9vcFRoaXMsU2l6ZU1hcHBpbmdCdWlsZGVyLnByb3RvdHlwZS5idWlsZD1ub29wTnVsbCxTbG90LnByb3RvdHlwZS5hZGRTZXJ2aWNlPW5vb3BUaGlzLFNsb3QucHJvdG90eXBlLmNsZWFyQ2F0ZWdvcnlFeGNsdXNpb25zPW5vb3BUaGlzLFNsb3QucHJvdG90eXBlLmNsZWFyVGFyZ2V0aW5nPW5vb3BUaGlzLFNsb3QucHJvdG90eXBlLmRlZmluZVNpemVNYXBwaW5nPW5vb3BUaGlzLFNsb3QucHJvdG90eXBlLmdldD1ub29wTnVsbCxTbG90LnByb3RvdHlwZS5nZXRBZFVuaXRQYXRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRVbml0UGF0aH0sU2xvdC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlS2V5cz1ub29wQXJyYXksU2xvdC5wcm90b3R5cGUuZ2V0Q2F0ZWdvcnlFeGNsdXNpb25zPW5vb3BBcnJheSxTbG90LnByb3RvdHlwZS5nZXREb21JZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdERpdn0sU2xvdC5wcm90b3R5cGUuZ2V0U2xvdEVsZW1lbnRJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdERpdn0sU2xvdC5wcm90b3R5cGUuZ2V0U2xvdElkPW5vb3BUaGlzLFNsb3QucHJvdG90eXBlLmdldFNpemVzPW5vb3BBcnJheSxTbG90LnByb3RvdHlwZS5nZXRUYXJnZXRpbmc9bm9vcEFycmF5LFNsb3QucHJvdG90eXBlLmdldFRhcmdldGluZ0tleXM9bm9vcEFycmF5LFNsb3QucHJvdG90eXBlLnNldD1ub29wVGhpcyxTbG90LnByb3RvdHlwZS5zZXRDYXRlZ29yeUV4Y2x1c2lvbj1ub29wVGhpcyxTbG90LnByb3RvdHlwZS5zZXRDbGlja1VybD1ub29wVGhpcyxTbG90LnByb3RvdHlwZS5zZXRDb2xsYXBzZUVtcHR5RGl2PW5vb3BUaGlzLFNsb3QucHJvdG90eXBlLnNldFRhcmdldGluZz1ub29wVGhpczt2YXIgcHViQWRzU2VydmljZT17YWRkRXZlbnRMaXN0ZW5lcjphZGRFdmVudExpc3RlbmVyLHJlbW92ZUV2ZW50TGlzdGVuZXI6cmVtb3ZlRXZlbnRMaXN0ZW5lcixjbGVhcjpub29wRnVuYyxjbGVhckNhdGVnb3J5RXhjbHVzaW9uczpub29wVGhpcyxjbGVhclRhZ0ZvckNoaWxkRGlyZWN0ZWRUcmVhdG1lbnQ6bm9vcFRoaXMsY2xlYXJUYXJnZXRpbmc6bm9vcFRoaXMsY29sbGFwc2VFbXB0eURpdnM6bm9vcEZ1bmMsZGVmaW5lT3V0T2ZQYWdlUGFzc2JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFBhc3NiYWNrU2xvdH0sZGVmaW5lUGFzc2JhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFBhc3NiYWNrU2xvdH0sZGlzYWJsZUluaXRpYWxMb2FkOm5vb3BGdW5jLGRpc3BsYXk6bm9vcEZ1bmMsZW5hYmxlQXN5bmNSZW5kZXJpbmc6bm9vcEZ1bmMsZW5hYmxlTGF6eUxvYWQ6bm9vcEZ1bmMsZW5hYmxlU2luZ2xlUmVxdWVzdDpub29wRnVuYyxlbmFibGVTeW5jUmVuZGVyaW5nOm5vb3BGdW5jLGVuYWJsZVZpZGVvQWRzOm5vb3BGdW5jLGdldDpub29wTnVsbCxnZXRBdHRyaWJ1dGVLZXlzOm5vb3BBcnJheSxnZXRUYXJnZXRpbmc6bm9vcEFycmF5LGdldFRhcmdldGluZ0tleXM6bm9vcEFycmF5LGdldFNsb3RzOm5vb3BBcnJheSxpc0luaXRpYWxMb2FkRGlzYWJsZWQ6dHJ1ZUZ1bmMscmVmcmVzaDpub29wRnVuYyxzZXQ6bm9vcFRoaXMsc2V0Q2F0ZWdvcnlFeGNsdXNpb246bm9vcFRoaXMsc2V0Q2VudGVyaW5nOm5vb3BGdW5jLHNldENvb2tpZU9wdGlvbnM6bm9vcFRoaXMsc2V0Rm9yY2VTYWZlRnJhbWU6bm9vcFRoaXMsc2V0TG9jYXRpb246bm9vcFRoaXMsc2V0UHVibGlzaGVyUHJvdmlkZWRJZDpub29wVGhpcyxzZXRSZXF1ZXN0Tm9uUGVyc29uYWxpemVkQWRzOm5vb3BUaGlzLHNldFNhZmVGcmFtZUNvbmZpZzpub29wVGhpcyxzZXRUYWdGb3JDaGlsZERpcmVjdGVkVHJlYXRtZW50Om5vb3BUaGlzLHNldFRhcmdldGluZzpub29wVGhpcyxzZXRWaWRlb0NvbnRlbnQ6bm9vcFRoaXMsdXBkYXRlQ29ycmVsYXRvcjpub29wRnVuY30sZ2V0TmV3U2xvdD1mdW5jdGlvbihhZFVuaXRQYXRoLGNyZWF0aXZlcyxvcHREaXYpe3JldHVybiBuZXcgU2xvdChhZFVuaXRQYXRoLGNyZWF0aXZlcyxvcHREaXYpfSxfd2luZG93JGdvb2dsZXRhZz13aW5kb3cuZ29vZ2xldGFnLGdvb2dsZXRhZz12b2lkIDA9PT1fd2luZG93JGdvb2dsZXRhZz97fTpfd2luZG93JGdvb2dsZXRhZyxfZ29vZ2xldGFnJGNtZD1nb29nbGV0YWcuY21kLGNtZD12b2lkIDA9PT1fZ29vZ2xldGFnJGNtZD9bXTpfZ29vZ2xldGFnJGNtZDtmb3IoZ29vZ2xldGFnLmFwaVJlYWR5PSEwLGdvb2dsZXRhZy5jbWQ9W10sZ29vZ2xldGFnLmNtZC5wdXNoPWZ1bmN0aW9uKGEpe3RyeXthKCl9Y2F0Y2goZXgpe31yZXR1cm4gMX0sZ29vZ2xldGFnLmNvbXBhbmlvbkFkcz1mdW5jdGlvbigpe3JldHVybiBjb21wYW5pb25BZHNTZXJ2aWNlfSxnb29nbGV0YWcuY29udGVudD1mdW5jdGlvbigpe3JldHVybiBjb250ZW50U2VydmljZX0sZ29vZ2xldGFnLmRlZmluZU91dE9mUGFnZVNsb3Q9Z2V0TmV3U2xvdCxnb29nbGV0YWcuZGVmaW5lU2xvdD1nZXROZXdTbG90LGdvb2dsZXRhZy5kZXN0cm95U2xvdHM9ZnVuY3Rpb24oKXtzbG90cy5jbGVhcigpLHNsb3RzQnlJZC5jbGVhcigpfSxnb29nbGV0YWcuZGlzYWJsZVB1Ymxpc2hlckNvbnNvbGU9bm9vcEZ1bmMsZ29vZ2xldGFnLmRpc3BsYXk9ZnVuY3Rpb24oYXJnKXt2YXIgaWQ7aWQ9bnVsbCE9YXJnJiZhcmcuZ2V0U2xvdEVsZW1lbnRJZD9hcmcuZ2V0U2xvdEVsZW1lbnRJZCgpOm51bGwhPWFyZyYmYXJnLm5vZGVUeXBlP2FyZy5pZDpTdHJpbmcoYXJnKSxmdW5jdGlvbihzbG90KXtpZihzbG90KXt2YXIgaWQ9c2xvdC5nZXRTbG90RWxlbWVudElkKCk7aWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKXt2YXIgcGFyZW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtwYXJlbnQmJnBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSksZmlyZVNsb3RFdmVudCgic2xvdFJlbmRlckVuZGVkIixzbG90KSxmaXJlU2xvdEV2ZW50KCJzbG90UmVxdWVzdGVkIixzbG90KSxmaXJlU2xvdEV2ZW50KCJzbG90UmVzcG9uc2VSZWNlaXZlZCIsc2xvdCksZmlyZVNsb3RFdmVudCgic2xvdE9ubG9hZCIsc2xvdCksZmlyZVNsb3RFdmVudCgiaW1wcmVzc2lvblZpZXdhYmxlIixzbG90KX19fShzbG90c0J5SWQuZ2V0KGlkKSl9LGdvb2dsZXRhZy5lbmFibGVTZXJ2aWNlcz1ub29wRnVuYyxnb29nbGV0YWcuZ2V0VmVyc2lvbj1ub29wU3RyLGdvb2dsZXRhZy5wdWJhZHM9ZnVuY3Rpb24oKXtyZXR1cm4gcHViQWRzU2VydmljZX0sZ29vZ2xldGFnLnB1YmFkc1JlYWR5PSEwLGdvb2dsZXRhZy5zZXRBZElmcmFtZVRpdGxlPW5vb3BGdW5jLGdvb2dsZXRhZy5zaXplTWFwcGluZz1mdW5jdGlvbigpe3JldHVybiBuZXcgU2l6ZU1hcHBpbmdCdWlsZGVyfSx3aW5kb3cuZ29vZ2xldGFnPWdvb2dsZXRhZzswIT09Y21kLmxlbmd0aDspZ29vZ2xldGFnLmNtZC5wdXNoKGNtZC5zaGlmdCgpKTshZnVuY3Rpb24oc291cmNlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX1sb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIHN0YXJ0IikpLHRyYWNlJiZ0cmFjZSgpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2UgZW5kIikpfWNhdGNoKGUpe30iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9fZGVidWcmJndpbmRvdy5fX2RlYnVnKHNvdXJjZSl9fShzb3VyY2UpfSkuYXBwbHkodGhpcyx1cGRhdGVkQXJncyl9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9fSh7bmFtZToiZ29vZ2xldGFnc2VydmljZXMtZ3B0IixhcmdzOltdfSxbXSk7" }, { "title": "matomo", "aliases": [], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIFRyYWNrZXI9ZnVuY3Rpb24oKXt9O1RyYWNrZXIucHJvdG90eXBlLnNldERvTm90VHJhY2s9bm9vcEZ1bmMsVHJhY2tlci5wcm90b3R5cGUuc2V0RG9tYWlucz1ub29wRnVuYyxUcmFja2VyLnByb3RvdHlwZS5zZXRDdXN0b21EaW1lbnNpb249bm9vcEZ1bmMsVHJhY2tlci5wcm90b3R5cGUudHJhY2tQYWdlVmlldz1ub29wRnVuYzt2YXIgQXN5bmNUcmFja2VyPWZ1bmN0aW9uKCl7fTtBc3luY1RyYWNrZXIucHJvdG90eXBlLmFkZExpc3RlbmVyPW5vb3BGdW5jO3ZhciBtYXRvbW9XcmFwcGVyPXtnZXRUcmFja2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBUcmFja2VyfSxnZXRBc3luY1RyYWNrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFzeW5jVHJhY2tlcn19O3dpbmRvdy5QaXdpaz1tYXRvbW9XcmFwcGVyLGZ1bmN0aW9uKHNvdXJjZSxtZXNzYWdlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX12YXIgTE9HX01BUktFUj0ibG9nOiAiO21lc3NhZ2UmJigtMT09PW1lc3NhZ2UuaW5kZXhPZihMT0dfTUFSS0VSKT9sb2coIiIuY29uY2F0KHByZWZpeCwiIG1lc3NhZ2U6XG4iKS5jb25jYXQobWVzc2FnZSkpOmxvZyhtZXNzYWdlLnNsaWNlKExPR19NQVJLRVIubGVuZ3RoKSkpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJtYXRvbW8iLGFyZ3M6W119LFtdKTs=" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIFRyYWNrZXI9ZnVuY3Rpb24oKXt9O1RyYWNrZXIucHJvdG90eXBlLnNldERvTm90VHJhY2s9bm9vcEZ1bmMsVHJhY2tlci5wcm90b3R5cGUuc2V0RG9tYWlucz1ub29wRnVuYyxUcmFja2VyLnByb3RvdHlwZS5zZXRDdXN0b21EaW1lbnNpb249bm9vcEZ1bmMsVHJhY2tlci5wcm90b3R5cGUudHJhY2tQYWdlVmlldz1ub29wRnVuYzt2YXIgQXN5bmNUcmFja2VyPWZ1bmN0aW9uKCl7fTtBc3luY1RyYWNrZXIucHJvdG90eXBlLmFkZExpc3RlbmVyPW5vb3BGdW5jO3ZhciBtYXRvbW9XcmFwcGVyPXtnZXRUcmFja2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBUcmFja2VyfSxnZXRBc3luY1RyYWNrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFzeW5jVHJhY2tlcn19O3dpbmRvdy5QaXdpaz1tYXRvbW9XcmFwcGVyLGZ1bmN0aW9uKHNvdXJjZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6Im1hdG9tbyIsYXJnczpbXX0sW10pOw==" }, { "title": "metrika-yandex-tag", "aliases": [], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIGFzeW5jQ2FsbGJhY2tGcm9tT3B0aW9ucz1mdW5jdGlvbihpZCxwYXJhbSl7dmFyIG9wdGlvbnM9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGNhbGxiYWNrPW9wdGlvbnMuY2FsbGJhY2ssY3R4PW9wdGlvbnMuY3R4OyJmdW5jdGlvbiI9PXR5cGVvZiBjYWxsYmFjayYmKGNhbGxiYWNrPXZvaWQgMCE9PWN0eD9jYWxsYmFjay5iaW5kKGN0eCk6Y2FsbGJhY2ssc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gY2FsbGJhY2soKX0pKSl9LGFwaT17YWRkRmlsZUV4dGVuc2lvbjpub29wRnVuYyxleHRMaW5rOmFzeW5jQ2FsbGJhY2tGcm9tT3B0aW9ucyxmaWxlOmFzeW5jQ2FsbGJhY2tGcm9tT3B0aW9ucyxnZXRDbGllbnRJRDpmdW5jdGlvbihpZCxjYil7Y2ImJnNldFRpbWVvdXQoY2IobnVsbCkpfSxoaXQ6YXN5bmNDYWxsYmFja0Zyb21PcHRpb25zLG5vdEJvdW5jZTphc3luY0NhbGxiYWNrRnJvbU9wdGlvbnMscGFyYW1zOm5vb3BGdW5jLHJlYWNoR29hbDpmdW5jdGlvbihpZCx0YXJnZXQscGFyYW1zLGNhbGxiYWNrLGN0eCl7YXN5bmNDYWxsYmFja0Zyb21PcHRpb25zKG51bGwsbnVsbCx7Y2FsbGJhY2s6Y2FsbGJhY2ssY3R4OmN0eH0pfSxzZXRVc2VySUQ6bm9vcEZ1bmMsdXNlclBhcmFtczpub29wRnVuYyxkZXN0cnVjdDpub29wRnVuY307ZnVuY3Rpb24geW0oaWQsZnVuY05hbWUpe2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9bmV3IEFycmF5KF9sZW4+Mj9fbGVuLTI6MCksX2tleT0yO19rZXk8X2xlbjtfa2V5KyspYXJnc1tfa2V5LTJdPWFyZ3VtZW50c1tfa2V5XTtyZXR1cm4gYXBpW2Z1bmNOYW1lXSYmYXBpW2Z1bmNOYW1lXS5hcHBseShhcGksW2lkXS5jb25jYXQoYXJncykpfXZvaWQgMD09PXdpbmRvdy55bT8od2luZG93LnltPXltLHltLmE9W10pOndpbmRvdy55bSYmd2luZG93LnltLmEmJih5bS5hPXdpbmRvdy55bS5hLHdpbmRvdy55bT15bSx3aW5kb3cueW0uYS5mb3JFYWNoKChmdW5jdGlvbihwYXJhbXMpe3ZhciBpZDtpZD1wYXJhbXNbMF0sd2luZG93WyJ5YUNvdW50ZXIiLmNvbmNhdChpZCldPWFwaSxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgieWFjb3VudGVyIi5jb25jYXQoaWQsImluaXRlZCIpKSl9KSkpLGZ1bmN0aW9uKHNvdXJjZSxtZXNzYWdlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX12YXIgTE9HX01BUktFUj0ibG9nOiAiO21lc3NhZ2UmJigtMT09PW1lc3NhZ2UuaW5kZXhPZihMT0dfTUFSS0VSKT9sb2coIiIuY29uY2F0KHByZWZpeCwiIG1lc3NhZ2U6XG4iKS5jb25jYXQobWVzc2FnZSkpOmxvZyhtZXNzYWdlLnNsaWNlKExPR19NQVJLRVIubGVuZ3RoKSkpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJtZXRyaWthLXlhbmRleC10YWciLGFyZ3M6W119LFtdKTs=" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIGFzeW5jQ2FsbGJhY2tGcm9tT3B0aW9ucz1mdW5jdGlvbihpZCxwYXJhbSl7dmFyIG9wdGlvbnM9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGNhbGxiYWNrPW9wdGlvbnMuY2FsbGJhY2ssY3R4PW9wdGlvbnMuY3R4OyJmdW5jdGlvbiI9PXR5cGVvZiBjYWxsYmFjayYmKGNhbGxiYWNrPXZvaWQgMCE9PWN0eD9jYWxsYmFjay5iaW5kKGN0eCk6Y2FsbGJhY2ssc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gY2FsbGJhY2soKX0pKSl9LGFwaT17YWRkRmlsZUV4dGVuc2lvbjpub29wRnVuYyxleHRMaW5rOmFzeW5jQ2FsbGJhY2tGcm9tT3B0aW9ucyxmaWxlOmFzeW5jQ2FsbGJhY2tGcm9tT3B0aW9ucyxnZXRDbGllbnRJRDpmdW5jdGlvbihpZCxjYil7Y2ImJnNldFRpbWVvdXQoY2IobnVsbCkpfSxoaXQ6YXN5bmNDYWxsYmFja0Zyb21PcHRpb25zLG5vdEJvdW5jZTphc3luY0NhbGxiYWNrRnJvbU9wdGlvbnMscGFyYW1zOm5vb3BGdW5jLHJlYWNoR29hbDpmdW5jdGlvbihpZCx0YXJnZXQscGFyYW1zLGNhbGxiYWNrLGN0eCl7YXN5bmNDYWxsYmFja0Zyb21PcHRpb25zKG51bGwsbnVsbCx7Y2FsbGJhY2s6Y2FsbGJhY2ssY3R4OmN0eH0pfSxzZXRVc2VySUQ6bm9vcEZ1bmMsdXNlclBhcmFtczpub29wRnVuYyxkZXN0cnVjdDpub29wRnVuY307ZnVuY3Rpb24geW0oaWQsZnVuY05hbWUpe2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9bmV3IEFycmF5KF9sZW4+Mj9fbGVuLTI6MCksX2tleT0yO19rZXk8X2xlbjtfa2V5KyspYXJnc1tfa2V5LTJdPWFyZ3VtZW50c1tfa2V5XTtyZXR1cm4gYXBpW2Z1bmNOYW1lXSYmYXBpW2Z1bmNOYW1lXS5hcHBseShhcGksW2lkXS5jb25jYXQoYXJncykpfXZvaWQgMD09PXdpbmRvdy55bT8od2luZG93LnltPXltLHltLmE9W10pOndpbmRvdy55bSYmd2luZG93LnltLmEmJih5bS5hPXdpbmRvdy55bS5hLHdpbmRvdy55bT15bSx3aW5kb3cueW0uYS5mb3JFYWNoKChmdW5jdGlvbihwYXJhbXMpe3ZhciBpZDtpZD1wYXJhbXNbMF0sd2luZG93WyJ5YUNvdW50ZXIiLmNvbmNhdChpZCldPWFwaSxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgieWFjb3VudGVyIi5jb25jYXQoaWQsImluaXRlZCIpKSl9KSkpLGZ1bmN0aW9uKHNvdXJjZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6Im1ldHJpa2EteWFuZGV4LXRhZyIsYXJnczpbXX0sW10pOw==" }, { "title": "metrika-yandex-watch", "aliases": [], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31mdW5jdGlvbiBub29wQXJyYXkoKXtyZXR1cm5bXX1jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIGNiTmFtZT0ieWFuZGV4X21ldHJpa2FfY2FsbGJhY2tzIixhc3luY0NhbGxiYWNrRnJvbU9wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgb3B0aW9ucz1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sY2FsbGJhY2s9b3B0aW9ucy5jYWxsYmFjayxjdHg9b3B0aW9ucy5jdHg7ImZ1bmN0aW9uIj09dHlwZW9mIGNhbGxiYWNrJiYoY2FsbGJhY2s9dm9pZCAwIT09Y3R4P2NhbGxiYWNrLmJpbmQoY3R4KTpjYWxsYmFjayxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBjYWxsYmFjaygpfSkpKX07ZnVuY3Rpb24gTWV0cmlrYSgpe31NZXRyaWthLmNvdW50ZXJzPW5vb3BBcnJheSxNZXRyaWthLnByb3RvdHlwZS5hZGRGaWxlRXh0ZW5zaW9uPW5vb3BGdW5jLE1ldHJpa2EucHJvdG90eXBlLmdldENsaWVudElEPW5vb3BGdW5jLE1ldHJpa2EucHJvdG90eXBlLnNldFVzZXJJRD1ub29wRnVuYyxNZXRyaWthLnByb3RvdHlwZS51c2VyUGFyYW1zPW5vb3BGdW5jLE1ldHJpa2EucHJvdG90eXBlLnBhcmFtcz1ub29wRnVuYyxNZXRyaWthLnByb3RvdHlwZS5jb3VudGVycz1ub29wQXJyYXksTWV0cmlrYS5wcm90b3R5cGUuZXh0TGluaz1mdW5jdGlvbih1cmwsb3B0aW9ucyl7YXN5bmNDYWxsYmFja0Zyb21PcHRpb25zKG9wdGlvbnMpfSxNZXRyaWthLnByb3RvdHlwZS5maWxlPWZ1bmN0aW9uKHVybCxvcHRpb25zKXthc3luY0NhbGxiYWNrRnJvbU9wdGlvbnMob3B0aW9ucyl9LE1ldHJpa2EucHJvdG90eXBlLmhpdD1mdW5jdGlvbih1cmwsb3B0aW9ucyl7YXN5bmNDYWxsYmFja0Zyb21PcHRpb25zKG9wdGlvbnMpfSxNZXRyaWthLnByb3RvdHlwZS5yZWFjaEdvYWw9ZnVuY3Rpb24odGFyZ2V0LHBhcmFtcyxjYixjdHgpe2FzeW5jQ2FsbGJhY2tGcm9tT3B0aW9ucyh7Y2FsbGJhY2s6Y2IsY3R4OmN0eH0pfSxNZXRyaWthLnByb3RvdHlwZS5ub3RCb3VuY2U9YXN5bmNDYWxsYmFja0Zyb21PcHRpb25zLHdpbmRvdy5ZYT93aW5kb3cuWWEuTWV0cmlrYT1NZXRyaWthOndpbmRvdy5ZYT17TWV0cmlrYTpNZXRyaWthfSx3aW5kb3dbY2JOYW1lXSYmQXJyYXkuaXNBcnJheSh3aW5kb3dbY2JOYW1lXSkmJndpbmRvd1tjYk5hbWVdLmZvckVhY2goKGZ1bmN0aW9uKGZ1bmMpeyJmdW5jdGlvbiI9PXR5cGVvZiBmdW5jJiZmdW5jKCl9KSksZnVuY3Rpb24oc291cmNlLG1lc3NhZ2Upe2lmKCEwPT09c291cmNlLnZlcmJvc2Upe3RyeXt2YXIgbG9nPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdHJhY2U9Y29uc29sZS50cmFjZS5iaW5kKGNvbnNvbGUpLHByZWZpeD1zb3VyY2UucnVsZVRleHR8fCIiO2lmKHNvdXJjZS5kb21haW5OYW1lKXt2YXIgcnVsZVN0YXJ0SW5kZXgsQUdfU0NSSVBUTEVUX01BUktFUj0iIyUjLy8iLFVCT19TQ1JJUFRMRVRfTUFSS0VSPSIjIytqcyI7c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik+LTE/cnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik6c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpKTt2YXIgcnVsZVBhcnQ9c291cmNlLnJ1bGVUZXh0LnNsaWNlKHJ1bGVTdGFydEluZGV4KTtwcmVmaXg9IiIuY29uY2F0KHNvdXJjZS5kb21haW5OYW1lKS5jb25jYXQocnVsZVBhcnQpfXZhciBMT0dfTUFSS0VSPSJsb2c6ICI7bWVzc2FnZSYmKC0xPT09bWVzc2FnZS5pbmRleE9mKExPR19NQVJLRVIpP2xvZygiIi5jb25jYXQocHJlZml4LCIgbWVzc2FnZTpcbiIpLmNvbmNhdChtZXNzYWdlKSk6bG9nKG1lc3NhZ2Uuc2xpY2UoTE9HX01BUktFUi5sZW5ndGgpKSksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6Im1ldHJpa2EteWFuZGV4LXdhdGNoIixhcmdzOltdfSxbXSk7" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31mdW5jdGlvbiBub29wQXJyYXkoKXtyZXR1cm5bXX1jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIGNiTmFtZT0ieWFuZGV4X21ldHJpa2FfY2FsbGJhY2tzIixhc3luY0NhbGxiYWNrRnJvbU9wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgb3B0aW9ucz1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sY2FsbGJhY2s9b3B0aW9ucy5jYWxsYmFjayxjdHg9b3B0aW9ucy5jdHg7ImZ1bmN0aW9uIj09dHlwZW9mIGNhbGxiYWNrJiYoY2FsbGJhY2s9dm9pZCAwIT09Y3R4P2NhbGxiYWNrLmJpbmQoY3R4KTpjYWxsYmFjayxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBjYWxsYmFjaygpfSkpKX07ZnVuY3Rpb24gTWV0cmlrYSgpe31NZXRyaWthLmNvdW50ZXJzPW5vb3BBcnJheSxNZXRyaWthLnByb3RvdHlwZS5hZGRGaWxlRXh0ZW5zaW9uPW5vb3BGdW5jLE1ldHJpa2EucHJvdG90eXBlLmdldENsaWVudElEPW5vb3BGdW5jLE1ldHJpa2EucHJvdG90eXBlLnNldFVzZXJJRD1ub29wRnVuYyxNZXRyaWthLnByb3RvdHlwZS51c2VyUGFyYW1zPW5vb3BGdW5jLE1ldHJpa2EucHJvdG90eXBlLnBhcmFtcz1ub29wRnVuYyxNZXRyaWthLnByb3RvdHlwZS5jb3VudGVycz1ub29wQXJyYXksTWV0cmlrYS5wcm90b3R5cGUuZXh0TGluaz1mdW5jdGlvbih1cmwsb3B0aW9ucyl7YXN5bmNDYWxsYmFja0Zyb21PcHRpb25zKG9wdGlvbnMpfSxNZXRyaWthLnByb3RvdHlwZS5maWxlPWZ1bmN0aW9uKHVybCxvcHRpb25zKXthc3luY0NhbGxiYWNrRnJvbU9wdGlvbnMob3B0aW9ucyl9LE1ldHJpa2EucHJvdG90eXBlLmhpdD1mdW5jdGlvbih1cmwsb3B0aW9ucyl7YXN5bmNDYWxsYmFja0Zyb21PcHRpb25zKG9wdGlvbnMpfSxNZXRyaWthLnByb3RvdHlwZS5yZWFjaEdvYWw9ZnVuY3Rpb24odGFyZ2V0LHBhcmFtcyxjYixjdHgpe2FzeW5jQ2FsbGJhY2tGcm9tT3B0aW9ucyh7Y2FsbGJhY2s6Y2IsY3R4OmN0eH0pfSxNZXRyaWthLnByb3RvdHlwZS5ub3RCb3VuY2U9YXN5bmNDYWxsYmFja0Zyb21PcHRpb25zLHdpbmRvdy5ZYT93aW5kb3cuWWEuTWV0cmlrYT1NZXRyaWthOndpbmRvdy5ZYT17TWV0cmlrYTpNZXRyaWthfSx3aW5kb3dbY2JOYW1lXSYmQXJyYXkuaXNBcnJheSh3aW5kb3dbY2JOYW1lXSkmJndpbmRvd1tjYk5hbWVdLmZvckVhY2goKGZ1bmN0aW9uKGZ1bmMpeyJmdW5jdGlvbiI9PXR5cGVvZiBmdW5jJiZmdW5jKCl9KSksZnVuY3Rpb24oc291cmNlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX1sb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIHN0YXJ0IikpLHRyYWNlJiZ0cmFjZSgpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2UgZW5kIikpfWNhdGNoKGUpe30iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9fZGVidWcmJndpbmRvdy5fX2RlYnVnKHNvdXJjZSl9fShzb3VyY2UpfSkuYXBwbHkodGhpcyx1cGRhdGVkQXJncyl9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9fSh7bmFtZToibWV0cmlrYS15YW5kZXgtd2F0Y2giLGFyZ3M6W119LFtdKTs=" }, { "title": "naver-wcslog", "aliases": [], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7d2luZG93Lndjc19hZGQ9e30sd2luZG93Lndjc19kbz1ub29wRnVuYyx3aW5kb3cud2NzPXtpbmZsb3c6bm9vcEZ1bmN9LGZ1bmN0aW9uKHNvdXJjZSxtZXNzYWdlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX12YXIgTE9HX01BUktFUj0ibG9nOiAiO21lc3NhZ2UmJigtMT09PW1lc3NhZ2UuaW5kZXhPZihMT0dfTUFSS0VSKT9sb2coIiIuY29uY2F0KHByZWZpeCwiIG1lc3NhZ2U6XG4iKS5jb25jYXQobWVzc2FnZSkpOmxvZyhtZXNzYWdlLnNsaWNlKExPR19NQVJLRVIubGVuZ3RoKSkpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJuYXZlci13Y3Nsb2ciLGFyZ3M6W119LFtdKTs=" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7d2luZG93Lndjc19hZGQ9e30sd2luZG93Lndjc19kbz1ub29wRnVuYyx3aW5kb3cud2NzPXtpbmZsb3c6bm9vcEZ1bmN9LGZ1bmN0aW9uKHNvdXJjZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6Im5hdmVyLXdjc2xvZyIsYXJnczpbXX0sW10pOw==" }, { "title": "noeval", @@ -291,14 +291,14 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7d2luZG93LmV2YWw9ZnVuY3Rpb24ocyl7IWZ1bmN0aW9uKHNvdXJjZSxtZXNzYWdlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX12YXIgTE9HX01BUktFUj0ibG9nOiAiO21lc3NhZ2UmJigtMT09PW1lc3NhZ2UuaW5kZXhPZihMT0dfTUFSS0VSKT9sb2coIiIuY29uY2F0KHByZWZpeCwiIG1lc3NhZ2U6XG4iKS5jb25jYXQobWVzc2FnZSkpOmxvZyhtZXNzYWdlLnNsaWNlKExPR19NQVJLRVIubGVuZ3RoKSkpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSwiQWRHdWFyZCBoYXMgcHJldmVudGVkIGV2YWw6XG4iLmNvbmNhdChzKSl9LmJpbmQoKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6Im5vZXZhbCIsYXJnczpbXX0sW10pOw==" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7d2luZG93LmV2YWw9ZnVuY3Rpb24ocyl7IWZ1bmN0aW9uKHNvdXJjZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKSxmdW5jdGlvbihzb3VyY2UsbWVzc2FnZSl7KGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl18fHNvdXJjZS52ZXJib3NlKSYmY29uc29sZS5sb2coIiIuY29uY2F0KHNvdXJjZS5uYW1lLCI6ICIpLmNvbmNhdChtZXNzYWdlKSl9KHNvdXJjZSwiQWRHdWFyZCBoYXMgcHJldmVudGVkIGV2YWw6XG4iLmNvbmNhdChzKSwhMCl9LmJpbmQoKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6Im5vZXZhbCIsYXJnczpbXX0sW10pOw==" }, { "title": "pardot-1.0", "aliases": [], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31mdW5jdGlvbiBub29wU3RyKCl7cmV0dXJuIiJ9ZnVuY3Rpb24gbm9vcE51bGwoKXtyZXR1cm4gbnVsbH1jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7ZnVuY3Rpb24gcGlUcmFja2VyKCl7d2luZG93LnBpPXt0cmFja2VyOnt2aXNpdG9yX2lkOiIiLHZpc2l0b3JfaWRfc2lnbjoiIixwaV9vcHRfaW46IiIsY2FtcGFpZ25faWQ6IiJ9fSx3aW5kb3cucGlTY3JpcHROdW0rPTF9d2luZG93LnBpVmVyc2lvbj0iMS4wLjIiLHdpbmRvdy5waVNjcmlwdE51bT0wLHdpbmRvdy5waVNjcmlwdE9iaj1bXSx3aW5kb3cuY2hlY2tOYW1lc3BhY2U9bm9vcEZ1bmMsd2luZG93LmdldFBhcmRvdFVybD1ub29wU3RyLHdpbmRvdy5waUdldFBhcmFtZXRlcj1ub29wTnVsbCx3aW5kb3cucGlTZXRDb29raWU9bm9vcEZ1bmMsd2luZG93LnBpR2V0Q29va2llPW5vb3BTdHIsd2luZG93LnBpUmVzcG9uc2U9bm9vcEZ1bmMsd2luZG93LnBpVHJhY2tlcj1waVRyYWNrZXIscGlUcmFja2VyKCksZnVuY3Rpb24oc291cmNlLG1lc3NhZ2Upe2lmKCEwPT09c291cmNlLnZlcmJvc2Upe3RyeXt2YXIgbG9nPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdHJhY2U9Y29uc29sZS50cmFjZS5iaW5kKGNvbnNvbGUpLHByZWZpeD1zb3VyY2UucnVsZVRleHR8fCIiO2lmKHNvdXJjZS5kb21haW5OYW1lKXt2YXIgcnVsZVN0YXJ0SW5kZXgsQUdfU0NSSVBUTEVUX01BUktFUj0iIyUjLy8iLFVCT19TQ1JJUFRMRVRfTUFSS0VSPSIjIytqcyI7c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik+LTE/cnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik6c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpKTt2YXIgcnVsZVBhcnQ9c291cmNlLnJ1bGVUZXh0LnNsaWNlKHJ1bGVTdGFydEluZGV4KTtwcmVmaXg9IiIuY29uY2F0KHNvdXJjZS5kb21haW5OYW1lKS5jb25jYXQocnVsZVBhcnQpfXZhciBMT0dfTUFSS0VSPSJsb2c6ICI7bWVzc2FnZSYmKC0xPT09bWVzc2FnZS5pbmRleE9mKExPR19NQVJLRVIpP2xvZygiIi5jb25jYXQocHJlZml4LCIgbWVzc2FnZTpcbiIpLmNvbmNhdChtZXNzYWdlKSk6bG9nKG1lc3NhZ2Uuc2xpY2UoTE9HX01BUktFUi5sZW5ndGgpKSksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6InBhcmRvdC0xLjAiLGFyZ3M6W119LFtdKTs=" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31mdW5jdGlvbiBub29wU3RyKCl7cmV0dXJuIiJ9ZnVuY3Rpb24gbm9vcE51bGwoKXtyZXR1cm4gbnVsbH1jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7ZnVuY3Rpb24gcGlUcmFja2VyKCl7d2luZG93LnBpPXt0cmFja2VyOnt2aXNpdG9yX2lkOiIiLHZpc2l0b3JfaWRfc2lnbjoiIixwaV9vcHRfaW46IiIsY2FtcGFpZ25faWQ6IiJ9fSx3aW5kb3cucGlTY3JpcHROdW0rPTF9d2luZG93LnBpVmVyc2lvbj0iMS4wLjIiLHdpbmRvdy5waVNjcmlwdE51bT0wLHdpbmRvdy5waVNjcmlwdE9iaj1bXSx3aW5kb3cuY2hlY2tOYW1lc3BhY2U9bm9vcEZ1bmMsd2luZG93LmdldFBhcmRvdFVybD1ub29wU3RyLHdpbmRvdy5waUdldFBhcmFtZXRlcj1ub29wTnVsbCx3aW5kb3cucGlTZXRDb29raWU9bm9vcEZ1bmMsd2luZG93LnBpR2V0Q29va2llPW5vb3BTdHIsd2luZG93LnBpUmVzcG9uc2U9bm9vcEZ1bmMsd2luZG93LnBpVHJhY2tlcj1waVRyYWNrZXIscGlUcmFja2VyKCksZnVuY3Rpb24oc291cmNlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX1sb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIHN0YXJ0IikpLHRyYWNlJiZ0cmFjZSgpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2UgZW5kIikpfWNhdGNoKGUpe30iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9fZGVidWcmJndpbmRvdy5fX2RlYnVnKHNvdXJjZSl9fShzb3VyY2UpfSkuYXBwbHkodGhpcyx1cGRhdGVkQXJncyl9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9fSh7bmFtZToicGFyZG90LTEuMCIsYXJnczpbXX0sW10pOw==" }, { "title": "prebid-ads", @@ -308,28 +308,21 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7d2luZG93LmNhblJ1bkFkcz0hMCx3aW5kb3cuaXNBZEJsb2NrQWN0aXZlPSExLGZ1bmN0aW9uKHNvdXJjZSxtZXNzYWdlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX12YXIgTE9HX01BUktFUj0ibG9nOiAiO21lc3NhZ2UmJigtMT09PW1lc3NhZ2UuaW5kZXhPZihMT0dfTUFSS0VSKT9sb2coIiIuY29uY2F0KHByZWZpeCwiIG1lc3NhZ2U6XG4iKS5jb25jYXQobWVzc2FnZSkpOmxvZyhtZXNzYWdlLnNsaWNlKExPR19NQVJLRVIubGVuZ3RoKSkpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJwcmViaWQtYWRzIixhcmdzOltdfSxbXSk7" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7d2luZG93LmNhblJ1bkFkcz0hMCx3aW5kb3cuaXNBZEJsb2NrQWN0aXZlPSExLGZ1bmN0aW9uKHNvdXJjZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6InByZWJpZC1hZHMiLGFyZ3M6W119LFtdKTs=" }, { "title": "prebid", "aliases": [], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wU3RyKCl7cmV0dXJuIiJ9ZnVuY3Rpb24gbm9vcEFycmF5KCl7cmV0dXJuW119Y29uc3QgdXBkYXRlZEFyZ3M9YXJncz9bXS5jb25jYXQoc291cmNlKS5jb25jYXQoYXJncyk6W3NvdXJjZV07dHJ5eyhmdW5jdGlvbihzb3VyY2Upe3ZhciBwdXNoRnVuY3Rpb249ZnVuY3Rpb24oYXJnKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYXJnKXRyeXthcmcuY2FsbCgpfWNhdGNoKGV4KXt9fSxwYmpzV3JhcHBlcj17YWRkQWRVbml0czpmdW5jdGlvbigpe30sYWRTZXJ2ZXJzOntkZnA6e2J1aWxkVmlkZW9Vcmw6bm9vcFN0cn19LGFkVW5pdHM6W10sYWxpYXNCaWRkZXI6ZnVuY3Rpb24oKXt9LGNtZDpbXSxlbmFibGVBbmFseXRpY3M6ZnVuY3Rpb24oKXt9LGdldEhpZ2hlc3RDcG1CaWRzOm5vb3BBcnJheSxsaWJMb2FkZWQ6ITAscXVlOltdLHJlcXVlc3RCaWRzOmZ1bmN0aW9uKGFyZyl7aWYoYXJnIGluc3RhbmNlb2YgT2JqZWN0JiZhcmcuYmlkc0JhY2tIYW5kbGVyKXRyeXthcmcuYmlkc0JhY2tIYW5kbGVyLmNhbGwoKX1jYXRjaChleCl7fX0scmVtb3ZlQWRVbml0OmZ1bmN0aW9uKCl7fSxzZXRCaWRkZXJDb25maWc6ZnVuY3Rpb24oKXt9LHNldENvbmZpZzpmdW5jdGlvbigpe30sc2V0VGFyZ2V0aW5nRm9yR1BUQXN5bmM6ZnVuY3Rpb24oKXt9fTtwYmpzV3JhcHBlci5jbWQucHVzaD1wdXNoRnVuY3Rpb24scGJqc1dyYXBwZXIucXVlLnB1c2g9cHVzaEZ1bmN0aW9uLHdpbmRvdy5wYmpzPXBianNXcmFwcGVyLGZ1bmN0aW9uKHNvdXJjZSxtZXNzYWdlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX12YXIgTE9HX01BUktFUj0ibG9nOiAiO21lc3NhZ2UmJigtMT09PW1lc3NhZ2UuaW5kZXhPZihMT0dfTUFSS0VSKT9sb2coIiIuY29uY2F0KHByZWZpeCwiIG1lc3NhZ2U6XG4iKS5jb25jYXQobWVzc2FnZSkpOmxvZyhtZXNzYWdlLnNsaWNlKExPR19NQVJLRVIubGVuZ3RoKSkpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJwcmViaWQiLGFyZ3M6W119LFtdKTs=" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wU3RyKCl7cmV0dXJuIiJ9ZnVuY3Rpb24gbm9vcEFycmF5KCl7cmV0dXJuW119Y29uc3QgdXBkYXRlZEFyZ3M9YXJncz9bXS5jb25jYXQoc291cmNlKS5jb25jYXQoYXJncyk6W3NvdXJjZV07dHJ5eyhmdW5jdGlvbihzb3VyY2Upe3ZhciBwdXNoRnVuY3Rpb249ZnVuY3Rpb24oYXJnKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYXJnKXRyeXthcmcuY2FsbCgpfWNhdGNoKGV4KXt9fSxwYmpzV3JhcHBlcj17YWRkQWRVbml0czpmdW5jdGlvbigpe30sYWRTZXJ2ZXJzOntkZnA6e2J1aWxkVmlkZW9Vcmw6bm9vcFN0cn19LGFkVW5pdHM6W10sYWxpYXNCaWRkZXI6ZnVuY3Rpb24oKXt9LGNtZDpbXSxlbmFibGVBbmFseXRpY3M6ZnVuY3Rpb24oKXt9LGdldEhpZ2hlc3RDcG1CaWRzOm5vb3BBcnJheSxsaWJMb2FkZWQ6ITAscXVlOltdLHJlcXVlc3RCaWRzOmZ1bmN0aW9uKGFyZyl7aWYoYXJnIGluc3RhbmNlb2YgT2JqZWN0JiZhcmcuYmlkc0JhY2tIYW5kbGVyKXRyeXthcmcuYmlkc0JhY2tIYW5kbGVyLmNhbGwoKX1jYXRjaChleCl7fX0scmVtb3ZlQWRVbml0OmZ1bmN0aW9uKCl7fSxzZXRCaWRkZXJDb25maWc6ZnVuY3Rpb24oKXt9LHNldENvbmZpZzpmdW5jdGlvbigpe30sc2V0VGFyZ2V0aW5nRm9yR1BUQXN5bmM6ZnVuY3Rpb24oKXt9fTtwYmpzV3JhcHBlci5jbWQucHVzaD1wdXNoRnVuY3Rpb24scGJqc1dyYXBwZXIucXVlLnB1c2g9cHVzaEZ1bmN0aW9uLHdpbmRvdy5wYmpzPXBianNXcmFwcGVyLGZ1bmN0aW9uKHNvdXJjZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6InByZWJpZCIsYXJnczpbXX0sW10pOw==" }, { "title": "prevent-bab", - "aliases": [ - "nobab.js", - "ubo-nobab.js", - "bab-defuser.js", - "ubo-bab-defuser.js", - "ubo-nobab", - "ubo-bab-defuser" - ], + "aliases": [], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBoaXQoc291cmNlLG1lc3NhZ2Upe2lmKCEwPT09c291cmNlLnZlcmJvc2Upe3RyeXt2YXIgbG9nPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdHJhY2U9Y29uc29sZS50cmFjZS5iaW5kKGNvbnNvbGUpLHByZWZpeD1zb3VyY2UucnVsZVRleHR8fCIiO2lmKHNvdXJjZS5kb21haW5OYW1lKXt2YXIgcnVsZVN0YXJ0SW5kZXg7c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoIiMlIy8vIik+LTE/cnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoIiMlIy8vIik6c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoIiMjK2pzIik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZigiIyMranMiKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX1tZXNzYWdlJiYoLTE9PT1tZXNzYWdlLmluZGV4T2YoImxvZzogIik/bG9nKCIiLmNvbmNhdChwcmVmaXgsIiBtZXNzYWdlOlxuIikuY29uY2F0KG1lc3NhZ2UpKTpsb2cobWVzc2FnZS5zbGljZSgibG9nOiAiLmxlbmd0aCkpKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIHN0YXJ0IikpLHRyYWNlJiZ0cmFjZSgpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2UgZW5kIikpfWNhdGNoKGUpe30iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9fZGVidWcmJndpbmRvdy5fX2RlYnVnKHNvdXJjZSl9fWNvbnN0IHVwZGF0ZWRBcmdzPWFyZ3M/W10uY29uY2F0KHNvdXJjZSkuY29uY2F0KGFyZ3MpOltzb3VyY2VdO3RyeXsoZnVuY3Rpb24oc291cmNlKXt2YXIgbmF0aXZlU2V0VGltZW91dD13aW5kb3cuc2V0VGltZW91dCxiYWJSZWdleD0vXC5iYWJfZWxlbWVudGlkLiQvO3dpbmRvdy5zZXRUaW1lb3V0PWZ1bmN0aW9uKGNhbGxiYWNrKXtpZigic3RyaW5nIiE9dHlwZW9mIGNhbGxiYWNrfHwhYmFiUmVnZXgudGVzdChjYWxsYmFjaykpe2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9bmV3IEFycmF5KF9sZW4+MT9fbGVuLTE6MCksX2tleT0xO19rZXk8X2xlbjtfa2V5KyspYXJnc1tfa2V5LTFdPWFyZ3VtZW50c1tfa2V5XTtyZXR1cm4gbmF0aXZlU2V0VGltZW91dC5hcHBseSh3aW5kb3csW2NhbGxiYWNrXS5jb25jYXQoYXJncykpfWhpdChzb3VyY2UpfTt2YXIgc2lnbmF0dXJlcz1bWyJibG9ja2FkYmxvY2siXSxbImJhYmFzYm0iXSxbL2dldEl0ZW1cKCdiYWJuJ1wpL10sWyJnZXRFbGVtZW50QnlJZCIsIlN0cmluZy5mcm9tQ2hhckNvZGUiLCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSIsImNoYXJBdCIsIkRPTUNvbnRlbnRMb2FkZWQiLCJBZEJsb2NrIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRvU2Nyb2xsIiwiZnJvbUNoYXJDb2RlIiwiPDwyfHI+PjQiLCJzZXNzaW9uU3RvcmFnZSIsImNsaWVudFdpZHRoIiwibG9jYWxTdG9yYWdlIiwiTWF0aCIsInJhbmRvbSJdXSxuYXRpdmVFdmFsPXdpbmRvdy5ldmFsO3dpbmRvdy5ldmFsPWZ1bmN0aW9uKHN0cil7aWYoIWZ1bmN0aW9uKHN0cil7aWYoInN0cmluZyIhPXR5cGVvZiBzdHIpcmV0dXJuITE7Zm9yKHZhciBpPTA7aTxzaWduYXR1cmVzLmxlbmd0aDtpKz0xKXtmb3IodmFyIHRva2Vucz1zaWduYXR1cmVzW2ldLG1hdGNoPTAsaj0wO2o8dG9rZW5zLmxlbmd0aDtqKz0xKXt2YXIgdG9rZW49dG9rZW5zW2pdOyh0b2tlbiBpbnN0YW5jZW9mIFJlZ0V4cD90b2tlbi50ZXN0KHN0cik6c3RyLmluZGV4T2YodG9rZW4pPi0xKSYmKG1hdGNoKz0xKX1pZihtYXRjaC90b2tlbnMubGVuZ3RoPj0uOClyZXR1cm4hMH1yZXR1cm4hMX0oc3RyKSlyZXR1cm4gbmF0aXZlRXZhbChzdHIpO2hpdChzb3VyY2UpO3ZhciBib2R5RWw9ZG9jdW1lbnQuYm9keTtib2R5RWwmJmJvZHlFbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidmlzaWJpbGl0eSIpO3ZhciBlbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYmFiYXNibXNneCIpO2VsJiZlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKX0uYmluZCh3aW5kb3cpfSkuYXBwbHkodGhpcyx1cGRhdGVkQXJncyl9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9fSh7bmFtZToicHJldmVudC1iYWIiLGFyZ3M6W119LFtdKTs=" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBoaXQoc291cmNlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4O3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKCIjJSMvLyIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKCIjJSMvLyIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKCIjIytqcyIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoIiMjK2pzIikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX1jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIG5hdGl2ZVNldFRpbWVvdXQ9d2luZG93LnNldFRpbWVvdXQsYmFiUmVnZXg9L1wuYmFiX2VsZW1lbnRpZC4kLzt3aW5kb3cuc2V0VGltZW91dD1mdW5jdGlvbihjYWxsYmFjayl7aWYoInN0cmluZyIhPXR5cGVvZiBjYWxsYmFja3x8IWJhYlJlZ2V4LnRlc3QoY2FsbGJhY2spKXtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPW5ldyBBcnJheShfbGVuPjE/X2xlbi0xOjApLF9rZXk9MTtfa2V5PF9sZW47X2tleSsrKWFyZ3NbX2tleS0xXT1hcmd1bWVudHNbX2tleV07cmV0dXJuIG5hdGl2ZVNldFRpbWVvdXQuYXBwbHkod2luZG93LFtjYWxsYmFja10uY29uY2F0KGFyZ3MpKX1oaXQoc291cmNlKX07dmFyIHNpZ25hdHVyZXM9W1siYmxvY2thZGJsb2NrIl0sWyJiYWJhc2JtIl0sWy9nZXRJdGVtXCgnYmFibidcKS9dLFsiZ2V0RWxlbWVudEJ5SWQiLCJTdHJpbmcuZnJvbUNoYXJDb2RlIiwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLCJjaGFyQXQiLCJET01Db250ZW50TG9hZGVkIiwiQWRCbG9jayIsImFkZEV2ZW50TGlzdGVuZXIiLCJkb1Njcm9sbCIsImZyb21DaGFyQ29kZSIsIjw8MnxyPj40Iiwic2Vzc2lvblN0b3JhZ2UiLCJjbGllbnRXaWR0aCIsImxvY2FsU3RvcmFnZSIsIk1hdGgiLCJyYW5kb20iXV0sbmF0aXZlRXZhbD13aW5kb3cuZXZhbDt3aW5kb3cuZXZhbD1mdW5jdGlvbihzdHIpe2lmKCFmdW5jdGlvbihzdHIpe2lmKCJzdHJpbmciIT10eXBlb2Ygc3RyKXJldHVybiExO2Zvcih2YXIgaT0wO2k8c2lnbmF0dXJlcy5sZW5ndGg7aSs9MSl7Zm9yKHZhciB0b2tlbnM9c2lnbmF0dXJlc1tpXSxtYXRjaD0wLGo9MDtqPHRva2Vucy5sZW5ndGg7ais9MSl7dmFyIHRva2VuPXRva2Vuc1tqXTsodG9rZW4gaW5zdGFuY2VvZiBSZWdFeHA/dG9rZW4udGVzdChzdHIpOnN0ci5pbmRleE9mKHRva2VuKT4tMSkmJihtYXRjaCs9MSl9aWYobWF0Y2gvdG9rZW5zLmxlbmd0aD49LjgpcmV0dXJuITB9cmV0dXJuITF9KHN0cikpcmV0dXJuIG5hdGl2ZUV2YWwoc3RyKTtoaXQoc291cmNlKTt2YXIgYm9keUVsPWRvY3VtZW50LmJvZHk7Ym9keUVsJiZib2R5RWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoInZpc2liaWxpdHkiKTt2YXIgZWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJhYmFzYm1zZ3giKTtlbCYmZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCl9LmJpbmQod2luZG93KX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6InByZXZlbnQtYmFiIixhcmdzOltdfSxbXSk7" }, { "title": "prevent-bab2", @@ -338,7 +331,7 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIHNjcmlwdD1kb2N1bWVudC5jdXJyZW50U2NyaXB0O2lmKG51bGwhPT1zY3JpcHQpe3ZhciB1cmw9c2NyaXB0LnNyYztpZigic3RyaW5nIj09dHlwZW9mIHVybCl7dmFyIGRvbWFpbnNTdHI9WyJhZGNsaXh4XFwubmV0IiwiYWRuZXRhc2lhXFwuY29tIiwiYWR0cmFja2Vyc1xcLm5ldCIsImJhbm5lcnRyYWNrXFwubmV0Il0uam9pbigifCIpLG1hdGNoU3RyPSJeaHR0cHM/Oi8vW1xcdy1dK1xcLigiLmNvbmNhdChkb21haW5zU3RyLCIpLy4iKTshMSE9PW5ldyBSZWdFeHAobWF0Y2hTdHIpLnRlc3QodXJsKSYmKHdpbmRvdy5uSDdlWHpPc0c9ODU4LGZ1bmN0aW9uKHNvdXJjZSxtZXNzYWdlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX12YXIgTE9HX01BUktFUj0ibG9nOiAiO21lc3NhZ2UmJigtMT09PW1lc3NhZ2UuaW5kZXhPZihMT0dfTUFSS0VSKT9sb2coIiIuY29uY2F0KHByZWZpeCwiIG1lc3NhZ2U6XG4iKS5jb25jYXQobWVzc2FnZSkpOmxvZyhtZXNzYWdlLnNsaWNlKExPR19NQVJLRVIubGVuZ3RoKSkpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSkpfX19KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJwcmV2ZW50LWJhYjIiLGFyZ3M6W119LFtdKTs=" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIHNjcmlwdD1kb2N1bWVudC5jdXJyZW50U2NyaXB0O2lmKG51bGwhPT1zY3JpcHQpe3ZhciB1cmw9c2NyaXB0LnNyYztpZigic3RyaW5nIj09dHlwZW9mIHVybCl7dmFyIGRvbWFpbnNTdHI9WyJhZGNsaXh4XFwubmV0IiwiYWRuZXRhc2lhXFwuY29tIiwiYWR0cmFja2Vyc1xcLm5ldCIsImJhbm5lcnRyYWNrXFwubmV0Il0uam9pbigifCIpLG1hdGNoU3RyPSJeaHR0cHM/Oi8vW1xcdy1dK1xcLigiLmNvbmNhdChkb21haW5zU3RyLCIpLy4iKTshMSE9PW5ldyBSZWdFeHAobWF0Y2hTdHIpLnRlc3QodXJsKSYmKHdpbmRvdy5uSDdlWHpPc0c9ODU4LGZ1bmN0aW9uKHNvdXJjZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKSl9fX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6InByZXZlbnQtYmFiMiIsYXJnczpbXX0sW10pOw==" }, { "title": "prevent-fab-3.2.0", @@ -351,7 +344,7 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31mdW5jdGlvbiBub29wVGhpcygpe3JldHVybiB0aGlzfWNvbnN0IHVwZGF0ZWRBcmdzPWFyZ3M/W10uY29uY2F0KHNvdXJjZSkuY29uY2F0KGFyZ3MpOltzb3VyY2VdO3RyeXsoZnVuY3Rpb24oc291cmNlKXshZnVuY3Rpb24oc291cmNlLG1lc3NhZ2Upe2lmKCEwPT09c291cmNlLnZlcmJvc2Upe3RyeXt2YXIgbG9nPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdHJhY2U9Y29uc29sZS50cmFjZS5iaW5kKGNvbnNvbGUpLHByZWZpeD1zb3VyY2UucnVsZVRleHR8fCIiO2lmKHNvdXJjZS5kb21haW5OYW1lKXt2YXIgcnVsZVN0YXJ0SW5kZXgsQUdfU0NSSVBUTEVUX01BUktFUj0iIyUjLy8iLFVCT19TQ1JJUFRMRVRfTUFSS0VSPSIjIytqcyI7c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik+LTE/cnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik6c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpKTt2YXIgcnVsZVBhcnQ9c291cmNlLnJ1bGVUZXh0LnNsaWNlKHJ1bGVTdGFydEluZGV4KTtwcmVmaXg9IiIuY29uY2F0KHNvdXJjZS5kb21haW5OYW1lKS5jb25jYXQocnVsZVBhcnQpfXZhciBMT0dfTUFSS0VSPSJsb2c6ICI7bWVzc2FnZSYmKC0xPT09bWVzc2FnZS5pbmRleE9mKExPR19NQVJLRVIpP2xvZygiIi5jb25jYXQocHJlZml4LCIgbWVzc2FnZTpcbiIpLmNvbmNhdChtZXNzYWdlKSk6bG9nKG1lc3NhZ2Uuc2xpY2UoTE9HX01BUktFUi5sZW5ndGgpKSksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKTt2YXIgRmFiPWZ1bmN0aW9uKCl7fTtGYWIucHJvdG90eXBlLmNoZWNrPW5vb3BGdW5jLEZhYi5wcm90b3R5cGUuY2xlYXJFdmVudD1ub29wRnVuYyxGYWIucHJvdG90eXBlLmVtaXRFdmVudD1ub29wRnVuYyxGYWIucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGF8fGIoKSx0aGlzfSxGYWIucHJvdG90eXBlLm9uRGV0ZWN0ZWQ9bm9vcFRoaXMsRmFiLnByb3RvdHlwZS5vbk5vdERldGVjdGVkPWZ1bmN0aW9uKGEpe3JldHVybiBhKCksdGhpc30sRmFiLnByb3RvdHlwZS5zZXRPcHRpb249bm9vcEZ1bmMsRmFiLnByb3RvdHlwZS5vcHRpb25zPXtzZXQ6bm9vcEZ1bmMsZ2V0Om5vb3BGdW5jfTt2YXIgZmFiPW5ldyBGYWIsZ2V0U2V0RmFiPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRmFifSxzZXQ6ZnVuY3Rpb24oKXt9fSxnZXRzZXRmYWI9e2dldDpmdW5jdGlvbigpe3JldHVybiBmYWJ9LHNldDpmdW5jdGlvbigpe319O09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh3aW5kb3csIkZ1Y2tBZEJsb2NrIik/d2luZG93LkZ1Y2tBZEJsb2NrPUZhYjpPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJGdWNrQWRCbG9jayIsZ2V0U2V0RmFiKSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwod2luZG93LCJCbG9ja0FkQmxvY2siKT93aW5kb3cuQmxvY2tBZEJsb2NrPUZhYjpPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJCbG9ja0FkQmxvY2siLGdldFNldEZhYiksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHdpbmRvdywiU25pZmZBZEJsb2NrIik/d2luZG93LlNuaWZmQWRCbG9jaz1GYWI6T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywiU25pZmZBZEJsb2NrIixnZXRTZXRGYWIpLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh3aW5kb3csImZ1Y2tBZEJsb2NrIik/d2luZG93LmZ1Y2tBZEJsb2NrPWZhYjpPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJmdWNrQWRCbG9jayIsZ2V0c2V0ZmFiKSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwod2luZG93LCJibG9ja0FkQmxvY2siKT93aW5kb3cuYmxvY2tBZEJsb2NrPWZhYjpPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJibG9ja0FkQmxvY2siLGdldHNldGZhYiksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHdpbmRvdywic25pZmZBZEJsb2NrIik/d2luZG93LnNuaWZmQWRCbG9jaz1mYWI6T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywic25pZmZBZEJsb2NrIixnZXRzZXRmYWIpfSkuYXBwbHkodGhpcyx1cGRhdGVkQXJncyl9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9fSh7bmFtZToicHJldmVudC1mYWItMy4yLjAiLGFyZ3M6W119LFtdKTs=" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31mdW5jdGlvbiBub29wVGhpcygpe3JldHVybiB0aGlzfWNvbnN0IHVwZGF0ZWRBcmdzPWFyZ3M/W10uY29uY2F0KHNvdXJjZSkuY29uY2F0KGFyZ3MpOltzb3VyY2VdO3RyeXsoZnVuY3Rpb24oc291cmNlKXshZnVuY3Rpb24oc291cmNlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX1sb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIHN0YXJ0IikpLHRyYWNlJiZ0cmFjZSgpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2UgZW5kIikpfWNhdGNoKGUpe30iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9fZGVidWcmJndpbmRvdy5fX2RlYnVnKHNvdXJjZSl9fShzb3VyY2UpO3ZhciBGYWI9ZnVuY3Rpb24oKXt9O0ZhYi5wcm90b3R5cGUuY2hlY2s9bm9vcEZ1bmMsRmFiLnByb3RvdHlwZS5jbGVhckV2ZW50PW5vb3BGdW5jLEZhYi5wcm90b3R5cGUuZW1pdEV2ZW50PW5vb3BGdW5jLEZhYi5wcm90b3R5cGUub249ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYXx8YigpLHRoaXN9LEZhYi5wcm90b3R5cGUub25EZXRlY3RlZD1ub29wVGhpcyxGYWIucHJvdG90eXBlLm9uTm90RGV0ZWN0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEoKSx0aGlzfSxGYWIucHJvdG90eXBlLnNldE9wdGlvbj1ub29wRnVuYyxGYWIucHJvdG90eXBlLm9wdGlvbnM9e3NldDpub29wRnVuYyxnZXQ6bm9vcEZ1bmN9O3ZhciBmYWI9bmV3IEZhYixnZXRTZXRGYWI9e2dldDpmdW5jdGlvbigpe3JldHVybiBGYWJ9LHNldDpmdW5jdGlvbigpe319LGdldHNldGZhYj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGZhYn0sc2V0OmZ1bmN0aW9uKCl7fX07T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHdpbmRvdywiRnVja0FkQmxvY2siKT93aW5kb3cuRnVja0FkQmxvY2s9RmFiOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIkZ1Y2tBZEJsb2NrIixnZXRTZXRGYWIpLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh3aW5kb3csIkJsb2NrQWRCbG9jayIpP3dpbmRvdy5CbG9ja0FkQmxvY2s9RmFiOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIkJsb2NrQWRCbG9jayIsZ2V0U2V0RmFiKSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwod2luZG93LCJTbmlmZkFkQmxvY2siKT93aW5kb3cuU25pZmZBZEJsb2NrPUZhYjpPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJTbmlmZkFkQmxvY2siLGdldFNldEZhYiksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHdpbmRvdywiZnVja0FkQmxvY2siKT93aW5kb3cuZnVja0FkQmxvY2s9ZmFiOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImZ1Y2tBZEJsb2NrIixnZXRzZXRmYWIpLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh3aW5kb3csImJsb2NrQWRCbG9jayIpP3dpbmRvdy5ibG9ja0FkQmxvY2s9ZmFiOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImJsb2NrQWRCbG9jayIsZ2V0c2V0ZmFiKSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwod2luZG93LCJzbmlmZkFkQmxvY2siKT93aW5kb3cuc25pZmZBZEJsb2NrPWZhYjpPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJzbmlmZkFkQmxvY2siLGdldHNldGZhYil9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJwcmV2ZW50LWZhYi0zLjIuMCIsYXJnczpbXX0sW10pOw==" }, { "title": "prevent-popads-net", @@ -362,7 +355,7 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIHJpZD1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiw5KSx0aHJvd0Vycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKHJpZCl9O2RlbGV0ZSB3aW5kb3cuUG9wQWRzLGRlbGV0ZSB3aW5kb3cucG9wbnMsT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LHtQb3BBZHM6e3NldDp0aHJvd0Vycm9yfSxwb3Buczp7c2V0OnRocm93RXJyb3J9fSksd2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24ocmlkKXt2YXIgbmF0aXZlT25FcnJvcj13aW5kb3cub25lcnJvcjtyZXR1cm4gZnVuY3Rpb24oZXJyb3Ipe2lmKCJzdHJpbmciPT10eXBlb2YgZXJyb3ImJi0xIT09ZXJyb3IuaW5kZXhPZihyaWQpKXJldHVybiEwO2lmKG5hdGl2ZU9uRXJyb3IgaW5zdGFuY2VvZiBGdW5jdGlvbil7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1uZXcgQXJyYXkoX2xlbj4xP19sZW4tMTowKSxfa2V5PTE7X2tleTxfbGVuO19rZXkrKylhcmdzW19rZXktMV09YXJndW1lbnRzW19rZXldO3JldHVybiBuYXRpdmVPbkVycm9yLmFwcGx5KHRoaXMsW2Vycm9yXS5jb25jYXQoYXJncykpfXJldHVybiExfX0ocmlkKS5iaW5kKCksZnVuY3Rpb24oc291cmNlLG1lc3NhZ2Upe2lmKCEwPT09c291cmNlLnZlcmJvc2Upe3RyeXt2YXIgbG9nPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdHJhY2U9Y29uc29sZS50cmFjZS5iaW5kKGNvbnNvbGUpLHByZWZpeD1zb3VyY2UucnVsZVRleHR8fCIiO2lmKHNvdXJjZS5kb21haW5OYW1lKXt2YXIgcnVsZVN0YXJ0SW5kZXgsQUdfU0NSSVBUTEVUX01BUktFUj0iIyUjLy8iLFVCT19TQ1JJUFRMRVRfTUFSS0VSPSIjIytqcyI7c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik+LTE/cnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik6c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpKTt2YXIgcnVsZVBhcnQ9c291cmNlLnJ1bGVUZXh0LnNsaWNlKHJ1bGVTdGFydEluZGV4KTtwcmVmaXg9IiIuY29uY2F0KHNvdXJjZS5kb21haW5OYW1lKS5jb25jYXQocnVsZVBhcnQpfXZhciBMT0dfTUFSS0VSPSJsb2c6ICI7bWVzc2FnZSYmKC0xPT09bWVzc2FnZS5pbmRleE9mKExPR19NQVJLRVIpP2xvZygiIi5jb25jYXQocHJlZml4LCIgbWVzc2FnZTpcbiIpLmNvbmNhdChtZXNzYWdlKSk6bG9nKG1lc3NhZ2Uuc2xpY2UoTE9HX01BUktFUi5sZW5ndGgpKSksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6InByZXZlbnQtcG9wYWRzLW5ldCIsYXJnczpbXX0sW10pOw==" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIHJpZD1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiw5KSx0aHJvd0Vycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKHJpZCl9O2RlbGV0ZSB3aW5kb3cuUG9wQWRzLGRlbGV0ZSB3aW5kb3cucG9wbnMsT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LHtQb3BBZHM6e3NldDp0aHJvd0Vycm9yfSxwb3Buczp7c2V0OnRocm93RXJyb3J9fSksd2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24ocmlkKXt2YXIgbmF0aXZlT25FcnJvcj13aW5kb3cub25lcnJvcjtyZXR1cm4gZnVuY3Rpb24oZXJyb3Ipe2lmKCJzdHJpbmciPT10eXBlb2YgZXJyb3ImJi0xIT09ZXJyb3IuaW5kZXhPZihyaWQpKXJldHVybiEwO2lmKG5hdGl2ZU9uRXJyb3IgaW5zdGFuY2VvZiBGdW5jdGlvbil7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1uZXcgQXJyYXkoX2xlbj4xP19sZW4tMTowKSxfa2V5PTE7X2tleTxfbGVuO19rZXkrKylhcmdzW19rZXktMV09YXJndW1lbnRzW19rZXldO3JldHVybiBuYXRpdmVPbkVycm9yLmFwcGx5KHRoaXMsW2Vycm9yXS5jb25jYXQoYXJncykpfXJldHVybiExfX0ocmlkKS5iaW5kKCksZnVuY3Rpb24oc291cmNlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX1sb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIHN0YXJ0IikpLHRyYWNlJiZ0cmFjZSgpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2UgZW5kIikpfWNhdGNoKGUpe30iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9fZGVidWcmJndpbmRvdy5fX2RlYnVnKHNvdXJjZSl9fShzb3VyY2UpfSkuYXBwbHkodGhpcyx1cGRhdGVkQXJncyl9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9fSh7bmFtZToicHJldmVudC1wb3BhZHMtbmV0IixhcmdzOltdfSxbXSk7" }, { "title": "scorecardresearch-beacon", @@ -372,7 +365,7 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7d2luZG93LkNPTVNDT1JFPXtwdXJnZTpmdW5jdGlvbigpe3dpbmRvdy5fY29tc2NvcmU9W119LGJlYWNvbjpmdW5jdGlvbigpe319LGZ1bmN0aW9uKHNvdXJjZSxtZXNzYWdlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX12YXIgTE9HX01BUktFUj0ibG9nOiAiO21lc3NhZ2UmJigtMT09PW1lc3NhZ2UuaW5kZXhPZihMT0dfTUFSS0VSKT9sb2coIiIuY29uY2F0KHByZWZpeCwiIG1lc3NhZ2U6XG4iKS5jb25jYXQobWVzc2FnZSkpOmxvZyhtZXNzYWdlLnNsaWNlKExPR19NQVJLRVIubGVuZ3RoKSkpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJzY29yZWNhcmRyZXNlYXJjaC1iZWFjb24iLGFyZ3M6W119LFtdKTs=" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7d2luZG93LkNPTVNDT1JFPXtwdXJnZTpmdW5jdGlvbigpe3dpbmRvdy5fY29tc2NvcmU9W119LGJlYWNvbjpmdW5jdGlvbigpe319LGZ1bmN0aW9uKHNvdXJjZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6InNjb3JlY2FyZHJlc2VhcmNoLWJlYWNvbiIsYXJnczpbXX0sW10pOw==" }, { "title": "set-popads-dummy", @@ -383,6 +376,6 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBoaXQoc291cmNlLG1lc3NhZ2Upe2lmKCEwPT09c291cmNlLnZlcmJvc2Upe3RyeXt2YXIgbG9nPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdHJhY2U9Y29uc29sZS50cmFjZS5iaW5kKGNvbnNvbGUpLHByZWZpeD1zb3VyY2UucnVsZVRleHR8fCIiO2lmKHNvdXJjZS5kb21haW5OYW1lKXt2YXIgcnVsZVN0YXJ0SW5kZXg7c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoIiMlIy8vIik+LTE/cnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoIiMlIy8vIik6c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoIiMjK2pzIik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZigiIyMranMiKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX1tZXNzYWdlJiYoLTE9PT1tZXNzYWdlLmluZGV4T2YoImxvZzogIik/bG9nKCIiLmNvbmNhdChwcmVmaXgsIiBtZXNzYWdlOlxuIikuY29uY2F0KG1lc3NhZ2UpKTpsb2cobWVzc2FnZS5zbGljZSgibG9nOiAiLmxlbmd0aCkpKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIHN0YXJ0IikpLHRyYWNlJiZ0cmFjZSgpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2UgZW5kIikpfWNhdGNoKGUpe30iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9fZGVidWcmJndpbmRvdy5fX2RlYnVnKHNvdXJjZSl9fWNvbnN0IHVwZGF0ZWRBcmdzPWFyZ3M/W10uY29uY2F0KHNvdXJjZSkuY29uY2F0KGFyZ3MpOltzb3VyY2VdO3RyeXsoZnVuY3Rpb24oc291cmNlKXtkZWxldGUgd2luZG93LlBvcEFkcyxkZWxldGUgd2luZG93LnBvcG5zLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdpbmRvdyx7UG9wQWRzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaGl0KHNvdXJjZSkse319fSxwb3Buczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGhpdChzb3VyY2UpLHt9fX19KX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6InNldC1wb3BhZHMtZHVtbXkiLGFyZ3M6W119LFtdKTs=" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBoaXQoc291cmNlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4O3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKCIjJSMvLyIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKCIjJSMvLyIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKCIjIytqcyIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoIiMjK2pzIikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX1jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7ZGVsZXRlIHdpbmRvdy5Qb3BBZHMsZGVsZXRlIHdpbmRvdy5wb3BucyxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3cse1BvcEFkczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGhpdChzb3VyY2UpLHt9fX0scG9wbnM6e2dldDpmdW5jdGlvbigpe3JldHVybiBoaXQoc291cmNlKSx7fX19fSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJzZXQtcG9wYWRzLWR1bW15IixhcmdzOltdfSxbXSk7" } ] \ No newline at end of file diff --git a/dist/redirects.yml b/dist/redirects.yml index da8cd735..386fdbb9 100644 --- a/dist/redirects.yml +++ b/dist/redirects.yml @@ -611,7 +611,7 @@ window.apstag = apstagWrapper; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -631,14 +631,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -744,7 +736,7 @@ window.ATInternet = smartTagWrapper; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -764,14 +756,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -914,7 +898,7 @@ } hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -934,14 +918,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -1004,7 +980,7 @@ window.Fingerprint2 = Fingerprint2; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -1024,14 +1000,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -1085,7 +1053,7 @@ window.FingerprintJS = new FingerprintJS; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -1105,14 +1073,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -1156,7 +1116,7 @@ window.GemiusPlayer = GemiusPlayer; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -1176,14 +1136,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -1289,7 +1241,7 @@ window._gat = gat; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -1309,14 +1261,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -1433,7 +1377,7 @@ } hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -1453,14 +1397,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -2042,7 +1978,7 @@ window.google.ima = ima; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -2062,14 +1998,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -2161,7 +2089,7 @@ hit(source); } } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -2181,14 +2109,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -2425,7 +2345,7 @@ } hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -2445,14 +2365,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -2516,7 +2428,7 @@ window.Piwik = matomoWrapper; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -2536,14 +2448,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -2642,7 +2546,7 @@ } hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -2662,14 +2566,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -2752,7 +2648,7 @@ } hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -2772,14 +2668,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -2820,7 +2708,7 @@ }; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -2840,14 +2728,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -2887,10 +2767,11 @@ (function(source, args) { function noeval(source) { window.eval = function evalWrapper(s) { - hit(source, "AdGuard has prevented eval:\n".concat(s)); + hit(source); + logMessage(source, "AdGuard has prevented eval:\n".concat(s), true); }.bind(); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -2910,14 +2791,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -2928,6 +2801,12 @@ window.__debug(source); } } + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + if (forced || source.verbose) { + console.log("".concat(source.name, ": ").concat(message)); + } + } const updatedArgs = args ? [].concat(source).concat(args) : [ source ]; try { noeval.apply(this, updatedArgs); @@ -2971,7 +2850,7 @@ piTracker(); hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -2991,14 +2870,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -3041,7 +2912,7 @@ window.isAdBlockActive = false; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -3061,14 +2932,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -3136,7 +2999,7 @@ window.pbjs = pbjsWrapper; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -3156,14 +3019,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -3195,17 +3050,11 @@ - title: prevent-bab comment: Prevents BlockAdblock script from detecting an ad blocker. - aliases: - - nobab.js - - ubo-nobab.js - - bab-defuser.js - - ubo-bab-defuser.js - - ubo-nobab - - ubo-bab-defuser + aliases: [] contentType: application/javascript content: |- (function(source, args) { - function preventBab(source) { + function preventBab$1(source) { var nativeSetTimeout = window.setTimeout; var babRegex = /\.bab_elementid.$/; var timeoutWrapper = function timeoutWrapper(callback) { @@ -3256,7 +3105,7 @@ }; window.eval = evalWrapper.bind(window); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -3276,14 +3125,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -3296,7 +3137,7 @@ } const updatedArgs = args ? [].concat(source).concat(args) : [ source ]; try { - preventBab.apply(this, updatedArgs); + preventBab$1.apply(this, updatedArgs); } catch (e) { console.log(e); } @@ -3331,7 +3172,7 @@ window.nH7eXzOsG = 858; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -3351,14 +3192,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -3458,7 +3291,7 @@ Object.defineProperty(window, "sniffAdBlock", getsetfab); } } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -3478,14 +3311,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -3559,7 +3384,7 @@ function randomId() { return Math.random().toString(36).substr(2, 9); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -3579,14 +3404,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -3626,7 +3443,7 @@ }; hit(source); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -3646,14 +3463,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); @@ -3705,7 +3514,7 @@ } }); } - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } @@ -3725,14 +3534,6 @@ var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - var LOG_MARKER = "log: "; - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } log("".concat(prefix, " trace start")); if (trace) { trace(); diff --git a/dist/scriptlets.corelibs.json b/dist/scriptlets.corelibs.json index 00e3b90b..dab8dfa1 100644 --- a/dist/scriptlets.corelibs.json +++ b/dist/scriptlets.corelibs.json @@ -5,7 +5,7 @@ "names": [ "trusted-click-element" ], - "scriptlet": "function trustedClickElement(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function parseCookieString(cookieString){var cookieChunks=cookieString.split(\";\"),cookieData={};return cookieChunks.forEach((function(singleCookie){var cookieKey,cookieValue,delimiterIndex=singleCookie.indexOf(\"=\");-1===delimiterIndex?cookieKey=singleCookie.trim():(cookieKey=singleCookie.slice(0,delimiterIndex).trim(),cookieValue=singleCookie.slice(delimiterIndex+1)),cookieData[cookieKey]=cookieValue||null})),cookieData}function throttle(cb,delay){var savedArgs,wait=!1;return function wrapper(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];wait?savedArgs=args:(cb.apply(void 0,args),wait=!0,setTimeout((function(){wait=!1,savedArgs&&(wrapper(savedArgs),savedArgs=null)}),delay))}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,selectors){var extraMatch=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",delay=arguments.length>3&&void 0!==arguments[3]?arguments[3]:NaN;if(selectors){var parsedDelay,OBSERVER_TIMEOUT_MS=1e4,THROTTLE_DELAY_MS=20,COOKIE_MATCH_MARKER=\"cookie:\",LOCAL_STORAGE_MATCH_MARKER=\"localStorage:\",SELECTORS_DELIMITER=\",\",COOKIE_STRING_DELIMITER=\";\",EXTRA_MATCH_DELIMITER=/(,\\s*){1}(?=cookie:|localStorage:)/;if(delay)if(parsedDelay=parseInt(delay,10),!(!Number.isNaN(parsedDelay)||parsedDelay-1){var cookieMatch=matchStr.replace(COOKIE_MATCH_MARKER,\"\");cookieMatches.push(cookieMatch)}if(matchStr.indexOf(LOCAL_STORAGE_MATCH_MARKER)>-1){var localStorageMatch=matchStr.replace(LOCAL_STORAGE_MATCH_MARKER,\"\");localStorageMatches.push(localStorageMatch)}}));if(cookieMatches.length>0){var parsedCookieMatches=parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER)),parsedCookies=parseCookieString(document.cookie),cookieKeys=Object.keys(parsedCookies);if(0===cookieKeys.length)return;if(!Object.keys(parsedCookieMatches).every((function(key){var valueMatch=parsedCookieMatches[key]?toRegExp(parsedCookieMatches[key]):null,keyMatch=toRegExp(key);return cookieKeys.some((function(key){return!!keyMatch.test(key)&&(!valueMatch||valueMatch.test(parsedCookies[key]))}))})))return}if(localStorageMatches.length>0)if(!localStorageMatches.every((function(str){var itemValue=window.localStorage.getItem(str);return itemValue||\"\"===itemValue})))return;var selectorsSequence=selectors.split(SELECTORS_DELIMITER).map((function(selector){return selector.trim()})),createElementObj=function(element){return{element:element||null,clicked:!1}},elementsSequence=Array(selectorsSequence.length).fill(createElementObj()),clickElementsBySequence=function(){for(var i=0;i-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function parseCookieString(cookieString){var cookieChunks=cookieString.split(\";\"),cookieData={};return cookieChunks.forEach((function(singleCookie){var cookieKey,cookieValue,delimiterIndex=singleCookie.indexOf(\"=\");-1===delimiterIndex?cookieKey=singleCookie.trim():(cookieKey=singleCookie.slice(0,delimiterIndex).trim(),cookieValue=singleCookie.slice(delimiterIndex+1)),cookieData[cookieKey]=cookieValue||null})),cookieData}function throttle(cb,delay){var savedArgs,wait=!1;return function wrapper(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];wait?savedArgs=args:(cb.apply(void 0,args),wait=!0,setTimeout((function(){wait=!1,savedArgs&&(wrapper(savedArgs),savedArgs=null)}),delay))}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,selectors){var extraMatch=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",delay=arguments.length>3&&void 0!==arguments[3]?arguments[3]:NaN;if(selectors){var parsedDelay,OBSERVER_TIMEOUT_MS=1e4,THROTTLE_DELAY_MS=20,COOKIE_MATCH_MARKER=\"cookie:\",LOCAL_STORAGE_MATCH_MARKER=\"localStorage:\",SELECTORS_DELIMITER=\",\",COOKIE_STRING_DELIMITER=\";\",EXTRA_MATCH_DELIMITER=/(,\\s*){1}(?=cookie:|localStorage:)/;if(delay)if(parsedDelay=parseInt(delay,10),!(!Number.isNaN(parsedDelay)||parsedDelay-1){var cookieMatch=matchStr.replace(COOKIE_MATCH_MARKER,\"\");cookieMatches.push(cookieMatch)}if(matchStr.indexOf(LOCAL_STORAGE_MATCH_MARKER)>-1){var localStorageMatch=matchStr.replace(LOCAL_STORAGE_MATCH_MARKER,\"\");localStorageMatches.push(localStorageMatch)}}));if(cookieMatches.length>0){var parsedCookieMatches=parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER)),parsedCookies=parseCookieString(document.cookie),cookieKeys=Object.keys(parsedCookies);if(0===cookieKeys.length)return;if(!Object.keys(parsedCookieMatches).every((function(key){var valueMatch=parsedCookieMatches[key]?toRegExp(parsedCookieMatches[key]):null,keyMatch=toRegExp(key);return cookieKeys.some((function(key){return!!keyMatch.test(key)&&(!valueMatch||valueMatch.test(parsedCookies[key]))}))})))return}if(localStorageMatches.length>0)if(!localStorageMatches.every((function(str){var itemValue=window.localStorage.getItem(str);return itemValue||\"\"===itemValue})))return;var selectorsSequence=selectors.split(SELECTORS_DELIMITER).map((function(selector){return selector.trim()})),createElementObj=function(element){return{element:element||null,clicked:!1}},elementsSequence=Array(selectorsSequence.length).fill(createElementObj()),clickElementsBySequence=function(){for(var i=0;i-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:abort,set:function(){}})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function abortOnPropertyRead(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:abort,set:function(){}})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -31,7 +31,7 @@ "ubo-aopw", "abp-abort-on-property-write" ], - "scriptlet": "function abortOnPropertyWrite(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){throw function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:abort})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function abortOnPropertyWrite(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:abort})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -49,7 +49,7 @@ "ubo-std.js", "ubo-std" ], - "scriptlet": "function preventSetTimeout(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function noopFunc(){}function isPreventionNeeded(_ref){var callback=_ref.callback,delay=_ref.delay,matchCallback=_ref.matchCallback,matchDelay=_ref.matchDelay;if(!function(callback){return callback instanceof Function||\"string\"==typeof callback}(callback))return!1;if(!function(match){var str=match;startsWith(match,\"!\")&&(str=match.slice(1));return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(str)}(matchCallback)||matchDelay&&!function(match){var str=match;startsWith(match,\"!\")&&(str=match.slice(1));var num=parseFloat(str);return!nativeIsNaN(num)&&function(num){return(Number.isFinite||window.isFinite)(num)}(num)}(matchDelay))return!1;var _parseMatchArg=function(match){var isInvertedMatch=startsWith(match,\"!\"),matchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(isInvertedMatch?match.slice(1):match);return{isInvertedMatch:isInvertedMatch,matchRegexp:matchRegexp}}(matchCallback),isInvertedMatch=_parseMatchArg.isInvertedMatch,matchRegexp=_parseMatchArg.matchRegexp,_parseDelayArg=function(delay){var isInvertedDelayMatch=startsWith(delay,\"!\"),delayValue=isInvertedDelayMatch?delay.slice(1):delay,delayMatch=nativeIsNaN(delayValue=parseInt(delayValue,10))?null:delayValue;return{isInvertedDelayMatch:isInvertedDelayMatch,delayMatch:delayMatch}}(matchDelay),isInvertedDelayMatch=_parseDelayArg.isInvertedDelayMatch,delayMatch=_parseDelayArg.delayMatch,callbackStr=String(callback);return null===delayMatch?matchRegexp.test(callbackStr)!==isInvertedMatch:matchCallback?matchRegexp.test(callbackStr)!==isInvertedMatch&&delay===delayMatch!==isInvertedDelayMatch:delay===delayMatch!==isInvertedDelayMatch}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function startsWith(str,prefix){return!!str&&0===str.indexOf(prefix)}function nativeIsNaN(num){return(Number.isNaN||window.isNaN)(num)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,matchCallback,matchDelay){var isProxySupported=\"undefined\"!=typeof Proxy,nativeTimeout=window.setTimeout,shouldLog=void 0===matchCallback&&void 0===matchDelay,setTimeoutHandler={apply:function(target,thisArg,args){var callback=args[0],delay=args[1],shouldPrevent=!1;return shouldLog?(hit(source),logMessage(source,\"setTimeout(\".concat(String(callback),\", \").concat(delay,\")\"),!0)):shouldPrevent=isPreventionNeeded({callback:callback,delay:delay,matchCallback:matchCallback,matchDelay:matchDelay}),shouldPrevent&&(hit(source),args[0]=noopFunc),target.apply(thisArg,args)}};window.setTimeout=isProxySupported?new Proxy(window.setTimeout,setTimeoutHandler):function(callback,delay){var shouldPrevent=!1;if(shouldLog?(hit(source),logMessage(source,\"setTimeout(\".concat(String(callback),\", \").concat(delay,\")\"),!0)):shouldPrevent=isPreventionNeeded({callback:callback,delay:delay,matchCallback:matchCallback,matchDelay:matchDelay}),shouldPrevent)return hit(source),nativeTimeout(noopFunc,delay);for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeTimeout.apply(window,[callback,delay].concat(args))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventSetTimeout(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function noopFunc(){}function isPreventionNeeded(_ref){var callback=_ref.callback,delay=_ref.delay,matchCallback=_ref.matchCallback,matchDelay=_ref.matchDelay;if(!function(callback){return callback instanceof Function||\"string\"==typeof callback}(callback))return!1;if(!function(match){var str=match;startsWith(match,\"!\")&&(str=match.slice(1));return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(str)}(matchCallback)||matchDelay&&!function(match){var str=match;startsWith(match,\"!\")&&(str=match.slice(1));var num=parseFloat(str);return!nativeIsNaN(num)&&function(num){return(Number.isFinite||window.isFinite)(num)}(num)}(matchDelay))return!1;var _parseMatchArg=function(match){var isInvertedMatch=startsWith(match,\"!\"),matchValue=isInvertedMatch?match.slice(1):match,matchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(matchValue);return{isInvertedMatch:isInvertedMatch,matchRegexp:matchRegexp}}(matchCallback),isInvertedMatch=_parseMatchArg.isInvertedMatch,matchRegexp=_parseMatchArg.matchRegexp,_parseDelayArg=function(delay){var isInvertedDelayMatch=startsWith(delay,\"!\"),delayValue=isInvertedDelayMatch?delay.slice(1):delay,delayMatch=nativeIsNaN(delayValue=parseInt(delayValue,10))?null:delayValue;return{isInvertedDelayMatch:isInvertedDelayMatch,delayMatch:delayMatch}}(matchDelay),isInvertedDelayMatch=_parseDelayArg.isInvertedDelayMatch,delayMatch=_parseDelayArg.delayMatch,callbackStr=String(callback);return null===delayMatch?matchRegexp.test(callbackStr)!==isInvertedMatch:matchCallback?matchRegexp.test(callbackStr)!==isInvertedMatch&&delay===delayMatch!==isInvertedDelayMatch:delay===delayMatch!==isInvertedDelayMatch}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function startsWith(str,prefix){return!!str&&0===str.indexOf(prefix)}function nativeIsNaN(num){return(Number.isNaN||window.isNaN)(num)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,matchCallback,matchDelay){var isProxySupported=\"undefined\"!=typeof Proxy,nativeTimeout=window.setTimeout,shouldLog=void 0===matchCallback&&void 0===matchDelay,setTimeoutHandler={apply:function(target,thisArg,args){var callback=args[0],delay=args[1],shouldPrevent=!1;return shouldLog?(hit(source),logMessage(source,\"setTimeout(\".concat(String(callback),\", \").concat(delay,\")\"),!0)):shouldPrevent=isPreventionNeeded({callback:callback,delay:delay,matchCallback:matchCallback,matchDelay:matchDelay}),shouldPrevent&&(hit(source),args[0]=noopFunc),target.apply(thisArg,args)}};window.setTimeout=isProxySupported?new Proxy(window.setTimeout,setTimeoutHandler):function(callback,delay){var shouldPrevent=!1;if(shouldLog?(hit(source),logMessage(source,\"setTimeout(\".concat(String(callback),\", \").concat(delay,\")\"),!0)):shouldPrevent=isPreventionNeeded({callback:callback,delay:delay,matchCallback:matchCallback,matchDelay:matchDelay}),shouldPrevent)return hit(source),nativeTimeout(noopFunc,delay);for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeTimeout.apply(window,[callback,delay].concat(args))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -67,7 +67,7 @@ "ubo-nosiif", "ubo-sid" ], - "scriptlet": "function preventSetInterval(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function noopFunc(){}function isPreventionNeeded(_ref){var callback=_ref.callback,delay=_ref.delay,matchCallback=_ref.matchCallback,matchDelay=_ref.matchDelay;if(!function(callback){return callback instanceof Function||\"string\"==typeof callback}(callback))return!1;if(!function(match){var str=match;startsWith(match,\"!\")&&(str=match.slice(1));return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(str)}(matchCallback)||matchDelay&&!function(match){var str=match;startsWith(match,\"!\")&&(str=match.slice(1));var num=parseFloat(str);return!nativeIsNaN(num)&&function(num){return(Number.isFinite||window.isFinite)(num)}(num)}(matchDelay))return!1;var _parseMatchArg=function(match){var isInvertedMatch=startsWith(match,\"!\"),matchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(isInvertedMatch?match.slice(1):match);return{isInvertedMatch:isInvertedMatch,matchRegexp:matchRegexp}}(matchCallback),isInvertedMatch=_parseMatchArg.isInvertedMatch,matchRegexp=_parseMatchArg.matchRegexp,_parseDelayArg=function(delay){var isInvertedDelayMatch=startsWith(delay,\"!\"),delayValue=isInvertedDelayMatch?delay.slice(1):delay,delayMatch=nativeIsNaN(delayValue=parseInt(delayValue,10))?null:delayValue;return{isInvertedDelayMatch:isInvertedDelayMatch,delayMatch:delayMatch}}(matchDelay),isInvertedDelayMatch=_parseDelayArg.isInvertedDelayMatch,delayMatch=_parseDelayArg.delayMatch,callbackStr=String(callback);return null===delayMatch?matchRegexp.test(callbackStr)!==isInvertedMatch:matchCallback?matchRegexp.test(callbackStr)!==isInvertedMatch&&delay===delayMatch!==isInvertedDelayMatch:delay===delayMatch!==isInvertedDelayMatch}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function startsWith(str,prefix){return!!str&&0===str.indexOf(prefix)}function nativeIsNaN(num){return(Number.isNaN||window.isNaN)(num)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,matchCallback,matchDelay){var isProxySupported=\"undefined\"!=typeof Proxy,nativeInterval=window.setInterval,shouldLog=void 0===matchCallback&&void 0===matchDelay,setIntervalHandler={apply:function(target,thisArg,args){var callback=args[0],delay=args[1],shouldPrevent=!1;return shouldLog?(hit(source),logMessage(source,\"setInterval(\".concat(String(callback),\", \").concat(delay,\")\"),!0)):shouldPrevent=isPreventionNeeded({callback:callback,delay:delay,matchCallback:matchCallback,matchDelay:matchDelay}),shouldPrevent&&(hit(source),args[0]=noopFunc),target.apply(thisArg,args)}};window.setInterval=isProxySupported?new Proxy(window.setInterval,setIntervalHandler):function(callback,delay){var shouldPrevent=!1;if(shouldLog?(hit(source),logMessage(source,\"setInterval(\".concat(String(callback),\", \").concat(delay,\")\"),!0)):shouldPrevent=isPreventionNeeded({callback:callback,delay:delay,matchCallback:matchCallback,matchDelay:matchDelay}),shouldPrevent)return hit(source),nativeInterval(noopFunc,delay);for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeInterval.apply(window,[callback,delay].concat(args))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventSetInterval(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function noopFunc(){}function isPreventionNeeded(_ref){var callback=_ref.callback,delay=_ref.delay,matchCallback=_ref.matchCallback,matchDelay=_ref.matchDelay;if(!function(callback){return callback instanceof Function||\"string\"==typeof callback}(callback))return!1;if(!function(match){var str=match;startsWith(match,\"!\")&&(str=match.slice(1));return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(str)}(matchCallback)||matchDelay&&!function(match){var str=match;startsWith(match,\"!\")&&(str=match.slice(1));var num=parseFloat(str);return!nativeIsNaN(num)&&function(num){return(Number.isFinite||window.isFinite)(num)}(num)}(matchDelay))return!1;var _parseMatchArg=function(match){var isInvertedMatch=startsWith(match,\"!\"),matchValue=isInvertedMatch?match.slice(1):match,matchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(matchValue);return{isInvertedMatch:isInvertedMatch,matchRegexp:matchRegexp}}(matchCallback),isInvertedMatch=_parseMatchArg.isInvertedMatch,matchRegexp=_parseMatchArg.matchRegexp,_parseDelayArg=function(delay){var isInvertedDelayMatch=startsWith(delay,\"!\"),delayValue=isInvertedDelayMatch?delay.slice(1):delay,delayMatch=nativeIsNaN(delayValue=parseInt(delayValue,10))?null:delayValue;return{isInvertedDelayMatch:isInvertedDelayMatch,delayMatch:delayMatch}}(matchDelay),isInvertedDelayMatch=_parseDelayArg.isInvertedDelayMatch,delayMatch=_parseDelayArg.delayMatch,callbackStr=String(callback);return null===delayMatch?matchRegexp.test(callbackStr)!==isInvertedMatch:matchCallback?matchRegexp.test(callbackStr)!==isInvertedMatch&&delay===delayMatch!==isInvertedDelayMatch:delay===delayMatch!==isInvertedDelayMatch}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function startsWith(str,prefix){return!!str&&0===str.indexOf(prefix)}function nativeIsNaN(num){return(Number.isNaN||window.isNaN)(num)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,matchCallback,matchDelay){var isProxySupported=\"undefined\"!=typeof Proxy,nativeInterval=window.setInterval,shouldLog=void 0===matchCallback&&void 0===matchDelay,setIntervalHandler={apply:function(target,thisArg,args){var callback=args[0],delay=args[1],shouldPrevent=!1;return shouldLog?(hit(source),logMessage(source,\"setInterval(\".concat(String(callback),\", \").concat(delay,\")\"),!0)):shouldPrevent=isPreventionNeeded({callback:callback,delay:delay,matchCallback:matchCallback,matchDelay:matchDelay}),shouldPrevent&&(hit(source),args[0]=noopFunc),target.apply(thisArg,args)}};window.setInterval=isProxySupported?new Proxy(window.setInterval,setIntervalHandler):function(callback,delay){var shouldPrevent=!1;if(shouldLog?(hit(source),logMessage(source,\"setInterval(\".concat(String(callback),\", \").concat(delay,\")\"),!0)):shouldPrevent=isPreventionNeeded({callback:callback,delay:delay,matchCallback:matchCallback,matchDelay:matchDelay}),shouldPrevent)return hit(source),nativeInterval(noopFunc,delay);for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeInterval.apply(window,[callback,delay].concat(args))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -79,7 +79,7 @@ "ubo-nowoif.js", "ubo-nowoif" ], - "scriptlet": "function preventWindowOpen(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function isValidStrPattern(input){var isValid,str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);\"/\"===input[0]&&\"/\"===input[input.length-1]&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}function isValidMatchStr(match){var str=match;return startsWith(match,\"!\")&&(str=match.slice(1)),isValidStrPattern(str)}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function nativeIsNaN(num){return(Number.isNaN||window.isNaN)(num)}function parseMatchArg(match){var isInvertedMatch=startsWith(match,\"!\");return{isInvertedMatch:isInvertedMatch,matchRegexp:toRegExp(isInvertedMatch?match.slice(1):match)}}function handleOldReplacement(replacement){var result,str,ending;if(replacement){if(\"trueFunc\"===replacement)result=trueFunc;else if(replacement.indexOf(\"=\")>-1){if(startsWith(replacement,\"{\")&&(ending=\"}\",!!(str=replacement)&&str.lastIndexOf(ending)===str.length-ending.length)){var propertyPart=replacement.slice(1,-1),propertyName=function(str,separator){if(!str||!separator)return str;var index=str.indexOf(separator);return index<0?str:str.substring(0,index)}(propertyPart,\"=\"),propertyValue=function(str,separator){if(!str)return str;var index=str.indexOf(separator);return index<0?\"\":str.substring(index+separator.length)}(propertyPart,\"=\");\"noopFunc\"===propertyValue&&((result={})[propertyName]=noopFunc)}}}else result=noopFunc;return result}function createDecoy(args){var tag,urlProp,replacement=args.replacement,url=args.url,delay=args.delay;\"obj\"===replacement?(tag=\"object\",urlProp=\"data\"):(tag=\"iframe\",urlProp=\"src\");var decoy=document.createElement(tag);return decoy[urlProp]=url,decoy.style.setProperty(\"height\",\"1px\",\"important\"),decoy.style.setProperty(\"position\",\"fixed\",\"important\"),decoy.style.setProperty(\"top\",\"-1px\",\"important\"),decoy.style.setProperty(\"width\",\"1px\",\"important\"),document.body.appendChild(decoy),setTimeout((function(){return decoy.remove()}),1e3*delay),decoy}function getPreventGetter(nativeGetter){return function(target,prop){return(!prop||\"closed\"!==prop)&&(\"function\"==typeof nativeGetter?noopFunc:prop&&target[prop])}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function noopFunc(){}function trueFunc(){return!0}function startsWith(str,prefix){return!!str&&0===str.indexOf(prefix)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var match=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"*\",delay=arguments.length>2?arguments[2]:void 0,replacement=arguments.length>3?arguments[3]:void 0,nativeOpen=window.open,isNewSyntax=\"0\"!==match&&\"1\"!==match,oldOpenWrapper=function(str){match=Number(match)>0;for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];if(!isValidStrPattern(delay))return logMessage(source,\"Invalid parameter: \".concat(delay)),nativeOpen.apply(window,[str].concat(args));var searchRegexp=toRegExp(delay);return match!==searchRegexp.test(str)?nativeOpen.apply(window,[str].concat(args)):(hit(source),handleOldReplacement(replacement))},newOpenWrapper=function(url){for(var shouldLog=replacement&&replacement.indexOf(\"log\")>-1,_len2=arguments.length,args=new Array(_len2>1?_len2-1:0),_key2=1;_key2<_len2;_key2++)args[_key2-1]=arguments[_key2];if(shouldLog){var argsStr=args&&args.length>0?\", \".concat(args.join(\", \")):\"\",message=\"window-open: \".concat(url).concat(argsStr);logMessage(source,message,!0),hit(source)}var shouldPrevent=!1;if(\"*\"===match)shouldPrevent=!0;else if(isValidMatchStr(match)){var _parseMatchArg=parseMatchArg(match),isInvertedMatch=_parseMatchArg.isInvertedMatch;shouldPrevent=_parseMatchArg.matchRegexp.test(url)!==isInvertedMatch}else logMessage(source,\"Invalid parameter: \".concat(match)),shouldPrevent=!1;if(shouldPrevent){var result,parsedDelay=parseInt(delay,10);if(nativeIsNaN(parsedDelay))result=null;else{var decoy=createDecoy({replacement:replacement,url:url,delay:parsedDelay}),popup=decoy.contentWindow;if(\"object\"==typeof popup&&null!==popup)Object.defineProperty(popup,\"closed\",{value:!1}),Object.defineProperty(popup,\"opener\",{value:window}),Object.defineProperty(popup,\"frameElement\",{value:null});else{var nativeGetter=decoy.contentWindow&&decoy.contentWindow.get;Object.defineProperty(decoy,\"contentWindow\",{get:getPreventGetter(nativeGetter)}),popup=decoy.contentWindow}result=popup}return hit(source),result}return nativeOpen.apply(window,[url].concat(args))};window.open=isNewSyntax?newOpenWrapper:oldOpenWrapper,window.open.toString=nativeOpen.toString.bind(nativeOpen)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventWindowOpen(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function isValidStrPattern(input){var isValid,str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);\"/\"===input[0]&&\"/\"===input[input.length-1]&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}function isValidMatchStr(match){var str=match;return startsWith(match,\"!\")&&(str=match.slice(1)),isValidStrPattern(str)}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function nativeIsNaN(num){return(Number.isNaN||window.isNaN)(num)}function parseMatchArg(match){var isInvertedMatch=startsWith(match,\"!\");return{isInvertedMatch:isInvertedMatch,matchRegexp:toRegExp(isInvertedMatch?match.slice(1):match)}}function handleOldReplacement(replacement){var result,str,ending;if(replacement){if(\"trueFunc\"===replacement)result=trueFunc;else if(replacement.indexOf(\"=\")>-1){if(startsWith(replacement,\"{\")&&(ending=\"}\",!!(str=replacement)&&str.lastIndexOf(ending)===str.length-ending.length)){var propertyPart=replacement.slice(1,-1),propertyName=function(str,separator){if(!str||!separator)return str;var index=str.indexOf(separator);return index<0?str:str.substring(0,index)}(propertyPart,\"=\"),propertyValue=function(str,separator){if(!str)return str;var index=str.indexOf(separator);return index<0?\"\":str.substring(index+separator.length)}(propertyPart,\"=\");\"noopFunc\"===propertyValue&&((result={})[propertyName]=noopFunc)}}}else result=noopFunc;return result}function createDecoy(args){var tag,urlProp,replacement=args.replacement,url=args.url,delay=args.delay;\"obj\"===replacement?(tag=\"object\",urlProp=\"data\"):(tag=\"iframe\",urlProp=\"src\");var decoy=document.createElement(tag);return decoy[urlProp]=url,decoy.style.setProperty(\"height\",\"1px\",\"important\"),decoy.style.setProperty(\"position\",\"fixed\",\"important\"),decoy.style.setProperty(\"top\",\"-1px\",\"important\"),decoy.style.setProperty(\"width\",\"1px\",\"important\"),document.body.appendChild(decoy),setTimeout((function(){return decoy.remove()}),1e3*delay),decoy}function getPreventGetter(nativeGetter){return function(target,prop){return(!prop||\"closed\"!==prop)&&(\"function\"==typeof nativeGetter?noopFunc:prop&&target[prop])}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function noopFunc(){}function trueFunc(){return!0}function startsWith(str,prefix){return!!str&&0===str.indexOf(prefix)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var match=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"*\",delay=arguments.length>2?arguments[2]:void 0,replacement=arguments.length>3?arguments[3]:void 0,nativeOpen=window.open,isNewSyntax=\"0\"!==match&&\"1\"!==match,oldOpenWrapper=function(str){match=Number(match)>0;for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];if(!isValidStrPattern(delay))return logMessage(source,\"Invalid parameter: \".concat(delay)),nativeOpen.apply(window,[str].concat(args));var searchRegexp=toRegExp(delay);return match!==searchRegexp.test(str)?nativeOpen.apply(window,[str].concat(args)):(hit(source),handleOldReplacement(replacement))},newOpenWrapper=function(url){for(var shouldLog=replacement&&replacement.indexOf(\"log\")>-1,_len2=arguments.length,args=new Array(_len2>1?_len2-1:0),_key2=1;_key2<_len2;_key2++)args[_key2-1]=arguments[_key2];if(shouldLog){var argsStr=args&&args.length>0?\", \".concat(args.join(\", \")):\"\",message=\"\".concat(url).concat(argsStr);logMessage(source,message,!0),hit(source)}var shouldPrevent=!1;if(\"*\"===match)shouldPrevent=!0;else if(isValidMatchStr(match)){var _parseMatchArg=parseMatchArg(match),isInvertedMatch=_parseMatchArg.isInvertedMatch;shouldPrevent=_parseMatchArg.matchRegexp.test(url)!==isInvertedMatch}else logMessage(source,\"Invalid parameter: \".concat(match)),shouldPrevent=!1;if(shouldPrevent){var result,parsedDelay=parseInt(delay,10);if(nativeIsNaN(parsedDelay))result=null;else{var decoy=createDecoy({replacement:replacement,url:url,delay:parsedDelay}),popup=decoy.contentWindow;if(\"object\"==typeof popup&&null!==popup)Object.defineProperty(popup,\"closed\",{value:!1}),Object.defineProperty(popup,\"opener\",{value:window}),Object.defineProperty(popup,\"frameElement\",{value:null});else{var nativeGetter=decoy.contentWindow&&decoy.contentWindow.get;Object.defineProperty(decoy,\"contentWindow\",{get:getPreventGetter(nativeGetter)}),popup=decoy.contentWindow}result=popup}return hit(source),result}return nativeOpen.apply(window,[url].concat(args))};window.open=isNewSyntax?newOpenWrapper:oldOpenWrapper,window.open.toString=nativeOpen.toString.bind(nativeOpen)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -98,7 +98,7 @@ "ubo-acis", "abp-abort-current-inline-script" ], - "scriptlet": "function abortCurrentInlineScript(source,args){function randomId(){return Math.random().toString(36).substr(2,9)}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,search){var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(search),rid=randomId(),getCurrentScript=function(){if(\"currentScript\"in document)return document.currentScript;var scripts=document.getElementsByTagName(\"script\");return scripts[scripts.length-1]},ourScript=getCurrentScript(),abort=function(){var scriptEl=getCurrentScript();if(scriptEl){var str,prefix,content=scriptEl.textContent;try{content=Object.getOwnPropertyDescriptor(Node.prototype,\"textContent\").get.call(scriptEl)}catch(e){}if(0===content.length&&void 0!==scriptEl.src&&(prefix=\"data:text/javascript;base64,\",(str=scriptEl.src)&&0===str.indexOf(prefix))){var encodedContent=scriptEl.src.slice(\"data:text/javascript;base64,\".length);content=window.atob(encodedContent)}if(scriptEl instanceof HTMLScriptElement&&content.length>0&&scriptEl!==ourScript&&searchRegexp.test(content))throw function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)}};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(base instanceof Object!=0||null!==base)if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var currentValue=base[prop],origDescriptor=Object.getOwnPropertyDescriptor(base,prop);origDescriptor instanceof Object!=0&&origDescriptor.get instanceof Function!=0||(currentValue=base[prop],origDescriptor=void 0);var descriptorWrapper=Object.assign({isAbortingSuspended:!1,isolateCallback:function(cb){this.isAbortingSuspended=!0;try{for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var result=cb.apply(void 0,args);return this.isAbortingSuspended=!1,result}catch(_unused){var rid=randomId();throw this.isAbortingSuspended=!1,new ReferenceError(rid)}}},{currentValue:currentValue,get:function(){return this.isAbortingSuspended||this.isolateCallback(abort),origDescriptor instanceof Object?origDescriptor.get.call(base):this.currentValue},set:function(newValue){this.isAbortingSuspended||this.isolateCallback(abort),origDescriptor instanceof Object?origDescriptor.set.call(base,newValue):this.currentValue=newValue}});!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return descriptorWrapper.get.call(descriptorWrapper)},set:function(newValue){descriptorWrapper.set.call(descriptorWrapper,newValue)}})}else{var props=property.split(\".\"),propIndex=props.indexOf(prop),baseName=props[propIndex-1],message=\"The scriptlet had been executed before the \".concat(baseName,\" was loaded.\");!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,message)}}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function abortCurrentInlineScript(source,args){function randomId(){return Math.random().toString(36).substr(2,9)}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,search){var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(search),rid=randomId(),getCurrentScript=function(){if(\"currentScript\"in document)return document.currentScript;var scripts=document.getElementsByTagName(\"script\");return scripts[scripts.length-1]},ourScript=getCurrentScript(),abort=function(){var scriptEl=getCurrentScript();if(scriptEl){var str,prefix,content=scriptEl.textContent;try{content=Object.getOwnPropertyDescriptor(Node.prototype,\"textContent\").get.call(scriptEl)}catch(e){}if(0===content.length&&void 0!==scriptEl.src&&(prefix=\"data:text/javascript;base64,\",(str=scriptEl.src)&&0===str.indexOf(prefix))){var encodedContent=scriptEl.src.slice(\"data:text/javascript;base64,\".length);content=window.atob(encodedContent)}if(scriptEl instanceof HTMLScriptElement&&content.length>0&&scriptEl!==ourScript&&searchRegexp.test(content))throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)}};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(base instanceof Object!=0||null!==base)if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var currentValue=base[prop],origDescriptor=Object.getOwnPropertyDescriptor(base,prop);origDescriptor instanceof Object!=0&&origDescriptor.get instanceof Function!=0||(currentValue=base[prop],origDescriptor=void 0);var descriptorWrapper=Object.assign({isAbortingSuspended:!1,isolateCallback:function(cb){this.isAbortingSuspended=!0;try{for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var result=cb.apply(void 0,args);return this.isAbortingSuspended=!1,result}catch(_unused){var rid=randomId();throw this.isAbortingSuspended=!1,new ReferenceError(rid)}}},{currentValue:currentValue,get:function(){return this.isAbortingSuspended||this.isolateCallback(abort),origDescriptor instanceof Object?origDescriptor.get.call(base):this.currentValue},set:function(newValue){this.isAbortingSuspended||this.isolateCallback(abort),origDescriptor instanceof Object?origDescriptor.set.call(base,newValue):this.currentValue=newValue}});!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return descriptorWrapper.get.call(descriptorWrapper)},set:function(newValue){descriptorWrapper.set.call(descriptorWrapper,newValue)}})}else{var props=property.split(\".\"),propIndex=props.indexOf(prop),baseName=props[propIndex-1],message=\"The scriptlet had been executed before the \".concat(baseName,\" was loaded.\");!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,message)}}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -111,7 +111,7 @@ "ubo-set", "abp-override-property-read" ], - "scriptlet": "function setConstant(source,args){function noopFunc(){}function trueFunc(){return!0}function falseFunc(){return!1}function noopPromiseReject(){return Promise.reject()}function noopPromiseResolve(){var responseBody=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"{}\",responseUrl=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",responseType=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"default\";if(\"undefined\"!=typeof Response){var response=new Response(responseBody,{status:200,statusText:\"OK\"});return Object.defineProperties(response,{url:{value:responseUrl},type:{value:responseType}}),Promise.resolve(response)}}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&isEmptyObject(base)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function isEmptyObject(obj){return 0===Object.keys(obj).length}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,value,stack){if(property&&function(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(shouldAbortInlineOrInjectedScript(stackMatch,stackTrace))return!0;var stackRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(stackMatch),refinedStackTrace=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).join(\"\\n\");return Object.getOwnPropertyDescriptor(RegExp.prototype,\"test\").value.call(stackRegexp,refinedStackTrace)}(stack,(new Error).stack)){var constantValue,num;if(\"undefined\"===value)constantValue=void 0;else if(\"false\"===value)constantValue=!1;else if(\"true\"===value)constantValue=!0;else if(\"null\"===value)constantValue=null;else if(\"emptyArr\"===value)constantValue=[];else if(\"emptyObj\"===value)constantValue={};else if(\"noopFunc\"===value)constantValue=noopFunc;else if(\"trueFunc\"===value)constantValue=trueFunc;else if(\"falseFunc\"===value)constantValue=falseFunc;else if(\"noopPromiseResolve\"===value)constantValue=noopPromiseResolve;else if(\"noopPromiseReject\"===value)constantValue=noopPromiseReject;else if(/^\\d+$/.test(value)){if(num=constantValue=parseFloat(value),(Number.isNaN||window.isNaN)(num))return;if(Math.abs(constantValue)>32767)return}else if(\"-1\"===value)constantValue=-1;else if(\"\"===value)constantValue=\"\";else if(\"yes\"===value)constantValue=\"yes\";else{if(\"no\"!==value)return;constantValue=\"no\"}var canceled=!1,mustCancel=function(value){return canceled||(canceled=void 0!==value&&void 0!==constantValue&&typeof value!=typeof constantValue&&null!==value)},trapProp=function(base,prop,configurable,handler){if(!handler.init(base[prop]))return!1;var prevSetter,origDescriptor=Object.getOwnPropertyDescriptor(base,prop);if(origDescriptor instanceof Object){if(!origDescriptor.configurable){var message=\"Property '\".concat(prop,\"' is not configurable\");return function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,message),!1}base[prop]=constantValue,origDescriptor.set instanceof Function&&(prevSetter=origDescriptor.set)}return Object.defineProperty(base,prop,{configurable:configurable,get:function(){return handler.get()},set:function(a){void 0!==prevSetter&&prevSetter(a),handler.set(a)}}),!0};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain,inChainPropHandler={factValue:void 0,init:function(a){return this.factValue=a,!0},get:function(){return this.factValue},set:function(a){this.factValue!==a&&(this.factValue=a,a instanceof Object&&setChainPropAccess(a,chain))}},endPropHandler={init:function(a){return!mustCancel(a)},get:function(){return constantValue},set:function(a){mustCancel(a)&&(constantValue=a)}};if(chain)if(void 0===base||null!==base[prop]){(base instanceof Object||\"object\"==typeof base)&&isEmptyObject(base)&&trapProp(base,prop,!0,inChainPropHandler);var propValue=owner[prop];(propValue instanceof Object||\"object\"==typeof propValue&&null!==propValue)&&setChainPropAccess(propValue,chain),trapProp(base,prop,!0,inChainPropHandler)}else trapProp(base,prop,!0,inChainPropHandler);else trapProp(base,prop,!1,endPropHandler)&&function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}(window,property)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function setConstant(source,args){function noopFunc(){}function trueFunc(){return!0}function falseFunc(){return!1}function noopPromiseReject(){return Promise.reject()}function noopPromiseResolve(){var responseBody=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"{}\",responseUrl=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",responseType=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"default\";if(\"undefined\"!=typeof Response){var response=new Response(responseBody,{status:200,statusText:\"OK\"});return Object.defineProperties(response,{url:{value:responseUrl},type:{value:responseType}}),Promise.resolve(response)}}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&isEmptyObject(base)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function isEmptyObject(obj){return 0===Object.keys(obj).length}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,value,stack){if(property&&function(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(function(stackMatch,stackTrace){var INLINE_SCRIPT_STRING=\"inlineScript\",INJECTED_SCRIPT_STRING=\"injectedScript\",INJECTED_SCRIPT_MARKER=\"\",isInlineScript=function(stackMatch){return stackMatch.indexOf(INLINE_SCRIPT_STRING)>-1},isInjectedScript=function(stackMatch){return stackMatch.indexOf(INJECTED_SCRIPT_STRING)>-1};if(!isInlineScript(stackMatch)&&!isInjectedScript(stackMatch))return!1;var documentURL=window.location.href,pos=documentURL.indexOf(\"#\");-1!==pos&&(documentURL=documentURL.slice(0,pos));var stackLines=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).map((function(line){var stack,getStackTraceURL=/(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);if(getStackTraceURL){var stackURL=getStackTraceURL[2];if(startsWith(stackURL,\"(\")&&(stackURL=stackURL.slice(1)),startsWith(stackURL,INJECTED_SCRIPT_MARKER)){stackURL=INJECTED_SCRIPT_STRING;var stackFunction=void 0!==getStackTraceURL[1]?getStackTraceURL[1].slice(0,-1):line.slice(0,getStackTraceURL.index).trim();startsWith(stackFunction,\"at\")&&(stackFunction=stackFunction.slice(2).trim()),stack=\"\".concat(stackFunction,\" \").concat(stackURL).trim()}else stack=stackURL}else stack=line;return stack}));if(stackLines)for(var index=0;index0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(stackMatch),refinedStackTrace=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).join(\"\\n\");return Object.getOwnPropertyDescriptor(RegExp.prototype,\"test\").value.call(stackRegexp,refinedStackTrace)}(stack,(new Error).stack)){var constantValue,num;if(\"undefined\"===value)constantValue=void 0;else if(\"false\"===value)constantValue=!1;else if(\"true\"===value)constantValue=!0;else if(\"null\"===value)constantValue=null;else if(\"emptyArr\"===value)constantValue=[];else if(\"emptyObj\"===value)constantValue={};else if(\"noopFunc\"===value)constantValue=noopFunc;else if(\"trueFunc\"===value)constantValue=trueFunc;else if(\"falseFunc\"===value)constantValue=falseFunc;else if(\"noopPromiseResolve\"===value)constantValue=noopPromiseResolve;else if(\"noopPromiseReject\"===value)constantValue=noopPromiseReject;else if(/^\\d+$/.test(value)){if(num=constantValue=parseFloat(value),(Number.isNaN||window.isNaN)(num))return;if(Math.abs(constantValue)>32767)return}else if(\"-1\"===value)constantValue=-1;else if(\"\"===value)constantValue=\"\";else if(\"yes\"===value)constantValue=\"yes\";else{if(\"no\"!==value)return;constantValue=\"no\"}var canceled=!1,mustCancel=function(value){return canceled||(canceled=void 0!==value&&void 0!==constantValue&&typeof value!=typeof constantValue&&null!==value)},trapProp=function(base,prop,configurable,handler){if(!handler.init(base[prop]))return!1;var prevSetter,origDescriptor=Object.getOwnPropertyDescriptor(base,prop);if(origDescriptor instanceof Object){if(!origDescriptor.configurable){var message=\"Property '\".concat(prop,\"' is not configurable\");return function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,message),!1}base[prop]=constantValue,origDescriptor.set instanceof Function&&(prevSetter=origDescriptor.set)}return Object.defineProperty(base,prop,{configurable:configurable,get:function(){return handler.get()},set:function(a){void 0!==prevSetter&&prevSetter(a),handler.set(a)}}),!0};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain,inChainPropHandler={factValue:void 0,init:function(a){return this.factValue=a,!0},get:function(){return this.factValue},set:function(a){this.factValue!==a&&(this.factValue=a,a instanceof Object&&setChainPropAccess(a,chain))}},endPropHandler={init:function(a){return!mustCancel(a)},get:function(){return constantValue},set:function(a){mustCancel(a)&&(constantValue=a)}};if(chain)if(void 0===base||null!==base[prop]){(base instanceof Object||\"object\"==typeof base)&&isEmptyObject(base)&&trapProp(base,prop,!0,inChainPropHandler);var propValue=owner[prop];(propValue instanceof Object||\"object\"==typeof propValue&&null!==propValue)&&setChainPropAccess(propValue,chain),trapProp(base,prop,!0,inChainPropHandler)}else trapProp(base,prop,!0,inChainPropHandler);else trapProp(base,prop,!1,endPropHandler)&&function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}(window,property)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -120,7 +120,7 @@ "ubo-cookie-remover.js", "ubo-cookie-remover" ], - "scriptlet": "function removeCookie(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,match){var matchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(match),removeCookieFromHost=function(cookieName,hostName){var cookieSpec=\"\".concat(cookieName,\"=\"),domain1=\"; domain=\".concat(hostName),domain2=\"; domain=.\".concat(hostName),path=\"; path=/\",expiration=\"; expires=Thu, 01 Jan 1970 00:00:00 GMT\";document.cookie=cookieSpec+expiration,document.cookie=cookieSpec+domain1+expiration,document.cookie=cookieSpec+domain2+expiration,document.cookie=cookieSpec+path+expiration,document.cookie=cookieSpec+domain1+path+expiration,document.cookie=cookieSpec+domain2+path+expiration,function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)},rmCookie=function(){document.cookie.split(\";\").forEach((function(cookieStr){var pos=cookieStr.indexOf(\"=\");if(-1!==pos){var cookieName=cookieStr.slice(0,pos).trim();if(matchRegexp.test(cookieName))for(var hostParts=document.location.hostname.split(\".\"),i=0;i<=hostParts.length-1;i+=1){var hostName=hostParts.slice(i).join(\".\");hostName&&removeCookieFromHost(cookieName,hostName)}}}))};rmCookie(),window.addEventListener(\"beforeunload\",rmCookie)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function removeCookie(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,match){var matchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(match),removeCookieFromHost=function(cookieName,hostName){var cookieSpec=\"\".concat(cookieName,\"=\"),domain1=\"; domain=\".concat(hostName),domain2=\"; domain=.\".concat(hostName),path=\"; path=/\",expiration=\"; expires=Thu, 01 Jan 1970 00:00:00 GMT\";document.cookie=cookieSpec+expiration,document.cookie=cookieSpec+domain1+expiration,document.cookie=cookieSpec+domain2+expiration,document.cookie=cookieSpec+path+expiration,document.cookie=cookieSpec+domain1+path+expiration,document.cookie=cookieSpec+domain2+path+expiration,function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)},rmCookie=function(){document.cookie.split(\";\").forEach((function(cookieStr){var pos=cookieStr.indexOf(\"=\");if(-1!==pos){var cookieName=cookieStr.slice(0,pos).trim();if(matchRegexp.test(cookieName))for(var hostParts=document.location.hostname.split(\".\"),i=0;i<=hostParts.length-1;i+=1){var hostName=hostParts.slice(i).join(\".\");hostName&&removeCookieFromHost(cookieName,hostName)}}}))};rmCookie(),window.addEventListener(\"beforeunload\",rmCookie)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -132,19 +132,13 @@ "ubo-addEventListener-defuser", "ubo-aeld" ], - "scriptlet": "function preventAddEventListener(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function validateType(type){return void 0!==type}function validateListener(listener){return void 0!==listener&&(\"function\"==typeof listener||\"object\"==typeof listener&&null!==listener&&\"function\"==typeof listener.handleEvent)}function listenerToString(listener){return\"function\"==typeof listener?listener.toString():listener.handleEvent.toString()}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,typeSearch,listenerSearch){var typeSearchRegexp=toRegExp(typeSearch),listenerSearchRegexp=toRegExp(listenerSearch),nativeAddEventListener=window.EventTarget.prototype.addEventListener;function addEventListenerWrapper(type,listener){var shouldPrevent=!1;if(validateType(type)&&validateListener(listener)&&(shouldPrevent=typeSearchRegexp.test(type.toString())&&listenerSearchRegexp.test(listenerToString(listener))),!shouldPrevent){for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeAddEventListener.apply(this,[type,listener].concat(args))}hit(source)}var descriptor={configurable:!0,set:function(){},get:function(){return addEventListenerWrapper}};Object.defineProperty(window.EventTarget.prototype,\"addEventListener\",descriptor),Object.defineProperty(window,\"addEventListener\",descriptor),Object.defineProperty(document,\"addEventListener\",descriptor)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventAddEventListener(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function validateType(type){return void 0!==type}function validateListener(listener){return void 0!==listener&&(\"function\"==typeof listener||\"object\"==typeof listener&&null!==listener&&\"function\"==typeof listener.handleEvent)}function listenerToString(listener){return\"function\"==typeof listener?listener.toString():listener.handleEvent.toString()}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,typeSearch,listenerSearch){var typeSearchRegexp=toRegExp(typeSearch),listenerSearchRegexp=toRegExp(listenerSearch),nativeAddEventListener=window.EventTarget.prototype.addEventListener;function addEventListenerWrapper(type,listener){var shouldPrevent=!1;if(validateType(type)&&validateListener(listener)&&(shouldPrevent=typeSearchRegexp.test(type.toString())&&listenerSearchRegexp.test(listenerToString(listener))),!shouldPrevent){for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeAddEventListener.apply(this,[type,listener].concat(args))}hit(source)}var descriptor={configurable:!0,set:function(){},get:function(){return addEventListenerWrapper}};Object.defineProperty(window.EventTarget.prototype,\"addEventListener\",descriptor),Object.defineProperty(window,\"addEventListener\",descriptor),Object.defineProperty(document,\"addEventListener\",descriptor)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ - "prevent-bab", - "nobab.js", - "ubo-nobab.js", - "bab-defuser.js", - "ubo-bab-defuser.js", - "ubo-nobab", - "ubo-bab-defuser" + "prevent-bab" ], - "scriptlet": "function preventBab(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var nativeSetTimeout=window.setTimeout,babRegex=/\\.bab_elementid.$/;window.setTimeout=function(callback){if(\"string\"!=typeof callback||!babRegex.test(callback)){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeSetTimeout.apply(window,[callback].concat(args))}hit(source)};var signatures=[[\"blockadblock\"],[\"babasbm\"],[/getItem\\('babn'\\)/],[\"getElementById\",\"String.fromCharCode\",\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",\"charAt\",\"DOMContentLoaded\",\"AdBlock\",\"addEventListener\",\"doScroll\",\"fromCharCode\",\"<<2|r>>4\",\"sessionStorage\",\"clientWidth\",\"localStorage\",\"Math\",\"random\"]],nativeEval=window.eval;window.eval=function(str){if(!function(str){if(\"string\"!=typeof str)return!1;for(var i=0;i-1)&&(match+=1)}if(match/tokens.length>=.8)return!0}return!1}(str))return nativeEval(str);hit(source);var bodyEl=document.body;bodyEl&&bodyEl.style.removeProperty(\"visibility\");var el=document.getElementById(\"babasbmsgx\");el&&el.parentNode.removeChild(el)}.bind(window)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventBab(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var nativeSetTimeout=window.setTimeout,babRegex=/\\.bab_elementid.$/;window.setTimeout=function(callback){if(\"string\"!=typeof callback||!babRegex.test(callback)){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeSetTimeout.apply(window,[callback].concat(args))}hit(source)};var signatures=[[\"blockadblock\"],[\"babasbm\"],[/getItem\\('babn'\\)/],[\"getElementById\",\"String.fromCharCode\",\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",\"charAt\",\"DOMContentLoaded\",\"AdBlock\",\"addEventListener\",\"doScroll\",\"fromCharCode\",\"<<2|r>>4\",\"sessionStorage\",\"clientWidth\",\"localStorage\",\"Math\",\"random\"]],nativeEval=window.eval;window.eval=function(str){if(!function(str){if(\"string\"!=typeof str)return!1;for(var i=0;i-1)&&(match+=1)}if(match/tokens.length>=.8)return!0}return!1}(str))return nativeEval(str);hit(source);var bodyEl=document.body;bodyEl&&bodyEl.style.removeProperty(\"visibility\");var el=document.getElementById(\"babasbmsgx\");el&&el.parentNode.removeChild(el)}.bind(window)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -153,7 +147,7 @@ "ubo-nowebrtc.js", "ubo-nowebrtc" ], - "scriptlet": "function nowebrtc(source,args){function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var propertyName=\"\";if(window.RTCPeerConnection?propertyName=\"RTCPeerConnection\":window.webkitRTCPeerConnection&&(propertyName=\"webkitRTCPeerConnection\"),\"\"!==propertyName){var rtcReplacement=function(config){var message=\"Document tried to create an RTCPeerConnection: \".concat(function(config){var str=\"undefined\";if(null===config)str=\"null\";else if(config instanceof Object){var SERVERS_PROP_NAME=\"iceServers\",URLS_PROP_NAME=\"urls\";Object.prototype.hasOwnProperty.call(config,SERVERS_PROP_NAME)&&Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0],URLS_PROP_NAME)&&config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]&&(str=config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString())}return str}(config));!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,message),function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)};rtcReplacement.prototype={close:noopFunc,createDataChannel:noopFunc,createOffer:noopFunc,setRemoteDescription:noopFunc};var rtc=window[propertyName];window[propertyName]=rtcReplacement,rtc.prototype&&(rtc.prototype.createDataChannel=function(a,b){return{close:noopFunc,send:noopFunc}}.bind(null))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function nowebrtc(source,args){function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var propertyName=\"\";if(window.RTCPeerConnection?propertyName=\"RTCPeerConnection\":window.webkitRTCPeerConnection&&(propertyName=\"webkitRTCPeerConnection\"),\"\"!==propertyName){var rtcReplacement=function(config){var message=\"Document tried to create an RTCPeerConnection: \".concat(function(config){var str=\"undefined\";if(null===config)str=\"null\";else if(config instanceof Object){var SERVERS_PROP_NAME=\"iceServers\",URLS_PROP_NAME=\"urls\";Object.prototype.hasOwnProperty.call(config,SERVERS_PROP_NAME)&&Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0],URLS_PROP_NAME)&&config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]&&(str=config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString())}return str}(config));!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,message),function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)};rtcReplacement.prototype={close:noopFunc,createDataChannel:noopFunc,createOffer:noopFunc,setRemoteDescription:noopFunc};var rtc=window[propertyName];window[propertyName]=rtcReplacement,rtc.prototype&&(rtc.prototype.createDataChannel=function(a,b){return{close:noopFunc,send:noopFunc}}.bind(null))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -165,13 +159,13 @@ "ubo-addEventListener-logger", "ubo-aell" ], - "scriptlet": "function logAddEventListener(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function validateType(type){return void 0!==type}function validateListener(listener){return void 0!==listener&&(\"function\"==typeof listener||\"object\"==typeof listener&&null!==listener&&\"function\"==typeof listener.handleEvent)}function listenerToString(listener){return\"function\"==typeof listener?listener.toString():listener.handleEvent.toString()}function convertTypeToString(value){return void 0===value?\"undefined\":\"object\"==typeof value?null===value?\"null\":objectToString(value):value.toString()}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var nativeAddEventListener=window.EventTarget.prototype.addEventListener;function addEventListenerWrapper(type,listener){if(validateType(type)&&validateListener(listener)){var _message='addEventListener(\"'.concat(type,'\", ').concat(listenerToString(listener),\")\");logMessage(source,_message,!0),hit(source)}var message=\"Invalid event type or listener passed to addEventListener:\\ntype: \".concat(convertTypeToString(type),\"\\nlistener: \").concat(convertTypeToString(listener));logMessage(source,message,!0);for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeAddEventListener.apply(this,[type,listener].concat(args))}var descriptor={configurable:!0,set:function(){},get:function(){return addEventListenerWrapper}};Object.defineProperty(window.EventTarget.prototype,\"addEventListener\",descriptor),Object.defineProperty(window,\"addEventListener\",descriptor),Object.defineProperty(document,\"addEventListener\",descriptor)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function logAddEventListener(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function validateType(type){return void 0!==type}function validateListener(listener){return void 0!==listener&&(\"function\"==typeof listener||\"object\"==typeof listener&&null!==listener&&\"function\"==typeof listener.handleEvent)}function listenerToString(listener){return\"function\"==typeof listener?listener.toString():listener.handleEvent.toString()}function convertTypeToString(value){return void 0===value?\"undefined\":\"object\"==typeof value?null===value?\"null\":objectToString(value):value.toString()}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var nativeAddEventListener=window.EventTarget.prototype.addEventListener;function addEventListenerWrapper(type,listener){if(validateType(type)&&validateListener(listener)){var _message='addEventListener(\"'.concat(type,'\", ').concat(listenerToString(listener),\")\");logMessage(source,_message,!0),hit(source)}var message=\"Invalid event type or listener passed to addEventListener:\\ntype: \".concat(convertTypeToString(type),\"\\nlistener: \").concat(convertTypeToString(listener));logMessage(source,message,!0);for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeAddEventListener.apply(this,[type,listener].concat(args))}var descriptor={configurable:!0,set:function(){},get:function(){return addEventListenerWrapper}};Object.defineProperty(window.EventTarget.prototype,\"addEventListener\",descriptor),Object.defineProperty(window,\"addEventListener\",descriptor),Object.defineProperty(document,\"addEventListener\",descriptor)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "log-eval" ], - "scriptlet": "function logEval(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var nativeEval=window.eval;window.eval=function(str){return hit(source),logMessage(source,'eval(\"'.concat(str,'\")'),!0),nativeEval(str)};var nativeFunction=window.Function;function FunctionWrapper(){hit(source);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];return logMessage(source,\"new Function(\".concat(args.join(\", \"),\")\"),!0),nativeFunction.apply(this,[].concat(args))}FunctionWrapper.prototype=Object.create(nativeFunction.prototype),FunctionWrapper.prototype.constructor=FunctionWrapper,window.Function=FunctionWrapper}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function logEval(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var nativeEval=window.eval;window.eval=function(str){return hit(source),logMessage(source,'eval(\"'.concat(str,'\")'),!0),nativeEval(str)};var nativeFunction=window.Function;function FunctionWrapper(){hit(source);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];return logMessage(source,\"new Function(\".concat(args.join(\", \"),\")\"),!0),nativeFunction.apply(this,[].concat(args))}FunctionWrapper.prototype=Object.create(nativeFunction.prototype),FunctionWrapper.prototype.constructor=FunctionWrapper,window.Function=FunctionWrapper}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -189,7 +183,7 @@ "ubo-noeval", "ubo-silent-noeval" ], - "scriptlet": "function noeval(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){window.eval=function(s){!function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source,\"AdGuard has prevented eval:\\n\".concat(s))}.bind()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function noeval(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){window.eval=function(s){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,\"AdGuard has prevented eval:\\n\".concat(s),!0)}.bind()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -198,7 +192,7 @@ "ubo-noeval-if.js", "ubo-noeval-if" ], - "scriptlet": "function preventEvalIf(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,search){var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(search),nativeEval=window.eval;window.eval=function(payload){if(!searchRegexp.test(payload.toString()))return nativeEval.call(window,payload);!function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source,payload)}.bind(window)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventEvalIf(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,search){var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(search),nativeEval=window.eval;window.eval=function(payload){if(!searchRegexp.test(payload.toString()))return nativeEval.call(window,payload);!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}.bind(window)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -209,7 +203,7 @@ "ubo-fuckadblock.js-3.2.0", "ubo-nofab" ], - "scriptlet": "function preventFab(source,args){function noopFunc(){}function noopThis(){return this}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){!function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);var Fab=function(){};Fab.prototype.check=noopFunc,Fab.prototype.clearEvent=noopFunc,Fab.prototype.emitEvent=noopFunc,Fab.prototype.on=function(a,b){return a||b(),this},Fab.prototype.onDetected=noopThis,Fab.prototype.onNotDetected=function(a){return a(),this},Fab.prototype.setOption=noopFunc,Fab.prototype.options={set:noopFunc,get:noopFunc};var fab=new Fab,getSetFab={get:function(){return Fab},set:function(){}},getsetfab={get:function(){return fab},set:function(){}};Object.prototype.hasOwnProperty.call(window,\"FuckAdBlock\")?window.FuckAdBlock=Fab:Object.defineProperty(window,\"FuckAdBlock\",getSetFab),Object.prototype.hasOwnProperty.call(window,\"BlockAdBlock\")?window.BlockAdBlock=Fab:Object.defineProperty(window,\"BlockAdBlock\",getSetFab),Object.prototype.hasOwnProperty.call(window,\"SniffAdBlock\")?window.SniffAdBlock=Fab:Object.defineProperty(window,\"SniffAdBlock\",getSetFab),Object.prototype.hasOwnProperty.call(window,\"fuckAdBlock\")?window.fuckAdBlock=fab:Object.defineProperty(window,\"fuckAdBlock\",getsetfab),Object.prototype.hasOwnProperty.call(window,\"blockAdBlock\")?window.blockAdBlock=fab:Object.defineProperty(window,\"blockAdBlock\",getsetfab),Object.prototype.hasOwnProperty.call(window,\"sniffAdBlock\")?window.sniffAdBlock=fab:Object.defineProperty(window,\"sniffAdBlock\",getsetfab)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventFab(source,args){function noopFunc(){}function noopThis(){return this}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);var Fab=function(){};Fab.prototype.check=noopFunc,Fab.prototype.clearEvent=noopFunc,Fab.prototype.emitEvent=noopFunc,Fab.prototype.on=function(a,b){return a||b(),this},Fab.prototype.onDetected=noopThis,Fab.prototype.onNotDetected=function(a){return a(),this},Fab.prototype.setOption=noopFunc,Fab.prototype.options={set:noopFunc,get:noopFunc};var fab=new Fab,getSetFab={get:function(){return Fab},set:function(){}},getsetfab={get:function(){return fab},set:function(){}};Object.prototype.hasOwnProperty.call(window,\"FuckAdBlock\")?window.FuckAdBlock=Fab:Object.defineProperty(window,\"FuckAdBlock\",getSetFab),Object.prototype.hasOwnProperty.call(window,\"BlockAdBlock\")?window.BlockAdBlock=Fab:Object.defineProperty(window,\"BlockAdBlock\",getSetFab),Object.prototype.hasOwnProperty.call(window,\"SniffAdBlock\")?window.SniffAdBlock=Fab:Object.defineProperty(window,\"SniffAdBlock\",getSetFab),Object.prototype.hasOwnProperty.call(window,\"fuckAdBlock\")?window.fuckAdBlock=fab:Object.defineProperty(window,\"fuckAdBlock\",getsetfab),Object.prototype.hasOwnProperty.call(window,\"blockAdBlock\")?window.blockAdBlock=fab:Object.defineProperty(window,\"blockAdBlock\",getsetfab),Object.prototype.hasOwnProperty.call(window,\"sniffAdBlock\")?window.sniffAdBlock=fab:Object.defineProperty(window,\"sniffAdBlock\",getsetfab)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -218,7 +212,7 @@ "ubo-popads-dummy.js", "ubo-popads-dummy" ], - "scriptlet": "function setPopadsDummy(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){delete window.PopAds,delete window.popns,Object.defineProperties(window,{PopAds:{get:function(){return hit(source),{}}},popns:{get:function(){return hit(source),{}}}})}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function setPopadsDummy(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){delete window.PopAds,delete window.popns,Object.defineProperties(window,{PopAds:{get:function(){return hit(source),{}}},popns:{get:function(){return hit(source),{}}}})}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -227,7 +221,7 @@ "ubo-popads.net.js", "ubo-popads.net" ], - "scriptlet": "function preventPopadsNet(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var rid=Math.random().toString(36).substr(2,9),throwError=function(){throw new ReferenceError(rid)};delete window.PopAds,delete window.popns,Object.defineProperties(window,{PopAds:{set:throwError},popns:{set:throwError}}),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind(),function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventPopadsNet(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var rid=Math.random().toString(36).substr(2,9),throwError=function(){throw new ReferenceError(rid)};delete window.PopAds,delete window.popns,Object.defineProperties(window,{PopAds:{set:throwError},popns:{set:throwError}}),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind(),function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -236,25 +230,25 @@ "ubo-adfly-defuser.js", "ubo-adfly-defuser" ], - "scriptlet": "function preventAdfly(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var val,isDigit=function(data){return/^\\d$/.test(data)},applyHandler=!0;object=window,property=\"ysmm\",descriptor={configurable:!1,set:function(value){if(applyHandler){applyHandler=!1;try{\"string\"==typeof value&&function(encodedURL){for(var evenChars=\"\",oddChars=\"\",i=0;i2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,\"Failed to set up prevent-adfly scriptlet\"):function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);var object,property,descriptor,currentDescriptor}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventAdfly(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var val,isDigit=function(data){return/^\\d$/.test(data)},applyHandler=!0;object=window,property=\"ysmm\",descriptor={configurable:!1,set:function(value){if(applyHandler){applyHandler=!1;try{\"string\"==typeof value&&function(encodedURL){for(var evenChars=\"\",oddChars=\"\",i=0;i2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,\"Failed to set up prevent-adfly scriptlet\"):function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);var object,property,descriptor,currentDescriptor}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "debug-on-property-read" ], - "scriptlet": "function debugOnPropertyRead(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){!function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:abort,set:noopFunc})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function debugOnPropertyRead(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:abort,set:noopFunc})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "debug-on-property-write" ], - "scriptlet": "function debugOnPropertyWrite(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){!function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:abort})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function debugOnPropertyWrite(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:abort})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "debug-current-inline-script" ], - "scriptlet": "function debugCurrentInlineScript(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,search){var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(search),rid=Math.random().toString(36).substr(2,9),getCurrentScript=function(){if(\"currentScript\"in document)return document.currentScript;var scripts=document.getElementsByTagName(\"script\");return scripts[scripts.length-1]},ourScript=getCurrentScript(),abort=function(){var scriptEl=getCurrentScript();if(scriptEl){var content=scriptEl.textContent;try{content=Object.getOwnPropertyDescriptor(Node.prototype,\"textContent\").get.call(scriptEl)}catch(e){}if(scriptEl instanceof HTMLScriptElement&&content.length>0&&scriptEl!==ourScript&&searchRegexp.test(content)){!function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger}}};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(base instanceof Object!=0||null!==base)if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var currentValue=base[prop];!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:function(value){abort(),currentValue=value},get:function(){return abort(),currentValue}})}else{var props=property.split(\".\"),propIndex=props.indexOf(prop),baseName=props[propIndex-1];!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(\"The scriptlet had been executed before the \".concat(baseName,\" was loaded.\"),source.verbose)}}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function debugCurrentInlineScript(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,search){var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(search),rid=Math.random().toString(36).substr(2,9),getCurrentScript=function(){if(\"currentScript\"in document)return document.currentScript;var scripts=document.getElementsByTagName(\"script\");return scripts[scripts.length-1]},ourScript=getCurrentScript(),abort=function(){var scriptEl=getCurrentScript();if(scriptEl){var content=scriptEl.textContent;try{content=Object.getOwnPropertyDescriptor(Node.prototype,\"textContent\").get.call(scriptEl)}catch(e){}if(scriptEl instanceof HTMLScriptElement&&content.length>0&&scriptEl!==ourScript&&searchRegexp.test(content)){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger}}};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(base instanceof Object!=0||null!==base)if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var currentValue=base[prop];!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:function(value){abort(),currentValue=value},get:function(){return abort(),currentValue}})}else{var props=property.split(\".\"),propIndex=props.indexOf(prop),baseName=props[propIndex-1];!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(\"The scriptlet had been executed before the \".concat(baseName,\" was loaded.\"),source.verbose)}}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -266,13 +260,13 @@ "ubo-remove-attr", "ubo-ra" ], - "scriptlet": "function removeAttr(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function observeDOMChanges(callback){var observeAttrs=arguments.length>1&&void 0!==arguments[1]&&arguments[1],attrsToObserve=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],THROTTLE_DELAY_MS=20,observer=new MutationObserver(throttle(callbackWrapper,THROTTLE_DELAY_MS)),connect=function(){attrsToObserve.length>0?observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs,attributeFilter:attrsToObserve}):observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs})},disconnect=function(){observer.disconnect()};function callbackWrapper(){disconnect(),callback(),connect()}connect()}function parseFlags(flags){var VALID_FLAGS=[\"stay\",\"asap\",\"complete\"],passedFlags=flags.trim().split(\" \").filter((function(f){return-1!==VALID_FLAGS.indexOf(f)}));return{ASAP:\"asap\",COMPLETE:\"complete\",STAY:\"stay\",hasFlag:function(flag){return-1!==passedFlags.indexOf(flag)}}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function throttle(cb,delay){var savedArgs,wait=!1;return function wrapper(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];wait?savedArgs=args:(cb.apply(void 0,args),wait=!0,setTimeout((function(){wait=!1,savedArgs&&(wrapper(savedArgs),savedArgs=null)}),delay))}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,attrs,selector){var applying=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"asap stay\";if(attrs){attrs=attrs.split(/\\s*\\|\\s*/),selector||(selector=\"[\".concat(attrs.join(\"],[\"),\"]\"));var rmattr=function(){var nodes=[];try{nodes=[].slice.call(document.querySelectorAll(selector))}catch(e){logMessage(source,\"Invalid selector arg: '\".concat(selector,\"'\"))}var removed=!1;nodes.forEach((function(node){attrs.forEach((function(attr){node.removeAttribute(attr),removed=!0}))})),removed&&hit(source)},flags=parseFlags(applying),run=function(){rmattr(),flags.hasFlag(flags.STAY)&&observeDOMChanges(rmattr,!0)};flags.hasFlag(flags.ASAP)&&(\"loading\"===document.readyState?window.addEventListener(\"DOMContentLoaded\",rmattr,{once:!0}):rmattr()),\"complete\"!==document.readyState&&flags.hasFlag(flags.COMPLETE)?window.addEventListener(\"load\",run,{once:!0}):flags.hasFlag(flags.STAY)&&(-1!==!applying.indexOf(\" \")&&rmattr(),observeDOMChanges(rmattr,!0))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function removeAttr(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function observeDOMChanges(callback){var observeAttrs=arguments.length>1&&void 0!==arguments[1]&&arguments[1],attrsToObserve=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],THROTTLE_DELAY_MS=20,observer=new MutationObserver(throttle(callbackWrapper,THROTTLE_DELAY_MS)),connect=function(){attrsToObserve.length>0?observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs,attributeFilter:attrsToObserve}):observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs})},disconnect=function(){observer.disconnect()};function callbackWrapper(){disconnect(),callback(),connect()}connect()}function parseFlags(flags){var VALID_FLAGS=[\"stay\",\"asap\",\"complete\"],passedFlags=flags.trim().split(\" \").filter((function(f){return-1!==VALID_FLAGS.indexOf(f)}));return{ASAP:\"asap\",COMPLETE:\"complete\",STAY:\"stay\",hasFlag:function(flag){return-1!==passedFlags.indexOf(flag)}}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function throttle(cb,delay){var savedArgs,wait=!1;return function wrapper(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];wait?savedArgs=args:(cb.apply(void 0,args),wait=!0,setTimeout((function(){wait=!1,savedArgs&&(wrapper(savedArgs),savedArgs=null)}),delay))}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,attrs,selector){var applying=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"asap stay\";if(attrs){attrs=attrs.split(/\\s*\\|\\s*/),selector||(selector=\"[\".concat(attrs.join(\"],[\"),\"]\"));var rmattr=function(){var nodes=[];try{nodes=[].slice.call(document.querySelectorAll(selector))}catch(e){logMessage(source,\"Invalid selector arg: '\".concat(selector,\"'\"))}var removed=!1;nodes.forEach((function(node){attrs.forEach((function(attr){node.removeAttribute(attr),removed=!0}))})),removed&&hit(source)},flags=parseFlags(applying),run=function(){rmattr(),flags.hasFlag(flags.STAY)&&observeDOMChanges(rmattr,!0)};flags.hasFlag(flags.ASAP)&&(\"loading\"===document.readyState?window.addEventListener(\"DOMContentLoaded\",rmattr,{once:!0}):rmattr()),\"complete\"!==document.readyState&&flags.hasFlag(flags.COMPLETE)?window.addEventListener(\"load\",run,{once:!0}):flags.hasFlag(flags.STAY)&&(-1!==!applying.indexOf(\" \")&&rmattr(),observeDOMChanges(rmattr,!0))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "set-attr" ], - "scriptlet": "function setAttr(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function observeDOMChanges(callback){var observeAttrs=arguments.length>1&&void 0!==arguments[1]&&arguments[1],attrsToObserve=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],THROTTLE_DELAY_MS=20,observer=new MutationObserver(throttle(callbackWrapper,THROTTLE_DELAY_MS)),connect=function(){attrsToObserve.length>0?observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs,attributeFilter:attrsToObserve}):observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs})},disconnect=function(){observer.disconnect()};function callbackWrapper(){disconnect(),callback(),connect()}connect()}function nativeIsNaN(num){return(Number.isNaN||window.isNaN)(num)}function throttle(cb,delay){var savedArgs,wait=!1;return function wrapper(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];wait?savedArgs=args:(cb.apply(void 0,args),wait=!0,setTimeout((function(){wait=!1,savedArgs&&(wrapper(savedArgs),savedArgs=null)}),delay))}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,selector,attr){var value=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\";if(selector&&attr&&(0===value.length||!(nativeIsNaN(parseInt(value,10))||parseInt(value,10)<0||parseInt(value,10)>32767))){var setAttr=function(){var nodes=[].slice.call(document.querySelectorAll(selector)),set=!1;nodes.forEach((function(node){node.setAttribute(attr,value),set=!0})),set&&hit(source)};setAttr(),observeDOMChanges(setAttr,!0)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function setAttr(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function observeDOMChanges(callback){var observeAttrs=arguments.length>1&&void 0!==arguments[1]&&arguments[1],attrsToObserve=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],THROTTLE_DELAY_MS=20,observer=new MutationObserver(throttle(callbackWrapper,THROTTLE_DELAY_MS)),connect=function(){attrsToObserve.length>0?observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs,attributeFilter:attrsToObserve}):observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs})},disconnect=function(){observer.disconnect()};function callbackWrapper(){disconnect(),callback(),connect()}connect()}function nativeIsNaN(num){return(Number.isNaN||window.isNaN)(num)}function throttle(cb,delay){var savedArgs,wait=!1;return function wrapper(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];wait?savedArgs=args:(cb.apply(void 0,args),wait=!0,setTimeout((function(){wait=!1,savedArgs&&(wrapper(savedArgs),savedArgs=null)}),delay))}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,selector,attr){var value=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\";if(selector&&attr&&(0===value.length||!(nativeIsNaN(parseInt(value,10))||parseInt(value,10)<0||parseInt(value,10)>32767))){var setAttr=function(){var nodes=[].slice.call(document.querySelectorAll(selector)),set=!1;nodes.forEach((function(node){node.setAttribute(attr,value),set=!0})),set&&hit(source)};setAttr(),observeDOMChanges(setAttr,!0)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -284,7 +278,7 @@ "ubo-remove-class", "ubo-rc" ], - "scriptlet": "function removeClass(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function observeDOMChanges(callback){var observeAttrs=arguments.length>1&&void 0!==arguments[1]&&arguments[1],attrsToObserve=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],THROTTLE_DELAY_MS=20,observer=new MutationObserver(throttle(callbackWrapper,THROTTLE_DELAY_MS)),connect=function(){attrsToObserve.length>0?observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs,attributeFilter:attrsToObserve}):observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs})},disconnect=function(){observer.disconnect()};function callbackWrapper(){disconnect(),callback(),connect()}connect()}function parseFlags(flags){var VALID_FLAGS=[\"stay\",\"asap\",\"complete\"],passedFlags=flags.trim().split(\" \").filter((function(f){return-1!==VALID_FLAGS.indexOf(f)}));return{ASAP:\"asap\",COMPLETE:\"complete\",STAY:\"stay\",hasFlag:function(flag){return-1!==passedFlags.indexOf(flag)}}}function throttle(cb,delay){var savedArgs,wait=!1;return function wrapper(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];wait?savedArgs=args:(cb.apply(void 0,args),wait=!0,setTimeout((function(){wait=!1,savedArgs&&(wrapper(savedArgs),savedArgs=null)}),delay))}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,classNames,selector){var applying=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"asap stay\";if(classNames){classNames=classNames.split(/\\s*\\|\\s*/);var selectors=[];selector||(selectors=classNames.map((function(className){return\".\".concat(className)})));var removeClassHandler=function(){var nodes=new Set;if(selector){var foundNodes=[];try{foundNodes=[].slice.call(document.querySelectorAll(selector))}catch(e){logMessage(source,\"Invalid selector arg: '\".concat(selector,\"'\"))}foundNodes.forEach((function(n){return nodes.add(n)}))}else selectors.length>0&&selectors.forEach((function(s){for(var elements=document.querySelectorAll(s),i=0;i-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function observeDOMChanges(callback){var observeAttrs=arguments.length>1&&void 0!==arguments[1]&&arguments[1],attrsToObserve=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],THROTTLE_DELAY_MS=20,observer=new MutationObserver(throttle(callbackWrapper,THROTTLE_DELAY_MS)),connect=function(){attrsToObserve.length>0?observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs,attributeFilter:attrsToObserve}):observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs})},disconnect=function(){observer.disconnect()};function callbackWrapper(){disconnect(),callback(),connect()}connect()}function parseFlags(flags){var VALID_FLAGS=[\"stay\",\"asap\",\"complete\"],passedFlags=flags.trim().split(\" \").filter((function(f){return-1!==VALID_FLAGS.indexOf(f)}));return{ASAP:\"asap\",COMPLETE:\"complete\",STAY:\"stay\",hasFlag:function(flag){return-1!==passedFlags.indexOf(flag)}}}function throttle(cb,delay){var savedArgs,wait=!1;return function wrapper(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];wait?savedArgs=args:(cb.apply(void 0,args),wait=!0,setTimeout((function(){wait=!1,savedArgs&&(wrapper(savedArgs),savedArgs=null)}),delay))}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,classNames,selector){var applying=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"asap stay\";if(classNames){classNames=classNames.split(/\\s*\\|\\s*/);var selectors=[];selector||(selectors=classNames.map((function(className){return\".\".concat(className)})));var removeClassHandler=function(){var nodes=new Set;if(selector){var foundNodes=[];try{foundNodes=[].slice.call(document.querySelectorAll(selector))}catch(e){logMessage(source,\"Invalid selector arg: '\".concat(selector,\"'\"))}foundNodes.forEach((function(n){return nodes.add(n)}))}else selectors.length>0&&selectors.forEach((function(s){for(var elements=document.querySelectorAll(s),i=0;i-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){document.addEventListener(\"click\",(function(ev){for(var target=ev.target;null!==target;){if(\"a\"===target.localName&&target.hasAttribute(\"target\")){ev.stopPropagation(),ev.preventDefault(),hit(source);break}target=target.parentNode}}))}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function disableNewtabLinks(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){document.addEventListener(\"click\",(function(ev){for(var target=ev.target;null!==target;){if(\"a\"===target.localName&&target.hasAttribute(\"target\")){ev.stopPropagation(),ev.preventDefault(),hit(source);break}target=target.parentNode}}))}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -305,7 +299,7 @@ "ubo-nano-setInterval-booster", "ubo-nano-sib" ], - "scriptlet": "function adjustSetInterval(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function isValidCallback(callback){return callback instanceof Function||\"string\"==typeof callback}function getBoostMultiplier(boost){var num,parsedBoost=parseFloat(boost),boostMultiplier=nativeIsNaN(parsedBoost)||(num=parsedBoost,!(Number.isFinite||window.isFinite)(num))?.05:parsedBoost;return boostMultiplier<.02&&(boostMultiplier=.02),boostMultiplier>50&&(boostMultiplier=50),boostMultiplier}function isDelayMatched(inputDelay,realDelay){return\"*\"===inputDelay||realDelay===function(delay){var DEFAULT_DELAY=1e3,parsedDelay=parseInt(delay,10);return nativeIsNaN(parsedDelay)?DEFAULT_DELAY:parsedDelay}(inputDelay)}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function nativeIsNaN(num){return(Number.isNaN||window.isNaN)(num)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,matchCallback,matchDelay,boost){var nativeSetInterval=window.setInterval,matchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(matchCallback);window.setInterval=function(callback,delay){if(isValidCallback(callback))matchRegexp.test(callback.toString())&&isDelayMatched(matchDelay,delay)&&(delay*=getBoostMultiplier(boost),hit(source));else{var message=\"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback),\"'.\");logMessage(source,message)}for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeSetInterval.apply(window,[callback,delay].concat(args))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function adjustSetInterval(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function isValidCallback(callback){return callback instanceof Function||\"string\"==typeof callback}function getBoostMultiplier(boost){var num,parsedBoost=parseFloat(boost),boostMultiplier=nativeIsNaN(parsedBoost)||(num=parsedBoost,!(Number.isFinite||window.isFinite)(num))?.05:parsedBoost;return boostMultiplier<.02&&(boostMultiplier=.02),boostMultiplier>50&&(boostMultiplier=50),boostMultiplier}function isDelayMatched(inputDelay,realDelay){return\"*\"===inputDelay||realDelay===function(delay){var DEFAULT_DELAY=1e3,parsedDelay=parseInt(delay,10);return nativeIsNaN(parsedDelay)?DEFAULT_DELAY:parsedDelay}(inputDelay)}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function nativeIsNaN(num){return(Number.isNaN||window.isNaN)(num)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,matchCallback,matchDelay,boost){var nativeSetInterval=window.setInterval,matchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(matchCallback);window.setInterval=function(callback,delay){if(isValidCallback(callback))matchRegexp.test(callback.toString())&&isDelayMatched(matchDelay,delay)&&(delay*=getBoostMultiplier(boost),hit(source));else{var message=\"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback),\"'.\");logMessage(source,message)}for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeSetInterval.apply(window,[callback,delay].concat(args))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -317,14 +311,14 @@ "ubo-nano-setTimeout-booster", "ubo-nano-stb" ], - "scriptlet": "function adjustSetTimeout(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function isValidCallback(callback){return callback instanceof Function||\"string\"==typeof callback}function getBoostMultiplier(boost){var num,parsedBoost=parseFloat(boost),boostMultiplier=nativeIsNaN(parsedBoost)||(num=parsedBoost,!(Number.isFinite||window.isFinite)(num))?.05:parsedBoost;return boostMultiplier<.02&&(boostMultiplier=.02),boostMultiplier>50&&(boostMultiplier=50),boostMultiplier}function isDelayMatched(inputDelay,realDelay){return\"*\"===inputDelay||realDelay===function(delay){var DEFAULT_DELAY=1e3,parsedDelay=parseInt(delay,10);return nativeIsNaN(parsedDelay)?DEFAULT_DELAY:parsedDelay}(inputDelay)}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function nativeIsNaN(num){return(Number.isNaN||window.isNaN)(num)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,matchCallback,matchDelay,boost){var nativeSetTimeout=window.setTimeout,matchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(matchCallback);window.setTimeout=function(callback,delay){if(isValidCallback(callback))matchRegexp.test(callback.toString())&&isDelayMatched(matchDelay,delay)&&(delay*=getBoostMultiplier(boost),hit(source));else{var message=\"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback),\"'.\");logMessage(source,message)}for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeSetTimeout.apply(window,[callback,delay].concat(args))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function adjustSetTimeout(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function isValidCallback(callback){return callback instanceof Function||\"string\"==typeof callback}function getBoostMultiplier(boost){var num,parsedBoost=parseFloat(boost),boostMultiplier=nativeIsNaN(parsedBoost)||(num=parsedBoost,!(Number.isFinite||window.isFinite)(num))?.05:parsedBoost;return boostMultiplier<.02&&(boostMultiplier=.02),boostMultiplier>50&&(boostMultiplier=50),boostMultiplier}function isDelayMatched(inputDelay,realDelay){return\"*\"===inputDelay||realDelay===function(delay){var DEFAULT_DELAY=1e3,parsedDelay=parseInt(delay,10);return nativeIsNaN(parsedDelay)?DEFAULT_DELAY:parsedDelay}(inputDelay)}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function nativeIsNaN(num){return(Number.isNaN||window.isNaN)(num)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,matchCallback,matchDelay,boost){var nativeSetTimeout=window.setTimeout,matchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(matchCallback);window.setTimeout=function(callback,delay){if(isValidCallback(callback))matchRegexp.test(callback.toString())&&isDelayMatched(matchDelay,delay)&&(delay*=getBoostMultiplier(boost),hit(source));else{var message=\"Scriptlet can't be applied because of invalid callback: '\".concat(String(callback),\"'.\");logMessage(source,message)}for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeSetTimeout.apply(window,[callback,delay].concat(args))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "dir-string", "abp-dir-string" ], - "scriptlet": "function dirString(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,times){var dir=console.dir;times=parseInt(times,10),console.dir=function(object){for(var temp,i=0;i-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source,temp)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function dirString(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,times){var dir=console.dir;console.dir=function(object){\"function\"==typeof dir&&dir.call(this,object),function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -334,7 +328,7 @@ "ubo-json-prune", "abp-json-prune" ], - "scriptlet": "function jsonPrune(source,args){function getWildcardPropertyInChain(base,chain){var lookThrough=arguments.length>2&&void 0!==arguments[2]&&arguments[2],output=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],pos=chain.indexOf(\".\");if(-1===pos){if(\"*\"===chain||\"[]\"===chain)for(var key in base)Object.prototype.hasOwnProperty.call(base,key)&&output.push({base:base,prop:key});else output.push({base:base,prop:chain});return output}var prop=chain.slice(0,pos),shouldLookThrough=\"[]\"===prop&&Array.isArray(base)||\"*\"===prop&&base instanceof Object;if(shouldLookThrough){var nextProp=chain.slice(pos+1),baseKeys=Object.keys(base);baseKeys.forEach((function(key){getWildcardPropertyInChain(base[key],nextProp,lookThrough,output)}))}var nextBase=base[prop];return chain=chain.slice(pos+1),void 0!==nextBase&&getWildcardPropertyInChain(nextBase,chain,lookThrough,output),output}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToRemove,requiredInitialProps,stack){if(!stack||function(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(shouldAbortInlineOrInjectedScript(stackMatch,stackTrace))return!0;var stackRegexp=toRegExp(stackMatch),refinedStackTrace=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).join(\"\\n\");return Object.getOwnPropertyDescriptor(RegExp.prototype,\"test\").value.call(stackRegexp,refinedStackTrace)}(stack,(new Error).stack)){var prunePaths=void 0!==propsToRemove&&\"\"!==propsToRemove?propsToRemove.split(/ +/):[],requiredPaths=void 0!==requiredInitialProps&&\"\"!==requiredInitialProps?requiredInitialProps.split(/ +/):[],jsonPruner=function(root){if(0===prunePaths.length&&0===requiredPaths.length)return logMessage(source,\"\".concat(window.location.hostname,\" \").concat(root),!0),root;try{if(!1===function(root){if(!root)return!1;var shouldProcess;if(0===prunePaths.length&&requiredPaths.length>0){var rootString=JSON.stringify(root);if(toRegExp(requiredPaths.join(\"\")).test(rootString))return logMessage(source,\"\".concat(window.location.hostname,\" \").concat(root),!0),!1}for(var i=0;i-1||requiredPath.indexOf(\"*.\")>-1||requiredPath.indexOf(\".*\")>-1||requiredPath.indexOf(\".[].\")>-1||requiredPath.indexOf(\"[].\")>-1||requiredPath.indexOf(\".[]\")>-1,details=getWildcardPropertyInChain(root,requiredPath,hasWildcard);shouldProcess=!hasWildcard;for(var _i=0;_i-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source))}))}))}catch(e){logMessage(source,e)}return root},nativeJSONParse=JSON.parse,jsonParseWrapper=function(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];var root=nativeJSONParse.apply(JSON,args);return jsonPruner(root)};jsonParseWrapper.toString=nativeJSONParse.toString.bind(nativeJSONParse),JSON.parse=jsonParseWrapper;var nativeResponseJson=Response.prototype.json;\"undefined\"!=typeof Response&&(Response.prototype.json=function(){return nativeResponseJson.apply(this).then((function(obj){return jsonPruner(obj)}))})}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function jsonPrune(source,args){function getWildcardPropertyInChain(base,chain){var lookThrough=arguments.length>2&&void 0!==arguments[2]&&arguments[2],output=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],pos=chain.indexOf(\".\");if(-1===pos){if(\"*\"===chain||\"[]\"===chain)for(var key in base)Object.prototype.hasOwnProperty.call(base,key)&&output.push({base:base,prop:key});else output.push({base:base,prop:chain});return output}var prop=chain.slice(0,pos),shouldLookThrough=\"[]\"===prop&&Array.isArray(base)||\"*\"===prop&&base instanceof Object;if(shouldLookThrough){var nextProp=chain.slice(pos+1),baseKeys=Object.keys(base);baseKeys.forEach((function(key){getWildcardPropertyInChain(base[key],nextProp,lookThrough,output)}))}var nextBase=base[prop];return chain=chain.slice(pos+1),void 0!==nextBase&&getWildcardPropertyInChain(nextBase,chain,lookThrough,output),output}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToRemove,requiredInitialProps,stack){if(!stack||function(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(function(stackMatch,stackTrace){var INLINE_SCRIPT_STRING=\"inlineScript\",INJECTED_SCRIPT_STRING=\"injectedScript\",INJECTED_SCRIPT_MARKER=\"\",isInlineScript=function(stackMatch){return stackMatch.indexOf(INLINE_SCRIPT_STRING)>-1},isInjectedScript=function(stackMatch){return stackMatch.indexOf(INJECTED_SCRIPT_STRING)>-1};if(!isInlineScript(stackMatch)&&!isInjectedScript(stackMatch))return!1;var documentURL=window.location.href,pos=documentURL.indexOf(\"#\");-1!==pos&&(documentURL=documentURL.slice(0,pos));var stackLines=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).map((function(line){var stack,getStackTraceURL=/(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);if(getStackTraceURL){var stackURL=getStackTraceURL[2];if(startsWith(stackURL,\"(\")&&(stackURL=stackURL.slice(1)),startsWith(stackURL,INJECTED_SCRIPT_MARKER)){stackURL=INJECTED_SCRIPT_STRING;var stackFunction=void 0!==getStackTraceURL[1]?getStackTraceURL[1].slice(0,-1):line.slice(0,getStackTraceURL.index).trim();startsWith(stackFunction,\"at\")&&(stackFunction=stackFunction.slice(2).trim()),stack=\"\".concat(stackFunction,\" \").concat(stackURL).trim()}else stack=stackURL}else stack=line;return stack}));if(stackLines)for(var index=0;index0){var rootString=JSON.stringify(root);if(toRegExp(requiredPaths.join(\"\")).test(rootString))return logMessage(source,\"\".concat(window.location.hostname,\" \").concat(objectToString(root)),!0),!1}for(var i=0;i-1||requiredPath.indexOf(\"*.\")>-1||requiredPath.indexOf(\".*\")>-1||requiredPath.indexOf(\".[].\")>-1||requiredPath.indexOf(\"[].\")>-1||requiredPath.indexOf(\".[]\")>-1,details=getWildcardPropertyInChain(root,requiredPath,hasWildcard);shouldProcess=!hasWildcard;for(var _i=0;_i-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source))}))}))}catch(e){logMessage(source,e)}return root},nativeJSONParse=JSON.parse,jsonParseWrapper=function(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];var root=nativeJSONParse.apply(JSON,args);return jsonPruner(root)};jsonParseWrapper.toString=nativeJSONParse.toString.bind(nativeJSONParse),JSON.parse=jsonParseWrapper;var nativeResponseJson=Response.prototype.json;\"undefined\"!=typeof Response&&(Response.prototype.json=function(){return nativeResponseJson.apply(this).then((function(obj){return jsonPruner(obj)}))})}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -346,31 +340,31 @@ "ubo-no-requestAnimationFrame-if", "ubo-norafif" ], - "scriptlet": "function preventRequestAnimationFrame(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function noopFunc(){}function isValidStrPattern(input){var isValid,str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);\"/\"===input[0]&&\"/\"===input[input.length-1]&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}function isValidCallback(callback){return callback instanceof Function||\"string\"==typeof callback}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,match){var nativeRequestAnimationFrame=window.requestAnimationFrame,shouldLog=void 0===match,_parseMatchArg=function(match){var str,prefix,isInvertedMatch=(prefix=\"!\",!!(str=match)&&0===str.indexOf(prefix)),matchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(isInvertedMatch?match.slice(1):match);return{isInvertedMatch:isInvertedMatch,matchRegexp:matchRegexp}}(match),isInvertedMatch=_parseMatchArg.isInvertedMatch,matchRegexp=_parseMatchArg.matchRegexp;window.requestAnimationFrame=function(callback){var shouldPrevent=!1;if(shouldLog?(hit(source),logMessage(source,\"requestAnimationFrame(\".concat(String(callback),\")\"),!0)):isValidCallback(callback)&&isValidStrPattern(match)&&(shouldPrevent=matchRegexp.test(callback.toString())!==isInvertedMatch),shouldPrevent)return hit(source),nativeRequestAnimationFrame(noopFunc);for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeRequestAnimationFrame.apply(window,[callback].concat(args))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventRequestAnimationFrame(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function noopFunc(){}function isValidStrPattern(input){var isValid,str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);\"/\"===input[0]&&\"/\"===input[input.length-1]&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}function isValidCallback(callback){return callback instanceof Function||\"string\"==typeof callback}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,match){var nativeRequestAnimationFrame=window.requestAnimationFrame,shouldLog=void 0===match,_parseMatchArg=function(match){var str,prefix,isInvertedMatch=(prefix=\"!\",!!(str=match)&&0===str.indexOf(prefix)),matchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(isInvertedMatch?match.slice(1):match);return{isInvertedMatch:isInvertedMatch,matchRegexp:matchRegexp}}(match),isInvertedMatch=_parseMatchArg.isInvertedMatch,matchRegexp=_parseMatchArg.matchRegexp;window.requestAnimationFrame=function(callback){var shouldPrevent=!1;if(shouldLog?(hit(source),logMessage(source,\"requestAnimationFrame(\".concat(String(callback),\")\"),!0)):isValidCallback(callback)&&isValidStrPattern(match)&&(shouldPrevent=matchRegexp.test(callback.toString())!==isInvertedMatch),shouldPrevent)return hit(source),nativeRequestAnimationFrame(noopFunc);for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeRequestAnimationFrame.apply(window,[callback].concat(args))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "set-cookie" ], - "scriptlet": "function setCookie(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function getLimitedCookieValue(value){if(!value)return null;var validValue,num;if(\"true\"===value)validValue=\"true\";else if(\"True\"===value)validValue=\"True\";else if(\"false\"===value)validValue=\"false\";else if(\"False\"===value)validValue=\"False\";else if(\"yes\"===value)validValue=\"yes\";else if(\"Yes\"===value)validValue=\"Yes\";else if(\"Y\"===value)validValue=\"Y\";else if(\"no\"===value)validValue=\"no\";else if(\"ok\"===value)validValue=\"ok\";else if(\"OK\"===value)validValue=\"OK\";else{if(!/^\\d+$/.test(value))return null;if(validValue=parseFloat(value),num=validValue,(Number.isNaN||window.isNaN)(num))return null;if(Math.abs(validValue)<0||Math.abs(validValue)>15)return null}return validValue}function concatCookieNameValuePath(rawName,rawValue,rawPath){return\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath),\";\")}function isValidCookiePath(rawPath){return\"/\"===rawPath||\"none\"===rawPath}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var path=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"/\",validValue=getLimitedCookieValue(value);if(null!==validValue)if(isValidCookiePath(path)){var cookieToSet=concatCookieNameValuePath(name,validValue,path);cookieToSet&&(hit(source),document.cookie=cookieToSet)}else logMessage(source,\"Invalid cookie path: '\".concat(path,\"'\"));else logMessage(source,\"Invalid cookie value: '\".concat(validValue,\"'\"))}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function setCookie(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function getLimitedCookieValue(value){if(!value)return null;var validValue,num;if(\"true\"===value)validValue=\"true\";else if(\"True\"===value)validValue=\"True\";else if(\"false\"===value)validValue=\"false\";else if(\"False\"===value)validValue=\"False\";else if(\"yes\"===value)validValue=\"yes\";else if(\"Yes\"===value)validValue=\"Yes\";else if(\"Y\"===value)validValue=\"Y\";else if(\"no\"===value)validValue=\"no\";else if(\"ok\"===value)validValue=\"ok\";else if(\"OK\"===value)validValue=\"OK\";else{if(!/^\\d+$/.test(value))return null;if(validValue=parseFloat(value),num=validValue,(Number.isNaN||window.isNaN)(num))return null;if(Math.abs(validValue)<0||Math.abs(validValue)>15)return null}return validValue}function concatCookieNameValuePath(rawName,rawValue,rawPath){return\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath),\";\")}function isValidCookiePath(rawPath){return\"/\"===rawPath||\"none\"===rawPath}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var path=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"/\",validValue=getLimitedCookieValue(value);if(null!==validValue)if(isValidCookiePath(path)){var cookieToSet=concatCookieNameValuePath(name,validValue,path);cookieToSet&&(hit(source),document.cookie=cookieToSet)}else logMessage(source,\"Invalid cookie path: '\".concat(path,\"'\"));else logMessage(source,\"Invalid cookie value: '\".concat(validValue,\"'\"))}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "set-cookie-reload" ], - "scriptlet": "function setCookieReload(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function isCookieSetWithValue(cookieString,name,value){return cookieString.split(\";\").some((function(cookieStr){var pos=cookieStr.indexOf(\"=\");if(-1===pos)return!1;var cookieName=cookieStr.slice(0,pos).trim(),cookieValue=cookieStr.slice(pos+1).trim();return name===cookieName&&value===cookieValue}))}function getLimitedCookieValue(value){if(!value)return null;var validValue,num;if(\"true\"===value)validValue=\"true\";else if(\"True\"===value)validValue=\"True\";else if(\"false\"===value)validValue=\"false\";else if(\"False\"===value)validValue=\"False\";else if(\"yes\"===value)validValue=\"yes\";else if(\"Yes\"===value)validValue=\"Yes\";else if(\"Y\"===value)validValue=\"Y\";else if(\"no\"===value)validValue=\"no\";else if(\"ok\"===value)validValue=\"ok\";else if(\"OK\"===value)validValue=\"OK\";else{if(!/^\\d+$/.test(value))return null;if(validValue=parseFloat(value),num=validValue,(Number.isNaN||window.isNaN)(num))return null;if(Math.abs(validValue)<0||Math.abs(validValue)>15)return null}return validValue}function concatCookieNameValuePath(rawName,rawValue,rawPath){return\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath),\";\")}function isValidCookiePath(rawPath){return\"/\"===rawPath||\"none\"===rawPath}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var path=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"/\";if(!isCookieSetWithValue(name,value)){var validValue=getLimitedCookieValue(value);if(null!==validValue)if(isValidCookiePath(path)){var cookieToSet=concatCookieNameValuePath(name,validValue,path);cookieToSet&&(document.cookie=cookieToSet,hit(source),isCookieSetWithValue(document.cookie,name,value)&&window.location.reload())}else logMessage(source,\"Invalid cookie path: '\".concat(path,\"'\"));else logMessage(source,\"Invalid cookie value: '\".concat(value,\"'\"))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function setCookieReload(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function isCookieSetWithValue(cookieString,name,value){return cookieString.split(\";\").some((function(cookieStr){var pos=cookieStr.indexOf(\"=\");if(-1===pos)return!1;var cookieName=cookieStr.slice(0,pos).trim(),cookieValue=cookieStr.slice(pos+1).trim();return name===cookieName&&value===cookieValue}))}function getLimitedCookieValue(value){if(!value)return null;var validValue,num;if(\"true\"===value)validValue=\"true\";else if(\"True\"===value)validValue=\"True\";else if(\"false\"===value)validValue=\"false\";else if(\"False\"===value)validValue=\"False\";else if(\"yes\"===value)validValue=\"yes\";else if(\"Yes\"===value)validValue=\"Yes\";else if(\"Y\"===value)validValue=\"Y\";else if(\"no\"===value)validValue=\"no\";else if(\"ok\"===value)validValue=\"ok\";else if(\"OK\"===value)validValue=\"OK\";else{if(!/^\\d+$/.test(value))return null;if(validValue=parseFloat(value),num=validValue,(Number.isNaN||window.isNaN)(num))return null;if(Math.abs(validValue)<0||Math.abs(validValue)>15)return null}return validValue}function concatCookieNameValuePath(rawName,rawValue,rawPath){return\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath),\";\")}function isValidCookiePath(rawPath){return\"/\"===rawPath||\"none\"===rawPath}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var path=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"/\";if(!isCookieSetWithValue(name,value)){var validValue=getLimitedCookieValue(value);if(null!==validValue)if(isValidCookiePath(path)){var cookieToSet=concatCookieNameValuePath(name,validValue,path);cookieToSet&&(document.cookie=cookieToSet,hit(source),isCookieSetWithValue(document.cookie,name,value)&&window.location.reload())}else logMessage(source,\"Invalid cookie path: '\".concat(path,\"'\"));else logMessage(source,\"Invalid cookie value: '\".concat(value,\"'\"))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "hide-in-shadow-dom" ], - "scriptlet": "function hideInShadowDom(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function findHostElements(rootElement){var hosts=[];return rootElement.querySelectorAll(\"*\").forEach((function(el){el.shadowRoot&&hosts.push(el)})),hosts}function pierceShadowDom(selector,hostElements){var targets=[],innerHostsAcc=[];hostElements.forEach((function(host){var simpleElems=host.querySelectorAll(selector);targets=targets.concat([].slice.call(simpleElems));var shadowRootElem=host.shadowRoot,shadowChildren=shadowRootElem.querySelectorAll(selector);targets=targets.concat([].slice.call(shadowChildren)),innerHostsAcc.push(findHostElements(shadowRootElem))}));var innerHosts=function(input){var stack=[];input.forEach((function(el){return stack.push(el)}));var res=[];for(;stack.length;){var next=stack.pop();Array.isArray(next)?next.forEach((function(el){return stack.push(el)})):res.push(next)}return res.reverse()}(innerHostsAcc);return{targets:targets,innerHosts:innerHosts}}function throttle(cb,delay){var savedArgs,wait=!1;return function wrapper(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];wait?savedArgs=args:(cb.apply(void 0,args),wait=!0,setTimeout((function(){wait=!1,savedArgs&&(wrapper(savedArgs),savedArgs=null)}),delay))}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,selector,baseSelector){if(Element.prototype.attachShadow){var hideHandler=function(){for(var hostElements=baseSelector?document.querySelectorAll(baseSelector):findHostElements(document.documentElement);0!==hostElements.length;){var isHidden=!1,_pierceShadowDom=pierceShadowDom(selector,hostElements),targets=_pierceShadowDom.targets,innerHosts=_pierceShadowDom.innerHosts;targets.forEach((function(targetEl){targetEl.style.cssText=\"display:none!important;\",isHidden=!0})),isHidden&&hit(source),hostElements=innerHosts}};hideHandler(),function(callback){var observeAttrs=arguments.length>1&&void 0!==arguments[1]&&arguments[1],attrsToObserve=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],observer=new MutationObserver(throttle(callbackWrapper,20)),connect=function(){attrsToObserve.length>0?observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs,attributeFilter:attrsToObserve}):observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs})},disconnect=function(){observer.disconnect()};function callbackWrapper(){disconnect(),callback(),connect()}connect()}(hideHandler,!0)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function hideInShadowDom(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function findHostElements(rootElement){var hosts=[];return rootElement.querySelectorAll(\"*\").forEach((function(el){el.shadowRoot&&hosts.push(el)})),hosts}function pierceShadowDom(selector,hostElements){var targets=[],innerHostsAcc=[];hostElements.forEach((function(host){var simpleElems=host.querySelectorAll(selector);targets=targets.concat([].slice.call(simpleElems));var shadowRootElem=host.shadowRoot,shadowChildren=shadowRootElem.querySelectorAll(selector);targets=targets.concat([].slice.call(shadowChildren)),innerHostsAcc.push(findHostElements(shadowRootElem))}));var innerHosts=function(input){var stack=[];input.forEach((function(el){return stack.push(el)}));var res=[];for(;stack.length;){var next=stack.pop();Array.isArray(next)?next.forEach((function(el){return stack.push(el)})):res.push(next)}return res.reverse()}(innerHostsAcc);return{targets:targets,innerHosts:innerHosts}}function throttle(cb,delay){var savedArgs,wait=!1;return function wrapper(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];wait?savedArgs=args:(cb.apply(void 0,args),wait=!0,setTimeout((function(){wait=!1,savedArgs&&(wrapper(savedArgs),savedArgs=null)}),delay))}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,selector,baseSelector){if(Element.prototype.attachShadow){var hideHandler=function(){for(var hostElements=baseSelector?document.querySelectorAll(baseSelector):findHostElements(document.documentElement);0!==hostElements.length;){var isHidden=!1,_pierceShadowDom=pierceShadowDom(selector,hostElements),targets=_pierceShadowDom.targets,innerHosts=_pierceShadowDom.innerHosts;targets.forEach((function(targetEl){targetEl.style.cssText=\"display:none!important;\",isHidden=!0})),isHidden&&hit(source),hostElements=innerHosts}};hideHandler(),function(callback){var observeAttrs=arguments.length>1&&void 0!==arguments[1]&&arguments[1],attrsToObserve=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],observer=new MutationObserver(throttle(callbackWrapper,20)),connect=function(){attrsToObserve.length>0?observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs,attributeFilter:attrsToObserve}):observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs})},disconnect=function(){observer.disconnect()};function callbackWrapper(){disconnect(),callback(),connect()}connect()}(hideHandler,!0)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "remove-in-shadow-dom" ], - "scriptlet": "function removeInShadowDom(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function findHostElements(rootElement){var hosts=[];return rootElement.querySelectorAll(\"*\").forEach((function(el){el.shadowRoot&&hosts.push(el)})),hosts}function pierceShadowDom(selector,hostElements){var targets=[],innerHostsAcc=[];hostElements.forEach((function(host){var simpleElems=host.querySelectorAll(selector);targets=targets.concat([].slice.call(simpleElems));var shadowRootElem=host.shadowRoot,shadowChildren=shadowRootElem.querySelectorAll(selector);targets=targets.concat([].slice.call(shadowChildren)),innerHostsAcc.push(findHostElements(shadowRootElem))}));var innerHosts=function(input){var stack=[];input.forEach((function(el){return stack.push(el)}));var res=[];for(;stack.length;){var next=stack.pop();Array.isArray(next)?next.forEach((function(el){return stack.push(el)})):res.push(next)}return res.reverse()}(innerHostsAcc);return{targets:targets,innerHosts:innerHosts}}function throttle(cb,delay){var savedArgs,wait=!1;return function wrapper(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];wait?savedArgs=args:(cb.apply(void 0,args),wait=!0,setTimeout((function(){wait=!1,savedArgs&&(wrapper(savedArgs),savedArgs=null)}),delay))}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,selector,baseSelector){if(Element.prototype.attachShadow){var removeHandler=function(){for(var hostElements=baseSelector?document.querySelectorAll(baseSelector):findHostElements(document.documentElement);0!==hostElements.length;){var isRemoved=!1,_pierceShadowDom=pierceShadowDom(selector,hostElements),targets=_pierceShadowDom.targets,innerHosts=_pierceShadowDom.innerHosts;targets.forEach((function(targetEl){targetEl.remove(),isRemoved=!0})),isRemoved&&hit(source),hostElements=innerHosts}};removeHandler(),function(callback){var observeAttrs=arguments.length>1&&void 0!==arguments[1]&&arguments[1],attrsToObserve=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],observer=new MutationObserver(throttle(callbackWrapper,20)),connect=function(){attrsToObserve.length>0?observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs,attributeFilter:attrsToObserve}):observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs})},disconnect=function(){observer.disconnect()};function callbackWrapper(){disconnect(),callback(),connect()}connect()}(removeHandler,!0)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function removeInShadowDom(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function findHostElements(rootElement){var hosts=[];return rootElement.querySelectorAll(\"*\").forEach((function(el){el.shadowRoot&&hosts.push(el)})),hosts}function pierceShadowDom(selector,hostElements){var targets=[],innerHostsAcc=[];hostElements.forEach((function(host){var simpleElems=host.querySelectorAll(selector);targets=targets.concat([].slice.call(simpleElems));var shadowRootElem=host.shadowRoot,shadowChildren=shadowRootElem.querySelectorAll(selector);targets=targets.concat([].slice.call(shadowChildren)),innerHostsAcc.push(findHostElements(shadowRootElem))}));var innerHosts=function(input){var stack=[];input.forEach((function(el){return stack.push(el)}));var res=[];for(;stack.length;){var next=stack.pop();Array.isArray(next)?next.forEach((function(el){return stack.push(el)})):res.push(next)}return res.reverse()}(innerHostsAcc);return{targets:targets,innerHosts:innerHosts}}function throttle(cb,delay){var savedArgs,wait=!1;return function wrapper(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];wait?savedArgs=args:(cb.apply(void 0,args),wait=!0,setTimeout((function(){wait=!1,savedArgs&&(wrapper(savedArgs),savedArgs=null)}),delay))}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,selector,baseSelector){if(Element.prototype.attachShadow){var removeHandler=function(){for(var hostElements=baseSelector?document.querySelectorAll(baseSelector):findHostElements(document.documentElement);0!==hostElements.length;){var isRemoved=!1,_pierceShadowDom=pierceShadowDom(selector,hostElements),targets=_pierceShadowDom.targets,innerHosts=_pierceShadowDom.innerHosts;targets.forEach((function(targetEl){targetEl.remove(),isRemoved=!0})),isRemoved&&hit(source),hostElements=innerHosts}};removeHandler(),function(callback){var observeAttrs=arguments.length>1&&void 0!==arguments[1]&&arguments[1],attrsToObserve=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],observer=new MutationObserver(throttle(callbackWrapper,20)),connect=function(){attrsToObserve.length>0?observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs,attributeFilter:attrsToObserve}):observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:observeAttrs})},disconnect=function(){observer.disconnect()};function callbackWrapper(){disconnect(),callback(),connect()}connect()}(removeHandler,!0)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -379,19 +373,19 @@ "ubo-no-fetch-if.js", "ubo-no-fetch-if" ], - "scriptlet": "function preventFetch(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function getFetchData(args){var fetchUrl,fetchInit,request,fetchPropsObj={};if(args[0]instanceof Request){var requestData=(request=args[0],[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"].map((function(key){return[key,request[key]]})).reduce((function(acc,el){var key=el[0],value=el[1];return acc[key]=value,acc}),{}));fetchUrl=requestData.url,fetchInit=requestData}else fetchUrl=args[0],fetchInit=args[1];return fetchPropsObj.url=fetchUrl,fetchInit instanceof Object&&Object.keys(fetchInit).forEach((function(prop){fetchPropsObj[prop]=fetchInit[prop]})),fetchPropsObj}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function noopPromiseResolve(){var responseBody=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"{}\",responseUrl=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",responseType=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"default\";if(\"undefined\"!=typeof Response){var response=new Response(responseBody,{status:200,statusText:\"OK\"});return Object.defineProperties(response,{url:{value:responseUrl},type:{value:responseType}}),Promise.resolve(response)}}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToMatch){var responseBody=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"emptyObj\",responseType=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"default\";if(\"undefined\"!=typeof fetch&&\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Response){var strResponseBody;if(\"emptyObj\"===responseBody)strResponseBody=\"{}\";else{if(\"emptyArr\"!==responseBody)return;strResponseBody=\"[]\"}if(\"default\"===responseType||\"opaque\"===responseType){var handlerWrapper=function(target,thisArg,args){var fetchData=getFetchData(args);return void 0===propsToMatch?(logMessage(source,\"fetch( \".concat(objectToString(fetchData),\" )\"),!0),hit(source),Reflect.apply(target,thisArg,args)):matchRequestProps(source,propsToMatch,fetchData)?(hit(source),noopPromiseResolve(strResponseBody,fetchData.url,responseType)):Reflect.apply(target,thisArg,args)};fetch=new Proxy(fetch,{apply:handlerWrapper})}else logMessage(source,\"Invalid parameter: \".concat(responseType))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventFetch(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function getFetchData(args){var fetchUrl,fetchInit,entries,request,fetchPropsObj={};if(args[0]instanceof Request){var requestData=(request=args[0],entries=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"].map((function(key){return[key,request[key]]})),entries.reduce((function(acc,el){var key=el[0],value=el[1];return acc[key]=value,acc}),{}));fetchUrl=requestData.url,fetchInit=requestData}else fetchUrl=args[0],fetchInit=args[1];return fetchPropsObj.url=fetchUrl,fetchInit instanceof Object&&Object.keys(fetchInit).forEach((function(prop){fetchPropsObj[prop]=fetchInit[prop]})),fetchPropsObj}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function noopPromiseResolve(){var responseBody=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"{}\",responseUrl=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",responseType=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"default\";if(\"undefined\"!=typeof Response){var response=new Response(responseBody,{status:200,statusText:\"OK\"});return Object.defineProperties(response,{url:{value:responseUrl},type:{value:responseType}}),Promise.resolve(response)}}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToMatch){var responseBody=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"emptyObj\",responseType=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"default\";if(\"undefined\"!=typeof fetch&&\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Response){var strResponseBody;if(\"\"===responseBody||\"emptyObj\"===responseBody)strResponseBody=\"{}\";else{if(\"emptyArr\"!==responseBody)return;strResponseBody=\"[]\"}if(\"default\"===responseType||\"opaque\"===responseType){var handlerWrapper=function(target,thisArg,args){var fetchData=getFetchData(args);return void 0===propsToMatch?(logMessage(source,\"fetch( \".concat(objectToString(fetchData),\" )\"),!0),hit(source),Reflect.apply(target,thisArg,args)):matchRequestProps(source,propsToMatch,fetchData)?(hit(source),noopPromiseResolve(strResponseBody,fetchData.url,responseType)):Reflect.apply(target,thisArg,args)};fetch=new Proxy(fetch,{apply:handlerWrapper})}else logMessage(source,\"Invalid parameter: \".concat(responseType))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "set-local-storage-item" ], - "scriptlet": "function setLocalStorageItem(source,args){function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,key,value){if(void 0!==key){var validValue=function(source,value){if(!value)return null;var validValue,num;if(\"undefined\"===value)validValue=void 0;else if(\"false\"===value)validValue=!1;else if(\"true\"===value)validValue=!0;else if(\"null\"===value)validValue=null;else if(\"emptyArr\"===value)validValue=\"[]\";else if(\"emptyObj\"===value)validValue=\"{}\";else if(\"\"===value)validValue=\"\";else if(/^\\d+$/.test(value)){if(num=validValue=parseFloat(value),(Number.isNaN||window.isNaN)(num))return logMessage(source,\"Invalid storage item value: '\".concat(value,\"'\")),null;if(Math.abs(validValue)>32767)return logMessage(source,\"Invalid storage item value: '\".concat(value,\"'\")),null}else if(\"yes\"===value)validValue=\"yes\";else{if(\"no\"!==value)return null;validValue=\"no\"}return validValue}(source,value);null!==validValue?(function(source,storage,key,value){try{storage.setItem(key,value)}catch(e){logMessage(source,\"Unable to set sessionStorage item due to: \".concat(e.message))}}(source,window.localStorage,key,validValue),function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)):logMessage(source,\"Invalid cookie value: '\".concat(validValue,\"'\"))}else logMessage(source,\"Item key should be specified.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function setLocalStorageItem(source,args){function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,key,value){if(void 0!==key){var validValue;try{validValue=function(value){if(\"string\"!=typeof value)throw new Error(\"Invalid value\");var validValue,num;if(\"undefined\"===value)validValue=void 0;else if(\"false\"===value)validValue=!1;else if(\"true\"===value)validValue=!0;else if(\"null\"===value)validValue=null;else if(\"emptyArr\"===value)validValue=\"[]\";else if(\"emptyObj\"===value)validValue=\"{}\";else if(\"\"===value)validValue=\"\";else if(/^\\d+$/.test(value)){if(num=validValue=parseFloat(value),(Number.isNaN||window.isNaN)(num))throw new Error(\"Invalid value\");if(Math.abs(validValue)>32767)throw new Error(\"Invalid value\")}else if(\"yes\"===value)validValue=\"yes\";else{if(\"no\"!==value)throw new Error(\"Invalid value\");validValue=\"no\"}return validValue}(value)}catch(_unused){return void logMessage(source,\"Invalid storage item value: '\".concat(value,\"'\"))}!function(source,storage,key,value){try{storage.setItem(key,value)}catch(e){logMessage(source,\"Unable to set sessionStorage item due to: \".concat(e.message))}}(source,window.localStorage,key,validValue),function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}else logMessage(source,\"Item key should be specified.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "set-session-storage-item" ], - "scriptlet": "function setSessionStorageItem(source,args){function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,key,value){if(void 0!==key){var validValue=function(source,value){if(!value)return null;var validValue,num;if(\"undefined\"===value)validValue=void 0;else if(\"false\"===value)validValue=!1;else if(\"true\"===value)validValue=!0;else if(\"null\"===value)validValue=null;else if(\"emptyArr\"===value)validValue=\"[]\";else if(\"emptyObj\"===value)validValue=\"{}\";else if(\"\"===value)validValue=\"\";else if(/^\\d+$/.test(value)){if(num=validValue=parseFloat(value),(Number.isNaN||window.isNaN)(num))return logMessage(source,\"Invalid storage item value: '\".concat(value,\"'\")),null;if(Math.abs(validValue)>32767)return logMessage(source,\"Invalid storage item value: '\".concat(value,\"'\")),null}else if(\"yes\"===value)validValue=\"yes\";else{if(\"no\"!==value)return null;validValue=\"no\"}return validValue}(source,value);null!==validValue?function(source,storage,key,value){try{storage.setItem(key,value)}catch(e){logMessage(source,\"Unable to set sessionStorage item due to: \".concat(e.message))}}(source,window.sessionStorage,key,validValue):logMessage(source,\"Invalid cookie value: '\".concat(validValue,\"'\"))}else logMessage(source,\"Item key should be specified.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function setSessionStorageItem(source,args){function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,key,value){if(void 0!==key){var validValue;try{validValue=function(value){if(\"string\"!=typeof value)throw new Error(\"Invalid value\");var validValue,num;if(\"undefined\"===value)validValue=void 0;else if(\"false\"===value)validValue=!1;else if(\"true\"===value)validValue=!0;else if(\"null\"===value)validValue=null;else if(\"emptyArr\"===value)validValue=\"[]\";else if(\"emptyObj\"===value)validValue=\"{}\";else if(\"\"===value)validValue=\"\";else if(/^\\d+$/.test(value)){if(num=validValue=parseFloat(value),(Number.isNaN||window.isNaN)(num))throw new Error(\"Invalid value\");if(Math.abs(validValue)>32767)throw new Error(\"Invalid value\")}else if(\"yes\"===value)validValue=\"yes\";else{if(\"no\"!==value)throw new Error(\"Invalid value\");validValue=\"no\"}return validValue}(value)}catch(_unused){return void logMessage(source,\"Invalid storage item value: '\".concat(value,\"'\"))}!function(source,storage,key,value){try{storage.setItem(key,value)}catch(e){logMessage(source,\"Unable to set sessionStorage item due to: \".concat(e.message))}}(source,window.sessionStorage,key,validValue),function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}else logMessage(source,\"Item key should be specified.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -404,13 +398,13 @@ "ubo-aost", "abp-abort-on-stack-trace" ], - "scriptlet": "function abortOnStackTrace(source,args){function randomId(){return Math.random().toString(36).substr(2,9)}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function matchStackTrace(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(function(stackMatch,stackTrace){var INLINE_SCRIPT_STRING=\"inlineScript\",INJECTED_SCRIPT_STRING=\"injectedScript\",INJECTED_SCRIPT_MARKER=\"\",isInlineScript=function(stackMatch){return stackMatch.indexOf(INLINE_SCRIPT_STRING)>-1},isInjectedScript=function(stackMatch){return stackMatch.indexOf(INJECTED_SCRIPT_STRING)>-1};if(!isInlineScript(stackMatch)&&!isInjectedScript(stackMatch))return!1;var documentURL=window.location.href,pos=documentURL.indexOf(\"#\");-1!==pos&&(documentURL=documentURL.slice(0,pos));var stackLines=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).map((function(line){var stack,getStackTraceURL=/(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);if(getStackTraceURL){var stackURL=getStackTraceURL[2];if(startsWith(stackURL,\"(\")&&(stackURL=stackURL.slice(1)),startsWith(stackURL,INJECTED_SCRIPT_MARKER)){stackURL=INJECTED_SCRIPT_STRING;var stackFunction=void 0!==getStackTraceURL[1]?getStackTraceURL[1].slice(0,-1):line.slice(0,getStackTraceURL.index).trim();startsWith(stackFunction,\"at\")&&(stackFunction=stackFunction.slice(2).trim()),stack=\"\".concat(stackFunction,\" \").concat(stackURL).trim()}else stack=stackURL}else stack=line;return stack}));if(stackLines)for(var index=0;index0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(stackMatch),refinedStackTrace=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).join(\"\\n\");return Object.getOwnPropertyDescriptor(RegExp.prototype,\"test\").value.call(stackRegexp,refinedStackTrace)}function startsWith(str,prefix){return!!str&&0===str.indexOf(prefix)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,stack){if(property&&stack){var rid=randomId(),abort=function(){throw function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else if(stack.match(/^(inlineScript|injectedScript)$/)||function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(stack)){var descriptorWrapper=Object.assign({isAbortingSuspended:!1,isolateCallback:function(cb){this.isAbortingSuspended=!0;try{for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var result=cb.apply(void 0,args);return this.isAbortingSuspended=!1,result}catch(_unused){var rid=randomId();throw this.isAbortingSuspended=!1,new ReferenceError(rid)}}},{value:base[prop],get:function(){return!this.isAbortingSuspended&&this.isolateCallback(matchStackTrace,stack,(new Error).stack)&&abort(),this.value},set:function(newValue){!this.isAbortingSuspended&&this.isolateCallback(matchStackTrace,stack,(new Error).stack)&&abort(),this.value=newValue}});!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return descriptorWrapper.get.call(descriptorWrapper)},set:function(newValue){descriptorWrapper.set.call(descriptorWrapper,newValue)}})}else!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,\"Invalid parameter: \".concat(stack))}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function abortOnStackTrace(source,args){function randomId(){return Math.random().toString(36).substr(2,9)}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function matchStackTrace(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(function(stackMatch,stackTrace){var INLINE_SCRIPT_STRING=\"inlineScript\",INJECTED_SCRIPT_STRING=\"injectedScript\",INJECTED_SCRIPT_MARKER=\"\",isInlineScript=function(stackMatch){return stackMatch.indexOf(INLINE_SCRIPT_STRING)>-1},isInjectedScript=function(stackMatch){return stackMatch.indexOf(INJECTED_SCRIPT_STRING)>-1};if(!isInlineScript(stackMatch)&&!isInjectedScript(stackMatch))return!1;var documentURL=window.location.href,pos=documentURL.indexOf(\"#\");-1!==pos&&(documentURL=documentURL.slice(0,pos));var stackSteps=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})),stackLines=stackSteps.map((function(line){var stack,getStackTraceURL=/(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);if(getStackTraceURL){var stackURL=getStackTraceURL[2];if(startsWith(stackURL,\"(\")&&(stackURL=stackURL.slice(1)),startsWith(stackURL,INJECTED_SCRIPT_MARKER)){stackURL=INJECTED_SCRIPT_STRING;var stackFunction=void 0!==getStackTraceURL[1]?getStackTraceURL[1].slice(0,-1):line.slice(0,getStackTraceURL.index).trim();startsWith(stackFunction,\"at\")&&(stackFunction=stackFunction.slice(2).trim()),stack=\"\".concat(stackFunction,\" \").concat(stackURL).trim()}else stack=stackURL}else stack=line;return stack}));if(stackLines)for(var index=0;index0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(stackMatch),refinedStackTrace=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).join(\"\\n\");return Object.getOwnPropertyDescriptor(RegExp.prototype,\"test\").value.call(stackRegexp,refinedStackTrace)}function startsWith(str,prefix){return!!str&&0===str.indexOf(prefix)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,stack){if(property&&stack){var rid=randomId(),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else if(stack.match(/^(inlineScript|injectedScript)$/)||function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(stack)){var descriptorWrapper=Object.assign({isAbortingSuspended:!1,isolateCallback:function(cb){this.isAbortingSuspended=!0;try{for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var result=cb.apply(void 0,args);return this.isAbortingSuspended=!1,result}catch(_unused){var rid=randomId();throw this.isAbortingSuspended=!1,new ReferenceError(rid)}}},{value:base[prop],get:function(){return!this.isAbortingSuspended&&this.isolateCallback(matchStackTrace,stack,(new Error).stack)&&abort(),this.value},set:function(newValue){!this.isAbortingSuspended&&this.isolateCallback(matchStackTrace,stack,(new Error).stack)&&abort(),this.value=newValue}});!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return descriptorWrapper.get.call(descriptorWrapper)},set:function(newValue){descriptorWrapper.set.call(descriptorWrapper,newValue)}})}else!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,\"Invalid parameter: \".concat(stack))}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "log-on-stack-trace" ], - "scriptlet": "function logOnStacktrace(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var refineStackTrace=function(stackString){var logInfoArray=stackString.split(\"\\n\").slice(2).map((function(line){return line.replace(/ {4}at /,\"\")})).map((function(line){var funcName,funcFullPath,reg=/\\(([^\\)]+)\\)/,regFirefox=/(.*?@)(\\S+)(:\\d+):\\d+\\)?$/;return line.match(reg)?(funcName=line.split(\" \").slice(0,-1).join(\" \"),funcFullPath=line.match(reg)[1]):line.match(regFirefox)?(funcName=line.split(\"@\").slice(0,-1).join(\" \"),funcFullPath=line.match(regFirefox)[2]):(funcName=\"function name is not available\",funcFullPath=line),[funcName,funcFullPath]})),logInfoObject={};return logInfoArray.forEach((function(pair){logInfoObject[pair[0]]=pair[1]})),logInfoObject};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var value=base[prop];!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return hit(source),logMessage(source,\"Get \".concat(prop),!0),console.table(refineStackTrace((new Error).stack)),value},set:function(newValue){hit(source),logMessage(source,\"Set \".concat(prop),!0),console.table(refineStackTrace((new Error).stack)),value=newValue}})}}(window,property)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function logOnStacktrace(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var refineStackTrace=function(stackString){var logInfoArray=stackString.split(\"\\n\").slice(2).map((function(line){return line.replace(/ {4}at /,\"\")})).map((function(line){var funcName,funcFullPath,reg=/\\(([^\\)]+)\\)/,regFirefox=/(.*?@)(\\S+)(:\\d+):\\d+\\)?$/;return line.match(reg)?(funcName=line.split(\" \").slice(0,-1).join(\" \"),funcFullPath=line.match(reg)[1]):line.match(regFirefox)?(funcName=line.split(\"@\").slice(0,-1).join(\" \"),funcFullPath=line.match(regFirefox)[2]):(funcName=\"function name is not available\",funcFullPath=line),[funcName,funcFullPath]})),logInfoObject={};return logInfoArray.forEach((function(pair){logInfoObject[pair[0]]=pair[1]})),logInfoObject};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var value=base[prop];!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return hit(source),logMessage(source,\"Get \".concat(prop),!0),console.table(refineStackTrace((new Error).stack)),value},set:function(newValue){hit(source),logMessage(source,\"Set \".concat(prop),!0),console.table(refineStackTrace((new Error).stack)),value=newValue}})}}(window,property)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -419,7 +413,7 @@ "ubo-no-xhr-if.js", "ubo-no-xhr-if" ], - "scriptlet": "function preventXHR(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function getNumberFromString(rawString){var num,parsedDelay=parseInt(rawString,10);return num=parsedDelay,(Number.isNaN||window.isNaN)(num)?null:parsedDelay}function nativeIsFinite(num){return(Number.isFinite||window.isFinite)(num)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToMatch,customResponseText){if(\"undefined\"!=typeof Proxy){var responseUrl,shouldPrevent=!1,response=\"\",responseText=\"\",openHandler={apply:function(target,thisArg,args){var xhrData={method:args[0],url:args[1]};return responseUrl=xhrData.url,void 0===propsToMatch?(logMessage(source,\"xhr( \".concat(objectToString(xhrData),\" )\"),!0),hit(source)):shouldPrevent=function(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}(source,propsToMatch,xhrData),Reflect.apply(target,thisArg,args)}},sendHandler={apply:function(target,thisArg,args){if(!shouldPrevent)return Reflect.apply(target,thisArg,args);if(\"blob\"===thisArg.responseType&&(response=new Blob),\"arraybuffer\"===thisArg.responseType&&(response=new ArrayBuffer),customResponseText){var randomText=function(customResponseText){var customResponse=customResponseText;if(\"true\"===customResponse)return Math.random().toString(36).slice(-10);if(customResponse=customResponse.replace(\"length:\",\"\"),!/^\\d+-\\d+$/.test(customResponse))return null;var min,max,rangeMin=getNumberFromString(customResponse.split(\"-\")[0]),rangeMax=getNumberFromString(customResponse.split(\"-\")[1]);if(!nativeIsFinite(rangeMin)||!nativeIsFinite(rangeMax))return null;if(rangeMin>rangeMax){var temp=rangeMin;rangeMin=rangeMax,rangeMax=temp}return rangeMax>5e5?null:(customResponse=function(length){for(var result=\"\",characters=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~\",charactersLength=characters.length,i=0;i-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function getNumberFromString(rawString){var num,parsedDelay=parseInt(rawString,10);return num=parsedDelay,(Number.isNaN||window.isNaN)(num)?null:parsedDelay}function nativeIsFinite(num){return(Number.isFinite||window.isFinite)(num)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToMatch,customResponseText){if(\"undefined\"!=typeof Proxy){var responseUrl,shouldPrevent=!1,response=\"\",responseText=\"\",openHandler={apply:function(target,thisArg,args){var xhrData={method:args[0],url:args[1]};return responseUrl=xhrData.url,void 0===propsToMatch?(logMessage(source,\"xhr( \".concat(objectToString(xhrData),\" )\"),!0),hit(source)):shouldPrevent=function(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}(source,propsToMatch,xhrData),Reflect.apply(target,thisArg,args)}},sendHandler={apply:function(target,thisArg,args){if(!shouldPrevent)return Reflect.apply(target,thisArg,args);if(\"blob\"===thisArg.responseType&&(response=new Blob),\"arraybuffer\"===thisArg.responseType&&(response=new ArrayBuffer),customResponseText){var randomText=function(customResponseText){var customResponse=customResponseText;if(\"true\"===customResponse)return Math.random().toString(36).slice(-10);if(customResponse=customResponse.replace(\"length:\",\"\"),!/^\\d+-\\d+$/.test(customResponse))return null;var min,max,rangeMin=getNumberFromString(customResponse.split(\"-\")[0]),rangeMax=getNumberFromString(customResponse.split(\"-\")[1]);if(!nativeIsFinite(rangeMin)||!nativeIsFinite(rangeMax))return null;if(rangeMin>rangeMax){var temp=rangeMin;rangeMin=rangeMax,rangeMax=temp}return rangeMax>5e5?null:function(length){for(var result=\"\",characters=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~\",charactersLength=characters.length,i=0;i-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var path=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";if(\"function\"!=typeof window.close){logMessage(source,\"window.close() is not a function so 'close-window' scriptlet is unavailable\")}var closeImmediately=function(){try{hit(source),window.close()}catch(e){logMessage(source,e)}},closeByExtension=function(){var extCall=function(){dispatchEvent(new Event(\"adguard:scriptlet-close-window\"))};window.addEventListener(\"adguard:subscribed-to-close-window\",extCall,{once:!0}),setTimeout((function(){window.removeEventListener(\"adguard:subscribed-to-close-window\",extCall,{once:!0})}),5e3)};(function(){if(\"\"===path)return!0;var pathRegexp=toRegExp(path),currentPath=\"\".concat(window.location.pathname).concat(window.location.search);return pathRegexp.test(currentPath)})()&&(closeImmediately(),navigator.userAgent.indexOf(\"Chrome\")>-1&&closeByExtension())}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function forceWindowClose(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var path=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";if(\"function\"==typeof window.close){var closeImmediately=function(){try{hit(source),window.close()}catch(e){logMessage(source,e)}},closeByExtension=function(){var extCall=function(){dispatchEvent(new Event(\"adguard:scriptlet-close-window\"))};window.addEventListener(\"adguard:subscribed-to-close-window\",extCall,{once:!0}),setTimeout((function(){window.removeEventListener(\"adguard:subscribed-to-close-window\",extCall,{once:!0})}),5e3)};(function(){if(\"\"===path)return!0;var pathRegexp=toRegExp(path),currentPath=\"\".concat(window.location.pathname).concat(window.location.search);return pathRegexp.test(currentPath)})()&&(closeImmediately(),navigator.userAgent.indexOf(\"Chrome\")>-1&&closeByExtension())}else{logMessage(source,\"window.close() is not a function so 'close-window' scriptlet is unavailable\")}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -438,25 +432,25 @@ "ubo-refresh-defuser.js", "ubo-refresh-defuser" ], - "scriptlet": "function preventRefresh(source,args){function getNumberFromString(rawString){var num,parsedDelay=parseInt(rawString,10);return num=parsedDelay,(Number.isNaN||window.isNaN)(num)?null:parsedDelay}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,delaySec){var getMetaElements=function(){var metaNodes=[];try{metaNodes=document.querySelectorAll('meta[http-equiv=\"refresh\" i][content]')}catch(e){try{metaNodes=document.querySelectorAll('meta[http-equiv=\"refresh\"][content]')}catch(e){!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,e)}}return Array.from(metaNodes)},stop=function(){var metaElements=getMetaElements();if(0!==metaElements.length){var secondsToRun=getNumberFromString(delaySec);null===secondsToRun&&(secondsToRun=function(metaElements){var delays=metaElements.map((function(meta){var contentString=meta.getAttribute(\"content\");if(0===contentString.length)return null;var limiterIndex=contentString.indexOf(\";\");return getNumberFromString(-1!==limiterIndex?contentString.substring(0,limiterIndex):contentString)})).filter((function(delay){return null!==delay}));return delays.length?delays.reduce((function(a,b){return Math.min(a,b)})):null}(metaElements)),null!==secondsToRun&&setTimeout((function(){window.stop(),function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}),1e3*secondsToRun)}};\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",stop,{once:!0}):stop()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventRefresh(source,args){function getNumberFromString(rawString){var num,parsedDelay=parseInt(rawString,10);return num=parsedDelay,(Number.isNaN||window.isNaN)(num)?null:parsedDelay}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,delaySec){var getMetaElements=function(){var metaNodes=[];try{metaNodes=document.querySelectorAll('meta[http-equiv=\"refresh\" i][content]')}catch(e){try{metaNodes=document.querySelectorAll('meta[http-equiv=\"refresh\"][content]')}catch(e){!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,e)}}return Array.from(metaNodes)},stop=function(){var metaElements=getMetaElements();if(0!==metaElements.length){var secondsToRun=getNumberFromString(delaySec);null===secondsToRun&&(secondsToRun=function(metaElements){var delays=metaElements.map((function(meta){var contentString=meta.getAttribute(\"content\");if(0===contentString.length)return null;var limiterIndex=contentString.indexOf(\";\");return getNumberFromString(-1!==limiterIndex?contentString.substring(0,limiterIndex):contentString)})).filter((function(delay){return null!==delay}));return delays.length?delays.reduce((function(a,b){return Math.min(a,b)})):null}(metaElements)),null!==secondsToRun&&setTimeout((function(){window.stop(),function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}),1e3*secondsToRun)}};\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",stop,{once:!0}):stop()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "prevent-element-src-loading" ], - "scriptlet": "function preventElementSrcLoading(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function safeGetDescriptor(obj,prop){var descriptor=Object.getOwnPropertyDescriptor(obj,prop);return descriptor&&descriptor.configurable?descriptor:null}function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,tagName,match){if(\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Reflect){var instance,policy,srcMockData={script:\"data:text/javascript;base64,KCk9Pnt9\",img:\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",iframe:\"data:text/html;base64, PGRpdj48L2Rpdj4=\"};if(\"script\"===tagName)instance=HTMLScriptElement;else if(\"img\"===tagName)instance=HTMLImageElement;else{if(\"iframe\"!==tagName)return;instance=HTMLIFrameElement}window.trustedTypes&&\"function\"==typeof window.trustedTypes.createPolicy&&(policy=window.trustedTypes.createPolicy(\"mock\",{createScriptURL:function(arg){return arg}}));var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(match),setMatchedAttribute=function(elem){return elem.setAttribute(source.name,\"matched\")},setAttributeHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var nodeName=thisArg.nodeName.toLowerCase(),attrName=args[0].toLowerCase(),attrValue=args[1];return\"src\"===attrName&&tagName.toLowerCase()===nodeName&&srcMockData[nodeName]&&searchRegexp.test(attrValue)?(hit(source),setMatchedAttribute(thisArg),Reflect.apply(target,thisArg,[attrName,srcMockData[nodeName]])):Reflect.apply(target,thisArg,args)}};instance.prototype.setAttribute=new Proxy(Element.prototype.setAttribute,setAttributeHandler);var origSrcDescriptor=safeGetDescriptor(instance.prototype,\"src\");if(origSrcDescriptor){Object.defineProperty(instance.prototype,\"src\",{enumerable:!0,configurable:!0,get:function(){return origSrcDescriptor.get.call(this)},set:function(urlValue){var nodeName=this.nodeName.toLowerCase();if(tagName.toLowerCase()!==nodeName||!srcMockData[nodeName]||!searchRegexp.test(urlValue))return origSrcDescriptor.set.call(this,urlValue),!0;if(policy&&urlValue instanceof TrustedScriptURL){var trustedSrc=policy.createScriptURL(urlValue);return origSrcDescriptor.set.call(this,trustedSrc),void hit(source)}setMatchedAttribute(this),origSrcDescriptor.set.call(this,srcMockData[nodeName]),hit(source)}});var origOnerrorDescriptor=safeGetDescriptor(HTMLElement.prototype,\"onerror\");if(origOnerrorDescriptor){Object.defineProperty(HTMLElement.prototype,\"onerror\",{enumerable:!0,configurable:!0,get:function(){return origOnerrorDescriptor.get.call(this)},set:function(cb){return\"matched\"===this.getAttribute(source.name)?(origOnerrorDescriptor.set.call(this,noopFunc),!0):(origOnerrorDescriptor.set.call(this,cb),!0)}});var addEventListenerHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var eventName=args[0];return\"matched\"===thisArg.getAttribute(source.name)&&\"error\"===eventName?Reflect.apply(target,thisArg,[eventName,noopFunc]):Reflect.apply(target,thisArg,args)}};EventTarget.prototype.addEventListener=new Proxy(EventTarget.prototype.addEventListener,addEventListenerHandler)}}}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventElementSrcLoading(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function safeGetDescriptor(obj,prop){var descriptor=Object.getOwnPropertyDescriptor(obj,prop);return descriptor&&descriptor.configurable?descriptor:null}function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,tagName,match){if(\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Reflect){var instance,policy,srcMockData={script:\"data:text/javascript;base64,KCk9Pnt9\",img:\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",iframe:\"data:text/html;base64, PGRpdj48L2Rpdj4=\"};if(\"script\"===tagName)instance=HTMLScriptElement;else if(\"img\"===tagName)instance=HTMLImageElement;else{if(\"iframe\"!==tagName)return;instance=HTMLIFrameElement}window.trustedTypes&&\"function\"==typeof window.trustedTypes.createPolicy&&(policy=window.trustedTypes.createPolicy(\"mock\",{createScriptURL:function(arg){return arg}}));var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(match),setMatchedAttribute=function(elem){return elem.setAttribute(source.name,\"matched\")},setAttributeHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var nodeName=thisArg.nodeName.toLowerCase(),attrName=args[0].toLowerCase(),attrValue=args[1];return\"src\"===attrName&&tagName.toLowerCase()===nodeName&&srcMockData[nodeName]&&searchRegexp.test(attrValue)?(hit(source),setMatchedAttribute(thisArg),Reflect.apply(target,thisArg,[attrName,srcMockData[nodeName]])):Reflect.apply(target,thisArg,args)}};instance.prototype.setAttribute=new Proxy(Element.prototype.setAttribute,setAttributeHandler);var origSrcDescriptor=safeGetDescriptor(instance.prototype,\"src\");if(origSrcDescriptor){Object.defineProperty(instance.prototype,\"src\",{enumerable:!0,configurable:!0,get:function(){return origSrcDescriptor.get.call(this)},set:function(urlValue){var nodeName=this.nodeName.toLowerCase();if(tagName.toLowerCase()!==nodeName||!srcMockData[nodeName]||!searchRegexp.test(urlValue))return origSrcDescriptor.set.call(this,urlValue),!0;if(policy&&urlValue instanceof TrustedScriptURL){var trustedSrc=policy.createScriptURL(urlValue);return origSrcDescriptor.set.call(this,trustedSrc),void hit(source)}setMatchedAttribute(this),origSrcDescriptor.set.call(this,srcMockData[nodeName]),hit(source)}});var origOnerrorDescriptor=safeGetDescriptor(HTMLElement.prototype,\"onerror\");if(origOnerrorDescriptor){Object.defineProperty(HTMLElement.prototype,\"onerror\",{enumerable:!0,configurable:!0,get:function(){return origOnerrorDescriptor.get.call(this)},set:function(cb){return\"matched\"===this.getAttribute(source.name)?(origOnerrorDescriptor.set.call(this,noopFunc),!0):(origOnerrorDescriptor.set.call(this,cb),!0)}});var addEventListenerHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var eventName=args[0];return\"matched\"===thisArg.getAttribute(source.name)&&\"error\"===eventName?Reflect.apply(target,thisArg,[eventName,noopFunc]):Reflect.apply(target,thisArg,args)}};EventTarget.prototype.addEventListener=new Proxy(EventTarget.prototype.addEventListener,addEventListenerHandler)}}}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "no-topics" ], - "scriptlet": "function noTopics(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){Document instanceof Object!=0&&Object.prototype.hasOwnProperty.call(Document.prototype,\"browsingTopics\")&&Document.prototype.browsingTopics instanceof Function!=0&&(Document.prototype.browsingTopics=function(){return function(){var responseUrl=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",responseType=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"default\";if(\"undefined\"!=typeof Response){var response=new Response(arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"{}\",{status:200,statusText:\"OK\"});return Object.defineProperties(response,{url:{value:responseUrl},type:{value:responseType}}),Promise.resolve(response)}}(\"[]\")},function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source))}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function noTopics(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){Document instanceof Object!=0&&Object.prototype.hasOwnProperty.call(Document.prototype,\"browsingTopics\")&&Document.prototype.browsingTopics instanceof Function!=0&&(Document.prototype.browsingTopics=function(){return function(){var responseUrl=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",responseType=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"default\";if(\"undefined\"!=typeof Response){var response=new Response(arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"{}\",{status:200,statusText:\"OK\"});return Object.defineProperties(response,{url:{value:responseUrl},type:{value:responseType}}),Promise.resolve(response)}}(\"[]\")},function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source))}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "trusted-replace-xhr-response" ], - "scriptlet": "function trustedReplaceXhrResponse(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=toRegExp(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function getXhrData(method,url,async,user,password){return{method:method,url:url,async:async,user:user,password:password}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var pattern=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",replacement=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",propsToMatch=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\";if(\"undefined\"!=typeof Proxy)if(\"\"!==pattern||\"\"===replacement){var xhrData,shouldLog=\"\"===pattern&&\"\"===replacement,nativeOpen=window.XMLHttpRequest.prototype.open,nativeSend=window.XMLHttpRequest.prototype.send,shouldReplace=!1,requestHeaders=[],openWrapper=function(target,thisArg,args){if(xhrData=getXhrData.apply(null,args),shouldLog){var _message=\"xhr( \".concat(objectToString(xhrData),\" )\");return logMessage(source,_message,!0),hit(source),Reflect.apply(target,thisArg,args)}if(shouldReplace=matchRequestProps(source,propsToMatch,xhrData)){var setRequestHeaderHandler={apply:function(target,thisArg,args){return requestHeaders.push(args),Reflect.apply(target,thisArg,args)}};thisArg.setRequestHeader=new Proxy(thisArg.setRequestHeader,setRequestHeaderHandler)}return Reflect.apply(target,thisArg,args)},sendWrapper=function(target,thisArg,args){if(!shouldReplace)return Reflect.apply(target,thisArg,args);var forgedRequest=new XMLHttpRequest;forgedRequest.addEventListener(\"readystatechange\",(function(){if(4===forgedRequest.readyState){var readyState=forgedRequest.readyState,response=forgedRequest.response,responseText=forgedRequest.responseText,responseURL=forgedRequest.responseURL,responseXML=forgedRequest.responseXML,status=forgedRequest.status,statusText=forgedRequest.statusText,content=responseText||response;if(\"string\"==typeof content){var patternRegexp=\"*\"===pattern?toRegExp():toRegExp(pattern),modifiedContent=content.replace(patternRegexp,replacement);Object.defineProperties(thisArg,{readyState:{value:readyState},response:{value:modifiedContent},responseText:{value:modifiedContent},responseURL:{value:responseURL},responseXML:{value:responseXML},status:{value:status},statusText:{value:statusText}}),setTimeout((function(){var stateEvent=new Event(\"readystatechange\");thisArg.dispatchEvent(stateEvent);var loadEvent=new Event(\"load\");thisArg.dispatchEvent(loadEvent);var loadEndEvent=new Event(\"loadend\");thisArg.dispatchEvent(loadEndEvent)}),1),hit(source)}}})),nativeOpen.apply(forgedRequest,[xhrData.method,xhrData.url]),requestHeaders.forEach((function(header){var name=header[0],value=header[1];forgedRequest.setRequestHeader(name,value)})),requestHeaders=[];try{nativeSend.call(forgedRequest,args)}catch(_unused){return Reflect.apply(target,thisArg,args)}},openHandler={apply:openWrapper},sendHandler={apply:sendWrapper};XMLHttpRequest.prototype.open=new Proxy(XMLHttpRequest.prototype.open,openHandler),XMLHttpRequest.prototype.send=new Proxy(XMLHttpRequest.prototype.send,sendHandler)}else{logMessage(source,\"Pattern argument should not be empty string.\")}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function trustedReplaceXhrResponse(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=toRegExp(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function getXhrData(method,url,async,user,password){return{method:method,url:url,async:async,user:user,password:password}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var pattern=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",replacement=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",propsToMatch=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\";if(\"undefined\"!=typeof Proxy)if(\"\"!==pattern||\"\"===replacement){var xhrData,shouldLog=\"\"===pattern&&\"\"===replacement,nativeOpen=window.XMLHttpRequest.prototype.open,nativeSend=window.XMLHttpRequest.prototype.send,shouldReplace=!1,requestHeaders=[],openWrapper=function(target,thisArg,args){if(xhrData=getXhrData.apply(null,args),shouldLog){var _message=\"xhr( \".concat(objectToString(xhrData),\" )\");return logMessage(source,_message,!0),hit(source),Reflect.apply(target,thisArg,args)}if(shouldReplace=matchRequestProps(source,propsToMatch,xhrData)){var setRequestHeaderHandler={apply:function(target,thisArg,args){return requestHeaders.push(args),Reflect.apply(target,thisArg,args)}};thisArg.setRequestHeader=new Proxy(thisArg.setRequestHeader,setRequestHeaderHandler)}return Reflect.apply(target,thisArg,args)},sendWrapper=function(target,thisArg,args){if(!shouldReplace)return Reflect.apply(target,thisArg,args);var forgedRequest=new XMLHttpRequest;forgedRequest.addEventListener(\"readystatechange\",(function(){if(4===forgedRequest.readyState){var readyState=forgedRequest.readyState,response=forgedRequest.response,responseText=forgedRequest.responseText,responseURL=forgedRequest.responseURL,responseXML=forgedRequest.responseXML,status=forgedRequest.status,statusText=forgedRequest.statusText,content=responseText||response;if(\"string\"==typeof content){var patternRegexp=\"*\"===pattern?/(\\n|.)*/:toRegExp(pattern),modifiedContent=content.replace(patternRegexp,replacement);Object.defineProperties(thisArg,{readyState:{value:readyState},response:{value:modifiedContent},responseText:{value:modifiedContent},responseURL:{value:responseURL},responseXML:{value:responseXML},status:{value:status},statusText:{value:statusText}}),setTimeout((function(){var stateEvent=new Event(\"readystatechange\");thisArg.dispatchEvent(stateEvent);var loadEvent=new Event(\"load\");thisArg.dispatchEvent(loadEvent);var loadEndEvent=new Event(\"loadend\");thisArg.dispatchEvent(loadEndEvent)}),1),hit(source)}}})),nativeOpen.apply(forgedRequest,[xhrData.method,xhrData.url]),requestHeaders.forEach((function(header){var name=header[0],value=header[1];forgedRequest.setRequestHeader(name,value)})),requestHeaders=[];try{nativeSend.call(forgedRequest,args)}catch(_unused){return Reflect.apply(target,thisArg,args)}},openHandler={apply:openWrapper},sendHandler={apply:sendWrapper};XMLHttpRequest.prototype.open=new Proxy(XMLHttpRequest.prototype.open,openHandler),XMLHttpRequest.prototype.send=new Proxy(XMLHttpRequest.prototype.send,sendHandler)}else{logMessage(source,\"Pattern argument should not be empty string.\")}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -465,31 +459,31 @@ "ubo-xml-prune.js", "ubo-xml-prune" ], - "scriptlet": "function xmlPrune(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function startsWith(str,prefix){return!!str&&0===str.indexOf(prefix)}function endsWith(str,ending){return!!str&&str.lastIndexOf(ending)===str.length-ending.length}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToRemove){var _this=this,optionalProp=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",urlToMatch=arguments.length>3?arguments[3]:void 0;if(\"undefined\"!=typeof Reflect&&\"undefined\"!=typeof fetch&&\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Response){var shouldPruneResponse=!0;propsToRemove||(shouldPruneResponse=!1);var urlMatchRegexp=toRegExp(urlToMatch),isXML=function(text){var trimedText=text.trim();return!(!startsWith(trimedText,\"<\")||!endsWith(trimedText,\">\"))},pruneXML=function(text){if(!isXML(text))return shouldPruneResponse=!1,text;var xmlDoc=(new DOMParser).parseFromString(text,\"text/xml\");if(xmlDoc.querySelector(\"parsererror\"))return text;if(\"\"!==optionalProp&&null===xmlDoc.querySelector(optionalProp))return shouldPruneResponse=!1,text;var elems=xmlDoc.querySelectorAll(propsToRemove);return elems.length?(elems.forEach((function(elem){elem.remove()})),text=(new XMLSerializer).serializeToString(xmlDoc)):(shouldPruneResponse=!1,text)},xhrWrapper=function(target,thisArg,args){var xhrURL=args[1];return\"string\"!=typeof xhrURL||0===xhrURL.length||urlMatchRegexp.test(xhrURL)&&thisArg.addEventListener(\"readystatechange\",(function pruneResponse(){if(4===thisArg.readyState){var response=thisArg.response;if(thisArg.removeEventListener(\"readystatechange\",pruneResponse),shouldPruneResponse){var prunedResponseContent=pruneXML(response);shouldPruneResponse&&(Object.defineProperty(thisArg,\"response\",{value:prunedResponseContent}),Object.defineProperty(thisArg,\"responseText\",{value:prunedResponseContent}),hit(source)),shouldPruneResponse=!0}else isXML(response)&&logMessage(\"XMLHttpRequest.open() URL: \".concat(xhrURL,\"\\nresponse: \").concat(response))}})),Reflect.apply(target,thisArg,args)},xhrHandler={apply:xhrWrapper};window.XMLHttpRequest.prototype.open=new Proxy(window.XMLHttpRequest.prototype.open,xhrHandler);var nativeFetch=window.fetch,fetchWrapper=function(target,thisArg,args){var fetchURL=args[0];return\"string\"!=typeof fetchURL||0===fetchURL.length?Reflect.apply(target,thisArg,args):urlMatchRegexp.test(fetchURL)?nativeFetch.apply(_this,args).then((function(response){return response.text().then((function(text){if(!shouldPruneResponse)return isXML(text)&&logMessage(\"fetch URL: \".concat(fetchURL,\"\\nresponse text: \").concat(text)),Reflect.apply(target,thisArg,args);var prunedText=pruneXML(text);return shouldPruneResponse?(hit(source),new Response(prunedText,{status:response.status,statusText:response.statusText,headers:response.headers})):(shouldPruneResponse=!0,Reflect.apply(target,thisArg,args))}))})):Reflect.apply(target,thisArg,args)},fetchHandler={apply:fetchWrapper};window.fetch=new Proxy(window.fetch,fetchHandler)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function xmlPrune(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function startsWith(str,prefix){return!!str&&0===str.indexOf(prefix)}function endsWith(str,ending){return!!str&&str.lastIndexOf(ending)===str.length-ending.length}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToRemove){var _this=this,optionalProp=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",urlToMatch=arguments.length>3?arguments[3]:void 0;if(\"undefined\"!=typeof Reflect&&\"undefined\"!=typeof fetch&&\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Response){var shouldPruneResponse=!0;propsToRemove||(shouldPruneResponse=!1);var urlMatchRegexp=toRegExp(urlToMatch),isXML=function(text){var trimedText=text.trim();return!(!startsWith(trimedText,\"<\")||!endsWith(trimedText,\">\"))},pruneXML=function(text){if(!isXML(text))return shouldPruneResponse=!1,text;var xmlDoc=(new DOMParser).parseFromString(text,\"text/xml\");if(xmlDoc.querySelector(\"parsererror\"))return text;if(\"\"!==optionalProp&&null===xmlDoc.querySelector(optionalProp))return shouldPruneResponse=!1,text;var elems=xmlDoc.querySelectorAll(propsToRemove);return elems.length?(elems.forEach((function(elem){elem.remove()})),text=(new XMLSerializer).serializeToString(xmlDoc)):(shouldPruneResponse=!1,text)},xhrWrapper=function(target,thisArg,args){var xhrURL=args[1];return\"string\"!=typeof xhrURL||0===xhrURL.length||urlMatchRegexp.test(xhrURL)&&thisArg.addEventListener(\"readystatechange\",(function pruneResponse(){if(4===thisArg.readyState){var response=thisArg.response;if(thisArg.removeEventListener(\"readystatechange\",pruneResponse),shouldPruneResponse){var prunedResponseContent=pruneXML(response);shouldPruneResponse&&(Object.defineProperty(thisArg,\"response\",{value:prunedResponseContent}),Object.defineProperty(thisArg,\"responseText\",{value:prunedResponseContent}),hit(source)),shouldPruneResponse=!0}else isXML(response)&&logMessage(\"XMLHttpRequest.open() URL: \".concat(xhrURL,\"\\nresponse: \").concat(response))}})),Reflect.apply(target,thisArg,args)},xhrHandler={apply:xhrWrapper};window.XMLHttpRequest.prototype.open=new Proxy(window.XMLHttpRequest.prototype.open,xhrHandler);var nativeFetch=window.fetch,fetchWrapper=function(target,thisArg,args){var fetchURL=args[0];return\"string\"!=typeof fetchURL||0===fetchURL.length?Reflect.apply(target,thisArg,args):urlMatchRegexp.test(fetchURL)?nativeFetch.apply(_this,args).then((function(response){return response.text().then((function(text){if(!shouldPruneResponse)return isXML(text)&&logMessage(\"fetch URL: \".concat(fetchURL,\"\\nresponse text: \").concat(text)),Reflect.apply(target,thisArg,args);var prunedText=pruneXML(text);return shouldPruneResponse?(hit(source),new Response(prunedText,{status:response.status,statusText:response.statusText,headers:response.headers})):(shouldPruneResponse=!0,Reflect.apply(target,thisArg,args))}))})):Reflect.apply(target,thisArg,args)},fetchHandler={apply:fetchWrapper};window.fetch=new Proxy(window.fetch,fetchHandler)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "trusted-set-cookie" ], - "scriptlet": "function trustedSetCookie(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function concatCookieNameValuePath(rawName,rawValue,rawPath){return\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath),\";\")}function isValidCookiePath(rawPath){return\"/\"===rawPath||\"none\"===rawPath}function getTrustedCookieOffsetMs(offsetExpiresSec){if(!offsetExpiresSec)return null;var parsedSec;if(\"1year\"===offsetExpiresSec)parsedSec=31536e3;else if(\"1day\"===offsetExpiresSec)parsedSec=86400;else if(parsedSec=Number.parseInt(offsetExpiresSec,10),Number.isNaN(parsedSec))return null;return 1e3*parsedSec}function parseKeywordValue(rawValue){var parsedValue=rawValue;return\"$now$\"===rawValue?parsedValue=Date.now().toString():\"$currentDate$\"===rawValue&&(parsedValue=Date()),parsedValue}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var offsetExpiresSec=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\",path=arguments.length>4&&void 0!==arguments[4]?arguments[4]:\"/\";if(void 0!==name)if(void 0!==value){var parsedValue=parseKeywordValue(value);if(isValidCookiePath(path)){var cookieToSet=concatCookieNameValuePath(name,parsedValue,path);if(cookieToSet){var parsedOffsetMs=getTrustedCookieOffsetMs(offsetExpiresSec);if(parsedOffsetMs){var expires=Date.now()+parsedOffsetMs;cookieToSet+=\" expires=\".concat(new Date(expires).toUTCString(),\";\"),document.cookie=cookieToSet,hit(source)}else logMessage(source,\"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec))}}else logMessage(source,\"Invalid cookie path: '\".concat(path,\"'\"))}else logMessage(source,\"Cookie value should be specified.\");else logMessage(source,\"Cookie name should be specified.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function trustedSetCookie(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function concatCookieNameValuePath(rawName,rawValue,rawPath){return\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath),\";\")}function isValidCookiePath(rawPath){return\"/\"===rawPath||\"none\"===rawPath}function getTrustedCookieOffsetMs(offsetExpiresSec){var parsedSec;if(\"1year\"===offsetExpiresSec)parsedSec=31536e3;else if(\"1day\"===offsetExpiresSec)parsedSec=86400;else if(parsedSec=Number.parseInt(offsetExpiresSec,10),Number.isNaN(parsedSec))return null;return 1e3*parsedSec}function parseKeywordValue(rawValue){var parsedValue=rawValue;return\"$now$\"===rawValue?parsedValue=Date.now().toString():\"$currentDate$\"===rawValue&&(parsedValue=Date()),parsedValue}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var offsetExpiresSec=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\",path=arguments.length>4&&void 0!==arguments[4]?arguments[4]:\"/\";if(void 0!==name)if(void 0!==value){var parsedValue=parseKeywordValue(value);if(isValidCookiePath(path)){var cookieToSet=concatCookieNameValuePath(name,parsedValue,path);if(cookieToSet){if(offsetExpiresSec){var parsedOffsetMs=getTrustedCookieOffsetMs(offsetExpiresSec);if(!parsedOffsetMs)return void logMessage(source,\"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));var expires=Date.now()+parsedOffsetMs;cookieToSet+=\" expires=\".concat(new Date(expires).toUTCString(),\";\")}document.cookie=cookieToSet,hit(source)}}else logMessage(source,\"Invalid cookie path: '\".concat(path,\"'\"))}else logMessage(source,\"Cookie value should be specified.\");else logMessage(source,\"Cookie name should be specified.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "trusted-set-cookie-reload" ], - "scriptlet": "function trustedSetCookieReload(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function isCookieSetWithValue(cookieString,name,value){return cookieString.split(\";\").some((function(cookieStr){var pos=cookieStr.indexOf(\"=\");if(-1===pos)return!1;var cookieName=cookieStr.slice(0,pos).trim(),cookieValue=cookieStr.slice(pos+1).trim();return name===cookieName&&value===cookieValue}))}function concatCookieNameValuePath(rawName,rawValue,rawPath){return\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath),\";\")}function isValidCookiePath(rawPath){return\"/\"===rawPath||\"none\"===rawPath}function getTrustedCookieOffsetMs(offsetExpiresSec){if(!offsetExpiresSec)return null;var parsedSec;if(\"1year\"===offsetExpiresSec)parsedSec=31536e3;else if(\"1day\"===offsetExpiresSec)parsedSec=86400;else if(parsedSec=Number.parseInt(offsetExpiresSec,10),Number.isNaN(parsedSec))return null;return 1e3*parsedSec}function parseKeywordValue(rawValue){var parsedValue=rawValue;return\"$now$\"===rawValue?parsedValue=Date.now().toString():\"$currentDate$\"===rawValue&&(parsedValue=Date()),parsedValue}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var offsetExpiresSec=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\",path=arguments.length>4&&void 0!==arguments[4]?arguments[4]:\"/\";if(void 0!==name)if(void 0!==value){if(!isCookieSetWithValue(document.cookie,name,value)){var parsedValue=parseKeywordValue(value);if(isValidCookiePath(path)){var cookieToSet=concatCookieNameValuePath(name,parsedValue,path);if(cookieToSet){var parsedOffsetExpiresMs=getTrustedCookieOffsetMs(offsetExpiresSec);if(parsedOffsetExpiresMs){var expires=Date.now()+parsedOffsetExpiresMs;cookieToSet+=\" expires=\".concat(new Date(expires).toUTCString(),\";\"),document.cookie=cookieToSet,hit(source),isCookieSetWithValue(document.cookie,name,value)&&window.location.reload()}else logMessage(source,\"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec))}}else logMessage(source,\"Invalid cookie path: '\".concat(path,\"'\"))}}else logMessage(source,\"Cookie value should be specified.\");else logMessage(source,\"Cookie name should be specified.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function trustedSetCookieReload(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function isCookieSetWithValue(cookieString,name,value){return cookieString.split(\";\").some((function(cookieStr){var pos=cookieStr.indexOf(\"=\");if(-1===pos)return!1;var cookieName=cookieStr.slice(0,pos).trim(),cookieValue=cookieStr.slice(pos+1).trim();return name===cookieName&&value===cookieValue}))}function concatCookieNameValuePath(rawName,rawValue,rawPath){return\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath),\";\")}function isValidCookiePath(rawPath){return\"/\"===rawPath||\"none\"===rawPath}function getTrustedCookieOffsetMs(offsetExpiresSec){var parsedSec;if(\"1year\"===offsetExpiresSec)parsedSec=31536e3;else if(\"1day\"===offsetExpiresSec)parsedSec=86400;else if(parsedSec=Number.parseInt(offsetExpiresSec,10),Number.isNaN(parsedSec))return null;return 1e3*parsedSec}function parseKeywordValue(rawValue){var parsedValue=rawValue;return\"$now$\"===rawValue?parsedValue=Date.now().toString():\"$currentDate$\"===rawValue&&(parsedValue=Date()),parsedValue}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var offsetExpiresSec=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\",path=arguments.length>4&&void 0!==arguments[4]?arguments[4]:\"/\";if(void 0!==name)if(void 0!==value){if(!isCookieSetWithValue(document.cookie,name,value)){var parsedValue=parseKeywordValue(value);if(isValidCookiePath(path)){var cookieToSet=concatCookieNameValuePath(name,parsedValue,path);if(cookieToSet){if(offsetExpiresSec){var parsedOffsetMs=getTrustedCookieOffsetMs(offsetExpiresSec);if(!parsedOffsetMs)return void logMessage(source,\"Invalid offsetExpiresSec value: \".concat(offsetExpiresSec));var expires=Date.now()+parsedOffsetMs;cookieToSet+=\" expires=\".concat(new Date(expires).toUTCString(),\";\")}document.cookie=cookieToSet,hit(source),isCookieSetWithValue(document.cookie,name,value)&&window.location.reload()}}else logMessage(source,\"Invalid cookie path: '\".concat(path,\"'\"))}}else logMessage(source,\"Cookie value should be specified.\");else logMessage(source,\"Cookie name should be specified.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "trusted-replace-fetch-response" ], - "scriptlet": "function trustedReplaceFetchResponse(source,args){function hit(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}message&&(-1===message.indexOf(\"log: \")?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(\"log: \".length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function getFetchData(args){var fetchUrl,fetchInit,request,fetchPropsObj={};if(args[0]instanceof Request){var requestData=(request=args[0],[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"].map((function(key){return[key,request[key]]})).reduce((function(acc,el){var key=el[0],value=el[1];return acc[key]=value,acc}),{}));fetchUrl=requestData.url,fetchInit=requestData}else fetchUrl=args[0],fetchInit=args[1];return fetchPropsObj.url=fetchUrl,fetchInit instanceof Object&&Object.keys(fetchInit).forEach((function(prop){fetchPropsObj[prop]=fetchInit[prop]})),fetchPropsObj}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=toRegExp(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var pattern=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",replacement=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",propsToMatch=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\";if(\"undefined\"!=typeof fetch&&\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Response)if(\"\"!==pattern||\"\"===replacement){var fetchData,shouldLog=\"\"===pattern&&\"\"===replacement,nativeFetch=fetch,handlerWrapper=function(target,thisArg,args){return fetchData=getFetchData(args),shouldLog?(logMessage(source,\"fetch( \".concat(objectToString(fetchData),\" )\"),!0),hit(source),Reflect.apply(target,thisArg,args)):matchRequestProps(source,propsToMatch,fetchData)?nativeFetch.apply(void 0,toConsumableArray(args)).then((function(response){return response.text().then((function(bodyText){var patternRegexp=\"*\"===pattern?toRegExp():toRegExp(pattern),modifiedTextContent=bodyText.replace(patternRegexp,replacement),forgedResponse=function(response,textContent){var bodyUsed=response.bodyUsed,headers=response.headers,ok=response.ok,redirected=response.redirected,status=response.status,statusText=response.statusText,type=response.type,url=response.url,forgedResponse=new Response(textContent,{status:status,statusText:statusText,headers:headers});return Object.defineProperties(forgedResponse,{url:{value:url},type:{value:type},ok:{value:ok},bodyUsed:{value:bodyUsed},redirected:{value:redirected}}),forgedResponse}(response,modifiedTextContent);return hit(source),forgedResponse})).catch((function(){var fetchDataStr=objectToString(fetchData),message=\"Response body can't be converted to text: \".concat(fetchDataStr);return logMessage(source,message),Reflect.apply(target,thisArg,args)}))})).catch((function(){return Reflect.apply(target,thisArg,args)})):Reflect.apply(target,thisArg,args)};fetch=new Proxy(fetch,{apply:handlerWrapper})}else logMessage(source,\"Pattern argument should not be empty string.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function trustedReplaceFetchResponse(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function getFetchData(args){var fetchUrl,fetchInit,entries,request,fetchPropsObj={};if(args[0]instanceof Request){var requestData=(request=args[0],entries=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"].map((function(key){return[key,request[key]]})),entries.reduce((function(acc,el){var key=el[0],value=el[1];return acc[key]=value,acc}),{}));fetchUrl=requestData.url,fetchInit=requestData}else fetchUrl=args[0],fetchInit=args[1];return fetchPropsObj.url=fetchUrl,fetchInit instanceof Object&&Object.keys(fetchInit).forEach((function(prop){fetchPropsObj[prop]=fetchInit[prop]})),fetchPropsObj}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=toRegExp(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var pattern=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",replacement=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",propsToMatch=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\";if(\"undefined\"!=typeof fetch&&\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Response)if(\"\"!==pattern||\"\"===replacement){var fetchData,shouldLog=\"\"===pattern&&\"\"===replacement,nativeFetch=fetch,handlerWrapper=function(target,thisArg,args){return fetchData=getFetchData(args),shouldLog?(logMessage(source,\"fetch( \".concat(objectToString(fetchData),\" )\"),!0),hit(source),Reflect.apply(target,thisArg,args)):matchRequestProps(source,propsToMatch,fetchData)?nativeFetch.apply(null,args).then((function(response){return response.text().then((function(bodyText){var patternRegexp=\"*\"===pattern?/(\\n|.)*/:toRegExp(pattern),modifiedTextContent=bodyText.replace(patternRegexp,replacement),forgedResponse=function(response,textContent){var bodyUsed=response.bodyUsed,headers=response.headers,ok=response.ok,redirected=response.redirected,status=response.status,statusText=response.statusText,type=response.type,url=response.url,forgedResponse=new Response(textContent,{status:status,statusText:statusText,headers:headers});return Object.defineProperties(forgedResponse,{url:{value:url},type:{value:type},ok:{value:ok},bodyUsed:{value:bodyUsed},redirected:{value:redirected}}),forgedResponse}(response,modifiedTextContent);return hit(source),forgedResponse})).catch((function(){var fetchDataStr=objectToString(fetchData),message=\"Response body can't be converted to text: \".concat(fetchDataStr);return logMessage(source,message),Reflect.apply(target,thisArg,args)}))})).catch((function(){return Reflect.apply(target,thisArg,args)})):Reflect.apply(target,thisArg,args)};fetch=new Proxy(fetch,{apply:handlerWrapper})}else logMessage(source,\"Pattern argument should not be empty string.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "trusted-set-local-storage-item" ], - "scriptlet": "function trustedSetLocalStorageItem(source,args){function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,key,value){if(void 0!==key)if(void 0!==value){var parsedValue=function(rawValue){var CURRENT_DATE_KEYWORD=\"$currentDate$\",parsedValue=rawValue;return\"$now$\"===rawValue?parsedValue=Date.now().toString():rawValue===CURRENT_DATE_KEYWORD&&(parsedValue=Date()),parsedValue}(value);!function(source,storage,key,value){try{storage.setItem(key,value)}catch(e){logMessage(source,\"Unable to set sessionStorage item due to: \".concat(e.message))}}(source,window.localStorage,key,parsedValue),function(source,message){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}var LOG_MARKER=\"log: \";message&&(-1===message.indexOf(LOG_MARKER)?log(\"\".concat(prefix,\" message:\\n\").concat(message)):log(message.slice(LOG_MARKER.length))),log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}else logMessage(source,\"Item value should be specified.\");else logMessage(source,\"Item key should be specified.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function trustedSetLocalStorageItem(source,args){function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,key,value){if(void 0!==key)if(void 0!==value){var parsedValue=function(rawValue){var CURRENT_DATE_KEYWORD=\"$currentDate$\",parsedValue=rawValue;return\"$now$\"===rawValue?parsedValue=Date.now().toString():rawValue===CURRENT_DATE_KEYWORD&&(parsedValue=Date()),parsedValue}(value);!function(source,storage,key,value){try{storage.setItem(key,value)}catch(e){logMessage(source,\"Unable to set sessionStorage item due to: \".concat(e.message))}}(source,window.localStorage,key,parsedValue),function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}else logMessage(source,\"Item value should be specified.\");else logMessage(source,\"Item key should be specified.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" } ] } \ No newline at end of file diff --git a/dist/scriptlets.js b/dist/scriptlets.js index a7842603..f9224197 100644 --- a/dist/scriptlets.js +++ b/dist/scriptlets.js @@ -12,20 +12,21 @@ */ function attachDependencies(scriptlet) { var _scriptlet$injections = scriptlet.injections, - injections = _scriptlet$injections === void 0 ? [] : _scriptlet$injections; + injections = _scriptlet$injections === void 0 ? [] : _scriptlet$injections; return injections.reduce(function (accum, dep) { return "".concat(accum, "\n").concat(dep.toString()); }, scriptlet.toString()); } + /** * Add scriptlet call to existing code * @param {Function} scriptlet * @param {string} code */ - function addCall(scriptlet, code) { return "".concat(code, "\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n ").concat(scriptlet.name, ".apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }"); } + /** * Wrap function into IIFE (Immediately invoked function expression) * @@ -49,29 +50,24 @@ * noeval.apply(this, args); * )({"args": ["aaa", "bbb"], "name":"noeval"}, ["aaa", "bbb"])` */ - function passSourceAndProps(source, code) { var redirect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (source.hit) { source.hit = source.hit.toString(); } - var sourceString = JSON.stringify(source); var argsString = source.args ? "[".concat(source.args.map(JSON.stringify), "]") : undefined; var params = argsString ? "".concat(sourceString, ", ").concat(argsString) : sourceString; - if (redirect) { return "(function(source, args){\n".concat(code, "\n})(").concat(params, ");"); } - return "(".concat(code, ")(").concat(params, ");"); } + /** * Wrap code in no name function * @param {string} code which must be wrapped */ - function wrapInNonameFunc(code) { return "function(source, args){\n".concat(code, "\n}"); } @@ -91,6 +87,7 @@ }); return entries; }; + /** * Converts array of pairs to object. * Object.fromEntries() polyfill because it is not supported by IE @@ -98,7 +95,6 @@ * @param {Array} entries - array of pairs * @returns {Object} */ - var getObjectFromEntries = function getObjectFromEntries(entries) { var output = entries.reduce(function (acc, el) { var key = el[0]; @@ -108,31 +104,30 @@ }, {}); return output; }; + /** * Checks whether the obj is an empty object * @param {Object} obj * @returns {boolean} */ - var isEmptyObject = function isEmptyObject(obj) { return Object.keys(obj).length === 0; }; + /** * Checks whether the obj is an empty object * @param {Object} obj * @param {string} prop * @returns {Object|null} */ - var safeGetDescriptor = function safeGetDescriptor(obj, prop) { var descriptor = Object.getOwnPropertyDescriptor(obj, prop); - if (descriptor && descriptor.configurable) { return descriptor; } - return null; }; + /** * Set getter and setter to property if it's configurable * @param {Object} object target object with property @@ -140,14 +135,11 @@ * @param {PropertyDescriptor} descriptor contains getter and setter functions * @returns {boolean} is operation successful */ - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } @@ -163,29 +155,30 @@ var native = Number.isNaN || window.isNaN; return native(num); }; + /** * Determines whether the passed value is a finite number * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite * @param {*} num * @returns {boolean} */ - var nativeIsFinite = function nativeIsFinite(num) { // eslint-disable-next-line no-restricted-properties var native = Number.isFinite || window.isFinite; return native(num); }; + /** * Parses string for a number, if possible, otherwise returns null. * @param {*} rawString * @returns {number|null} */ - var getNumberFromString = function getNumberFromString(rawString) { var parsedDelay = parseInt(rawString, 10); var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; return validDelay; }; + /** * Generate a random integer between two values, inclusive * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#getting_a_random_integer_between_two_values_inclusive @@ -193,7 +186,6 @@ * @param {number} max * @returns {number} */ - function getRandomIntInclusive(min, max) { min = Math.ceil(min); max = Math.floor(max); @@ -207,19 +199,19 @@ * @param {string} newSubstr replacement * @returns {string} */ - var replaceAll = function replaceAll(input, substr, newSubstr) { return input.split(substr).join(newSubstr); }; + /** * Escapes special chars in string * @param {string} str * @returns {string} */ - var escapeRegExp = function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }; + /** * A literal string or regexp pattern wrapped in forward slashes. * For example, 'simpleStr' or '/adblock|_0x/'. @@ -233,77 +225,69 @@ * @returns {RegExp} regular expression; defaults to /.?/ * @throws {SyntaxError} Throw an error for invalid regex pattern */ - var toRegExp = function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var DEFAULT_VALUE = '.?'; var FORWARD_SLASH = '/'; - if (input === '') { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); return new RegExp(escaped); }; + /** * Checks whether the input string can be converted to regexp * @param {RawStrPattern} input literal string or regexp pattern * @returns {boolean} */ - var isValidStrPattern = function isValidStrPattern(input) { var FORWARD_SLASH = '/'; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; }; + /** * Get string before regexp first match * @param {string} str * @param {RegExp} rx */ - var getBeforeRegExp = function getBeforeRegExp(str, rx) { var index = str.search(rx); return str.substring(0, index); }; + /** * Checks whether the string starts with the substring * @param {string} str full string * @param {string} prefix substring * @returns {boolean} */ - - var startsWith = function startsWith(str, prefix) { + var startsWith$1 = function startsWith(str, prefix) { // if str === '', (str && false) will return '' // that's why it has to be !!str return !!str && str.indexOf(prefix) === 0; }; + /** * Checks whether the string ends with the substring * @param {string} str full string * @param {string} ending substring * @returns {boolean} */ - var endsWith = function endsWith(str, ending) { // if str === '', (str && false) will return '' // that's why it has to be !!str @@ -313,7 +297,6 @@ if (!str) { return str; } - var index = str.indexOf(separator); return index < 0 ? '' : str.substring(index + separator.length); }; @@ -321,44 +304,41 @@ if (!str || !separator) { return str; } - var index = str.indexOf(separator); return index < 0 ? str : str.substring(0, index); }; + /** * Wrap str in single quotes and replaces single quotes to double one * @param {string} str */ - var wrapInSingleQuotes = function wrapInSingleQuotes(str) { if (str[0] === '\'' && str[str.length - 1] === '\'' || str[0] === '"' && str[str.length - 1] === '"') { str = str.substring(1, str.length - 1); - } // eslint-disable-next-line no-useless-escape - - + } + // eslint-disable-next-line no-useless-escape str = str.replace(/\'/g, '"'); return "'".concat(str, "'"); }; + /** * Returns substring enclosed in the widest braces * @param {string} str */ - var getStringInBraces = function getStringInBraces(str) { var firstIndex = str.indexOf('('); var lastIndex = str.lastIndexOf(')'); return str.substring(firstIndex + 1, lastIndex); }; + /** * Prepares RTCPeerConnection config as string for proper logging * @param {*} config * @returns {string} stringified config */ - var convertRtcConfigToString = function convertRtcConfigToString(config) { var UNDEF_STR = 'undefined'; var str = UNDEF_STR; - if (config === null) { str = 'null'; } else if (config instanceof Object) { @@ -371,49 +351,44 @@ ], }; */ - if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) { str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString(); } } - return str; }; + /** * Checks whether the match input string can be converted to regexp, * used for match inputs with possible negation * @param {string} match literal string or regexp pattern * @returns {boolean} */ - var isValidMatchStr = function isValidMatchStr(match) { var INVERT_MARKER = '!'; var str = match; - - if (startsWith(match, INVERT_MARKER)) { + if (startsWith$1(match, INVERT_MARKER)) { str = match.slice(1); } - return isValidStrPattern(str); }; + /** * Validates the match input number, * used for match inputs with possible negation * @param {string} match string of match number * @returns {boolean} */ - var isValidMatchNumber = function isValidMatchNumber(match) { var INVERT_MARKER = '!'; var str = match; - - if (startsWith(match, INVERT_MARKER)) { + if (startsWith$1(match, INVERT_MARKER)) { str = match.slice(1); } - var num = parseFloat(str); return !nativeIsNaN(num) && nativeIsFinite(num); }; + /** * @typedef {Object} MatchData * @property {boolean} isInvertedMatch @@ -427,10 +402,9 @@ * @param {string} match * @returns {MatchData} */ - var parseMatchArg = function parseMatchArg(match) { var INVERT_MARKER = '!'; - var isInvertedMatch = startsWith(match, INVERT_MARKER); + var isInvertedMatch = startsWith$1(match, INVERT_MARKER); var matchValue = isInvertedMatch ? match.slice(1) : match; var matchRegexp = toRegExp(matchValue); return { @@ -438,6 +412,7 @@ matchRegexp: matchRegexp }; }; + /** * @typedef {Object} DelayData * @property {boolean} isInvertedDelayMatch @@ -452,10 +427,9 @@ * `isInvertedDelayMatch` is boolean, * `delayMatch` is number OR null for invalid `delay` */ - var parseDelayArg = function parseDelayArg(delay) { var INVERT_MARKER = '!'; - var isInvertedDelayMatch = startsWith(delay, INVERT_MARKER); + var isInvertedDelayMatch = startsWith$1(delay, INVERT_MARKER); var delayValue = isInvertedDelayMatch ? delay.slice(1) : delay; delayValue = parseInt(delayValue, 10); var delayMatch = nativeIsNaN(delayValue) ? null : delayValue; @@ -464,34 +438,31 @@ delayMatch: delayMatch }; }; + /** * Converts object to string for logging * @param {Object} obj data object * @returns {string} */ - var objectToString = function objectToString(obj) { return isEmptyObject(obj) ? '{}' : getObjectEntries(obj).map(function (pair) { var key = pair[0]; var value = pair[1]; var recordValueStr = value; - if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } - return "".concat(key, ":\"").concat(recordValueStr, "\""); }).join(' '); }; + /** * Converts types into a string * @param {*} value * @returns {string} */ - var convertTypeToString = function convertTypeToString(value) { var output; - if (typeof value === 'undefined') { output = 'undefined'; } else if (typeof value === 'object') { @@ -503,68 +474,58 @@ } else { output = value.toString(); } - return output; }; + /** * Generate a random string, a length of the string is provided as an argument * @param {number} length * @returns {string} */ - function getRandomStrByLength(length) { var result = ''; var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~'; var charactersLength = characters.length; - for (var i = 0; i < length; i += 1) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } - return result; } + /** * Generate a random string * @param {string} customResponseText * @returns {string|null} random string or null if passed argument is invalid */ - function generateRandomResponse(customResponseText) { var customResponse = customResponseText; - if (customResponse === 'true') { // Generate random alphanumeric string of 10 symbols customResponse = Math.random().toString(36).slice(-10); return customResponse; } - customResponse = customResponse.replace('length:', ''); - var rangeRegex = /^\d+-\d+$/; // Return empty string if range is invalid - + var rangeRegex = /^\d+-\d+$/; + // Return empty string if range is invalid if (!rangeRegex.test(customResponse)) { return null; } - var rangeMin = getNumberFromString(customResponse.split('-')[0]); var rangeMax = getNumberFromString(customResponse.split('-')[1]); - if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) { return null; - } // If rangeMin > rangeMax, swap variables - + } + // If rangeMin > rangeMax, swap variables if (rangeMin > rangeMax) { var temp = rangeMin; rangeMin = rangeMax; rangeMax = temp; } - var LENGTH_RANGE_LIMIT = 500 * 1000; - if (rangeMax > LENGTH_RANGE_LIMIT) { return null; } - var length = getRandomIntInclusive(rangeMin, rangeMax); customResponse = getRandomStrByLength(length); return customResponse; @@ -581,10 +542,8 @@ } else { obj[key] = value; } - return obj; } - var defineProperty = _defineProperty; /** @@ -596,76 +555,65 @@ */ function iterateWithTransitions(iterable, transitions, init, args) { var state = init || Object.keys(transitions)[0]; - for (var i = 0; i < iterable.length; i += 1) { state = transitions[state](iterable, i, args); } - return state; } + /** * AdGuard scriptlet rule mask */ - - var ADG_SCRIPTLET_MASK = '#//scriptlet'; + /** * Helper to accumulate an array of strings char by char */ - var wordSaver = function wordSaver() { var str = ''; var strs = []; - var saveSymb = function saveSymb(s) { str += s; return str; }; - var saveStr = function saveStr() { strs.push(str); str = ''; }; - var getAll = function getAll() { return [].concat(strs); }; - return { saveSymb: saveSymb, saveStr: saveStr, getAll: getAll }; }; - var substringAfter = function substringAfter(str, separator) { if (!str) { return str; } - var index = str.indexOf(separator); return index < 0 ? '' : str.substring(index + separator.length); }; + /** * Parse and validate scriptlet rule * @param {*} ruleText * @returns {{name: string, args: Array}} */ - - var parseRule = function parseRule(ruleText) { var _transitions; - ruleText = substringAfter(ruleText, ADG_SCRIPTLET_MASK); /** * Transition names */ - var TRANSITION = { OPENED: 'opened', PARAM: 'param', CLOSED: 'closed' }; + /** * Transition function: the current index position in start, end or between params * @param {string} rule @@ -673,12 +621,10 @@ * @param {Object} Object * @property {Object} Object.sep contains prop symb with current separator char */ - var opened = function opened(rule, index, _ref) { var sep = _ref.sep; var char = rule[index]; var transition; - switch (char) { case ' ': case '(': @@ -687,7 +633,6 @@ transition = TRANSITION.OPENED; break; } - case '\'': case '"': { @@ -695,19 +640,16 @@ transition = TRANSITION.PARAM; break; } - case ')': { transition = index === rule.length - 1 ? TRANSITION.CLOSED : TRANSITION.OPENED; break; } - default: { throw new Error('The rule is not a scriptlet'); } } - return transition; }; /** @@ -718,20 +660,16 @@ * @property {Object} Object.sep contains prop `symb` with current separator char * @property {Object} Object.saver helper which allow to save strings by car by char */ - - var param = function param(rule, index, _ref2) { var saver = _ref2.saver, - sep = _ref2.sep; + sep = _ref2.sep; var char = rule[index]; - switch (char) { case '\'': case '"': { var preIndex = index - 1; var before = rule[preIndex]; - if (char === sep.symb && before !== '\\') { sep.symb = null; saver.saveStr(); @@ -739,7 +677,6 @@ } } // eslint-disable-next-line no-fallthrough - default: { saver.saveSymb(char); @@ -747,7 +684,6 @@ } } }; - var transitions = (_transitions = {}, defineProperty(_transitions, TRANSITION.OPENED, opened), defineProperty(_transitions, TRANSITION.PARAM, param), defineProperty(_transitions, TRANSITION.CLOSED, function () {}), _transitions); var sep = { symb: null @@ -757,11 +693,9 @@ sep: sep, saver: saver }); - if (state !== 'closed') { throw new Error("Invalid scriptlet rule ".concat(ruleText)); } - var args = saver.getAll(); return { name: args[0], @@ -778,24 +712,25 @@ // https://github.com/AdguardTeam/Scriptlets/issues/125 return typeof type !== 'undefined'; }; + /** * Validates event listener * @param {*} listener * @returns {boolean} */ - var validateListener = function validateListener(listener) { // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#parameters - return typeof listener !== 'undefined' && (typeof listener === 'function' || typeof listener === 'object' // https://github.com/AdguardTeam/Scriptlets/issues/76 + return typeof listener !== 'undefined' && (typeof listener === 'function' || typeof listener === 'object' + // https://github.com/AdguardTeam/Scriptlets/issues/76 && listener !== null && typeof listener.handleEvent === 'function'); }; + /** * Serialize valid event listener * https://developer.mozilla.org/en-US/docs/Web/API/EventListener * @param {EventListener} listener valid listener * @returns {string} */ - var listenerToString = function listenerToString(listener) { return typeof listener === 'function' ? listener.toString() : listener.handleEvent.toString(); }; @@ -803,12 +738,12 @@ var shouldMatchAnyDelay = function shouldMatchAnyDelay(delay) { return delay === '*'; }; + /** * Handles input delay value * @param {*} delay * @returns {number} proper number delay value */ - var getMatchDelay = function getMatchDelay(delay) { var DEFAULT_DELAY = 1000; var parsedDelay = parseInt(delay, 10); @@ -816,22 +751,22 @@ : parsedDelay; return delayMatch; }; + /** * Checks delay match condition * @param {*} inputDelay * @param {number} realDelay * @returns {boolean} */ - var isDelayMatched = function isDelayMatched(inputDelay, realDelay) { return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); }; + /** * Handles input boost value * @param {*} boost * @returns {number} proper number boost multiplier value */ - var getBoostMultiplier = function getBoostMultiplier(boost) { var DEFAULT_MULTIPLIER = 0.05; var MIN_MULTIPLIER = 0.02; @@ -839,15 +774,12 @@ var parsedBoost = parseFloat(boost); var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER // default scriptlet value : parsedBoost; - if (boostMultiplier < MIN_MULTIPLIER) { boostMultiplier = MIN_MULTIPLIER; } - if (boostMultiplier > MAX_MULTIPLIER) { boostMultiplier = MAX_MULTIPLIER; } - return boostMultiplier; }; @@ -863,11 +795,9 @@ return stack.push(el); }); var res = []; - while (stack.length) { // pop value from stack var next = stack.pop(); - if (Array.isArray(next)) { // push back array items, won't modify the original input next.forEach(function (el) { @@ -876,17 +806,16 @@ } else { res.push(next); } - } // reverse to restore input order - - + } + // reverse to restore input order return res.reverse(); }; + /** * Predicate method to check if the array item exists * @param {any} item * @returns {boolean} */ - var isExisting = function isExisting(item) { return !!item; }; @@ -902,10 +831,10 @@ * * @returns {boolean} */ - var isValidCookiePath = function isValidCookiePath(rawPath) { return rawPath === '/' || rawPath === 'none'; }; + /** * Returns 'path=/' if rawPath is '/' * or empty string '' for other cases, `rawPath === 'none'` included @@ -914,16 +843,15 @@ * * @returns {string} */ - var getCookiePath = function getCookiePath(rawPath) { if (rawPath === '/') { return 'path=/'; - } // otherwise do not set path as invalid + } + // otherwise do not set path as invalid // the same for pathArg === 'none' - - return ''; }; + /** * Combines input cookie name, value, and path into string. * @@ -933,11 +861,11 @@ * * @returns {string|null} string OR `null` if path is not supported */ - var concatCookieNameValuePath = function concatCookieNameValuePath(rawName, rawValue, rawPath) { // eslint-disable-next-line max-len return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); }; + /** * Gets supported cookie value * @@ -945,14 +873,11 @@ * * @returns {string|null} valid cookie string if ok OR null if not */ - var getLimitedCookieValue = function getLimitedCookieValue(value) { if (!value) { return null; } - var validValue; - if (value === 'true') { validValue = 'true'; } else if (value === 'True') { @@ -975,49 +900,46 @@ validValue = 'OK'; } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { return null; } - if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { return null; } } else { return null; } - return validValue; }; + /** * Parses cookie string into object * @param {string} cookieString string that conforms to document.cookie format * @returns {Object} key:value object that corresponds with incoming cookies keys and values */ - var parseCookieString = function parseCookieString(cookieString) { var COOKIE_DELIMITER = '='; - var COOKIE_PAIRS_DELIMITER = ';'; // Get raw cookies + var COOKIE_PAIRS_DELIMITER = ';'; + // Get raw cookies var cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER); var cookieData = {}; cookieChunks.forEach(function (singleCookie) { var cookieKey; var cookieValue; var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER); - if (delimiterIndex === -1) { cookieKey = singleCookie.trim(); } else { cookieKey = singleCookie.slice(0, delimiterIndex).trim(); cookieValue = singleCookie.slice(delimiterIndex + 1); - } // Save cookie key=value data with null instead of empty ('') values - - + } + // Save cookie key=value data with null instead of empty ('') values cookieData[cookieKey] = cookieValue || null; }); return cookieData; }; + /** * Check if cookie with specified name and value is present in a cookie string * @param {string} cookieString @@ -1025,51 +947,43 @@ * @param {string} value * @returns {boolean} */ - var isCookieSetWithValue = function isCookieSetWithValue(cookieString, name, value) { return cookieString.split(';').some(function (cookieStr) { var pos = cookieStr.indexOf('='); - if (pos === -1) { return false; } - var cookieName = cookieStr.slice(0, pos).trim(); var cookieValue = cookieStr.slice(pos + 1).trim(); return name === cookieName && value === cookieValue; }); }; + /** * Returns parsed offset expired number of ms or null if `offsetExpiresSec` is invalid * * @param {string} offsetExpiresSec input offset param in seconds * @returns {number|null} number is milliseconds OR null */ - var getTrustedCookieOffsetMs = function getTrustedCookieOffsetMs(offsetExpiresSec) { - if (!offsetExpiresSec) { - return null; - } - var ONE_YEAR_EXPIRATION_KEYWORD = '1year'; var ONE_DAY_EXPIRATION_KEYWORD = '1day'; var MS_IN_SEC = 1000; var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; var SECONDS_IN_DAY = 24 * 60 * 60; - var parsedSec; // Set predefined expire value if corresponding keyword was passed - + var parsedSec; + // Set predefined expire value if corresponding keyword was passed if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { parsedSec = SECONDS_IN_YEAR; } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { parsedSec = SECONDS_IN_DAY; } else { - parsedSec = Number.parseInt(offsetExpiresSec, 10); // If offsetExpiresSec has been parsed to NaN - do not set cookie at all - + parsedSec = Number.parseInt(offsetExpiresSec, 10); + // If offsetExpiresSec has been parsed to NaN - do not set cookie at all if (Number.isNaN(parsedSec)) { return null; } } - return parsedSec * MS_IN_SEC; }; @@ -1078,65 +992,65 @@ * @return {undefined} undefined */ var noopFunc = function noopFunc() {}; + /** * Function returns null * @return {null} null */ - var noopNull = function noopNull() { return null; }; + /** * Function returns true * @return {boolean} true */ - var trueFunc = function trueFunc() { return true; }; + /** * Function returns false * @return {boolean} false */ - var falseFunc = function falseFunc() { return false; }; + /** * Function returns this */ - function noopThis() { return this; } + /** * Function returns empty string * @return {string} empty string */ - var noopStr = function noopStr() { return ''; }; + /** * Function returns empty array * @return {Array} empty array */ - var noopArray = function noopArray() { return []; }; + /** * Function returns empty object * @return {Object} empty object */ - var noopObject = function noopObject() { return {}; }; + /** * Function returns Promise.reject() */ - var noopPromiseReject = function noopPromiseReject() { return Promise.reject(); }; // eslint-disable-line compat/compat @@ -1146,23 +1060,21 @@ * @param {string} [url=''] value of response url to set on response object * @param {string} [response='default'] value of response type to set on response object */ - var noopPromiseResolve = function noopPromiseResolve() { var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '{}'; var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'default'; - if (typeof Response === 'undefined') { return; - } // eslint-disable-next-line compat/compat - - + } + // eslint-disable-next-line compat/compat var response = new Response(responseBody, { status: 200, statusText: 'OK' - }); // Mock response' url & type to avoid adb checks - // https://github.com/AdguardTeam/Scriptlets/issues/216 + }); + // Mock response' url & type to avoid adb checks + // https://github.com/AdguardTeam/Scriptlets/issues/216 Object.defineProperties(response, { url: { value: responseUrl @@ -1170,8 +1082,9 @@ type: { value: responseType } - }); // eslint-disable-next-line compat/compat, consistent-return + }); + // eslint-disable-next-line compat/compat, consistent-return return Promise.resolve(response); }; @@ -1183,60 +1096,49 @@ * @param {string} stackTrace - script error stack trace * @returns {boolean} */ - - var shouldAbortInlineOrInjectedScript$1 = function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var shouldAbortInlineOrInjectedScript = function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { var INLINE_SCRIPT_STRING = 'inlineScript'; var INJECTED_SCRIPT_STRING = 'injectedScript'; var INJECTED_SCRIPT_MARKER = ''; - var isInlineScript = function isInlineScript(stackMatch) { return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; }; - var isInjectedScript = function isInjectedScript(stackMatch) { return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; }; - if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { return false; } - var documentURL = window.location.href; - var pos = documentURL.indexOf('#'); // Remove URL hash + var pos = documentURL.indexOf('#'); + // Remove URL hash // in Chrome, URL in stackTrace doesn't contain hash // so, it's necessary to remove it, otherwise location.href // will not match with location from stackTrace - if (pos !== -1) { documentURL = documentURL.slice(0, pos); } - var stackSteps = stackTrace.split('\n').slice(2).map(function (line) { return line.trim(); }); var stackLines = stackSteps.map(function (line) { - var stack; // Get stack trace URL + var stack; + // Get stack trace URL // in Firefox stack trace looks like this: advanceTaskQueue@http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:1834:20 // in Chrome like this: at Assert.throws (http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:3178:16) // so, first group "(.*?@)" is required for Firefox, second group contains URL - var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); - if (getStackTraceURL) { var stackURL = getStackTraceURL[2]; - - if (startsWith(stackURL, '(')) { + if (startsWith$1(stackURL, '(')) { stackURL = stackURL.slice(1); } - - if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { + if (startsWith$1(stackURL, INJECTED_SCRIPT_MARKER)) { stackURL = INJECTED_SCRIPT_STRING; var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); - - if (startsWith(stackFunction, 'at')) { + if (startsWith$1(stackFunction, 'at')) { stackFunction = stackFunction.slice(2).trim(); } - stack = "".concat(stackFunction, " ").concat(stackURL).trim(); } else { stack = stackURL; @@ -1244,22 +1146,18 @@ } else { stack = line; } - return stack; }); - if (stackLines) { for (var index = 0; index < stackLines.length; index += 1) { if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { return true; } - - if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { + if (isInjectedScript(stackMatch) && startsWith$1(stackLines[index], INJECTED_SCRIPT_STRING)) { return true; } } } - return false; }; @@ -1268,13 +1166,12 @@ * @param {HTMLElement} rootElement * @returns {HTMLElement[]} shadow-dom hosts */ - var findHostElements = function findHostElements(rootElement) { - var hosts = []; // Element.querySelectorAll() returns list of elements + var hosts = []; + // Element.querySelectorAll() returns list of elements // which are defined in DOM of Element. // Meanwhile, inner DOM of the element with shadowRoot property // is absolutely another DOM and which can not be reached by querySelectorAll('*') - var domElems = rootElement.querySelectorAll('*'); domElems.forEach(function (el) { if (el.shadowRoot) { @@ -1283,6 +1180,7 @@ }); return hosts; }; + /** * A collection of nodes. * @@ -1304,23 +1202,25 @@ * @param {HTMLElement[]|external:NodeList} hostElements * @returns {PierceData} */ - var pierceShadowDom = function pierceShadowDom(selector, hostElements) { var targets = []; - var innerHostsAcc = []; // it's possible to get a few hostElements found by baseSelector on the page + var innerHostsAcc = []; + // it's possible to get a few hostElements found by baseSelector on the page hostElements.forEach(function (host) { // check presence of selector element inside base element if it's not in shadow-dom var simpleElems = host.querySelectorAll(selector); targets = targets.concat([].slice.call(simpleElems)); var shadowRootElem = host.shadowRoot; var shadowChildren = shadowRootElem.querySelectorAll(selector); - targets = targets.concat([].slice.call(shadowChildren)); // find inner shadow-dom hosts inside processing shadow-dom + targets = targets.concat([].slice.call(shadowChildren)); + // find inner shadow-dom hosts inside processing shadow-dom innerHostsAcc.push(findHostElements(shadowRootElem)); - }); // if there were more than one host element, - // innerHostsAcc is an array of arrays and should be flatten + }); + // if there were more than one host element, + // innerHostsAcc is an array of arrays and should be flatten var innerHosts = flatten(innerHostsAcc); return { targets: targets, @@ -1333,13 +1233,14 @@ * @param {*} callback * @returns {boolean} */ - var isValidCallback = function isValidCallback(callback) { - return callback instanceof Function // passing string as 'code' arg is not recommended + return callback instanceof Function + // passing string as 'code' arg is not recommended // but it is possible and not restricted // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#parameters || typeof callback === 'string'; }; + /** * Checks whether 'callback' and 'delay' are matching * by given parameters 'matchCallback' and 'matchDelay'. @@ -1347,36 +1248,29 @@ * @param {Object} { callback, delay, matchCallback, matchDelay } * @returns {boolean} */ - var isPreventionNeeded = function isPreventionNeeded(_ref) { var callback = _ref.callback, - delay = _ref.delay, - matchCallback = _ref.matchCallback, - matchDelay = _ref.matchDelay; - + delay = _ref.delay, + matchCallback = _ref.matchCallback, + matchDelay = _ref.matchDelay; // if callback is has not valid type // scriptlet can not prevent it // so no need for more checking and do not call hit() later if (!isValidCallback(callback)) { return false; } - if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { return false; } - var _parseMatchArg = parseMatchArg(matchCallback), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; var _parseDelayArg = parseDelayArg(matchDelay), - isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, - delayMatch = _parseDelayArg.delayMatch; - - var shouldPrevent = false; // https://github.com/AdguardTeam/Scriptlets/issues/105 - + isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, + delayMatch = _parseDelayArg.delayMatch; + var shouldPrevent = false; + // https://github.com/AdguardTeam/Scriptlets/issues/105 var callbackStr = String(callback); - if (delayMatch === null) { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; } else if (!matchCallback) { @@ -1384,13 +1278,12 @@ } else { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && delay === delayMatch !== isInvertedDelayMatch; } - return shouldPrevent; }; var handleOldReplacement = function handleOldReplacement(replacement) { - var result; // defaults to return noopFunc instead of window.open - + var result; + // defaults to return noopFunc instead of window.open if (!replacement) { result = noopFunc; } else if (replacement === 'trueFunc') { @@ -1399,20 +1292,17 @@ // We should return noopFunc instead of window.open // but with some property if website checks it (examples 5, 6) // https://github.com/AdguardTeam/Scriptlets/issues/71 - var isProp = startsWith(replacement, '{') && endsWith(replacement, '}'); - + var isProp = startsWith$1(replacement, '{') && endsWith(replacement, '}'); if (isProp) { var propertyPart = replacement.slice(1, -1); var propertyName = substringBefore(propertyPart, '='); var propertyValue = substringAfter$1(propertyPart, '='); - if (propertyValue === 'noopFunc') { result = {}; result[propertyName] = noopFunc; } } } - return result; }; var createDecoy = function createDecoy(args) { @@ -1421,11 +1311,10 @@ var IFRAME_TAG_NAME = 'iframe'; var IFRAME_URL_PROP_NAME = 'src'; var replacement = args.replacement, - url = args.url, - delay = args.delay; + url = args.url, + delay = args.delay; var tag; var urlProp; - if (replacement === 'obj') { tag = OBJECT_TAG_NAME; urlProp = OBJECT_URL_PROP_NAME; @@ -1433,7 +1322,6 @@ tag = IFRAME_TAG_NAME; urlProp = IFRAME_URL_PROP_NAME; } - var decoy = document.createElement(tag); decoy[urlProp] = url; decoy.style.setProperty('height', '1px', 'important'); @@ -1451,14 +1339,11 @@ if (prop && prop === 'closed') { return false; } - if (typeof nativeGetter === 'function') { return noopFunc; } - return prop && target[prop]; }; - return preventGetter; }; @@ -1471,16 +1356,15 @@ * Includes common 'url' and 'method' props and all other fetch-specific props * @returns {string[]} */ - var getRequestProps = function getRequestProps() { return ['url', 'method', 'headers', 'body', 'mode', 'credentials', 'cache', 'redirect', 'referrer', 'referrerPolicy', 'integrity', 'keepalive', 'signal']; }; + /** * Collects Request options to object * @param {Request} request * @returns {Object} data object */ - var getRequestData = function getRequestData(request) { var requestInitOptions = getRequestProps(); var entries = requestInitOptions.map(function (key) { @@ -1490,17 +1374,16 @@ }); return getObjectFromEntries(entries); }; + /** * Collects fetch args to object * @param {*} args fetch args * @returns {Object} data object */ - var getFetchData = function getFetchData(args) { var fetchPropsObj = {}; var fetchUrl; var fetchInit; - if (args[0] instanceof Request) { // if Request passed to fetch, it will be in array var requestData = getRequestData(args[0]); @@ -1508,20 +1391,18 @@ fetchInit = requestData; } else { fetchUrl = args[0]; // eslint-disable-line prefer-destructuring - fetchInit = args[1]; // eslint-disable-line prefer-destructuring } fetchPropsObj.url = fetchUrl; - if (fetchInit instanceof Object) { Object.keys(fetchInit).forEach(function (prop) { fetchPropsObj[prop] = fetchInit[prop]; }); } - return fetchPropsObj; }; + /** * Collect xhr.open arguments to object * @param {string} method @@ -1531,7 +1412,6 @@ * @param {string} password * @returns {Object} */ - var getXhrData = function getXhrData(method, url, async, user, password) { return { method: method, @@ -1541,13 +1421,13 @@ password: password }; }; + /** * Parse propsToMatch input string into object; * used for prevent-fetch and prevent-xhr * @param {string} propsToMatchStr * @returns {Object} object where 'key' is prop name and 'value' is prop value */ - var parseMatchProps = function parseMatchProps(propsToMatchStr) { var PROPS_DIVIDER = ' '; var PAIRS_MARKER = ':'; @@ -1558,7 +1438,6 @@ var dividerInd = prop.indexOf(PAIRS_MARKER); var key = prop.slice(0, dividerInd); var hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { var value = prop.slice(dividerInd + 1); propsObj[key] = value; @@ -1571,23 +1450,23 @@ }); return propsObj; }; + /** * Validates parsed data values * @param {Object} data * @returns {boolean} */ - var validateParsedData = function validateParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); }); }; + /** * Converts valid parsed data to data obj for further matching * @param {Object} data * @returns {Object} */ - var getMatchPropsData = function getMatchPropsData(data) { var matchData = {}; Object.keys(data).forEach(function (key) { @@ -1611,7 +1490,6 @@ */ var logMessage = function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { // eslint-disable-next-line no-console console.log("".concat(source.name, ": ").concat(message)); @@ -1630,7 +1508,6 @@ * @param {string} value * @param {boolean} shouldLog determines if helper should log on a failed set attempt */ - var setStorageItem = function setStorageItem(source, storage, key, value) { // setItem() may throw an exception if the storage is full. try { @@ -1640,21 +1517,17 @@ logMessage(source, message); } }; + /** * Gets supported storage item value - * @param {Source} source * @param {string} value input item value - * @param {boolean} verbose if logging invalid values is required * @returns {string|null|undefined|boolean} valid item value if ok OR null if not */ - - var getLimitedStorageItemValue = function getLimitedStorageItemValue(source, value) { - if (!value) { - return null; + var getLimitedStorageItemValue = function getLimitedStorageItemValue(value) { + if (typeof value !== 'string') { + throw new Error('Invalid value'); } - var validValue; - if (value === 'undefined') { validValue = undefined; } else if (value === 'false') { @@ -1671,24 +1544,19 @@ validValue = ''; } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return null; + throw new Error('Invalid value'); } - if (Math.abs(validValue) > 0x7FFF) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return null; + throw new Error('Invalid value'); } } else if (value === 'yes') { validValue = 'yes'; } else if (value === 'no') { validValue = 'no'; } else { - return null; + throw new Error('Invalid value'); } - return validValue; }; @@ -1705,15 +1573,12 @@ if (typeof error === 'string' && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } @@ -1735,29 +1600,27 @@ * * @return {Object} */ - function getDescriptorAddon() { return { isAbortingSuspended: false, isolateCallback: function isolateCallback(cb) { - this.isAbortingSuspended = true; // try...catch is required in case if there are more than one inline scripts + this.isAbortingSuspended = true; + // try...catch is required in case if there are more than one inline scripts // which should be aborted. // so after the first successful abortion, `cb(...args);` will throw error, // and we should not stop on that and continue to abort other scripts - try { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - var result = cb.apply(void 0, args); this.isAbortingSuspended = false; return result; } catch (_unused) { var rid = randomId(); - this.isAbortingSuspended = false; // It's necessary to throw error + this.isAbortingSuspended = false; + // It's necessary to throw error // otherwise script will be not aborted - throw new ReferenceError(rid); } } @@ -1782,19 +1645,17 @@ * @param {string} chain * @returns {Chain} */ - function getPropertyInChain(base, chain) { var pos = chain.indexOf('.'); - if (pos === -1) { return { base: base, prop: chain }; } + var prop = chain.slice(0, pos); - var prop = chain.slice(0, pos); // https://github.com/AdguardTeam/Scriptlets/issues/128 - + // https://github.com/AdguardTeam/Scriptlets/issues/128 if (base === null) { // if base is null, return 'null' as base. // it's needed for triggering the reason logging while debugging @@ -1804,10 +1665,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) { // for empty objects in chain return { @@ -1816,7 +1675,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -1824,11 +1682,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -1862,7 +1718,6 @@ var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; var pos = chain.indexOf('.'); - if (pos === -1) { // for paths like 'a.b.*' every final nested prop should be processed if (chain === '*' || chain === '[]') { @@ -1882,95 +1737,71 @@ prop: chain }); } - return output; } - var prop = chain.slice(0, pos); var shouldLookThrough = prop === '[]' && Array.isArray(base) || prop === '*' && base instanceof Object; - if (shouldLookThrough) { var nextProp = chain.slice(pos + 1); - var baseKeys = Object.keys(base); // if there is a wildcard prop in input chain (e.g. 'ad.*.src' for 'ad.0.src ad.1.src'), - // each one of base keys should be considered as a potential chain prop in final path + var baseKeys = Object.keys(base); + // if there is a wildcard prop in input chain (e.g. 'ad.*.src' for 'ad.0.src ad.1.src'), + // each one of base keys should be considered as a potential chain prop in final path baseKeys.forEach(function (key) { var item = base[key]; getWildcardPropertyInChain(item, nextProp, lookThrough, output); }); } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if (nextBase !== undefined) { getWildcardPropertyInChain(nextBase, chain, lookThrough, output); } - return output; } /* eslint-disable no-console, no-underscore-dangle */ - /** * Hit used only for debug purposes now * @param {Source} source - * @param {string} [message] - optional message; * use LOG_MARKER = 'log: ' at the start of a message * for logging scriptlets */ - var hit = function hit(source, message) { + var hit = function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); // eslint-disable-line compat/compat var prefix = source.ruleText || ''; - if (source.domainName) { var AG_SCRIPTLET_MARKER = '#%#//'; var UBO_SCRIPTLET_MARKER = '##+js'; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } // delete all domains from ruleText and leave just rule part - - - var rulePart = source.ruleText.slice(ruleStartIndex); // prepare applied scriptlet rule for specific domain - - prefix = "".concat(source.domainName).concat(rulePart); - } // Used to check if scriptlet uses 'hit' function for logging - - - var LOG_MARKER = 'log: '; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); } + // delete all domains from ruleText and leave just rule part + var rulePart = source.ruleText.slice(ruleStartIndex); + // prepare applied scriptlet rule for specific domain + prefix = "".concat(source.domainName).concat(rulePart); } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); - } catch (e) {// try catch for Edge 15 + } catch (e) { + // try catch for Edge 15 // In according to this issue https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/14495220/ // console.log throws an error - } // This is necessary for unit-tests only! - + } + // This is necessary for unit-tests only! if (typeof window.__debug === 'function') { window.__debug(source); } @@ -1989,27 +1820,23 @@ * @param {Object} requestData object with standard properties of fetch/xhr like url, method etc * @returns {boolean} */ - var matchRequestProps = function matchRequestProps(source, propsToMatch, requestData) { if (propsToMatch === '' || propsToMatch === '*') { return true; } - var isMatched; var parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { logMessage(source, "Invalid parameter: ".concat(propsToMatch)); isMatched = false; } else { - var matchData = getMatchPropsData(parsedData); // prevent only if all props match - + var matchData = getMatchPropsData(parsedData); + // prevent only if all props match isMatched = Object.keys(matchData).every(function (matchKey) { var matchValue = matchData[matchKey]; return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); }); } - return isMatched; }; @@ -2020,16 +1847,13 @@ * @param {string} stackTrace - script error stack trace * @returns {boolean} */ - var matchStackTrace = function matchStackTrace(stackMatch, stackTrace) { if (!stackMatch || stackMatch === '') { return true; } - - if (shouldAbortInlineOrInjectedScript$1(stackMatch, stackTrace)) { + if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { return true; } - var stackRegexp = toRegExp(stackMatch); var refinedStackTrace = stackTrace.split('\n').slice(2) // get rid of our own functions in the stack trace .map(function (line) { @@ -2048,29 +1872,24 @@ var throttle = function throttle(cb, delay) { var wait = false; var savedArgs; - var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - if (wait) { savedArgs = args; return; } - cb.apply(void 0, args); wait = true; setTimeout(function () { wait = false; - if (savedArgs) { wrapper(savedArgs); savedArgs = null; } }, delay); }; - return wrapper; }; @@ -2079,11 +1898,9 @@ * @param {Function} callback * @param {boolean} observeAttrs - optional parameter - should observer check attributes changes */ - var observeDOMChanges = function observeDOMChanges(callback) { var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - /** * 'delay' in milliseconds for 'throttle' method */ @@ -2092,9 +1909,7 @@ * Used for remove-class */ // eslint-disable-next-line no-use-before-define, compat/compat - var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { @@ -2111,17 +1926,14 @@ }); } }; - var disconnect = function disconnect() { observer.disconnect(); }; - function callbackWrapper() { disconnect(); callback(); connect(); } - connect(); }; @@ -2164,7 +1976,6 @@ var NOW_VALUE_KEYWORD = '$now$'; var CURRENT_DATE_KEYWORD = '$currentDate$'; var parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { // Set to current time in ms, e.g 1667915146503 parsedValue = Date.now().toString(); @@ -2172,12 +1983,10 @@ // Set to current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' parsedValue = Date(); } - return parsedValue; }; /* eslint-disable max-len */ - /** * @trustedScriptlet trusted-click-element * @@ -2232,31 +2041,25 @@ * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], input[type="submit"][value="akkoord"]', 'cookie:cmpconsent, localStorage:promo', '250') * ``` */ - /* eslint-enable max-len */ - function trustedClickElement$1(source, selectors) { var extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN; - if (!selectors) { return; } - var OBSERVER_TIMEOUT_MS = 10000; var THROTTLE_DELAY_MS = 20; var COOKIE_MATCH_MARKER = 'cookie:'; var LOCAL_STORAGE_MATCH_MARKER = 'localStorage:'; var SELECTORS_DELIMITER = ','; - var COOKIE_STRING_DELIMITER = ';'; // Regex to split match pairs by commas, avoiding the ones included in regexes - + var COOKIE_STRING_DELIMITER = ';'; + // Regex to split match pairs by commas, avoiding the ones included in regexes var EXTRA_MATCH_DELIMITER = /(,\s*){1}(?=cookie:|localStorage:)/; var parsedDelay; - if (delay) { parsedDelay = parseInt(delay, 10); var isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS; - if (!isValidDelay) { // eslint-disable-next-line max-len var message = "Passed delay '".concat(delay, "' is invalid or bigger than ").concat(OBSERVER_TIMEOUT_MS, " ms"); @@ -2264,39 +2067,34 @@ return; } } - var canClick = !parsedDelay; var cookieMatches = []; var localStorageMatches = []; - if (extraMatch) { // Get all match marker:value pairs from argument var parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) { return matchStr.trim(); - }); // Filter match pairs by marker + }); + // Filter match pairs by marker parsedExtraMatch.forEach(function (matchStr) { if (matchStr.indexOf(COOKIE_MATCH_MARKER) > -1) { var cookieMatch = matchStr.replace(COOKIE_MATCH_MARKER, ''); cookieMatches.push(cookieMatch); } - if (matchStr.indexOf(LOCAL_STORAGE_MATCH_MARKER) > -1) { var localStorageMatch = matchStr.replace(LOCAL_STORAGE_MATCH_MARKER, ''); localStorageMatches.push(localStorageMatch); } }); } - if (cookieMatches.length > 0) { var parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER)); var parsedCookies = parseCookieString(document.cookie); var cookieKeys = Object.keys(parsedCookies); - if (cookieKeys.length === 0) { return; } - var cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) { // Avoid getting /.?/ result from toRegExp on undefined // as cookie may be set without value, @@ -2305,35 +2103,31 @@ var keyMatch = toRegExp(key); return cookieKeys.some(function (key) { var keysMatched = keyMatch.test(key); - if (!keysMatched) { return false; - } // Key matching is enough if cookie value match is not specified - + } + // Key matching is enough if cookie value match is not specified if (!valueMatch) { return true; } - return valueMatch.test(parsedCookies[key]); }); }); - if (!cookiesMatched) { return; } } - if (localStorageMatches.length > 0) { var localStorageMatched = localStorageMatches.every(function (str) { var itemValue = window.localStorage.getItem(str); return itemValue || itemValue === ''; }); - if (!localStorageMatched) { return; } } + /** * Create selectors array and swap selectors to null on finding it's element * @@ -2342,60 +2136,52 @@ * - always know on what index corresponding element should be put * - prevent selectors from being queried multiple times */ - - var selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) { return selector.trim(); }); - var createElementObj = function createElementObj(element) { return { element: element || null, clicked: false }; }; - var elementsSequence = Array(selectorsSequence.length).fill(createElementObj()); + /** * Go through elementsSequence from left to right, clicking on found elements * * Element should not be clicked if it is already clicked, * or a previous element is not found or clicked yet */ - var clickElementsBySequence = function clickElementsBySequence() { for (var i = 0; i < elementsSequence.length; i += 1) { - var elementObj = elementsSequence[i]; // Stop clicking if that pos element is not found yet - + var elementObj = elementsSequence[i]; + // Stop clicking if that pos element is not found yet if (!elementObj.element) { break; - } // Skip already clicked elements - - + } + // Skip already clicked elements if (!elementObj.clicked) { elementObj.element.click(); elementObj.clicked = true; } } - var allElementsClicked = elementsSequence.every(function (elementObj) { return elementObj.clicked === true; }); - if (allElementsClicked) { // At this stage observer is already disconnected hit(source); } }; - var handleElement = function handleElement(element, i) { var elementObj = createElementObj(element); elementsSequence[i] = elementObj; - if (canClick) { clickElementsBySequence(); } }; + /** * Query all selectors from queue on each mutation * Each selector is swapped to null in selectorsSequence on founding corresponding element @@ -2404,46 +2190,41 @@ * when delay is getting off after the last mutation took place. * */ - - var findElements = function findElements(mutations, observer) { var fulfilledSelectors = []; selectorsSequence.forEach(function (selector, i) { if (!selector) { return; } - var element = document.querySelector(selector); - if (!element) { return; } - handleElement(element, i); fulfilledSelectors.push(selector); - }); // selectorsSequence should be modified after the loop to not break loop indexation + }); + // selectorsSequence should be modified after the loop to not break loop indexation selectorsSequence = selectorsSequence.map(function (selector) { return fulfilledSelectors.indexOf(selector) === -1 ? selector : null; - }); // Disconnect observer after finding all elements + }); + // Disconnect observer after finding all elements var allSelectorsFulfilled = selectorsSequence.every(function (selector) { return selector === null; }); - if (allSelectorsFulfilled) { observer.disconnect(); } - }; // eslint-disable-next-line compat/compat - + }; + // eslint-disable-next-line compat/compat var observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS)); observer.observe(document.documentElement, { attributes: true, childList: true, subtree: true }); - if (parsedDelay) { setTimeout(function () { // Click previously collected elements @@ -2451,17 +2232,17 @@ canClick = true; }, parsedDelay); } - setTimeout(function () { return observer.disconnect(); }, OBSERVER_TIMEOUT_MS); } - trustedClickElement$1.names = ['trusted-click-element' // trusted scriptlets support no aliases + trustedClickElement$1.names = ['trusted-click-element' + // trusted scriptlets support no aliases ]; + trustedClickElement$1.injections = [hit, toRegExp, parseCookieString, throttle, logMessage]; /* eslint-disable max-len */ - /** * @scriptlet abort-on-property-read * @@ -2490,36 +2271,28 @@ * example.org#%#//scriptlet('abort-on-property-read', 'navigator.language') * ``` */ - /* eslint-enable max-len */ - function abortOnPropertyRead$1(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -2528,22 +2301,20 @@ }); return; } - setPropertyAccess(base, prop, { get: abort, set: function set() {} }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - abortOnPropertyRead$1.names = ['abort-on-property-read', // aliases are needed for matching the related scriptlet converted into our syntax + abortOnPropertyRead$1.names = ['abort-on-property-read', + // aliases are needed for matching the related scriptlet converted into our syntax 'abort-on-property-read.js', 'ubo-abort-on-property-read.js', 'aopr.js', 'ubo-aopr.js', 'ubo-abort-on-property-read', 'ubo-aopr', 'abp-abort-on-property-read']; abortOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; /* eslint-disable max-len */ - /** * @scriptlet abort-on-property-write * @@ -2569,36 +2340,28 @@ * example.org#%#//scriptlet('abort-on-property-write', 'adblock') * ``` */ - /* eslint-enable max-len */ - function abortOnPropertyWrite$1(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -2607,21 +2370,19 @@ }); return; } - setPropertyAccess(base, prop, { set: abort }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - abortOnPropertyWrite$1.names = ['abort-on-property-write', // aliases are needed for matching the related scriptlet converted into our syntax + abortOnPropertyWrite$1.names = ['abort-on-property-write', + // aliases are needed for matching the related scriptlet converted into our syntax 'abort-on-property-write.js', 'ubo-abort-on-property-write.js', 'aopw.js', 'ubo-aopw.js', 'ubo-abort-on-property-write', 'ubo-aopw', 'abp-abort-on-property-write']; abortOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; /* eslint-disable max-len */ - /** * @scriptlet prevent-setTimeout * @@ -2723,24 +2484,21 @@ * }, 500); * ``` */ - /* eslint-enable max-len */ - function preventSetTimeout$1(source, matchCallback, matchDelay) { // if browser does not support Proxy (e.g. Internet Explorer), // we use none-proxy "legacy" wrapper for preventing // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy var isProxySupported = typeof Proxy !== 'undefined'; - var nativeTimeout = window.setTimeout; // logs setTimeouts to console if no arguments have been specified + var nativeTimeout = window.setTimeout; + // logs setTimeouts to console if no arguments have been specified var shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined'; - var legacyTimeoutWrapper = function legacyTimeoutWrapper(callback, delay) { var shouldPrevent = false; - if (shouldLog) { - hit(source); // https://github.com/AdguardTeam/Scriptlets/issues/105 - + hit(source); + // https://github.com/AdguardTeam/Scriptlets/issues/105 logMessage(source, "setTimeout(".concat(String(callback), ", ").concat(delay, ")"), true); } else { shouldPrevent = isPreventionNeeded({ @@ -2750,27 +2508,22 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); return nativeTimeout(noopFunc, delay); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeTimeout.apply(window, [callback, delay].concat(args)); }; - var handlerWrapper = function handlerWrapper(target, thisArg, args) { var callback = args[0]; var delay = args[1]; var shouldPrevent = false; - if (shouldLog) { - hit(source); // https://github.com/AdguardTeam/Scriptlets/issues/105 - + hit(source); + // https://github.com/AdguardTeam/Scriptlets/issues/105 logMessage(source, "setTimeout(".concat(String(callback), ", ").concat(delay, ")"), true); } else { shouldPrevent = isPreventionNeeded({ @@ -2780,32 +2533,33 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); args[0] = noopFunc; } - return target.apply(thisArg, args); }; - var setTimeoutHandler = { apply: handlerWrapper }; window.setTimeout = isProxySupported ? new Proxy(window.setTimeout, setTimeoutHandler) : legacyTimeoutWrapper; } - preventSetTimeout$1.names = ['prevent-setTimeout', // aliases are needed for matching the related scriptlet converted into our syntax - 'no-setTimeout-if.js', // new implementation of setTimeout-defuser.js - 'ubo-no-setTimeout-if.js', 'nostif.js', // new short name of no-setTimeout-if - 'ubo-nostif.js', 'ubo-no-setTimeout-if', 'ubo-nostif', // old scriptlet names which should be supported as well. + preventSetTimeout$1.names = ['prevent-setTimeout', + // aliases are needed for matching the related scriptlet converted into our syntax + 'no-setTimeout-if.js', + // new implementation of setTimeout-defuser.js + 'ubo-no-setTimeout-if.js', 'nostif.js', + // new short name of no-setTimeout-if + 'ubo-nostif.js', 'ubo-no-setTimeout-if', 'ubo-nostif', + // old scriptlet names which should be supported as well. // should be removed eventually. // do not remove until other filter lists maintainers use them 'setTimeout-defuser.js', 'ubo-setTimeout-defuser.js', 'ubo-setTimeout-defuser', 'std.js', 'ubo-std.js', 'ubo-std']; - preventSetTimeout$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage, // following helpers should be injected as helpers above use them - parseMatchArg, parseDelayArg, toRegExp, startsWith, nativeIsNaN, isValidCallback, isValidMatchStr, escapeRegExp, isValidStrPattern, nativeIsFinite, isValidMatchNumber]; + preventSetTimeout$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage, + // following helpers should be injected as helpers above use them + parseMatchArg, parseDelayArg, toRegExp, startsWith$1, nativeIsNaN, isValidCallback, isValidMatchStr, escapeRegExp, isValidStrPattern, nativeIsFinite, isValidMatchNumber]; /* eslint-disable max-len */ - /** * @scriptlet prevent-setInterval * @@ -2907,24 +2661,21 @@ * }, 500); * ``` */ - /* eslint-enable max-len */ - function preventSetInterval$1(source, matchCallback, matchDelay) { // if browser does not support Proxy (e.g. Internet Explorer), // we use none-proxy "legacy" wrapper for preventing // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy var isProxySupported = typeof Proxy !== 'undefined'; - var nativeInterval = window.setInterval; // logs setIntervals to console if no arguments have been specified + var nativeInterval = window.setInterval; + // logs setIntervals to console if no arguments have been specified var shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined'; - var legacyIntervalWrapper = function legacyIntervalWrapper(callback, delay) { var shouldPrevent = false; - if (shouldLog) { - hit(source); // https://github.com/AdguardTeam/Scriptlets/issues/105 - + hit(source); + // https://github.com/AdguardTeam/Scriptlets/issues/105 logMessage(source, "setInterval(".concat(String(callback), ", ").concat(delay, ")"), true); } else { shouldPrevent = isPreventionNeeded({ @@ -2934,27 +2685,22 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); return nativeInterval(noopFunc, delay); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeInterval.apply(window, [callback, delay].concat(args)); }; - var handlerWrapper = function handlerWrapper(target, thisArg, args) { var callback = args[0]; var delay = args[1]; var shouldPrevent = false; - if (shouldLog) { - hit(source); // https://github.com/AdguardTeam/Scriptlets/issues/105 - + hit(source); + // https://github.com/AdguardTeam/Scriptlets/issues/105 logMessage(source, "setInterval(".concat(String(callback), ", ").concat(delay, ")"), true); } else { shouldPrevent = isPreventionNeeded({ @@ -2964,31 +2710,33 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); args[0] = noopFunc; } - return target.apply(thisArg, args); }; - var setIntervalHandler = { apply: handlerWrapper }; window.setInterval = isProxySupported ? new Proxy(window.setInterval, setIntervalHandler) : legacyIntervalWrapper; } - preventSetInterval$1.names = ['prevent-setInterval', // aliases are needed for matching the related scriptlet converted into our syntax - 'no-setInterval-if.js', // new implementation of setInterval-defuser.js - 'ubo-no-setInterval-if.js', 'setInterval-defuser.js', // old name should be supported as well - 'ubo-setInterval-defuser.js', 'nosiif.js', // new short name of no-setInterval-if - 'ubo-nosiif.js', 'sid.js', // old short scriptlet name + preventSetInterval$1.names = ['prevent-setInterval', + // aliases are needed for matching the related scriptlet converted into our syntax + 'no-setInterval-if.js', + // new implementation of setInterval-defuser.js + 'ubo-no-setInterval-if.js', 'setInterval-defuser.js', + // old name should be supported as well + 'ubo-setInterval-defuser.js', 'nosiif.js', + // new short name of no-setInterval-if + 'ubo-nosiif.js', 'sid.js', + // old short scriptlet name 'ubo-sid.js', 'ubo-no-setInterval-if', 'ubo-setInterval-defuser', 'ubo-nosiif', 'ubo-sid']; - preventSetInterval$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage, // following helpers should be injected as helpers above use them - toRegExp, startsWith, nativeIsNaN, parseMatchArg, parseDelayArg, isValidCallback, isValidMatchStr, isValidStrPattern, escapeRegExp, nativeIsFinite, isValidMatchNumber]; + preventSetInterval$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage, + // following helpers should be injected as helpers above use them + toRegExp, startsWith$1, nativeIsNaN, parseMatchArg, parseDelayArg, isValidCallback, isValidMatchStr, isValidStrPattern, escapeRegExp, nativeIsFinite, isValidMatchNumber]; /* eslint-disable max-len */ - /** * @scriptlet prevent-window-open * @@ -3049,9 +2797,7 @@ * * > For better compatibility with uBO, old syntax is not recommended to use. */ - /* eslint-enable max-len */ - function preventWindowOpen$1(source) { var match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '*'; var delay = arguments.length > 2 ? arguments[2] : undefined; @@ -3060,62 +2806,49 @@ // if scriptlet runs without args var nativeOpen = window.open; var isNewSyntax = match !== '0' && match !== '1'; - var oldOpenWrapper = function oldOpenWrapper(str) { - match = Number(match) > 0; // 'delay' was 'search' prop for matching in old syntax - + match = Number(match) > 0; + // 'delay' was 'search' prop for matching in old syntax for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - if (!isValidStrPattern(delay)) { logMessage(source, "Invalid parameter: ".concat(delay)); return nativeOpen.apply(window, [str].concat(args)); } - var searchRegexp = toRegExp(delay); - if (match !== searchRegexp.test(str)) { return nativeOpen.apply(window, [str].concat(args)); } - hit(source); return handleOldReplacement(replacement); }; - var newOpenWrapper = function newOpenWrapper(url) { var shouldLog = replacement && replacement.indexOf('log') > -1; - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } - if (shouldLog) { var argsStr = args && args.length > 0 ? ", ".concat(args.join(', ')) : ''; - var message = "window-open: ".concat(url).concat(argsStr); + var message = "".concat(url).concat(argsStr); logMessage(source, message, true); hit(source); } - var shouldPrevent = false; - if (match === '*') { shouldPrevent = true; } else if (isValidMatchStr(match)) { var _parseMatchArg = parseMatchArg(match), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; shouldPrevent = matchRegexp.test(url) !== isInvertedMatch; } else { logMessage(source, "Invalid parameter: ".concat(match)); shouldPrevent = false; } - if (shouldPrevent) { var parsedDelay = parseInt(delay, 10); var result; - if (nativeIsNaN(parsedDelay)) { result = noopNull(); } else { @@ -3126,7 +2859,6 @@ }; var decoy = createDecoy(decoyArgs); var popup = decoy.contentWindow; - if (typeof popup === 'object' && popup !== null) { Object.defineProperty(popup, 'closed', { value: false @@ -3144,27 +2876,24 @@ }); popup = decoy.contentWindow; } - result = popup; } - hit(source); return result; } - return nativeOpen.apply(window, [url].concat(args)); }; + window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper; - window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper; // Protect window.open from native code check - + // Protect window.open from native code check window.open.toString = nativeOpen.toString.bind(nativeOpen); } - preventWindowOpen$1.names = ['prevent-window-open', // aliases are needed for matching the related scriptlet converted into our syntax + preventWindowOpen$1.names = ['prevent-window-open', + // aliases are needed for matching the related scriptlet converted into our syntax 'window.open-defuser.js', 'ubo-window.open-defuser.js', 'ubo-window.open-defuser', 'nowoif.js', 'ubo-nowoif.js', 'ubo-nowoif']; - preventWindowOpen$1.injections = [hit, isValidStrPattern, escapeRegExp, isValidMatchStr, toRegExp, nativeIsNaN, parseMatchArg, handleOldReplacement, createDecoy, getPreventGetter, noopNull, logMessage, noopFunc, trueFunc, startsWith, endsWith, substringBefore, substringAfter$1]; + preventWindowOpen$1.injections = [hit, isValidStrPattern, escapeRegExp, isValidMatchStr, toRegExp, nativeIsNaN, parseMatchArg, handleOldReplacement, createDecoy, getPreventGetter, noopNull, logMessage, noopFunc, trueFunc, startsWith$1, endsWith, substringBefore, substringAfter$1]; /* eslint-disable max-len */ - /** * @scriptlet abort-current-inline-script * @@ -3227,14 +2956,11 @@ * * ``` */ - /* eslint-enable max-len */ - function abortCurrentInlineScript$1(source, property, search) { var searchRegexp = toRegExp(search); var rid = randomId(); var SRC_DATA_MARKER = 'data:text/javascript;base64,'; - var getCurrentScript = function getCurrentScript() { if ('currentScript' in document) { return document.currentScript; // eslint-disable-line compat/compat @@ -3243,49 +2969,42 @@ var scripts = document.getElementsByTagName('script'); return scripts[scripts.length - 1]; }; - var ourScript = getCurrentScript(); - var abort = function abort() { var scriptEl = getCurrentScript(); - if (!scriptEl) { return; } + var content = scriptEl.textContent; - var content = scriptEl.textContent; // We are using Node.prototype.textContent property descriptor + // We are using Node.prototype.textContent property descriptor // to get the real script content // even when document.currentScript.textContent is replaced. // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991 - try { var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get; content = textContentGetter.call(scriptEl); } catch (e) {} // eslint-disable-line no-empty - // https://github.com/AdguardTeam/Scriptlets/issues/130 - - if (content.length === 0 && typeof scriptEl.src !== 'undefined' && startsWith(scriptEl.src, SRC_DATA_MARKER)) { + // https://github.com/AdguardTeam/Scriptlets/issues/130 + if (content.length === 0 && typeof scriptEl.src !== 'undefined' && startsWith$1(scriptEl.src, SRC_DATA_MARKER)) { var encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length); content = window.atob(encodedContent); } - if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { hit(source); throw new ReferenceError(rid); } }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; // The scriptlet might be executed before the chain property has been created + chain = chainInfo.chain; // The scriptlet might be executed before the chain property has been created // (for instance, document.body before the HTML body was loaded). // In this case we're checking whether the base element exists or not // and if not, we simply exit without overriding anything. // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092 - if (base instanceof Object === false && base === null) { var props = property.split('.'); var propIndex = props.indexOf(prop); @@ -3294,16 +3013,13 @@ logMessage(source, message); return; } - if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -3312,33 +3028,27 @@ }); return; } - var currentValue = base[prop]; var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) { currentValue = base[prop]; origDescriptor = undefined; } - var descriptorWrapper = Object.assign(getDescriptorAddon(), { currentValue: currentValue, get: function get() { if (!this.isAbortingSuspended) { this.isolateCallback(abort); } - if (origDescriptor instanceof Object) { return origDescriptor.get.call(base); } - return this.currentValue; }, set: function set(newValue) { if (!this.isAbortingSuspended) { this.isolateCallback(abort); } - if (origDescriptor instanceof Object) { origDescriptor.set.call(base, newValue); } else { @@ -3356,18 +3066,19 @@ } }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - abortCurrentInlineScript$1.names = ['abort-current-inline-script', // aliases are needed for matching the related scriptlet converted into our syntax - 'abort-current-script.js', 'ubo-abort-current-script.js', 'acs.js', 'ubo-acs.js', // "ubo"-aliases with no "js"-ending - 'ubo-abort-current-script', 'ubo-acs', // obsolete but supported aliases + abortCurrentInlineScript$1.names = ['abort-current-inline-script', + // aliases are needed for matching the related scriptlet converted into our syntax + 'abort-current-script.js', 'ubo-abort-current-script.js', 'acs.js', 'ubo-acs.js', + // "ubo"-aliases with no "js"-ending + 'ubo-abort-current-script', 'ubo-acs', + // obsolete but supported aliases 'abort-current-inline-script.js', 'ubo-abort-current-inline-script.js', 'acis.js', 'ubo-acis.js', 'ubo-abort-current-inline-script', 'ubo-acis', 'abp-abort-current-inline-script']; - abortCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, startsWith, createOnErrorHandler, hit, logMessage, isEmptyObject, getDescriptorAddon]; + abortCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, startsWith$1, createOnErrorHandler, hit, logMessage, isEmptyObject, getDescriptorAddon]; /* eslint-disable max-len */ - /** * @scriptlet set-constant * @@ -3434,18 +3145,14 @@ * ✔ document.third() === true // if the condition described above is met * ``` */ - /* eslint-enable max-len */ - function setConstant$1(source, property, value, stack) { if (!property || !matchStackTrace(stack, new Error().stack)) { return; } - var emptyArr = noopArray(); var emptyObj = noopObject(); var constantValue; - if (value === 'undefined') { constantValue = undefined; } else if (value === 'false') { @@ -3470,11 +3177,9 @@ constantValue = noopPromiseReject; } else if (/^\d+$/.test(value)) { constantValue = parseFloat(value); - if (nativeIsNaN(constantValue)) { return; } - if (Math.abs(constantValue) > 0x7FFF) { return; } @@ -3489,26 +3194,21 @@ } else { return; } - var canceled = false; - var mustCancel = function mustCancel(value) { if (canceled) { return canceled; } - canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; return canceled; }; - var trapProp = function trapProp(base, prop, configurable, handler) { if (!handler.init(base[prop])) { return false; } - var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - var prevSetter; // This is required to prevent scriptlets overwrite each over - + var prevSetter; + // This is required to prevent scriptlets overwrite each over if (origDescriptor instanceof Object) { // This check is required to avoid defining non-configurable props if (!origDescriptor.configurable) { @@ -3516,14 +3216,11 @@ logMessage(source, message); return false; } - base[prop] = constantValue; - if (origDescriptor.set instanceof Function) { prevSetter = origDescriptor.set; } } - Object.defineProperty(base, prop, { configurable: configurable, get: function get() { @@ -3533,20 +3230,17 @@ if (prevSetter !== undefined) { prevSetter(a); } - handler.set(a); } }); return true; }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; // Handler method init is used to keep track of factual value + chain = chainInfo.chain; // Handler method init is used to keep track of factual value // and apply mustCancel() check only on end prop - var inChainPropHandler = { factValue: undefined, init: function init(a) { @@ -3561,9 +3255,7 @@ if (this.factValue === a) { return; } - this.factValue = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } @@ -3574,7 +3266,6 @@ if (mustCancel(a)) { return false; } - return true; }, get: function get() { @@ -3584,51 +3275,50 @@ if (!mustCancel(a)) { return; } - constantValue = a; } - }; // End prop case + }; + // End prop case if (!chain) { var isTrapped = trapProp(base, prop, false, endPropHandler); - if (isTrapped) { hit(source); } - return; - } // Null prop in chain - + } + // Null prop in chain if (base !== undefined && base[prop] === null) { trapProp(base, prop, true, inChainPropHandler); return; - } // Empty object prop in chain - + } + // Empty object prop in chain if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) { trapProp(base, prop, true, inChainPropHandler); - } // Defined prop in chain - + } + // Defined prop in chain var propValue = owner[prop]; - if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) { setChainPropAccess(propValue, chain); - } // Undefined prop in chain - + } + // Undefined prop in chain trapProp(base, prop, true, inChainPropHandler); }; - setChainPropAccess(window, property); } - setConstant$1.names = ['set-constant', // aliases are needed for matching the related scriptlet converted into our syntax + setConstant$1.names = ['set-constant', + // aliases are needed for matching the related scriptlet converted into our syntax 'set-constant.js', 'ubo-set-constant.js', 'set.js', 'ubo-set.js', 'ubo-set-constant', 'ubo-set', 'abp-override-property-read']; - setConstant$1.injections = [hit, logMessage, noopArray, noopObject, noopFunc, trueFunc, falseFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest]; + setConstant$1.injections = [hit, logMessage, noopArray, noopObject, noopFunc, trueFunc, falseFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest, + // following helpers should be imported and injected + // because they are used by helpers above + shouldAbortInlineOrInjectedScript]; /* eslint-disable max-len */ - /** * @scriptlet remove-cookie * @@ -3661,12 +3351,9 @@ * document.cookie = '__example=randomValue'; * ``` */ - /* eslint-enable max-len */ - function removeCookie$1(source, match) { var matchRegexp = toRegExp(match); - var removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) { var cookieSpec = "".concat(cookieName, "="); var domain1 = "; domain=".concat(hostName); @@ -3681,42 +3368,34 @@ document.cookie = cookieSpec + domain2 + path + expiration; hit(source); }; - var rmCookie = function rmCookie() { document.cookie.split(';').forEach(function (cookieStr) { var pos = cookieStr.indexOf('='); - if (pos === -1) { return; } - var cookieName = cookieStr.slice(0, pos).trim(); - if (!matchRegexp.test(cookieName)) { return; } - var hostParts = document.location.hostname.split('.'); - for (var i = 0; i <= hostParts.length - 1; i += 1) { var hostName = hostParts.slice(i).join('.'); - if (hostName) { removeCookieFromHost(cookieName, hostName); } } }); }; - rmCookie(); window.addEventListener('beforeunload', rmCookie); } - removeCookie$1.names = ['remove-cookie', // aliases are needed for matching the related scriptlet converted into our syntax + removeCookie$1.names = ['remove-cookie', + // aliases are needed for matching the related scriptlet converted into our syntax 'cookie-remover.js', 'ubo-cookie-remover.js', 'ubo-cookie-remover']; removeCookie$1.injections = [toRegExp, hit]; /* eslint-disable max-len */ - /** * @scriptlet prevent-addEventListener * @@ -3754,51 +3433,45 @@ * }); * ``` */ - /* eslint-enable max-len */ - function preventAddEventListener$1(source, typeSearch, listenerSearch) { var typeSearchRegexp = toRegExp(typeSearch); var listenerSearchRegexp = toRegExp(listenerSearch); var nativeAddEventListener = window.EventTarget.prototype.addEventListener; - function addEventListenerWrapper(type, listener) { var shouldPrevent = false; - if (validateType(type) && validateListener(listener)) { shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); } - if (shouldPrevent) { hit(source); return undefined; } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); } - var descriptor = { configurable: true, set: function set() {}, get: function get() { return addEventListenerWrapper; } - }; // https://github.com/AdguardTeam/Scriptlets/issues/215 + }; + // https://github.com/AdguardTeam/Scriptlets/issues/215 // https://github.com/AdguardTeam/Scriptlets/issues/143 - Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor); Object.defineProperty(window, 'addEventListener', descriptor); Object.defineProperty(document, 'addEventListener', descriptor); } - preventAddEventListener$1.names = ['prevent-addEventListener', // aliases are needed for matching the related scriptlet converted into our syntax + preventAddEventListener$1.names = ['prevent-addEventListener', + // aliases are needed for matching the related scriptlet converted into our syntax 'addEventListener-defuser.js', 'ubo-addEventListener-defuser.js', 'aeld.js', 'ubo-aeld.js', 'ubo-addEventListener-defuser', 'ubo-aeld']; preventAddEventListener$1.injections = [hit, toRegExp, validateType, validateListener, listenerToString]; /* eslint-disable consistent-return, no-eval */ + /** * @scriptlet prevent-bab * @@ -3816,82 +3489,65 @@ * example.org#%#//scriptlet('prevent-bab') * ``` */ - - function preventBab$1(source) { + function preventBab$2(source) { var nativeSetTimeout = window.setTimeout; var babRegex = /\.bab_elementid.$/; - var timeoutWrapper = function timeoutWrapper(callback) { if (typeof callback !== 'string' || !babRegex.test(callback)) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeSetTimeout.apply(window, [callback].concat(args)); } - hit(source); }; - window.setTimeout = timeoutWrapper; var signatures = [['blockadblock'], ['babasbm'], [/getItem\('babn'\)/], ['getElementById', 'String.fromCharCode', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'charAt', 'DOMContentLoaded', 'AdBlock', 'addEventListener', 'doScroll', 'fromCharCode', '<<2|r>>4', 'sessionStorage', 'clientWidth', 'localStorage', 'Math', 'random']]; - var check = function check(str) { if (typeof str !== 'string') { return false; } - for (var i = 0; i < signatures.length; i += 1) { var tokens = signatures[i]; var match = 0; - for (var j = 0; j < tokens.length; j += 1) { var token = tokens[j]; var found = token instanceof RegExp ? token.test(str) : str.indexOf(token) > -1; - if (found) { match += 1; } } - if (match / tokens.length >= 0.8) { return true; } } - return false; }; - var nativeEval = window.eval; - var evalWrapper = function evalWrapper(str) { if (!check(str)) { return nativeEval(str); } - hit(source); var bodyEl = document.body; - if (bodyEl) { bodyEl.style.removeProperty('visibility'); } - var el = document.getElementById('babasbmsgx'); - if (el) { el.parentNode.removeChild(el); } }; - window.eval = evalWrapper.bind(window); } - preventBab$1.names = ['prevent-bab', // aliases are needed for matching the related scriptlet converted into our syntax + preventBab$2.names = ['prevent-bab', + // aliases are needed for matching the related scriptlet converted into our syntax 'nobab.js', 'ubo-nobab.js', 'bab-defuser.js', 'ubo-bab-defuser.js', 'ubo-nobab', 'ubo-bab-defuser']; - preventBab$1.injections = [hit]; + preventBab$2.injections = [hit]; /* eslint-disable no-unused-vars, no-extra-bind, func-names */ - /* eslint-disable max-len */ + /* eslint-disable max-len */ /** * @scriptlet nowebrtc * @@ -3906,29 +3562,23 @@ * example.org#%#//scriptlet('nowebrtc') * ``` */ - /* eslint-enable max-len */ - function nowebrtc$1(source) { var propertyName = ''; - if (window.RTCPeerConnection) { propertyName = 'RTCPeerConnection'; } else if (window.webkitRTCPeerConnection) { propertyName = 'webkitRTCPeerConnection'; } - if (propertyName === '') { return; } - var rtcReplacement = function rtcReplacement(config) { // eslint-disable-next-line max-len var message = "Document tried to create an RTCPeerConnection: ".concat(convertRtcConfigToString(config)); logMessage(source, message); hit(source); }; - rtcReplacement.prototype = { close: noopFunc, createDataChannel: noopFunc, @@ -3937,7 +3587,6 @@ }; var rtc = window[propertyName]; window[propertyName] = rtcReplacement; - if (rtc.prototype) { rtc.prototype.createDataChannel = function (a, b) { return { @@ -3947,7 +3596,8 @@ }.bind(null); } } - nowebrtc$1.names = ['nowebrtc', // aliases are needed for matching the related scriptlet converted into our syntax + nowebrtc$1.names = ['nowebrtc', + // aliases are needed for matching the related scriptlet converted into our syntax 'nowebrtc.js', 'ubo-nowebrtc.js', 'ubo-nowebrtc']; nowebrtc$1.injections = [hit, noopFunc, logMessage, convertRtcConfigToString]; @@ -3965,47 +3615,43 @@ * example.org#%#//scriptlet('log-addEventListener') * ``` */ - function logAddEventListener$1(source) { var nativeAddEventListener = window.EventTarget.prototype.addEventListener; - function addEventListenerWrapper(type, listener) { if (validateType(type) && validateListener(listener)) { var _message = "addEventListener(\"".concat(type, "\", ").concat(listenerToString(listener), ")"); - logMessage(source, _message, true); hit(source); - } // logging while debugging - + } + // logging while debugging var message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); logMessage(source, message, true); - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); } - var descriptor = { configurable: true, set: function set() {}, get: function get() { return addEventListenerWrapper; } - }; // https://github.com/AdguardTeam/Scriptlets/issues/215 + }; + // https://github.com/AdguardTeam/Scriptlets/issues/215 // https://github.com/AdguardTeam/Scriptlets/issues/143 - Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor); Object.defineProperty(window, 'addEventListener', descriptor); Object.defineProperty(document, 'addEventListener', descriptor); } - logAddEventListener$1.names = ['log-addEventListener', // aliases are needed for matching the related scriptlet converted into our syntax + logAddEventListener$1.names = ['log-addEventListener', + // aliases are needed for matching the related scriptlet converted into our syntax 'addEventListener-logger.js', 'ubo-addEventListener-logger.js', 'aell.js', 'ubo-aell.js', 'ubo-addEventListener-logger', 'ubo-aell']; logAddEventListener$1.injections = [hit, validateType, validateListener, listenerToString, convertTypeToString, logMessage, objectToString, isEmptyObject, getObjectEntries]; /* eslint-disable no-eval */ + /** * @scriptlet log-eval * @@ -4017,32 +3663,26 @@ * example.org#%#//scriptlet('log-eval') * ``` */ - function logEval$1(source) { // wrap eval function var nativeEval = window.eval; - function evalWrapper(str) { hit(source); logMessage(source, "eval(\"".concat(str, "\")"), true); return nativeEval(str); } + window.eval = evalWrapper; - window.eval = evalWrapper; // wrap new Function - + // wrap new Function var nativeFunction = window.Function; - function FunctionWrapper() { hit(source); - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - logMessage(source, "new Function(".concat(args.join(', '), ")"), true); return nativeFunction.apply(this, [].concat(args)); } - FunctionWrapper.prototype = Object.create(nativeFunction.prototype); FunctionWrapper.prototype.constructor = FunctionWrapper; window.Function = FunctionWrapper; @@ -4066,12 +3706,13 @@ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - console.log(args); // eslint-disable-line no-console } + log$1.names = ['log']; /* eslint-disable no-eval, no-extra-bind */ + /** * @scriptlet noeval * @@ -4090,17 +3731,19 @@ * example.org#%#//scriptlet('noeval') * ``` */ - function noeval$1(source) { window.eval = function evalWrapper(s) { - hit(source, "AdGuard has prevented eval:\n".concat(s)); + hit(source); + logMessage(source, "AdGuard has prevented eval:\n".concat(s), true); }.bind(); } - noeval$1.names = ['noeval', // aliases are needed for matching the related scriptlet converted into our syntax + noeval$1.names = ['noeval', + // aliases are needed for matching the related scriptlet converted into our syntax 'noeval.js', 'silent-noeval.js', 'ubo-noeval.js', 'ubo-silent-noeval.js', 'ubo-noeval', 'ubo-silent-noeval']; - noeval$1.injections = [hit]; + noeval$1.injections = [hit, logMessage]; /* eslint-disable no-eval, no-extra-bind, func-names */ + /** * @scriptlet prevent-eval-if * @@ -4125,25 +3768,24 @@ * example.org#%#//scriptlet('prevent-eval-if', 'test') * ``` */ - function preventEvalIf$1(source, search) { var searchRegexp = toRegExp(search); var nativeEval = window.eval; - window.eval = function (payload) { if (!searchRegexp.test(payload.toString())) { return nativeEval.call(window, payload); } - - hit(source, payload); + hit(source); return undefined; }.bind(window); } - preventEvalIf$1.names = ['prevent-eval-if', // aliases are needed for matching the related scriptlet converted into our syntax + preventEvalIf$1.names = ['prevent-eval-if', + // aliases are needed for matching the related scriptlet converted into our syntax 'noeval-if.js', 'ubo-noeval-if.js', 'ubo-noeval-if']; preventEvalIf$1.injections = [toRegExp, hit]; /* eslint-disable func-names, no-multi-assign */ + /** * @scriptlet prevent-fab-3.2.0 * @@ -4158,31 +3800,25 @@ * example.org#%#//scriptlet('prevent-fab-3.2.0') * ``` */ - function preventFab$1(source) { - hit(source); // redefines Fab function for adblock detection + hit(source); + // redefines Fab function for adblock detection var Fab = function Fab() {}; - Fab.prototype.check = noopFunc; Fab.prototype.clearEvent = noopFunc; Fab.prototype.emitEvent = noopFunc; - Fab.prototype.on = function (a, b) { if (!a) { b(); } - return this; }; - Fab.prototype.onDetected = noopThis; - Fab.prototype.onNotDetected = function (a) { a(); return this; }; - Fab.prototype.setOption = noopFunc; Fab.prototype.options = { set: noopFunc, @@ -4200,50 +3836,48 @@ return fab; }, set: function set() {} - }; // redefined Fab data properties which if 'FuckAdBlock' variable exists + }; + // redefined Fab data properties which if 'FuckAdBlock' variable exists if (Object.prototype.hasOwnProperty.call(window, 'FuckAdBlock')) { window.FuckAdBlock = Fab; } else { // or redefined Fab accessor properties Object.defineProperty(window, 'FuckAdBlock', getSetFab); } - if (Object.prototype.hasOwnProperty.call(window, 'BlockAdBlock')) { window.BlockAdBlock = Fab; } else { Object.defineProperty(window, 'BlockAdBlock', getSetFab); } - if (Object.prototype.hasOwnProperty.call(window, 'SniffAdBlock')) { window.SniffAdBlock = Fab; } else { Object.defineProperty(window, 'SniffAdBlock', getSetFab); } - if (Object.prototype.hasOwnProperty.call(window, 'fuckAdBlock')) { window.fuckAdBlock = fab; } else { Object.defineProperty(window, 'fuckAdBlock', getsetfab); } - if (Object.prototype.hasOwnProperty.call(window, 'blockAdBlock')) { window.blockAdBlock = fab; } else { Object.defineProperty(window, 'blockAdBlock', getsetfab); } - if (Object.prototype.hasOwnProperty.call(window, 'sniffAdBlock')) { window.sniffAdBlock = fab; } else { Object.defineProperty(window, 'sniffAdBlock', getsetfab); } } - preventFab$1.names = ['prevent-fab-3.2.0', // aliases are needed for matching the related scriptlet converted into our syntax + preventFab$1.names = ['prevent-fab-3.2.0', + // aliases are needed for matching the related scriptlet converted into our syntax 'nofab.js', 'ubo-nofab.js', 'fuckadblock.js-3.2.0', 'ubo-fuckadblock.js-3.2.0', 'ubo-nofab']; preventFab$1.injections = [hit, noopFunc, noopThis]; /* eslint-disable func-names, no-multi-assign */ + /** * @scriptlet set-popads-dummy * @@ -4258,7 +3892,6 @@ * example.org#%#//scriptlet('set-popads-dummy') * ``` */ - function setPopadsDummy$1(source) { delete window.PopAds; delete window.popns; @@ -4277,7 +3910,8 @@ } }); } - setPopadsDummy$1.names = ['set-popads-dummy', // aliases are needed for matching the related scriptlet converted into our syntax + setPopadsDummy$1.names = ['set-popads-dummy', + // aliases are needed for matching the related scriptlet converted into our syntax 'popads-dummy.js', 'ubo-popads-dummy.js', 'ubo-popads-dummy']; setPopadsDummy$1.injections = [hit]; @@ -4295,14 +3929,11 @@ * example.org#%#//scriptlet('prevent-popads-net') * ``` */ - function preventPopadsNet$1(source) { var rid = randomId(); - var throwError = function throwError() { throw new ReferenceError(rid); }; - delete window.PopAds; delete window.popns; Object.defineProperties(window, { @@ -4316,11 +3947,13 @@ window.onerror = createOnErrorHandler(rid).bind(); hit(source); } - preventPopadsNet$1.names = ['prevent-popads-net', // aliases are needed for matching the related scriptlet converted into our syntax + preventPopadsNet$1.names = ['prevent-popads-net', + // aliases are needed for matching the related scriptlet converted into our syntax 'popads.net.js', 'ubo-popads.net.js', 'ubo-popads.net']; preventPopadsNet$1.injections = [createOnErrorHandler, randomId, hit]; /* eslint-disable func-names */ + /** * @scriptlet prevent-adfly * @@ -4335,16 +3968,13 @@ * example.org#%#//scriptlet('prevent-adfly') * ``` */ - function preventAdfly$1(source) { var isDigit = function isDigit(data) { return /^\d$/.test(data); }; - var handler = function handler(encodedURL) { var evenChars = ''; var oddChars = ''; - for (var i = 0; i < encodedURL.length; i += 1) { if (i % 2 === 0) { evenChars += encodedURL.charAt(i); @@ -4352,56 +3982,45 @@ oddChars = encodedURL.charAt(i) + oddChars; } } - var data = (evenChars + oddChars).split(''); - for (var _i = 0; _i < data.length; _i += 1) { if (isDigit(data[_i])) { for (var ii = _i + 1; ii < data.length; ii += 1) { if (isDigit(data[ii])) { // eslint-disable-next-line no-bitwise var temp = parseInt(data[_i], 10) ^ parseInt(data[ii], 10); - if (temp < 10) { data[_i] = temp.toString(); } - _i = ii; break; } } } } - data = data.join(''); var decodedURL = window.atob(data).slice(16, -16); /* eslint-disable compat/compat */ - if (window.stop) { window.stop(); } /* eslint-enable compat/compat */ - - window.onbeforeunload = null; window.location.href = decodedURL; }; - - var val; // Do not apply handler more than one time - + var val; + // Do not apply handler more than one time var applyHandler = true; var result = setPropertyAccess(window, 'ysmm', { configurable: false, set: function set(value) { if (applyHandler) { applyHandler = false; - try { if (typeof value === 'string') { handler(value); } } catch (err) {} // eslint-disable-line no-empty - } val = value; @@ -4410,19 +4029,18 @@ return val; } }); - if (result) { hit(source); } else { logMessage(source, 'Failed to set up prevent-adfly scriptlet'); } } - preventAdfly$1.names = ['prevent-adfly', // aliases are needed for matching the related scriptlet converted into our syntax + preventAdfly$1.names = ['prevent-adfly', + // aliases are needed for matching the related scriptlet converted into our syntax 'adfly-defuser.js', 'ubo-adfly-defuser.js', 'ubo-adfly-defuser']; preventAdfly$1.injections = [setPropertyAccess, hit, logMessage]; /* eslint-disable max-len */ - /** * @scriptlet debug-on-property-read * @@ -4439,16 +4057,12 @@ * example.org#%#//scriptlet('debug-on-property-read', 'open') * ``` */ - /* eslint-enable max-len */ - function debugOnPropertyRead$1(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); debugger; // eslint-disable-line no-debugger @@ -4458,17 +4072,14 @@ var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -4477,13 +4088,11 @@ }); return; } - setPropertyAccess(base, prop, { get: abort, set: noopFunc }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } @@ -4491,7 +4100,6 @@ debugOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, noopFunc, isEmptyObject]; /* eslint-disable max-len */ - /** * @scriptlet debug-on-property-write * @@ -4506,16 +4114,12 @@ * example.org#%#//scriptlet('debug-on-property-write', 'test') * ``` */ - /* eslint-enable max-len */ - function debugOnPropertyWrite$1(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); debugger; // eslint-disable-line no-debugger @@ -4525,17 +4129,14 @@ var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -4544,12 +4145,10 @@ }); return; } - setPropertyAccess(base, prop, { set: abort }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } @@ -4557,7 +4156,6 @@ debugOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; /* eslint-disable max-len */ - /** * @scriptlet debug-current-inline-script * @@ -4572,13 +4170,10 @@ * example.org#%#//scriptlet('debug-current-inline-script', 'alert') * ``` */ - /* eslint-enable max-len */ - function debugCurrentInlineScript$1(source, property, search) { var searchRegexp = toRegExp(search); var rid = randomId(); - var getCurrentScript = function getCurrentScript() { if ('currentScript' in document) { return document.currentScript; // eslint-disable-line compat/compat @@ -4587,27 +4182,23 @@ var scripts = document.getElementsByTagName('script'); return scripts[scripts.length - 1]; }; - var ourScript = getCurrentScript(); - var abort = function abort() { var scriptEl = getCurrentScript(); - if (!scriptEl) { return; } + var content = scriptEl.textContent; - var content = scriptEl.textContent; // We are using Node.prototype.textContent property descriptor + // We are using Node.prototype.textContent property descriptor // to get the real script content // even when document.currentScript.textContent is replaced. // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991 - try { var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get; content = textContentGetter.call(scriptEl); } catch (e) {} // eslint-disable-line no-empty - if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { hit(source); debugger; // eslint-disable-line no-debugger @@ -4618,12 +4209,11 @@ var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; // The scriptlet might be executed before the chain property has been created + chain = chainInfo.chain; // The scriptlet might be executed before the chain property has been created // (for instance, document.body before the HTML body was loaded). // In this case we're checking whether the base element exists or not // and if not, we simply exit without overriding anything. // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092 - if (base instanceof Object === false && base === null) { var props = property.split('.'); var propIndex = props.indexOf(prop); @@ -4632,16 +4222,13 @@ logMessage(message, source.verbose); return; } - if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -4650,7 +4237,6 @@ }); return; } - var currentValue = base[prop]; setPropertyAccess(base, prop, { set: function set(value) { @@ -4663,7 +4249,6 @@ } }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } @@ -4671,7 +4256,6 @@ debugCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, createOnErrorHandler, hit, logMessage, isEmptyObject]; /* eslint-disable max-len */ - /** * @scriptlet remove-attr * @@ -4731,31 +4315,23 @@ * example.org#%#//scriptlet('remove-attr', 'example', 'html', 'asap complete') * ``` */ - /* eslint-enable max-len */ - function removeAttr$1(source, attrs, selector) { var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay'; - if (!attrs) { return; } - attrs = attrs.split(/\s*\|\s*/); - if (!selector) { selector = "[".concat(attrs.join('],['), "]"); } - var rmattr = function rmattr() { var nodes = []; - try { nodes = [].slice.call(document.querySelectorAll(selector)); } catch (e) { logMessage(source, "Invalid selector arg: '".concat(selector, "'")); } - var removed = false; nodes.forEach(function (node) { attrs.forEach(function (attr) { @@ -4763,25 +4339,19 @@ removed = true; }); }); - if (removed) { hit(source); } }; - var flags = parseFlags(applying); - var run = function run() { rmattr(); - if (!flags.hasFlag(flags.STAY)) { return; - } // 'true' for observing attributes - - + } + // 'true' for observing attributes observeDOMChanges(rmattr, true); }; - if (flags.hasFlag(flags.ASAP)) { // https://github.com/AdguardTeam/Scriptlets/issues/245 // Call rmattr on DOM content loaded @@ -4794,7 +4364,6 @@ rmattr(); } } - if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) { window.addEventListener('load', run, { once: true @@ -4803,20 +4372,20 @@ // Only call rmattr for single 'stay' flag if (!applying.indexOf(' ') !== -1) { rmattr(); - } // 'true' for observing attributes - - + } + // 'true' for observing attributes observeDOMChanges(rmattr, true); } } - removeAttr$1.names = ['remove-attr', // aliases are needed for matching the related scriptlet converted into our syntax + removeAttr$1.names = ['remove-attr', + // aliases are needed for matching the related scriptlet converted into our syntax 'remove-attr.js', 'ubo-remove-attr.js', 'ra.js', 'ubo-ra.js', 'ubo-remove-attr', 'ubo-ra']; - removeAttr$1.injections = [hit, observeDOMChanges, parseFlags, logMessage, // following helpers should be imported and injected + removeAttr$1.injections = [hit, observeDOMChanges, parseFlags, logMessage, + // following helpers should be imported and injected // because they are used by helpers above throttle]; /* eslint-disable max-len */ - /** * @scriptlet set-attr * @@ -4861,21 +4430,16 @@ * Some text * ``` */ - /* eslint-enable max-len */ - function setAttr$1(source, selector, attr) { var value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - if (!selector || !attr) { return; - } // Drop strings that cant be parsed into number, negative numbers and numbers below 32767 - - + } + // Drop strings that cant be parsed into number, negative numbers and numbers below 32767 if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 0x7FFF)) { return; } - var setAttr = function setAttr() { var nodes = [].slice.call(document.querySelectorAll(selector)); var set = false; @@ -4883,22 +4447,20 @@ node.setAttribute(attr, value); set = true; }); - if (set) { hit(source); } }; - setAttr(); observeDOMChanges(setAttr, true); } setAttr$1.names = ['set-attr']; - setAttr$1.injections = [hit, observeDOMChanges, nativeIsNaN, // following helpers should be imported and injected + setAttr$1.injections = [hit, observeDOMChanges, nativeIsNaN, + // following helpers should be imported and injected // because they are used by helpers above throttle]; /* eslint-disable max-len */ - /** * @scriptlet remove-class * @@ -4962,51 +4524,41 @@ * example.org#%#//scriptlet('remove-class', 'branding', 'div[class^="inner"]', 'asap complete') * ``` */ - /* eslint-enable max-len */ function removeClass$1(source, classNames, selector) { var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay'; - if (!classNames) { return; } - classNames = classNames.split(/\s*\|\s*/); var selectors = []; - if (!selector) { selectors = classNames.map(function (className) { return ".".concat(className); }); } - var removeClassHandler = function removeClassHandler() { var nodes = new Set(); - if (selector) { var foundNodes = []; - try { foundNodes = [].slice.call(document.querySelectorAll(selector)); } catch (e) { logMessage(source, "Invalid selector arg: '".concat(selector, "'")); } - foundNodes.forEach(function (n) { return nodes.add(n); }); } else if (selectors.length > 0) { selectors.forEach(function (s) { var elements = document.querySelectorAll(s); - for (var i = 0; i < elements.length; i += 1) { var element = elements[i]; nodes.add(element); } }); } - var removed = false; nodes.forEach(function (node) { classNames.forEach(function (className) { @@ -5016,27 +4568,21 @@ } }); }); - if (removed) { hit(source); } }; - var CLASS_ATTR_NAME = ['class']; var flags = parseFlags(applying); - var run = function run() { removeClassHandler(); - if (!flags.hasFlag(flags.STAY)) { return; - } // 'true' for observing attributes + } + // 'true' for observing attributes // 'class' for observing only classes - - observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); }; - if (flags.hasFlag(flags.ASAP)) { // https://github.com/AdguardTeam/Scriptlets/issues/245 // Call removeClassHandler on DOM content loaded @@ -5049,7 +4595,6 @@ removeClassHandler(); } } - if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) { window.addEventListener('load', run, { once: true @@ -5059,13 +4604,14 @@ if (!applying.indexOf(' ') !== -1) { removeClassHandler(); } - observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); } } - removeClass$1.names = ['remove-class', // aliases are needed for matching the related scriptlet converted into our syntax + removeClass$1.names = ['remove-class', + // aliases are needed for matching the related scriptlet converted into our syntax 'remove-class.js', 'ubo-remove-class.js', 'rc.js', 'ubo-rc.js', 'ubo-remove-class', 'ubo-rc']; - removeClass$1.injections = [hit, logMessage, observeDOMChanges, parseFlags, // following helpers should be imported and injected + removeClass$1.injections = [hit, logMessage, observeDOMChanges, parseFlags, + // following helpers should be imported and injected // because they are used by helpers above throttle]; @@ -5083,11 +4629,9 @@ * example.org#%#//scriptlet('disable-newtab-links') * ``` */ - function disableNewtabLinks$1(source) { document.addEventListener('click', function (ev) { var target = ev.target; - while (target !== null) { if (target.localName === 'a' && target.hasAttribute('target')) { ev.stopPropagation(); @@ -5095,17 +4639,16 @@ hit(source); break; } - target = target.parentNode; } }); } - disableNewtabLinks$1.names = ['disable-newtab-links', // aliases are needed for matching the related scriptlet converted into our syntax + disableNewtabLinks$1.names = ['disable-newtab-links', + // aliases are needed for matching the related scriptlet converted into our syntax 'disable-newtab-links.js', 'ubo-disable-newtab-links.js', 'ubo-disable-newtab-links']; disableNewtabLinks$1.injections = [hit]; /* eslint-disable max-len */ - /** * @scriptlet adjust-setInterval * @@ -5154,13 +4697,10 @@ * example.org#%#//scriptlet('adjust-setInterval', '', '*', '0.02') * ``` */ - /* eslint-enable max-len */ - function adjustSetInterval$1(source, matchCallback, matchDelay, boost) { var nativeSetInterval = window.setInterval; var matchRegexp = toRegExp(matchCallback); - var intervalWrapper = function intervalWrapper(callback, delay) { // https://github.com/AdguardTeam/Scriptlets/issues/221 if (!isValidCallback(callback)) { @@ -5171,23 +4711,21 @@ delay *= getBoostMultiplier(boost); hit(source); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeSetInterval.apply(window, [callback, delay].concat(args)); }; - window.setInterval = intervalWrapper; } - adjustSetInterval$1.names = ['adjust-setInterval', // aliases are needed for matching the related scriptlet converted into our syntax + adjustSetInterval$1.names = ['adjust-setInterval', + // aliases are needed for matching the related scriptlet converted into our syntax 'nano-setInterval-booster.js', 'ubo-nano-setInterval-booster.js', 'nano-sib.js', 'ubo-nano-sib.js', 'ubo-nano-setInterval-booster', 'ubo-nano-sib']; - adjustSetInterval$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage, // following helpers should be injected as helpers above use them + adjustSetInterval$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage, + // following helpers should be injected as helpers above use them nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay]; /* eslint-disable max-len */ - /** * @scriptlet adjust-setTimeout * @@ -5236,13 +4774,10 @@ * example.org#%#//scriptlet('adjust-setTimeout', 'test', '*') * ``` */ - /* eslint-enable max-len */ - function adjustSetTimeout$1(source, matchCallback, matchDelay, boost) { var nativeSetTimeout = window.setTimeout; var matchRegexp = toRegExp(matchCallback); - var timeoutWrapper = function timeoutWrapper(callback, delay) { // https://github.com/AdguardTeam/Scriptlets/issues/221 if (!isValidCallback(callback)) { @@ -5253,23 +4788,21 @@ delay *= getBoostMultiplier(boost); hit(source); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeSetTimeout.apply(window, [callback, delay].concat(args)); }; - window.setTimeout = timeoutWrapper; } - adjustSetTimeout$1.names = ['adjust-setTimeout', // aliases are needed for matching the related scriptlet converted into our syntax + adjustSetTimeout$1.names = ['adjust-setTimeout', + // aliases are needed for matching the related scriptlet converted into our syntax 'nano-setTimeout-booster.js', 'ubo-nano-setTimeout-booster.js', 'nano-stb.js', 'ubo-nano-stb.js', 'ubo-nano-setTimeout-booster', 'ubo-nano-stb']; - adjustSetTimeout$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage, // following helpers should be injected as helpers above use them + adjustSetTimeout$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage, + // following helpers should be injected as helpers above use them nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay]; /* eslint-disable max-len */ - /** * @scriptlet dir-string * @@ -5295,38 +4828,23 @@ * example.org#%#//scriptlet('dir-string', '2') * ``` */ - /* eslint-enable max-len */ - function dirString$1(source, times) { var _console = console, - dir = _console.dir; - times = parseInt(times, 10); - + dir = _console.dir; function dirWrapper(object) { - // eslint-disable-next-line no-unused-vars - var temp; - - for (var i = 0; i < times; i += 1) { - // eslint-disable-next-line no-unused-expressions - temp = "".concat(object); - } - if (typeof dir === 'function') { dir.call(this, object); } - - hit(source, temp); - } // eslint-disable-next-line no-console - - + hit(source); + } + // eslint-disable-next-line no-console console.dir = dirWrapper; } dirString$1.names = ['dir-string', 'abp-dir-string']; dirString$1.injections = [hit]; /* eslint-disable max-len */ - /** * @scriptlet json-prune * @@ -5402,45 +4920,40 @@ * example.org#%#//scriptlet('json-prune', '', '"id":"117458"') * ``` */ - /* eslint-enable max-len */ - function jsonPrune$1(source, propsToRemove, requiredInitialProps, stack) { if (!!stack && !matchStackTrace(stack, new Error().stack)) { return; } - var prunePaths = propsToRemove !== undefined && propsToRemove !== '' ? propsToRemove.split(/ +/) : []; var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== '' ? requiredInitialProps.split(/ +/) : []; - function isPruningNeeded(root) { if (!root) { return false; } + var shouldProcess; - var shouldProcess; // Only log hostname and matched JSON payload if only second argument is present - + // Only log hostname and matched JSON payload if only second argument is present if (prunePaths.length === 0 && requiredPaths.length > 0) { var rootString = JSON.stringify(root); var matchRegex = toRegExp(requiredPaths.join('')); var shouldLog = matchRegex.test(rootString); - if (shouldLog) { - logMessage(source, "".concat(window.location.hostname, " ").concat(root), true); + logMessage(source, "".concat(window.location.hostname, " ").concat(objectToString(root)), true); shouldProcess = false; return shouldProcess; } } - for (var i = 0; i < requiredPaths.length; i += 1) { var requiredPath = requiredPaths[i]; var lastNestedPropName = requiredPath.split('.').pop(); - var hasWildcard = requiredPath.indexOf('.*.') > -1 || requiredPath.indexOf('*.') > -1 || requiredPath.indexOf('.*') > -1 || requiredPath.indexOf('.[].') > -1 || requiredPath.indexOf('[].') > -1 || requiredPath.indexOf('.[]') > -1; // if the path has wildcard, getPropertyInChain should 'look through' chain props + var hasWildcard = requiredPath.indexOf('.*.') > -1 || requiredPath.indexOf('*.') > -1 || requiredPath.indexOf('.*') > -1 || requiredPath.indexOf('.[].') > -1 || requiredPath.indexOf('[].') > -1 || requiredPath.indexOf('.[]') > -1; - var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); // start value of 'shouldProcess' due to checking below + // if the path has wildcard, getPropertyInChain should 'look through' chain props + var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); + // start value of 'shouldProcess' due to checking below shouldProcess = !hasWildcard; - for (var _i = 0; _i < details.length; _i += 1) { if (hasWildcard) { // if there is a wildcard, @@ -5452,28 +4965,25 @@ } } } - return shouldProcess; } + /** * Prunes properties of 'root' object * @param {Object} root */ - - var jsonPruner = function jsonPruner(root) { if (prunePaths.length === 0 && requiredPaths.length === 0) { - logMessage(source, "".concat(window.location.hostname, " ").concat(root), true); + logMessage(source, "".concat(window.location.hostname, " ").concat(objectToString(root)), true); return root; } - try { if (isPruningNeeded(root) === false) { return root; - } // if pruning is needed, we check every input pathToRemove - // and delete it if root has it - + } + // if pruning is needed, we check every input pathToRemove + // and delete it if root has it prunePaths.forEach(function (path) { var ownerObjArr = getWildcardPropertyInChain(root, path, true); ownerObjArr.forEach(function (ownerObj) { @@ -5486,51 +4996,50 @@ } catch (e) { logMessage(source, e); } - return root; }; - var nativeJSONParse = JSON.parse; - var jsonParseWrapper = function jsonParseWrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - // dealing with stringified json in args, which should be parsed. // so we call nativeJSONParse as JSON.parse which is bound to JSON object var root = nativeJSONParse.apply(JSON, args); return jsonPruner(root); - }; // JSON.parse mocking - + }; + // JSON.parse mocking jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse); - JSON.parse = jsonParseWrapper; // eslint-disable-next-line compat/compat - - var nativeResponseJson = Response.prototype.json; // eslint-disable-next-line func-names + JSON.parse = jsonParseWrapper; + // eslint-disable-next-line compat/compat + var nativeResponseJson = Response.prototype.json; + // eslint-disable-next-line func-names var responseJsonWrapper = function responseJsonWrapper() { var promise = nativeResponseJson.apply(this); return promise.then(function (obj) { return jsonPruner(obj); }); - }; // do nothing if browser does not support Response (e.g. Internet Explorer) - // https://developer.mozilla.org/en-US/docs/Web/API/Response - + }; + // do nothing if browser does not support Response (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/API/Response if (typeof Response === 'undefined') { return; - } // eslint-disable-next-line compat/compat - + } + // eslint-disable-next-line compat/compat Response.prototype.json = responseJsonWrapper; } - jsonPrune$1.names = ['json-prune', // aliases are needed for matching the related scriptlet converted into our syntax + jsonPrune$1.names = ['json-prune', + // aliases are needed for matching the related scriptlet converted into our syntax 'json-prune.js', 'ubo-json-prune.js', 'ubo-json-prune', 'abp-json-prune']; - jsonPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage, toRegExp, getNativeRegexpTest]; + jsonPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage, objectToString, + // following helpers are needed for helpers above + toRegExp, isEmptyObject, getObjectEntries, getNativeRegexpTest, shouldAbortInlineOrInjectedScript]; /* eslint-disable max-len */ - /** * @scriptlet prevent-requestAnimationFrame * @@ -5598,49 +5107,43 @@ * }); * ``` */ - /* eslint-enable max-len */ function preventRequestAnimationFrame$1(source, match) { - var nativeRequestAnimationFrame = window.requestAnimationFrame; // logs requestAnimationFrame to console if no arguments have been specified + var nativeRequestAnimationFrame = window.requestAnimationFrame; + // logs requestAnimationFrame to console if no arguments have been specified var shouldLog = typeof match === 'undefined'; - var _parseMatchArg = parseMatchArg(match), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; var rafWrapper = function rafWrapper(callback) { var shouldPrevent = false; - if (shouldLog) { hit(source); logMessage(source, "requestAnimationFrame(".concat(String(callback), ")"), true); } else if (isValidCallback(callback) && isValidStrPattern(match)) { shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch; } - if (shouldPrevent) { hit(source); return nativeRequestAnimationFrame(noopFunc); } - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeRequestAnimationFrame.apply(window, [callback].concat(args)); }; - window.requestAnimationFrame = rafWrapper; } - preventRequestAnimationFrame$1.names = ['prevent-requestAnimationFrame', // aliases are needed for matching the related scriptlet converted into our syntax + preventRequestAnimationFrame$1.names = ['prevent-requestAnimationFrame', + // aliases are needed for matching the related scriptlet converted into our syntax 'no-requestAnimationFrame-if.js', 'ubo-no-requestAnimationFrame-if.js', 'norafif.js', 'ubo-norafif.js', 'ubo-no-requestAnimationFrame-if', 'ubo-norafif']; - preventRequestAnimationFrame$1.injections = [hit, noopFunc, parseMatchArg, isValidStrPattern, isValidCallback, logMessage, // following helpers should be injected as helpers above use them - escapeRegExp, toRegExp, startsWith]; + preventRequestAnimationFrame$1.injections = [hit, noopFunc, parseMatchArg, isValidStrPattern, isValidCallback, logMessage, + // following helpers should be injected as helpers above use them + escapeRegExp, toRegExp, startsWith$1]; /* eslint-disable max-len */ - /** * @scriptlet set-cookie * @@ -5674,29 +5177,22 @@ * example.org#%#//scriptlet('set-cookie', 'cookie_consent', 'ok', 'none') * ``` */ - /* eslint-enable max-len */ - function setCookie$1(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; var validValue = getLimitedCookieValue(value); - if (validValue === null) { logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); return; } - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (!cookieToSet) { return; } - hit(source); document.cookie = cookieToSet; } @@ -5738,36 +5234,29 @@ * example.org#%#//scriptlet('set-cookie-reload', 'cookie-set', 'true', 'none') * ``` */ - function setCookieReload$1(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; - if (isCookieSetWithValue(name, value)) { return; } - var validValue = getLimitedCookieValue(value); - if (validValue === null) { logMessage(source, "Invalid cookie value: '".concat(value, "'")); return; } - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (!cookieToSet) { return; } - document.cookie = cookieToSet; - hit(source); // Only reload the page if cookie was set - // https://github.com/AdguardTeam/Scriptlets/issues/212 + hit(source); + // Only reload the page if cookie was set + // https://github.com/AdguardTeam/Scriptlets/issues/212 if (isCookieSetWithValue(document.cookie, name, value)) { window.location.reload(); } @@ -5802,54 +5291,49 @@ * virustotal.com#%#//scriptlet('hide-in-shadow-dom', 'vt-ui-contact-fab') * ``` */ - function hideInShadowDom$1(source, selector, baseSelector) { // do nothing if browser does not support ShadowRoot // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot if (!Element.prototype.attachShadow) { return; } - var hideElement = function hideElement(targetElement) { var DISPLAY_NONE_CSS = 'display:none!important;'; targetElement.style.cssText = DISPLAY_NONE_CSS; }; + /** * Handles shadow-dom piercing and hiding of found elements */ - - var hideHandler = function hideHandler() { // start value of shadow-dom hosts for the page dom - var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); // if there is shadow-dom host, they should be explored + var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); + // if there is shadow-dom host, they should be explored while (hostElements.length !== 0) { var isHidden = false; - var _pierceShadowDom = pierceShadowDom(selector, hostElements), - targets = _pierceShadowDom.targets, - innerHosts = _pierceShadowDom.innerHosts; - + targets = _pierceShadowDom.targets, + innerHosts = _pierceShadowDom.innerHosts; targets.forEach(function (targetEl) { hideElement(targetEl); isHidden = true; }); - if (isHidden) { hit(source); - } // continue to pierce for inner shadow-dom hosts - // and search inside them while the next iteration - + } + // continue to pierce for inner shadow-dom hosts + // and search inside them while the next iteration hostElements = innerHosts; } }; - hideHandler(); observeDOMChanges(hideHandler, true); } hideInShadowDom$1.names = ['hide-in-shadow-dom']; - hideInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom, // following helpers should be imported and injected + hideInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom, + // following helpers should be imported and injected // because they are used by helpers above flatten, throttle]; @@ -5880,58 +5364,52 @@ * virustotal.com#%#//scriptlet('remove-in-shadow-dom', 'vt-ui-contact-fab') * ``` */ - function removeInShadowDom$1(source, selector, baseSelector) { // do nothing if browser does not support ShadowRoot // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot if (!Element.prototype.attachShadow) { return; } - var removeElement = function removeElement(targetElement) { targetElement.remove(); }; + /** * Handles shadow-dom piercing and removing of found elements */ - - var removeHandler = function removeHandler() { // start value of shadow-dom hosts for the page dom - var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); // if there is shadow-dom host, they should be explored + var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); + // if there is shadow-dom host, they should be explored while (hostElements.length !== 0) { var isRemoved = false; - var _pierceShadowDom = pierceShadowDom(selector, hostElements), - targets = _pierceShadowDom.targets, - innerHosts = _pierceShadowDom.innerHosts; - + targets = _pierceShadowDom.targets, + innerHosts = _pierceShadowDom.innerHosts; targets.forEach(function (targetEl) { removeElement(targetEl); isRemoved = true; }); - if (isRemoved) { hit(source); - } // continue to pierce for inner shadow-dom hosts - // and search inside them while the next iteration - + } + // continue to pierce for inner shadow-dom hosts + // and search inside them while the next iteration hostElements = innerHosts; } }; - removeHandler(); observeDOMChanges(removeHandler, true); } removeInShadowDom$1.names = ['remove-in-shadow-dom']; - removeInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom, // following helpers should be imported and injected + removeInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom, + // following helpers should be imported and injected // because they are used by helpers above flatten, throttle]; /* eslint-disable max-len */ - /** * @scriptlet prevent-fetch * @@ -5997,68 +5475,63 @@ * ! Specify response body for all fetch calls * example.org#%#//scriptlet('prevent-fetch', '', 'emptyArr') * ``` + * + * 7. Prevent all fetch calls and specify response type value + * ``` + * example.org#%#//scriptlet('prevent-fetch', '*', '', 'opaque') + * ``` */ - /* eslint-enable max-len */ - function preventFetch$1(source, propsToMatch) { var responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'emptyObj'; var responseType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'default'; - // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer) // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { return; } - var strResponseBody; - - if (responseBody === 'emptyObj') { + if (responseBody === '' || responseBody === 'emptyObj') { strResponseBody = '{}'; } else if (responseBody === 'emptyArr') { strResponseBody = '[]'; } else { return; - } // Skip disallowed response types - + } + // Skip disallowed response types if (!(responseType === 'default' || responseType === 'opaque')) { logMessage(source, "Invalid parameter: ".concat(responseType)); return; } - var handlerWrapper = function handlerWrapper(target, thisArg, args) { var shouldPrevent = false; var fetchData = getFetchData(args); - if (typeof propsToMatch === 'undefined') { logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); hit(source); return Reflect.apply(target, thisArg, args); } - shouldPrevent = matchRequestProps(source, propsToMatch, fetchData); - if (shouldPrevent) { hit(source); return noopPromiseResolve(strResponseBody, fetchData.url, responseType); } - return Reflect.apply(target, thisArg, args); }; - var fetchHandler = { apply: handlerWrapper }; fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign } - preventFetch$1.names = ['prevent-fetch', // aliases are needed for matching the related scriptlet converted into our syntax + + preventFetch$1.names = ['prevent-fetch', + // aliases are needed for matching the related scriptlet converted into our syntax 'no-fetch-if.js', 'ubo-no-fetch-if.js', 'ubo-no-fetch-if']; preventFetch$1.injections = [hit, getFetchData, objectToString, noopPromiseResolve, matchRequestProps, logMessage, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; /* eslint-disable max-len */ - /** * @scriptlet set-local-storage-item * @@ -6092,7 +5565,6 @@ * example.org#%#//scriptlet('set-local-storage-item', 'exit-intent-marketing', '1') * ``` */ - /* eslint-enable max-len */ function setLocalStorageItem$1(source, key, value) { @@ -6100,16 +5572,15 @@ logMessage(source, 'Item key should be specified.'); return; } - - var validValue = getLimitedStorageItemValue(source, value); - - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + var validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch (_unused) { + logMessage(source, "Invalid storage item value: '".concat(value, "'")); return; } - var _window = window, - localStorage = _window.localStorage; + localStorage = _window.localStorage; setStorageItem(source, localStorage, key, validValue); hit(source); } @@ -6117,7 +5588,6 @@ setLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, getLimitedStorageItemValue]; /* eslint-disable max-len */ - /** * @scriptlet set-session-storage-item * @@ -6151,7 +5621,6 @@ * example.org#%#//scriptlet('set-session-storage-item', 'exit-intent-marketing', '1') * ``` */ - /* eslint-enable max-len */ function setSessionStorageItem$1(source, key, value) { @@ -6159,23 +5628,22 @@ logMessage(source, 'Item key should be specified.'); return; } - - var validValue = getLimitedStorageItemValue(source, value); - - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + var validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch (_unused) { + logMessage(source, "Invalid storage item value: '".concat(value, "'")); return; } - var _window = window, - sessionStorage = _window.sessionStorage; + sessionStorage = _window.sessionStorage; setStorageItem(source, sessionStorage, key, validValue); + hit(source); } setSessionStorageItem$1.names = ['set-session-storage-item']; setSessionStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, getLimitedStorageItemValue]; /* eslint-disable max-len */ - /** * @scriptlet abort-on-stack-trace * @@ -6215,36 +5683,28 @@ * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'injectedScript') * ``` */ - /* eslint-enable max-len */ - function abortOnStackTrace$1(source, property, stack) { if (!property || !stack) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -6253,27 +5713,24 @@ }); return; } - if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) { logMessage(source, "Invalid parameter: ".concat(stack)); return; - } // Prevent infinite loops when trapping prop used by helpers in getter/setter - + } + // Prevent infinite loops when trapping prop used by helpers in getter/setter var descriptorWrapper = Object.assign(getDescriptorAddon(), { value: base[prop], get: function get() { if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { abort(); } - return this.value; }, set: function set(newValue) { if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { abort(); } - this.value = newValue; } }); @@ -6287,16 +5744,15 @@ } }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - abortOnStackTrace$1.names = ['abort-on-stack-trace', // aliases are needed for matching the related scriptlet converted into our syntax + abortOnStackTrace$1.names = ['abort-on-stack-trace', + // aliases are needed for matching the related scriptlet converted into our syntax 'abort-on-stack-trace.js', 'ubo-abort-on-stack-trace.js', 'aost.js', 'ubo-aost.js', 'ubo-abort-on-stack-trace', 'ubo-aost', 'abp-abort-on-stack-trace']; - abortOnStackTrace$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isValidStrPattern, escapeRegExp, matchStackTrace, getDescriptorAddon, logMessage, toRegExp, isEmptyObject, getNativeRegexpTest, startsWith, shouldAbortInlineOrInjectedScript$1]; + abortOnStackTrace$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isValidStrPattern, escapeRegExp, matchStackTrace, getDescriptorAddon, logMessage, toRegExp, isEmptyObject, getNativeRegexpTest, startsWith$1, shouldAbortInlineOrInjectedScript]; /* eslint-disable max-len */ - /** * @scriptlet log-on-stack-trace * @@ -6313,48 +5769,40 @@ * * - `property` - required, path to a property. The property must be attached to window. */ - /* eslint-enable max-len */ - function logOnStacktrace$1(source, property) { if (!property) { return; } - var refineStackTrace = function refineStackTrace(stackString) { // Split stack trace string by lines and remove first two elements ('Error' and getter call) // Remove ' at ' at the start of each string var stackSteps = stackString.split('\n').slice(2).map(function (line) { return line.replace(/ {4}at /, ''); - }); // Trim each line extracting funcName : fullPath pair - + }); + // Trim each line extracting funcName : fullPath pair var logInfoArray = stackSteps.map(function (line) { var funcName; var funcFullPath; /* eslint-disable-next-line no-useless-escape */ - var reg = /\(([^\)]+)\)/; var regFirefox = /(.*?@)(\S+)(:\d+):\d+\)?$/; - if (line.match(reg)) { funcName = line.split(' ').slice(0, -1).join(' '); /* eslint-disable-next-line prefer-destructuring */ - funcFullPath = line.match(reg)[1]; } else if (line.match(regFirefox)) { funcName = line.split('@').slice(0, -1).join(' '); /* eslint-disable-next-line prefer-destructuring */ - funcFullPath = line.match(regFirefox)[2]; } else { // For when func name is not available funcName = 'function name is not available'; funcFullPath = line; } - return [funcName, funcFullPath]; - }); // Convert array into object for better display using console.table - + }); + // Convert array into object for better display using console.table var logInfoObject = {}; logInfoArray.forEach(function (pair) { /* eslint-disable-next-line prefer-destructuring */ @@ -6362,22 +5810,18 @@ }); return logInfoObject; }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -6386,10 +5830,8 @@ }); return; } - var value = base[prop]; /* eslint-disable no-console, compat/compat */ - setPropertyAccess(base, prop, { get: function get() { hit(source); @@ -6413,7 +5855,6 @@ logOnStacktrace$1.injections = [getPropertyInChain, setPropertyAccess, hit, logMessage, isEmptyObject]; /* eslint-disable max-len */ - /** * @scriptlet prevent-xhr * @@ -6479,21 +5920,17 @@ * example.org#%#//scriptlet('prevent-xhr', 'example.org', 'length:100-300') * ``` */ - /* eslint-enable max-len */ - function preventXHR$1(source, propsToMatch, customResponseText) { // do nothing if browser does not support Proxy (e.g. Internet Explorer) // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy if (typeof Proxy === 'undefined') { return; } - var shouldPrevent = false; var response = ''; var responseText = ''; var responseUrl; - var openWrapper = function openWrapper(target, thisArg, args) { // Get method and url from .open() var xhrData = { @@ -6501,7 +5938,6 @@ url: args[1] }; responseUrl = xhrData.url; - if (typeof propsToMatch === 'undefined') { // Log if no propsToMatch given logMessage(source, "xhr( ".concat(objectToString(xhrData), " )"), true); @@ -6509,34 +5945,27 @@ } else { shouldPrevent = matchRequestProps(source, propsToMatch, xhrData); } - return Reflect.apply(target, thisArg, args); }; - var sendWrapper = function sendWrapper(target, thisArg, args) { if (!shouldPrevent) { return Reflect.apply(target, thisArg, args); } - if (thisArg.responseType === 'blob') { response = new Blob(); } - if (thisArg.responseType === 'arraybuffer') { response = new ArrayBuffer(); } - if (customResponseText) { var randomText = generateRandomResponse(customResponseText); - if (randomText) { responseText = randomText; } else { logMessage(source, "Invalid range: ".concat(customResponseText)); } - } // Mock response object - - + } + // Mock response object Object.defineProperties(thisArg, { readyState: { value: 4, @@ -6566,8 +5995,8 @@ value: 'OK', writable: false } - }); // Mock events - + }); + // Mock events setTimeout(function () { var stateEvent = new Event('readystatechange'); thisArg.dispatchEvent(stateEvent); @@ -6579,7 +6008,6 @@ hit(source); return undefined; }; - var openHandler = { apply: openWrapper }; @@ -6589,7 +6017,8 @@ XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); } - preventXHR$1.names = ['prevent-xhr', // aliases are needed for matching the related scriptlet converted into our syntax + preventXHR$1.names = ['prevent-xhr', + // aliases are needed for matching the related scriptlet converted into our syntax 'no-xhr-if.js', 'ubo-no-xhr-if.js', 'ubo-no-xhr-if']; preventXHR$1.injections = [hit, logMessage, objectToString, matchRequestProps, generateRandomResponse, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries, getNumberFromString, nativeIsFinite, nativeIsNaN, parseMatchProps, validateParsedData, getMatchPropsData, getRequestProps, getRandomIntInclusive, getRandomStrByLength]; @@ -6600,7 +6029,7 @@ * Closes the browser tab immediately. * * > `window.close()` usage is restricted in Chrome. In this case - * tab will only be closed if using AdGuard browser extension. + * tab will only be closed when using AdGuard browser extension. * * **Syntax** * ``` @@ -6620,16 +6049,14 @@ * example.org#%#//scriptlet('close-window', '/example-page.html') * ``` */ - function forceWindowClose$1(source) { var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - // https://github.com/AdguardTeam/Scriptlets/issues/158#issuecomment-993423036 if (typeof window.close !== 'function') { var message = 'window.close() is not a function so \'close-window\' scriptlet is unavailable'; logMessage(source, message); + return; } - var closeImmediately = function closeImmediately() { try { hit(source); @@ -6640,12 +6067,10 @@ logMessage(source, e); } }; - var closeByExtension = function closeByExtension() { var extCall = function extCall() { dispatchEvent(new Event('adguard:scriptlet-close-window')); }; - window.addEventListener('adguard:subscribed-to-close-window', extCall, { once: true }); @@ -6655,20 +6080,16 @@ }); }, 5000); }; - var shouldClose = function shouldClose() { if (path === '') { return true; } - var pathRegexp = toRegExp(path); var currentPath = "".concat(window.location.pathname).concat(window.location.search); return pathRegexp.test(currentPath); }; - if (shouldClose()) { closeImmediately(); - if (navigator.userAgent.indexOf('Chrome') > -1) { closeByExtension(); } @@ -6678,7 +6099,6 @@ forceWindowClose$1.injections = [hit, toRegExp, logMessage]; /* eslint-disable max-len */ - /** * @scriptlet prevent-refresh * @@ -6706,13 +6126,10 @@ * cryptodirectories.com#%#//scriptlet('prevent-refresh', 3) * ``` */ - /* eslint-enable max-len */ - function preventRefresh$1(source, delaySec) { var getMetaElements = function getMetaElements() { var metaNodes = []; - try { metaNodes = document.querySelectorAll('meta[http-equiv="refresh" i][content]'); } catch (e) { @@ -6723,72 +6140,59 @@ logMessage(source, e); } } - return Array.from(metaNodes); }; - var getMetaContentDelay = function getMetaContentDelay(metaElements) { var delays = metaElements.map(function (meta) { var contentString = meta.getAttribute('content'); - if (contentString.length === 0) { return null; } - - var contentDelay; // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-http-equiv - + var contentDelay; + // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-http-equiv var limiterIndex = contentString.indexOf(';'); - if (limiterIndex !== -1) { var delaySubstring = contentString.substring(0, limiterIndex); contentDelay = getNumberFromString(delaySubstring); } else { contentDelay = getNumberFromString(contentString); } - return contentDelay; }).filter(function (delay) { return delay !== null; - }); // Check if "delays" array is empty, may happens when meta's content is invalid + }); + // Check if "delays" array is empty, may happens when meta's content is invalid // and reduce() method cannot be used with empty arrays without initial value - if (!delays.length) { return null; - } // Get smallest delay of all metas on the page - - + } + // Get smallest delay of all metas on the page var minDelay = delays.reduce(function (a, b) { return Math.min(a, b); - }); // eslint-disable-next-line consistent-return - + }); + // eslint-disable-next-line consistent-return return minDelay; }; - var stop = function stop() { var metaElements = getMetaElements(); - if (metaElements.length === 0) { return; } - - var secondsToRun = getNumberFromString(delaySec); // Check if argument is provided - + var secondsToRun = getNumberFromString(delaySec); + // Check if argument is provided if (secondsToRun === null) { secondsToRun = getMetaContentDelay(metaElements); - } // Check if meta tag has delay - - + } + // Check if meta tag has delay if (secondsToRun === null) { return; } - var delayMs = secondsToRun * 1000; setTimeout(function () { window.stop(); hit(source); }, delayMs); }; - if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', stop, { once: true @@ -6797,15 +6201,16 @@ stop(); } } - preventRefresh$1.names = ['prevent-refresh', // Aliases are needed for matching the related scriptlet converted into our syntax + preventRefresh$1.names = ['prevent-refresh', + // Aliases are needed for matching the related scriptlet converted into our syntax // These are used by UBO rules syntax // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets - 'refresh-defuser.js', 'refresh-defuser', // Prefix 'ubo-' is required to run converted rules + 'refresh-defuser.js', 'refresh-defuser', + // Prefix 'ubo-' is required to run converted rules 'ubo-refresh-defuser.js', 'ubo-refresh-defuser']; preventRefresh$1.injections = [hit, getNumberFromString, logMessage, nativeIsNaN]; /* eslint-disable max-len, consistent-return */ - /** * @scriptlet prevent-element-src-loading * @@ -6829,15 +6234,12 @@ * example.org#%#//scriptlet('prevent-element-src-loading', 'script' ,'adsbygoogle') * ``` */ - /* eslint-enable max-len */ - function preventElementSrcLoading$1(source, tagName, match) { // do nothing if browser does not support Proxy or Reflect if (typeof Proxy === 'undefined' || typeof Reflect === 'undefined') { return; } - var srcMockData = { // "KCk9Pnt9" = "()=>{}" script: 'data:text/javascript;base64,KCk9Pnt9', @@ -6847,7 +6249,6 @@ iframe: 'data:text/html;base64, PGRpdj48L2Rpdj4=' }; var instance; - if (tagName === 'script') { instance = HTMLScriptElement; } else if (tagName === 'img') { @@ -6856,13 +6257,12 @@ instance = HTMLIFrameElement; } else { return; - } // For websites that use Trusted Types - // https://w3c.github.io/webappsec-trusted-types/dist/spec/ - + } + // For websites that use Trusted Types + // https://w3c.github.io/webappsec-trusted-types/dist/spec/ var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function'; var policy; - if (hasTrustedTypes) { policy = window.trustedTypes.createPolicy('mock', { createScriptURL: function createScriptURL(arg) { @@ -6870,48 +6270,41 @@ } }); } - var SOURCE_PROPERTY_NAME = 'src'; var ONERROR_PROPERTY_NAME = 'onerror'; - var searchRegexp = toRegExp(match); // This will be needed to silent error events on matched element, - // as url wont be available + var searchRegexp = toRegExp(match); + // This will be needed to silent error events on matched element, + // as url wont be available var setMatchedAttribute = function setMatchedAttribute(elem) { return elem.setAttribute(source.name, 'matched'); }; - var setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) { // Check if arguments are present if (!args[0] || !args[1]) { return Reflect.apply(target, thisArg, args); } - var nodeName = thisArg.nodeName.toLowerCase(); var attrName = args[0].toLowerCase(); var attrValue = args[1]; var isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue); - if (!isMatched) { return Reflect.apply(target, thisArg, args); } - hit(source); - setMatchedAttribute(thisArg); // Forward the URI that corresponds with element's MIME type - + setMatchedAttribute(thisArg); + // Forward the URI that corresponds with element's MIME type return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]); }; - var setAttributeHandler = { apply: setAttributeWrapper - }; // eslint-disable-next-line max-len - + }; + // eslint-disable-next-line max-len instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler); var origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME); - if (!origSrcDescriptor) { return; } - Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, { enumerable: true, configurable: true, @@ -6921,33 +6314,30 @@ set: function set(urlValue) { var nodeName = this.nodeName.toLowerCase(); var isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue); - if (!isMatched) { origSrcDescriptor.set.call(this, urlValue); return true; - } // eslint-disable-next-line no-undef - + } + // eslint-disable-next-line no-undef if (policy && urlValue instanceof TrustedScriptURL) { var trustedSrc = policy.createScriptURL(urlValue); origSrcDescriptor.set.call(this, trustedSrc); hit(source); return; } - setMatchedAttribute(this); origSrcDescriptor.set.call(this, srcMockData[nodeName]); hit(source); } - }); // https://github.com/AdguardTeam/Scriptlets/issues/228 - // Prevent error event being triggered by other sources + }); + // https://github.com/AdguardTeam/Scriptlets/issues/228 + // Prevent error event being triggered by other sources var origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME); - if (!origOnerrorDescriptor) { return; } - Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, { enumerable: true, configurable: true, @@ -6956,37 +6346,30 @@ }, set: function set(cb) { var isMatched = this.getAttribute(source.name) === 'matched'; - if (!isMatched) { origOnerrorDescriptor.set.call(this, cb); return true; } - origOnerrorDescriptor.set.call(this, noopFunc); return true; } }); - var addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) { // Check if arguments are present if (!args[0] || !args[1]) { return Reflect.apply(target, thisArg, args); } - var eventName = args[0]; var isMatched = thisArg.getAttribute(source.name) === 'matched' && eventName === 'error'; - if (isMatched) { return Reflect.apply(target, thisArg, [eventName, noopFunc]); } - return Reflect.apply(target, thisArg, args); }; - var addEventListenerHandler = { apply: addEventListenerWrapper - }; // eslint-disable-next-line max-len - + }; + // eslint-disable-next-line max-len EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler); } preventElementSrcLoading$1.names = ['prevent-element-src-loading']; @@ -7004,31 +6387,26 @@ * example.org#%#//scriptlet('no-topics') * ``` */ - function noTopics$1(source) { var TOPICS_PROPERTY_NAME = 'browsingTopics'; - if (Document instanceof Object === false) { return; } - if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) { return; - } // document.browsingTopics() is async function so it's better to return noopPromiseResolve() - // https://github.com/patcg-individual-drafts/topics#the-api-and-how-it-works - + } + // document.browsingTopics() is async function so it's better to return noopPromiseResolve() + // https://github.com/patcg-individual-drafts/topics#the-api-and-how-it-works Document.prototype[TOPICS_PROPERTY_NAME] = function () { return noopPromiseResolve('[]'); }; - hit(source); } noTopics$1.names = ['no-topics']; noTopics$1.injections = [hit, noopPromiseResolve]; /* eslint-disable max-len */ - /** * @trustedScriptlet trusted-replace-xhr-response * @@ -7081,102 +6459,89 @@ * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'example.com') * ``` */ - /* eslint-enable max-len */ - function trustedReplaceXhrResponse$1(source) { var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - // do nothing if browser does not support Proxy (e.g. Internet Explorer) // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy if (typeof Proxy === 'undefined') { return; - } // Only allow pattern as empty string for logging purposes - + } + // Only allow pattern as empty string for logging purposes if (pattern === '' && replacement !== '') { var message = 'Pattern argument should not be empty string.'; logMessage(source, message); return; } - var shouldLog = pattern === '' && replacement === ''; var nativeOpen = window.XMLHttpRequest.prototype.open; var nativeSend = window.XMLHttpRequest.prototype.send; var shouldReplace = false; var xhrData; var requestHeaders = []; - var openWrapper = function openWrapper(target, thisArg, args) { // eslint-disable-next-line prefer-spread xhrData = getXhrData.apply(null, args); - if (shouldLog) { // Log if no propsToMatch given var _message = "xhr( ".concat(objectToString(xhrData), " )"); - logMessage(source, _message, true); hit(source); return Reflect.apply(target, thisArg, args); } + shouldReplace = matchRequestProps(source, propsToMatch, xhrData); - shouldReplace = matchRequestProps(source, propsToMatch, xhrData); // Trap setRequestHeader of target xhr object to mimic request headers later - + // Trap setRequestHeader of target xhr object to mimic request headers later if (shouldReplace) { var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { // Collect headers requestHeaders.push(args); return Reflect.apply(target, thisArg, args); }; - var setRequestHeaderHandler = { apply: setRequestHeaderWrapper - }; // setRequestHeader can only be called on open xhr object, - // so we can safely proxy it here + }; + // setRequestHeader can only be called on open xhr object, + // so we can safely proxy it here thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); } - return Reflect.apply(target, thisArg, args); }; - var sendWrapper = function sendWrapper(target, thisArg, args) { if (!shouldReplace) { return Reflect.apply(target, thisArg, args); } + /** * Create separate XHR request with original request's input * to be able to collect response data without triggering * listeners on original XHR object */ - - var forgedRequest = new XMLHttpRequest(); forgedRequest.addEventListener('readystatechange', function () { if (forgedRequest.readyState !== 4) { return; } - var readyState = forgedRequest.readyState, - response = forgedRequest.response, - responseText = forgedRequest.responseText, - responseURL = forgedRequest.responseURL, - responseXML = forgedRequest.responseXML, - status = forgedRequest.status, - statusText = forgedRequest.statusText; // Extract content from response - + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; // Extract content from response var content = responseText || response; - if (typeof content !== 'string') { return; } + var patternRegexp = pattern === '*' ? /(\n|.)*/ : toRegExp(pattern); + var modifiedContent = content.replace(patternRegexp, replacement); - var patternRegexp = pattern === '*' ? toRegExp() : toRegExp(pattern); - var modifiedContent = content.replace(patternRegexp, replacement); // Manually put required values into target XHR object + // Manually put required values into target XHR object // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied - Object.defineProperties(thisArg, { readyState: { value: readyState @@ -7199,8 +6564,9 @@ statusText: { value: statusText } - }); // Mock events + }); + // Mock events setTimeout(function () { var stateEvent = new Event('readystatechange'); thisArg.dispatchEvent(stateEvent); @@ -7211,25 +6577,23 @@ }, 1); hit(source); }); - nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); // Mimic request headers before sending - // setRequestHeader can only be called on open request objects + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + // Mimic request headers before sending + // setRequestHeader can only be called on open request objects requestHeaders.forEach(function (header) { var name = header[0]; var value = header[1]; forgedRequest.setRequestHeader(name, value); }); requestHeaders = []; - try { nativeSend.call(forgedRequest, args); } catch (_unused) { return Reflect.apply(target, thisArg, args); } - return undefined; }; - var openHandler = { apply: openWrapper }; @@ -7239,12 +6603,13 @@ XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); } - trustedReplaceXhrResponse$1.names = ['trusted-replace-xhr-response' // trusted scriptlets support no aliases + trustedReplaceXhrResponse$1.names = ['trusted-replace-xhr-response' + // trusted scriptlets support no aliases ]; + trustedReplaceXhrResponse$1.injections = [hit, logMessage, toRegExp, objectToString, matchRequestProps, getXhrData, getMatchPropsData, getRequestProps, validateParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries]; /* eslint-disable max-len */ - /** * @scriptlet xml-prune * @@ -7289,15 +6654,12 @@ * example.org#%#//scriptlet('xml-prune', '', '', '.mpd') * ``` */ - /* eslint-enable max-len */ function xmlPrune$1(source, propsToRemove) { var _this = this; - var optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var urlToMatch = arguments.length > 3 ? arguments[3] : undefined; - // do nothing if browser does not support Reflect, fetch or Proxy (e.g. Internet Explorer) // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy @@ -7305,55 +6667,42 @@ if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { return; } - var shouldPruneResponse = true; - if (!propsToRemove) { // If "propsToRemove" is not defined, then response shouldn't be pruned // but it should be logged in browser console shouldPruneResponse = false; } - var urlMatchRegexp = toRegExp(urlToMatch); - var isXML = function isXML(text) { // Check if "text" starts with "<" and check if it ends with ">" // If so, then it might be an XML file and should be pruned or logged var trimedText = text.trim(); - - if (startsWith(trimedText, '<') && endsWith(trimedText, '>')) { + if (startsWith$1(trimedText, '<') && endsWith(trimedText, '>')) { return true; } - return false; }; - var pruneXML = function pruneXML(text) { if (!isXML(text)) { shouldPruneResponse = false; return text; } - var xmlParser = new DOMParser(); var xmlDoc = xmlParser.parseFromString(text, 'text/xml'); var errorNode = xmlDoc.querySelector('parsererror'); - if (errorNode) { return text; } - if (optionalProp !== '' && xmlDoc.querySelector(optionalProp) === null) { shouldPruneResponse = false; return text; } - var elems = xmlDoc.querySelectorAll(propsToRemove); - if (!elems.length) { shouldPruneResponse = false; return text; } - elems.forEach(function (elem) { elem.remove(); }); @@ -7361,20 +6710,16 @@ text = serializer.serializeToString(xmlDoc); return text; }; - var xhrWrapper = function xhrWrapper(target, thisArg, args) { var xhrURL = args[1]; - if (typeof xhrURL !== 'string' || xhrURL.length === 0) { return Reflect.apply(target, thisArg, args); } - if (urlMatchRegexp.test(xhrURL)) { thisArg.addEventListener('readystatechange', function pruneResponse() { if (thisArg.readyState === 4) { var response = thisArg.response; thisArg.removeEventListener('readystatechange', pruneResponse); - if (!shouldPruneResponse) { if (isXML(response)) { // eslint-disable-next-line max-len @@ -7383,7 +6728,6 @@ } } else { var prunedResponseContent = pruneXML(response); - if (shouldPruneResponse) { Object.defineProperty(thisArg, 'response', { value: prunedResponseContent @@ -7392,36 +6736,31 @@ value: prunedResponseContent }); hit(source); - } // In case if response shouldn't be pruned + } + // In case if response shouldn't be pruned // pruneXML sets shouldPruneResponse to false // so it's necessary to set it to true again // otherwise response will be only logged - - shouldPruneResponse = true; } } }); } - return Reflect.apply(target, thisArg, args); }; - var xhrHandler = { apply: xhrWrapper - }; // eslint-disable-next-line max-len - - window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); // eslint-disable-next-line compat/compat + }; + // eslint-disable-next-line max-len + window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); + // eslint-disable-next-line compat/compat var nativeFetch = window.fetch; - var fetchWrapper = function fetchWrapper(target, thisArg, args) { var fetchURL = args[0]; - if (typeof fetchURL !== 'string' || fetchURL.length === 0) { return Reflect.apply(target, thisArg, args); } - if (urlMatchRegexp.test(fetchURL)) { return nativeFetch.apply(_this, args).then(function (response) { return response.text().then(function (text) { @@ -7429,12 +6768,9 @@ if (isXML(text)) { logMessage("fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(text)); } - return Reflect.apply(target, thisArg, args); } - var prunedText = pruneXML(text); - if (shouldPruneResponse) { hit(source); return new Response(prunedText, { @@ -7442,33 +6778,30 @@ statusText: response.statusText, headers: response.headers }); - } // If response shouldn't be pruned + } + // If response shouldn't be pruned // pruneXML sets shouldPruneResponse to false // so it's necessary to set it to true again // otherwise response will be only logged - - shouldPruneResponse = true; return Reflect.apply(target, thisArg, args); }); }); } - return Reflect.apply(target, thisArg, args); }; - var fetchHandler = { apply: fetchWrapper - }; // eslint-disable-next-line compat/compat - + }; + // eslint-disable-next-line compat/compat window.fetch = new Proxy(window.fetch, fetchHandler); } - xmlPrune$1.names = ['xml-prune', // aliases are needed for matching the related scriptlet converted into our syntax + xmlPrune$1.names = ['xml-prune', + // aliases are needed for matching the related scriptlet converted into our syntax 'xml-prune.js', 'ubo-xml-prune.js', 'ubo-xml-prune']; - xmlPrune$1.injections = [hit, logMessage, toRegExp, startsWith, endsWith]; + xmlPrune$1.injections = [hit, logMessage, toRegExp, startsWith$1, endsWith]; /* eslint-disable max-len */ - /** * @trustedScriptlet trusted-set-cookie * @@ -7523,54 +6856,47 @@ * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'none') * ``` */ - /* eslint-enable max-len */ function trustedSetCookie$1(source, name, value) { var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; - if (typeof name === 'undefined') { logMessage(source, 'Cookie name should be specified.'); return; } - if (typeof value === 'undefined') { logMessage(source, 'Cookie value should be specified.'); return; } - var parsedValue = parseKeywordValue(value); - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (!cookieToSet) { return; } - - var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); - - if (!parsedOffsetMs) { - logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); - return; + if (offsetExpiresSec) { + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); } - - var expires = Date.now() + parsedOffsetMs; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); document.cookie = cookieToSet; hit(source); } - trustedSetCookie$1.names = ['trusted-set-cookie' // trusted scriptlets support no aliases + trustedSetCookie$1.names = ['trusted-set-cookie' + // trusted scriptlets support no aliases ]; + trustedSetCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; /* eslint-disable max-len */ - /** * @trustedScriptlet trusted-set-cookie-reload * @@ -7626,112 +6952,59 @@ * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'decline', '', 'none') * ``` */ - /* eslint-enable max-len */ function trustedSetCookieReload$1(source, name, value) { var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; - if (typeof name === 'undefined') { logMessage(source, 'Cookie name should be specified.'); return; } - if (typeof value === 'undefined') { logMessage(source, 'Cookie value should be specified.'); return; - } // Prevent infinite reloads if cookie was already set or blocked by the browser - // https://github.com/AdguardTeam/Scriptlets/issues/212 - + } + // Prevent infinite reloads if cookie was already set or blocked by the browser + // https://github.com/AdguardTeam/Scriptlets/issues/212 if (isCookieSetWithValue(document.cookie, name, value)) { return; } - var parsedValue = parseKeywordValue(value); - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (!cookieToSet) { return; } - - var parsedOffsetExpiresMs = getTrustedCookieOffsetMs(offsetExpiresSec); - - if (!parsedOffsetExpiresMs) { - logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); - return; + if (offsetExpiresSec) { + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); } - - var expires = Date.now() + parsedOffsetExpiresMs; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); document.cookie = cookieToSet; - hit(source); // Only reload the page if cookie was set - // https://github.com/AdguardTeam/Scriptlets/issues/212 + hit(source); + // Only reload the page if cookie was set + // https://github.com/AdguardTeam/Scriptlets/issues/212 if (isCookieSetWithValue(document.cookie, name, value)) { window.location.reload(); } } - trustedSetCookieReload$1.names = ['trusted-set-cookie-reload' // trusted scriptlets support no aliases + trustedSetCookieReload$1.names = ['trusted-set-cookie-reload' + // trusted scriptlets support no aliases ]; - trustedSetCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; - } - - var arrayLikeToArray = _arrayLikeToArray; - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return arrayLikeToArray(arr); - } - - var arrayWithoutHoles = _arrayWithoutHoles; - - function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); - } - - var iterableToArray = _iterableToArray; - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); - } - - var unsupportedIterableToArray = _unsupportedIterableToArray; - - function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - var nonIterableSpread = _nonIterableSpread; - - function _toConsumableArray(arr) { - return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread(); - } - - var toConsumableArray$1 = _toConsumableArray; + trustedSetCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; /* eslint-disable max-len */ - /** * @trustedScriptlet trusted-replace-fetch-response * @@ -7787,47 +7060,40 @@ * example.org#%#//scriptlet('trusted-replace-fetch-response', '*', '', 'example.com') * ``` */ - /* eslint-enable max-len */ - function trustedReplaceFetchResponse$1(source) { var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer) // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { return; - } // Only allow pattern as empty string for logging purposes - + } + // Only allow pattern as empty string for logging purposes if (pattern === '' && replacement !== '') { logMessage(source, 'Pattern argument should not be empty string.'); return; } - var shouldLog = pattern === '' && replacement === ''; var nativeFetch = fetch; var shouldReplace = false; var fetchData; - var handlerWrapper = function handlerWrapper(target, thisArg, args) { fetchData = getFetchData(args); - if (shouldLog) { // log if no propsToMatch given logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); hit(source); return Reflect.apply(target, thisArg, args); } - shouldReplace = matchRequestProps(source, propsToMatch, fetchData); - if (!shouldReplace) { return Reflect.apply(target, thisArg, args); } + /** * Create new Response object using original response' properties * and given text as body content @@ -7835,24 +7101,22 @@ * @param {string} textContent text to set as body content * @returns {Response} */ - - var forgeResponse = function forgeResponse(response, textContent) { var bodyUsed = response.bodyUsed, - headers = response.headers, - ok = response.ok, - redirected = response.redirected, - status = response.status, - statusText = response.statusText, - type = response.type, - url = response.url; // eslint-disable-next-line compat/compat - + headers = response.headers, + ok = response.ok, + redirected = response.redirected, + status = response.status, + statusText = response.statusText, + type = response.type, + url = response.url; // eslint-disable-next-line compat/compat var forgedResponse = new Response(textContent, { status: status, statusText: statusText, headers: headers - }); // Manually set properties which can't be set by Response constructor + }); + // Manually set properties which can't be set by Response constructor Object.defineProperties(forgedResponse, { url: { value: url @@ -7873,9 +7137,10 @@ return forgedResponse; }; - return nativeFetch.apply(void 0, toConsumableArray$1(args)).then(function (response) { + // eslint-disable-next-line prefer-spread + return nativeFetch.apply(null, args).then(function (response) { return response.text().then(function (bodyText) { - var patternRegexp = pattern === '*' ? toRegExp() : toRegExp(pattern); + var patternRegexp = pattern === '*' ? /(\n|.)*/ : toRegExp(pattern); var modifiedTextContent = bodyText.replace(patternRegexp, replacement); var forgedResponse = forgeResponse(response, modifiedTextContent); hit(source); @@ -7891,17 +7156,16 @@ return Reflect.apply(target, thisArg, args); }); }; - var fetchHandler = { apply: handlerWrapper }; fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign } + trustedReplaceFetchResponse$1.names = ['trusted-replace-fetch-response']; trustedReplaceFetchResponse$1.injections = [hit, logMessage, getFetchData, objectToString, matchRequestProps, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; /* eslint-disable max-len */ - /** * @trustedScriptlet trusted-set-local-storage-item * @@ -7947,7 +7211,6 @@ * example.org#%#//scriptlet('trusted-set-local-storage-item', 'ppu_main_none', '') * ``` */ - /* eslint-enable max-len */ function trustedSetLocalStorageItem$1(source, key, value) { @@ -7955,20 +7218,20 @@ logMessage(source, 'Item key should be specified.'); return; } - if (typeof value === 'undefined') { logMessage(source, 'Item value should be specified.'); return; } - var parsedValue = parseKeywordValue(value); var _window = window, - localStorage = _window.localStorage; + localStorage = _window.localStorage; setStorageItem(source, localStorage, key, parsedValue); hit(source); } - trustedSetLocalStorageItem$1.names = ['trusted-set-local-storage-item' // trusted scriptlets support no aliases + trustedSetLocalStorageItem$1.names = ['trusted-set-local-storage-item' + // trusted scriptlets support no aliases ]; + trustedSetLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, parseKeywordValue]; /** @@ -7987,7 +7250,7 @@ setConstant: setConstant$1, removeCookie: removeCookie$1, preventAddEventListener: preventAddEventListener$1, - preventBab: preventBab$1, + preventBab: preventBab$2, nowebrtc: nowebrtc$1, logAddEventListener: logAddEventListener$1, logEval: logEval$1, @@ -8177,15 +7440,16 @@ var JS_RULE_MARKER = '#%#'; var COMMENT_MARKER = '!'; + /** * Checks if rule text is comment e.g. !!example.org##+js(set-constant.js, test, false) * @param {string} rule * @return {boolean} */ - var isComment = function isComment(rule) { - return startsWith(rule, COMMENT_MARKER); + return startsWith$1(rule, COMMENT_MARKER); }; + /* ************************************************************************ * * Scriptlets @@ -8195,85 +7459,79 @@ /** * uBlock scriptlet rule mask */ - - var UBO_SCRIPTLET_MASK_REG = /#@?#script:inject|#@?#\s*\+js/; var UBO_SCRIPTLET_MASK_1 = '##+js'; var UBO_SCRIPTLET_MASK_2 = '##script:inject'; var UBO_SCRIPTLET_EXCEPTION_MASK_1 = '#@#+js'; var UBO_SCRIPTLET_EXCEPTION_MASK_2 = '#@#script:inject'; + /** * AdBlock Plus snippet rule mask */ - var ABP_SCRIPTLET_MASK = '#$#'; var ABP_SCRIPTLET_EXCEPTION_MASK = '#@$#'; + /** * AdGuard CSS rule mask */ - var ADG_CSS_MASK_REG = /#@?\$#.+?\s*\{.*\}\s*$/g; + /** * Checks if the `rule` is AdGuard scriptlet rule * @param {string} rule - rule text */ - var isAdgScriptletRule = function isAdgScriptletRule(rule) { return !isComment(rule) && rule.indexOf(ADG_SCRIPTLET_MASK) > -1; }; + /** * Checks if the `rule` is uBO scriptlet rule * @param {string} rule rule text */ - - var isUboScriptletRule = function isUboScriptletRule(rule) { return (rule.indexOf(UBO_SCRIPTLET_MASK_1) > -1 || rule.indexOf(UBO_SCRIPTLET_MASK_2) > -1 || rule.indexOf(UBO_SCRIPTLET_EXCEPTION_MASK_1) > -1 || rule.indexOf(UBO_SCRIPTLET_EXCEPTION_MASK_2) > -1) && UBO_SCRIPTLET_MASK_REG.test(rule) && !isComment(rule); }; + /** * Checks if the `rule` is AdBlock Plus snippet * @param {string} rule rule text */ - - var isAbpSnippetRule = function isAbpSnippetRule(rule) { return (rule.indexOf(ABP_SCRIPTLET_MASK) > -1 || rule.indexOf(ABP_SCRIPTLET_EXCEPTION_MASK) > -1) && rule.search(ADG_CSS_MASK_REG) === -1 && !isComment(rule); }; + /** * Finds scriptlet by it's name * @param {string} name - scriptlet name */ - - var getScriptletByName = function getScriptletByName(name) { var scriptlets = Object.keys(scriptletList).map(function (key) { return scriptletList[key]; }); return scriptlets.find(function (s) { - return s.names // full match name checking - && (s.names.indexOf(name) > -1 // or check ubo alias name without '.js' at the end + return s.names + // full match name checking + && (s.names.indexOf(name) > -1 + // or check ubo alias name without '.js' at the end || !endsWith(name, '.js') && s.names.indexOf("".concat(name, ".js")) > -1); }); }; + /** * Checks if the scriptlet name is valid * @param {string} name - Scriptlet name */ - - var isValidScriptletName = function isValidScriptletName(name) { if (!name) { return false; } - var scriptlet = getScriptletByName(name); - if (!scriptlet) { return false; } - return true; }; + /* ************************************************************************ * * Redirects @@ -8283,18 +7541,16 @@ /** * Redirect resources markers */ - - var ADG_UBO_REDIRECT_MARKER = 'redirect='; var ADG_UBO_REDIRECT_RULE_MARKER = 'redirect-rule='; var ABP_REDIRECT_MARKER = 'rewrite=abp-resource:'; var EMPTY_REDIRECT_MARKER = 'empty'; var VALID_SOURCE_TYPES = ['image', 'media', 'subdocument', 'stylesheet', 'script', 'xmlhttprequest', 'other']; + /** * Source types for redirect rules if there is no one of them. * Used for ADG -> UBO conversion. */ - var ABSENT_SOURCE_TYPE_REPLACEMENT = [{ NAME: 'nooptext', TYPES: VALID_SOURCE_TYPES @@ -8326,41 +7582,41 @@ var validAdgRedirects = redirects$1.filter(function (el) { return el.adg; }); + /** * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names * It's used for UBO -> ADG converting */ - var uboToAdgCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) { return el.ubo; }).map(function (el) { return [el.ubo, el.adg]; })); + /** * Compatibility object where KEYS = ABP redirect names and VALUES = ADG redirect names * It's used for ABP -> ADG converting */ - var abpToAdgCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) { return el.abp; }).map(function (el) { return [el.abp, el.adg]; })); + /** * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names * It's used for ADG -> UBO converting */ - var adgToUboCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) { return el.ubo; }).map(function (el) { return [el.adg, el.ubo]; })); + /** * Needed for AdGuard redirect names validation where KEYS = **valid** AdGuard redirect names * 'adgToUboCompatibility' is still needed for ADG -> UBO converting */ - var validAdgCompatibility = getObjectFromEntries(validAdgRedirects.map(function (el) { return [el.adg, 'valid adg redirect']; })); @@ -8385,23 +7641,22 @@ compatibility: abpToAdgCompatibility } }; + /** * Parses redirect rule modifiers * @param {string} rule * @returns {Array} */ - var parseModifiers = function parseModifiers(rule) { return substringAfter$1(rule, '$').split(','); }; + /** * Gets redirect resource name * @param {string} rule * @param {string} marker - specific Adg/Ubo or Abp redirect resources marker * @returns {string} - redirect resource name */ - - var getRedirectName = function getRedirectName(rule, marker) { var ruleModifiers = parseModifiers(rule); var redirectNamePart = ruleModifiers.find(function (el) { @@ -8409,104 +7664,95 @@ }); return substringAfter$1(redirectNamePart, marker); }; + /** * Checks if the `rule` is AdGuard redirect rule. * Discards comments and JS rules and checks if the `rule` has 'redirect' modifier. * @param {string} rule - rule text */ - - var isAdgRedirectRule = function isAdgRedirectRule(rule) { var MARKER_IN_BASE_PART_MASK = '/((?!\\$|\\,).{1})redirect((-rule)?)=(.{0,}?)\\$(popup)?/'; - return !isComment(rule) && (rule.indexOf(REDIRECT_RULE_TYPES.ADG.redirectMarker) > -1 || rule.indexOf(REDIRECT_RULE_TYPES.ADG.redirectRuleMarker) > -1) // some js rules may have 'redirect=' in it, so we should get rid of them - && rule.indexOf(JS_RULE_MARKER) === -1 // get rid of rules like '_redirect=*://look.$popup' + return !isComment(rule) && (rule.indexOf(REDIRECT_RULE_TYPES.ADG.redirectMarker) > -1 || rule.indexOf(REDIRECT_RULE_TYPES.ADG.redirectRuleMarker) > -1) + // some js rules may have 'redirect=' in it, so we should get rid of them + && rule.indexOf(JS_RULE_MARKER) === -1 + // get rid of rules like '_redirect=*://look.$popup' && !toRegExp(MARKER_IN_BASE_PART_MASK).test(rule); - }; // const getRedirectResourceMarkerData = () + }; + + // const getRedirectResourceMarkerData = () /** * Checks if the `rule` satisfies the `type` * @param {string} rule - rule text * @param {'VALID_ADG'|'ADG'|'UBO'|'ABP'} type - type of a redirect rule */ - - var isRedirectRuleByType = function isRedirectRuleByType(rule, type) { var _REDIRECT_RULE_TYPES$ = REDIRECT_RULE_TYPES[type], - redirectMarker = _REDIRECT_RULE_TYPES$.redirectMarker, - redirectRuleMarker = _REDIRECT_RULE_TYPES$.redirectRuleMarker, - compatibility = _REDIRECT_RULE_TYPES$.compatibility; - + redirectMarker = _REDIRECT_RULE_TYPES$.redirectMarker, + redirectRuleMarker = _REDIRECT_RULE_TYPES$.redirectRuleMarker, + compatibility = _REDIRECT_RULE_TYPES$.compatibility; if (rule && !isComment(rule)) { - var marker; // check if there is a $redirect-rule modifier in rule - + var marker; + // check if there is a $redirect-rule modifier in rule var markerIndex = redirectRuleMarker ? rule.indexOf(redirectRuleMarker) : -1; - if (markerIndex > -1) { marker = redirectRuleMarker; } else { // check if there $redirect modifier in rule markerIndex = rule.indexOf(redirectMarker); - if (markerIndex > -1) { marker = redirectMarker; } else { return false; } } - var redirectName = getRedirectName(rule, marker); - if (!redirectName) { return false; } - return redirectName === Object.keys(compatibility).find(function (el) { return el === redirectName; }); } - return false; }; + /** * Checks if the `rule` is **valid** AdGuard redirect resource rule * @param {string} rule - rule text * @returns {boolean} */ - - var isValidAdgRedirectRule = function isValidAdgRedirectRule(rule) { return isRedirectRuleByType(rule, 'VALID_ADG'); }; + /** * Checks if the AdGuard redirect `rule` has Ubo analog. Needed for Adg->Ubo conversion * @param {string} rule - AdGuard rule text * @returns {boolean} - true if the rule can be converted to Ubo */ - - var isAdgRedirectCompatibleWithUbo = function isAdgRedirectCompatibleWithUbo(rule) { return isAdgRedirectRule(rule) && isRedirectRuleByType(rule, 'ADG'); }; + /** * Checks if the Ubo redirect `rule` has AdGuard analog. Needed for Ubo->Adg conversion * @param {string} rule - Ubo rule text * @returns {boolean} - true if the rule can be converted to AdGuard */ - - var isUboRedirectCompatibleWithAdg = function isUboRedirectCompatibleWithAdg(rule) { return isRedirectRuleByType(rule, 'UBO'); }; + /** * Checks if the Abp redirect `rule` has AdGuard analog. Needed for Abp->Adg conversion * @param {string} rule - Abp rule text * @returns {boolean} - true if the rule can be converted to AdGuard */ - - var isAbpRedirectCompatibleWithAdg = function isAbpRedirectCompatibleWithAdg(rule) { return isRedirectRuleByType(rule, 'ABP'); }; + /** * Checks if the rule has specified content type before Adg -> Ubo conversion. * @@ -8523,26 +7769,21 @@ * @param {string} rule * @returns {boolean} */ - - var hasValidContentType = function hasValidContentType(rule) { - var ruleModifiers = parseModifiers(rule); // rule can have more than one source type modifier - + var ruleModifiers = parseModifiers(rule); + // rule can have more than one source type modifier var sourceTypes = ruleModifiers.filter(function (el) { return VALID_SOURCE_TYPES.indexOf(el) > -1; }); - var isSourceTypeSpecified = sourceTypes.length > 0; // eslint-disable-next-line max-len - + var isSourceTypeSpecified = sourceTypes.length > 0; + // eslint-disable-next-line max-len var isEmptyRedirect = ruleModifiers.indexOf("".concat(ADG_UBO_REDIRECT_MARKER).concat(EMPTY_REDIRECT_MARKER)) > -1 || ruleModifiers.indexOf("".concat(ADG_UBO_REDIRECT_RULE_MARKER).concat(EMPTY_REDIRECT_MARKER)) > -1; - if (isEmptyRedirect) { // no source type for 'empty' is allowed return true; } - return isSourceTypeSpecified; }; - var validator = { UBO_SCRIPTLET_MASK_REG: UBO_SCRIPTLET_MASK_REG, ABP_SCRIPTLET_MASK: ABP_SCRIPTLET_MASK, @@ -8566,44 +7807,80 @@ hasValidContentType: hasValidContentType }; + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + return arr2; + } + var arrayLikeToArray = _arrayLikeToArray; + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return arrayLikeToArray(arr); + } + var arrayWithoutHoles = _arrayWithoutHoles; + + function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); + } + var iterableToArray = _iterableToArray; + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); + } + var unsupportedIterableToArray = _unsupportedIterableToArray; + + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + var nonIterableSpread = _nonIterableSpread; + + function _toConsumableArray(arr) { + return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread(); + } + var toConsumableArray = _toConsumableArray; + function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - var arrayWithHoles = _arrayWithHoles; function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - var nonIterableRest = _nonIterableRest; function _toArray(arr) { return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest(); } - var toArray$1 = _toArray; /** * AdGuard scriptlet rule */ - - var ADGUARD_SCRIPTLET_MASK_REG = /#@?%#\/\/scriptlet\(.+\)/; // eslint-disable-next-line no-template-curly-in-string - - var ADGUARD_SCRIPTLET_TEMPLATE = '${domains}#%#//scriptlet(${args})'; // eslint-disable-next-line no-template-curly-in-string - + var ADGUARD_SCRIPTLET_MASK_REG = /#@?%#\/\/scriptlet\(.+\)/; + // eslint-disable-next-line no-template-curly-in-string + var ADGUARD_SCRIPTLET_TEMPLATE = '${domains}#%#//scriptlet(${args})'; + // eslint-disable-next-line no-template-curly-in-string var ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@%#//scriptlet(${args})'; + /** * uBlock scriptlet rule mask */ // eslint-disable-next-line no-template-curly-in-string - - var UBO_SCRIPTLET_TEMPLATE = '${domains}##+js(${args})'; // eslint-disable-next-line no-template-curly-in-string - + var UBO_SCRIPTLET_TEMPLATE = '${domains}##+js(${args})'; + // eslint-disable-next-line no-template-curly-in-string var UBO_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@#+js(${args})'; var UBO_ALIAS_NAME_MARKER = 'ubo-'; - var UBO_SCRIPTLET_JS_ENDING = '.js'; // https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#xhr + var UBO_SCRIPTLET_JS_ENDING = '.js'; + // https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#xhr var UBO_XHR_TYPE = 'xhr'; var ADG_XHR_TYPE = 'xmlhttprequest'; var ADG_SET_CONSTANT_NAME = 'set-constant'; @@ -8622,22 +7899,21 @@ var ADG_REMOVE_ATTR_NAME = REMOVE_ATTR_ALIASES[0]; var ADG_REMOVE_CLASS_NAME = REMOVE_CLASS_ALIASES[0]; var REMOVE_ATTR_CLASS_APPLYING = ['asap', 'stay', 'complete']; + /** * Returns array of strings separated by space which not in quotes * @param {string} str */ - var getSentences = function getSentences(str) { var reg = /'.*?'|".*?"|\S+/g; return str.match(reg); }; + /** * Replaces string with data by placeholders * @param {string} str * @param {Object} data - where keys are placeholders names */ - - var replacePlaceholders = function replacePlaceholders(str, data) { return Object.keys(data).reduce(function (acc, key) { var reg = new RegExp("\\$\\{".concat(key, "\\}"), 'g'); @@ -8645,11 +7921,9 @@ return acc; }, str); }; - var splitArgs = function splitArgs(str) { var args = []; var prevArgStart = 0; - for (var i = 0; i < str.length; i += 1) { // do not split args by escaped comma // https://github.com/AdguardTeam/Scriptlets/issues/133 @@ -8657,39 +7931,35 @@ args.push(str.slice(prevArgStart, i).trim()); prevArgStart = i + 1; } - } // collect arg after last comma - - + } + // collect arg after last comma args.push(str.slice(prevArgStart, str.length).trim()); return args; }; + /** * Validates remove-attr/class scriptlet args * @param {string[]} parsedArgs * @returns {string[]|Error} valid args OR error for invalid selector */ - - var validateRemoveAttrClassArgs = function validateRemoveAttrClassArgs(parsedArgs) { var _parsedArgs = toArray$1(parsedArgs), - name = _parsedArgs[0], - value = _parsedArgs[1], - restArgs = _parsedArgs.slice(2); // no extra checking if there are only scriptlet name and value + name = _parsedArgs[0], + value = _parsedArgs[1], + restArgs = _parsedArgs.slice(2); // no extra checking if there are only scriptlet name and value // https://github.com/AdguardTeam/Scriptlets/issues/235 - - if (restArgs.length === 0) { return [name, value]; - } // remove-attr/class scriptlet might have multiple selectors separated by comma. so we should: + } + + // remove-attr/class scriptlet might have multiple selectors separated by comma. so we should: // 1. check if last arg is 'applying' parameter // 2. join 'selector' into one arg // 3. combine all args // https://github.com/AdguardTeam/Scriptlets/issues/133 - - var lastArg = restArgs.pop(); - var applying; // check the last parsed arg for matching possible 'applying' vale - + var applying; + // check the last parsed arg for matching possible 'applying' vale if (REMOVE_ATTR_CLASS_APPLYING.some(function (el) { return lastArg.indexOf(el) > -1; })) { @@ -8697,57 +7967,46 @@ } else { restArgs.push(lastArg); } - var selector = replaceAll(restArgs.join(', '), ESCAPED_COMMA_SEPARATOR, COMMA_SEPARATOR); - if (selector.length > 0 && typeof document !== 'undefined') { // empty selector is valid for these scriptlets as it applies to all elements, // all other selectors should be validated // e.g. #%#//scriptlet('ubo-remove-class.js', 'blur', ', html') document.querySelectorAll(selector); } - var validArgs = applying ? [name, value, selector, applying] : [name, value, selector]; return validArgs; }; + /** * Converts string of UBO scriptlet rule to AdGuard scriptlet rule * @param {string} rule - UBO scriptlet rule * @returns {string[]} - array with one AdGuard scriptlet rule */ - - var convertUboScriptletToAdg = function convertUboScriptletToAdg(rule) { var domains = getBeforeRegExp(rule, validator.UBO_SCRIPTLET_MASK_REG); var mask = rule.match(validator.UBO_SCRIPTLET_MASK_REG)[0]; var template; - if (mask.indexOf('@') > -1) { template = ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE; } else { template = ADGUARD_SCRIPTLET_TEMPLATE; } - var argsStr = getStringInBraces(rule); var parsedArgs = splitArgs(argsStr); var scriptletName = parsedArgs[0].indexOf(UBO_SCRIPTLET_JS_ENDING) > -1 ? "ubo-".concat(parsedArgs[0]) : "ubo-".concat(parsedArgs[0]).concat(UBO_SCRIPTLET_JS_ENDING); - if (REMOVE_ATTR_ALIASES.indexOf(scriptletName) > -1 || REMOVE_CLASS_ALIASES.indexOf(scriptletName) > -1) { parsedArgs = validateRemoveAttrClassArgs(parsedArgs); } - var args = parsedArgs.map(function (arg, index) { var outputArg = arg; - if (index === 0) { outputArg = scriptletName; - } // for example: example.org##+js(abort-current-inline-script, $, popup) - - + } + // for example: example.org##+js(abort-current-inline-script, $, popup) if (arg === '$') { outputArg = '$$'; } - return outputArg; }).map(function (arg) { return wrapInSingleQuotes(arg); @@ -8758,20 +8017,21 @@ }); return [adgRule]; }; + /** * Convert string of ABP snippet rule to AdGuard scriptlet rule * @param {string} rule - ABP snippet rule * @returns {Array} - array of AdGuard scriptlet rules - * one or few items depends on Abp-rule */ - var convertAbpSnippetToAdg = function convertAbpSnippetToAdg(rule) { var SEMICOLON_DIVIDER = /;(?=(?:(?:[^"]*"){2})*[^"]*$)/g; var mask = rule.indexOf(validator.ABP_SCRIPTLET_MASK) > -1 ? validator.ABP_SCRIPTLET_MASK : validator.ABP_SCRIPTLET_EXCEPTION_MASK; var template = mask === validator.ABP_SCRIPTLET_MASK ? ADGUARD_SCRIPTLET_TEMPLATE : ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE; var domains = substringBefore(rule, mask); var args = substringAfter$1(rule, mask); - return args.split(SEMICOLON_DIVIDER) // abp-rule may have `;` at the end which makes last array item irrelevant + return args.split(SEMICOLON_DIVIDER) + // abp-rule may have `;` at the end which makes last array item irrelevant // https://github.com/AdguardTeam/Scriptlets/issues/236 .filter(isExisting).map(function (args) { return getSentences(args).map(function (arg, index) { @@ -8786,16 +8046,15 @@ }); }); }; + /** * Converts scriptlet rule to AdGuard one * @param {string} rule * @returns {Array} - array of AdGuard scriptlet rules - * one item for Adg and Ubo or few items for Abp */ - var convertScriptletToAdg = function convertScriptletToAdg(rule) { var result; - if (validator.isUboScriptletRule(rule)) { result = convertUboScriptletToAdg(rule); } else if (validator.isAbpSnippetRule(rule)) { @@ -8803,44 +8062,41 @@ } else if (validator.isAdgScriptletRule(rule) || validator.isComment(rule)) { result = [rule]; } - return result; }; + /** * Converts UBO scriptlet rule to AdGuard one * @param {string} rule - AdGuard scriptlet rule * @returns {string} - UBO scriptlet rule */ - var convertAdgScriptletToUbo = function convertAdgScriptletToUbo(rule) { var res; - if (validator.isAdgScriptletRule(rule)) { var _parseRule = parseRule(rule), - parsedName = _parseRule.name, - parsedParams = _parseRule.args; - - var preparedParams; // https://github.com/AdguardTeam/FiltersCompiler/issues/102 - + parsedName = _parseRule.name, + parsedParams = _parseRule.args; + var preparedParams; + // https://github.com/AdguardTeam/FiltersCompiler/issues/102 if (parsedName === ADG_SET_CONSTANT_NAME && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) { preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_STRING]; - } else if (parsedName === ADG_PREVENT_FETCH_NAME // https://github.com/AdguardTeam/Scriptlets/issues/109 + } else if (parsedName === ADG_PREVENT_FETCH_NAME + // https://github.com/AdguardTeam/Scriptlets/issues/109 && (parsedParams[0] === ADG_PREVENT_FETCH_WILDCARD || parsedParams[0] === ADG_PREVENT_FETCH_EMPTY_STRING)) { preparedParams = [UBO_NO_FETCH_IF_WILDCARD]; } else if ((parsedName === ADG_REMOVE_ATTR_NAME || parsedName === ADG_REMOVE_CLASS_NAME) && parsedParams[1] && parsedParams[1].indexOf(COMMA_SEPARATOR) > -1) { preparedParams = [parsedParams[0], replaceAll(parsedParams[1], COMMA_SEPARATOR, ESCAPED_COMMA_SEPARATOR)]; } else { preparedParams = parsedParams; - } // object of name and aliases for the Adg-scriptlet - + } + // object of name and aliases for the Adg-scriptlet var adgScriptletObject = Object.keys(scriptletList).map(function (el) { return scriptletList[el]; }).map(function (s) { var _s$names = toArray$1(s.names), - name = _s$names[0], - aliases = _s$names.slice(1); - + name = _s$names[0], + aliases = _s$names.slice(1); return { name: name, aliases: aliases @@ -8849,25 +8105,23 @@ return el.name === parsedName || el.aliases.indexOf(parsedName) >= 0; }); var aliases = adgScriptletObject.aliases; - if (aliases.length > 0) { - var uboAlias = adgScriptletObject.aliases // eslint-disable-next-line no-restricted-properties + var uboAlias = adgScriptletObject.aliases + // eslint-disable-next-line no-restricted-properties .find(function (alias) { return alias.includes(UBO_ALIAS_NAME_MARKER); }); - if (uboAlias) { var mask = rule.match(ADGUARD_SCRIPTLET_MASK_REG)[0]; var template; - if (mask.indexOf('@') > -1) { template = UBO_SCRIPTLET_EXCEPTION_TEMPLATE; } else { template = UBO_SCRIPTLET_TEMPLATE; } - var domains = getBeforeRegExp(rule, ADGUARD_SCRIPTLET_MASK_REG); - var uboName = uboAlias.replace(UBO_ALIAS_NAME_MARKER, '') // '.js' in the Ubo scriptlet name can be omitted + var uboName = uboAlias.replace(UBO_ALIAS_NAME_MARKER, '') + // '.js' in the Ubo scriptlet name can be omitted // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets .replace(UBO_SCRIPTLET_JS_ENDING, ''); var args = preparedParams.length > 0 ? "".concat(uboName, ", ").concat(preparedParams.join("".concat(COMMA_SEPARATOR, " "))) : uboName; @@ -8879,30 +8133,30 @@ } } } - return res; }; + /** * Checks whether the ADG scriptlet exists or UBO/ABP scriptlet is compatible to ADG * @param {string} input - can be ADG or UBO or ABP scriptlet rule * @returns {boolean} */ - var isValidScriptletRule = function isValidScriptletRule(input) { if (!input) { return false; - } // ABP 'input' rule may contain more than one snippet - + } + // ABP 'input' rule may contain more than one snippet + var rulesArray = convertScriptletToAdg(input); - var rulesArray = convertScriptletToAdg(input); // checking if each of parsed scriptlets is valid + // checking if each of parsed scriptlets is valid // if at least one of them is not valid - whole 'input' rule is not valid too - var isValid = rulesArray.every(function (rule) { var parsedRule = parseRule(rule); return validator.isValidScriptletName(parsedRule.name); }); return isValid; }; + /** * Gets index and redirect resource marker from UBO/ADG modifiers array * @param {string[]} modifiers @@ -8910,39 +8164,34 @@ * @param {string} rule * @returns {Object} { index, marker } */ - var getMarkerData = function getMarkerData(modifiers, redirectsData, rule) { var marker; var index = modifiers.findIndex(function (m) { return m.indexOf(redirectsData.redirectRuleMarker) > -1; }); - if (index > -1) { marker = redirectsData.redirectRuleMarker; } else { index = modifiers.findIndex(function (m) { return m.indexOf(redirectsData.redirectMarker) > -1; }); - if (index > -1) { marker = redirectsData.redirectMarker; } else { throw new Error("No redirect resource modifier found in rule: ".concat(rule)); } } - return { index: index, marker: marker }; }; + /** * Converts Ubo redirect rule to Adg one * @param {string} rule * @returns {string} */ - - var convertUboRedirectToAdg = function convertUboRedirectToAdg(rule) { var firstPartOfRule = substringBefore(rule, '$'); var uboModifiers = validator.parseModifiers(rule); @@ -8954,21 +8203,19 @@ var adgMarker = uboMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.ADG.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.ADG.redirectMarker; return "".concat(adgMarker).concat(adgName); } - if (modifier === UBO_XHR_TYPE) { return ADG_XHR_TYPE; } - return modifier; }).join(COMMA_SEPARATOR); return "".concat(firstPartOfRule, "$").concat(adgModifiers); }; + /** * Converts Abp redirect rule to Adg one * @param {string} rule * @returns {string} */ - var convertAbpRedirectToAdg = function convertAbpRedirectToAdg(rule) { var firstPartOfRule = substringBefore(rule, '$'); var abpModifiers = validator.parseModifiers(rule); @@ -8978,20 +8225,18 @@ var adgName = validator.REDIRECT_RULE_TYPES.ABP.compatibility[abpName]; return "".concat(validator.REDIRECT_RULE_TYPES.ADG.redirectMarker).concat(adgName); } - return modifier; }).join(COMMA_SEPARATOR); return "".concat(firstPartOfRule, "$").concat(adgModifiers); }; + /** * Converts redirect rule to AdGuard one * @param {string} rule * @returns {string} */ - var convertRedirectToAdg = function convertRedirectToAdg(rule) { var result; - if (validator.isUboRedirectCompatibleWithAdg(rule)) { result = convertUboRedirectToAdg(rule); } else if (validator.isAbpRedirectCompatibleWithAdg(rule)) { @@ -8999,9 +8244,9 @@ } else if (validator.isValidAdgRedirectRule(rule)) { result = rule; } - return result; }; + /** * Converts Adg redirect rule to Ubo one * 1. Checks if there is Ubo analog for Adg rule @@ -9013,40 +8258,33 @@ * @param {string} rule * @returns {string} */ - var convertAdgRedirectToUbo = function convertAdgRedirectToUbo(rule) { if (!validator.isAdgRedirectCompatibleWithUbo(rule)) { throw new Error("Unable to convert for uBO - unsupported redirect in rule: ".concat(rule)); } - var basePart = substringBefore(rule, '$'); var adgModifiers = validator.parseModifiers(rule); var adgMarkerData = getMarkerData(adgModifiers, validator.REDIRECT_RULE_TYPES.ADG, rule); var adgRedirectName = adgModifiers[adgMarkerData.index].slice(adgMarkerData.marker.length); - if (!validator.hasValidContentType(rule)) { // add missed source types as content type modifiers var sourceTypesData = validator.ABSENT_SOURCE_TYPE_REPLACEMENT.find(function (el) { return el.NAME === adgRedirectName; }); - if (typeof sourceTypesData === 'undefined') { // eslint-disable-next-line max-len throw new Error("Unable to convert for uBO - no types to add for specific redirect in rule: ".concat(rule)); } - var additionModifiers = sourceTypesData.TYPES; - adgModifiers.push.apply(adgModifiers, toConsumableArray$1(additionModifiers)); + adgModifiers.push.apply(adgModifiers, toConsumableArray(additionModifiers)); } - var uboModifiers = adgModifiers.map(function (el, index) { if (index === adgMarkerData.index) { - var uboMarker = adgMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.UBO.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.UBO.redirectMarker; // eslint-disable-next-line max-len - + var uboMarker = adgMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.UBO.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.UBO.redirectMarker; + // eslint-disable-next-line max-len var uboRedirectName = validator.REDIRECT_RULE_TYPES.ADG.compatibility[adgRedirectName]; return "".concat(uboMarker).concat(uboRedirectName); } - return el; }).join(COMMA_SEPARATOR); return "".concat(basePart, "$").concat(uboModifiers); @@ -9068,30 +8306,24 @@ * ||googletagmanager.com/gtm.js$script,redirect=googletagmanager-gtm * ``` */ - function GoogleAnalytics(source) { // eslint-disable-next-line func-names var Tracker = function Tracker() {}; // constructor - - var proto = Tracker.prototype; proto.get = noopFunc; proto.set = noopFunc; proto.send = noopFunc; - var googleAnalyticsName = window.GoogleAnalyticsObject || 'ga'; // a -- fake arg for 'ga.length < 1' antiadblock checking + var googleAnalyticsName = window.GoogleAnalyticsObject || 'ga'; + // a -- fake arg for 'ga.length < 1' antiadblock checking // eslint-disable-next-line no-unused-vars - function ga(a) { var len = arguments.length; - if (len === 0) { return; - } // eslint-disable-next-line prefer-rest-params - - + } + // eslint-disable-next-line prefer-rest-params var lastArg = arguments[len - 1]; var replacer; - if (lastArg instanceof Object && lastArg !== null && typeof lastArg.hitCallback === 'function') { replacer = lastArg.hitCallback; } else if (typeof lastArg === 'function') { @@ -9100,79 +8332,68 @@ lastArg(ga.create()); }; } - try { - setTimeout(replacer, 1); // eslint-disable-next-line no-empty + setTimeout(replacer, 1); + // eslint-disable-next-line no-empty } catch (ex) {} } - ga.create = function () { return new Tracker(); - }; // https://github.com/AdguardTeam/Scriptlets/issues/134 - - + }; + // https://github.com/AdguardTeam/Scriptlets/issues/134 ga.getByName = function () { return new Tracker(); }; - ga.getAll = function () { return [new Tracker()]; }; - ga.remove = noopFunc; ga.loaded = true; window[googleAnalyticsName] = ga; var _window = window, - dataLayer = _window.dataLayer, - google_optimize = _window.google_optimize; // eslint-disable-line camelcase - + dataLayer = _window.dataLayer, + google_optimize = _window.google_optimize; // eslint-disable-line camelcase if (dataLayer instanceof Object === false) { return; } - if (dataLayer.hide instanceof Object && typeof dataLayer.hide.end === 'function') { dataLayer.hide.end(); } + /** * checks data object and delays callback * @param {Object|Array} data gtag payload * @param {string} funcName callback prop name * @returns */ - - var handleCallback = function handleCallback(dataObj, funcName) { if (dataObj && typeof dataObj[funcName] === 'function') { setTimeout(dataObj[funcName]); } }; - if (typeof dataLayer.push === 'function') { dataLayer.push = function (data) { if (data instanceof Object) { - handleCallback(data, 'eventCallback'); // eslint-disable-next-line no-restricted-syntax, guard-for-in - + handleCallback(data, 'eventCallback'); + // eslint-disable-next-line no-restricted-syntax, guard-for-in for (var key in data) { handleCallback(data[key], 'event_callback'); - } // eslint-disable-next-line no-prototype-builtins - - + } + // eslint-disable-next-line no-prototype-builtins if (!data.hasOwnProperty('eventCallback') && !data.hasOwnProperty('eventCallback')) { [].push.call(window.dataLayer, data); } } - if (Array.isArray(data)) { data.forEach(function (arg) { handleCallback(arg, 'callback'); }); } - return noopFunc; }; - } // https://github.com/AdguardTeam/Scriptlets/issues/81 - + } + // https://github.com/AdguardTeam/Scriptlets/issues/81 if (google_optimize instanceof Object && typeof google_optimize.get === 'function') { // eslint-disable-line camelcase var googleOptimizeWrapper = { @@ -9180,14 +8401,15 @@ }; window.google_optimize = googleOptimizeWrapper; } - hit(source); } - GoogleAnalytics.names = ['google-analytics', 'ubo-google-analytics_analytics.js', 'google-analytics_analytics.js', // https://github.com/AdguardTeam/Scriptlets/issues/127 + GoogleAnalytics.names = ['google-analytics', 'ubo-google-analytics_analytics.js', 'google-analytics_analytics.js', + // https://github.com/AdguardTeam/Scriptlets/issues/127 'googletagmanager-gtm', 'ubo-googletagmanager_gtm.js', 'googletagmanager_gtm.js']; GoogleAnalytics.injections = [hit, noopFunc, noopNull, noopArray]; /* eslint-disable no-underscore-dangle */ + /** * @redirect google-analytics-ga * @@ -9202,11 +8424,9 @@ * ||google-analytics.com/ga.js$script,redirect=google-analytics-ga * ``` */ - function GoogleAnalyticsGa(source) { // Gaq constructor function Gaq() {} - Gaq.prototype.Na = noopFunc; Gaq.prototype.O = noopFunc; Gaq.prototype.Sa = noopFunc; @@ -9215,80 +8435,67 @@ Gaq.prototype._createAsyncTracker = noopFunc; Gaq.prototype._getAsyncTracker = noopFunc; Gaq.prototype._getPlugin = noopFunc; - Gaq.prototype.push = function (data) { if (typeof data === 'function') { data(); return; } - if (Array.isArray(data) === false) { return; - } // https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiDomainDirectory#_gat.GA_Tracker_._link + } + // https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiDomainDirectory#_gat.GA_Tracker_._link // https://github.com/uBlockOrigin/uBlock-issues/issues/1807 - - if (typeof data[0] === 'string' && /(^|\.)_link$/.test(data[0]) && typeof data[1] === 'string') { window.location.assign(data[1]); - } // https://github.com/gorhill/uBlock/issues/2162 - - + } + // https://github.com/gorhill/uBlock/issues/2162 if (data[0] === '_set' && data[1] === 'hitCallback' && typeof data[2] === 'function') { data[2](); } }; - var gaq = new Gaq(); var asyncTrackers = window._gaq || []; - if (Array.isArray(asyncTrackers)) { while (asyncTrackers[0]) { gaq.push(asyncTrackers.shift()); } - } // eslint-disable-next-line no-multi-assign - - - window._gaq = gaq.qf = gaq; // Gat constructor - - function Gat() {} // Mock tracker api + } + // eslint-disable-next-line no-multi-assign + window._gaq = gaq.qf = gaq; + // Gat constructor + function Gat() {} + // Mock tracker api var api = ['_addIgnoredOrganic', '_addIgnoredRef', '_addItem', '_addOrganic', '_addTrans', '_clearIgnoredOrganic', '_clearIgnoredRef', '_clearOrganic', '_cookiePathCopy', '_deleteCustomVar', '_getName', '_setAccount', '_getAccount', '_getClientInfo', '_getDetectFlash', '_getDetectTitle', '_getLinkerUrl', '_getLocalGifPath', '_getServiceMode', '_getVersion', '_getVisitorCustomVar', '_initData', '_link', '_linkByPost', '_setAllowAnchor', '_setAllowHash', '_setAllowLinker', '_setCampContentKey', '_setCampMediumKey', '_setCampNameKey', '_setCampNOKey', '_setCampSourceKey', '_setCampTermKey', '_setCampaignCookieTimeout', '_setCampaignTrack', '_setClientInfo', '_setCookiePath', '_setCookiePersistence', '_setCookieTimeout', '_setCustomVar', '_setDetectFlash', '_setDetectTitle', '_setDomainName', '_setLocalGifPath', '_setLocalRemoteServerMode', '_setLocalServerMode', '_setReferrerOverride', '_setRemoteServerMode', '_setSampleRate', '_setSessionTimeout', '_setSiteSpeedSampleRate', '_setSessionCookieTimeout', '_setVar', '_setVisitorCookieTimeout', '_trackEvent', '_trackPageLoadTime', '_trackPageview', '_trackSocial', '_trackTiming', '_trackTrans', '_visitCode']; var tracker = api.reduce(function (res, funcName) { res[funcName] = noopFunc; return res; }, {}); - tracker._getLinkerUrl = function (a) { return a; - }; // https://github.com/AdguardTeam/Scriptlets/issues/154 - - + }; + // https://github.com/AdguardTeam/Scriptlets/issues/154 tracker._link = function (url) { if (typeof url !== 'string') { return; } - try { window.location.assign(url); } catch (e) { logMessage(source, e); } }; - Gat.prototype._anonymizeIP = noopFunc; Gat.prototype._createTracker = noopFunc; Gat.prototype._forceSSL = noopFunc; Gat.prototype._getPlugin = noopFunc; - Gat.prototype._getTracker = function () { return tracker; }; - Gat.prototype._getTrackerByName = function () { return tracker; }; - Gat.prototype._getTrackers = noopFunc; Gat.prototype.aa = noopFunc; Gat.prototype.ab = noopFunc; @@ -9305,7 +8512,6 @@ GoogleAnalyticsGa.injections = [hit, noopFunc, logMessage]; /* eslint-disable max-len */ - /** * @redirect googlesyndication-adsbygoogle * @@ -9320,9 +8526,7 @@ * ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect=googlesyndication-adsbygoogle * ``` */ - /* eslint-enable max-len */ - function GoogleSyndicationAdsByGoogle(source) { window.adsbygoogle = { // https://github.com/AdguardTeam/Scriptlets/issues/113 @@ -9334,12 +8538,10 @@ this.length = 0; this.length += 1; } - if (arg !== null && arg instanceof Object && arg.constructor.name === 'Object') { // eslint-disable-next-line no-restricted-syntax for (var _i = 0, _Object$keys = Object.keys(arg); _i < _Object$keys.length; _i++) { var key = _Object$keys[_i]; - if (typeof arg[key] === 'function') { try { // https://github.com/AdguardTeam/Scriptlets/issues/252 @@ -9359,22 +8561,21 @@ var ASWIFT_IFRAME_MARKER = 'aswift_'; var GOOGLE_ADS_IFRAME_MARKER = 'google_ads_iframe_'; var executed = false; - for (var i = 0; i < adElems.length; i += 1) { var adElemChildNodes = adElems[i].childNodes; - var childNodesQuantity = adElemChildNodes.length; // childNodes of .adsbygoogle can be defined if scriptlet was executed before + var childNodesQuantity = adElemChildNodes.length; + // childNodes of .adsbygoogle can be defined if scriptlet was executed before // so we should check that childNodes are exactly defined by us // TODO: remake after scriptlets context developing in 1.3 - var areIframesDefined = false; - if (childNodesQuantity > 0) { // it should be only 2 child iframes if scriptlet was executed - areIframesDefined = childNodesQuantity === 2 // the first of child nodes should be aswift iframe - && adElemChildNodes[0].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[0].id.indexOf(ASWIFT_IFRAME_MARKER) > -1 // the second of child nodes should be google_ads iframe + areIframesDefined = childNodesQuantity === 2 + // the first of child nodes should be aswift iframe + && adElemChildNodes[0].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[0].id.indexOf(ASWIFT_IFRAME_MARKER) > -1 + // the second of child nodes should be google_ads iframe && adElemChildNodes[1].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[1].id.indexOf(GOOGLE_ADS_IFRAME_MARKER) > -1; } - if (!areIframesDefined) { // here we do the job if scriptlet has not been executed earlier adElems[i].setAttribute(statusAttrName, 'done'); @@ -9393,7 +8594,6 @@ executed = true; } } - if (executed) { hit(source); } @@ -9402,6 +8602,7 @@ GoogleSyndicationAdsByGoogle.injections = [hit]; /* eslint-disable func-names */ + /** * @redirect googletagservices-gpt * @@ -9416,29 +8617,23 @@ * ||googletagservices.com/tag/js/gpt.js$script,redirect=googletagservices-gpt * ``` */ - function GoogleTagServicesGpt(source) { var slots = new Map(); var slotsById = new Map(); var eventCallbacks = new Map(); - var addEventListener = function addEventListener(name, listener) { if (!eventCallbacks.has(name)) { eventCallbacks.set(name, new Set()); } - eventCallbacks.get(name).add(listener); return this; }; - var removeEventListener = function removeEventListener(name, listener) { if (eventCallbacks.has(name)) { return eventCallbacks.get(name).delete(listener); } - return false; }; - var fireSlotEvent = function fireSlotEvent(name, slot) { // eslint-disable-next-line compat/compat return new Promise(function (resolve) { @@ -9446,7 +8641,6 @@ var size = [0, 0]; var callbacksSet = eventCallbacks.get(name) || []; var callbackArray = Array.from(callbacksSet); - for (var i = 0; i < callbackArray.length; i += 1) { callbackArray[i]({ isEmpty: true, @@ -9454,36 +8648,28 @@ slot: slot }); } - resolve(); }); }); }; - var displaySlot = function displaySlot(slot) { if (!slot) { return; } - var id = slot.getSlotElementId(); - if (!document.getElementById(id)) { return; } - var parent = document.getElementById(id); - if (parent) { parent.appendChild(document.createElement('div')); } - fireSlotEvent('slotRenderEnded', slot); fireSlotEvent('slotRequested', slot); fireSlotEvent('slotResponseReceived', slot); fireSlotEvent('slotOnload', slot); fireSlotEvent('impressionViewable', slot); }; - var companionAdsService = { addEventListener: addEventListener, removeEventListener: removeEventListener, @@ -9496,10 +8682,8 @@ removeEventListener: removeEventListener, setContent: noopFunc }; - function PassbackSlot() {} // constructor - PassbackSlot.prototype.display = noopFunc; PassbackSlot.prototype.get = noopNull; PassbackSlot.prototype.set = noopThis; @@ -9507,50 +8691,36 @@ PassbackSlot.prototype.setTagForChildDirectedTreatment = noopThis; PassbackSlot.prototype.setTargeting = noopThis; PassbackSlot.prototype.updateTargetingFromMap = noopThis; - function SizeMappingBuilder() {} // constructor - - SizeMappingBuilder.prototype.addSize = noopThis; SizeMappingBuilder.prototype.build = noopNull; - function Slot(adUnitPath, creatives, optDiv) { this.adUnitPath = adUnitPath; this.creatives = creatives; this.optDiv = optDiv; - if (slotsById.has(optDiv)) { var _document$getElementB; - (_document$getElementB = document.getElementById(optDiv)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.remove(); return slotsById.get(optDiv); } - slotsById.set(optDiv, this); } // constructor - - Slot.prototype.addService = noopThis; Slot.prototype.clearCategoryExclusions = noopThis; Slot.prototype.clearTargeting = noopThis; Slot.prototype.defineSizeMapping = noopThis; Slot.prototype.get = noopNull; - Slot.prototype.getAdUnitPath = function () { return this.adUnitPath; }; - Slot.prototype.getAttributeKeys = noopArray; Slot.prototype.getCategoryExclusions = noopArray; - Slot.prototype.getDomId = function () { return this.optDiv; }; - Slot.prototype.getSlotElementId = function () { return this.optDiv; }; - Slot.prototype.getSlotId = noopThis; Slot.prototype.getSizes = noopArray; Slot.prototype.getTargeting = noopArray; @@ -9602,48 +8772,38 @@ setVideoContent: noopThis, updateCorrelator: noopFunc }; - var getNewSlot = function getNewSlot(adUnitPath, creatives, optDiv) { return new Slot(adUnitPath, creatives, optDiv); }; - var _window = window, - _window$googletag = _window.googletag, - googletag = _window$googletag === void 0 ? {} : _window$googletag; + _window$googletag = _window.googletag, + googletag = _window$googletag === void 0 ? {} : _window$googletag; var _googletag$cmd = googletag.cmd, - cmd = _googletag$cmd === void 0 ? [] : _googletag$cmd; + cmd = _googletag$cmd === void 0 ? [] : _googletag$cmd; googletag.apiReady = true; googletag.cmd = []; - googletag.cmd.push = function (a) { try { - a(); // eslint-disable-next-line no-empty + a(); + // eslint-disable-next-line no-empty } catch (ex) {} - return 1; }; - googletag.companionAds = function () { return companionAdsService; }; - googletag.content = function () { return contentService; }; - googletag.defineOutOfPageSlot = getNewSlot; googletag.defineSlot = getNewSlot; - googletag.destroySlots = function () { slots.clear(); slotsById.clear(); }; - googletag.disablePublisherConsole = noopFunc; - googletag.display = function (arg) { var id; - if (arg !== null && arg !== void 0 && arg.getSlotElementId) { id = arg.getSlotElementId(); } else if (arg !== null && arg !== void 0 && arg.nodeType) { @@ -9651,30 +8811,22 @@ } else { id = String(arg); } - displaySlot(slotsById.get(id)); }; - googletag.enableServices = noopFunc; googletag.getVersion = noopStr; - googletag.pubads = function () { return pubAdsService; }; - googletag.pubadsReady = true; googletag.setAdIframeTitle = noopFunc; - googletag.sizeMapping = function () { return new SizeMappingBuilder(); }; - window.googletag = googletag; - while (cmd.length !== 0) { googletag.cmd.push(cmd.shift()); } - hit(source); } GoogleTagServicesGpt.names = ['googletagservices-gpt', 'ubo-googletagservices_gpt.js', 'googletagservices_gpt.js']; @@ -9694,7 +8846,6 @@ * ||sb.scorecardresearch.com/beacon.js$script,redirect=scorecardresearch-beacon * ``` */ - function ScoreCardResearchBeacon(source) { window.COMSCORE = { purge: function purge() { @@ -9720,13 +8871,11 @@ * ||mc.yandex.ru/metrika/tag.js$script,redirect=metrika-yandex-tag * ``` */ - function metrikaYandexTag(source) { var asyncCallbackFromOptions = function asyncCallbackFromOptions(id, param) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var callback = options.callback; var ctx = options.ctx; - if (typeof callback === 'function') { callback = ctx !== undefined ? callback.bind(ctx) : callback; setTimeout(function () { @@ -9734,50 +8883,48 @@ }); } }; + /** * https://yandex.ru/support/metrica/objects/addfileextension.html */ - - var addFileExtension = noopFunc; + /** * https://yandex.ru/support/metrica/objects/extlink.html */ - var extLink = asyncCallbackFromOptions; + /** * https://yandex.ru/support/metrica/objects/file.html */ - var file = asyncCallbackFromOptions; + /** * https://yandex.ru/support/metrica/objects/get-client-id.html * @param {Function} cb */ - var getClientID = function getClientID(id, cb) { if (!cb) { return; } - setTimeout(cb(null)); }; + /** * https://yandex.ru/support/metrica/objects/hit.html */ - - var hitFunc = asyncCallbackFromOptions; + /** * https://yandex.ru/support/metrica/objects/notbounce.html */ - var notBounce = asyncCallbackFromOptions; + /** * https://yandex.ru/support/metrica/objects/params-method.html */ - var params = noopFunc; + /** * https://yandex.ru/support/metrica/objects/reachgoal.html * @param {string} target @@ -9785,25 +8932,24 @@ * @param {Function} callback * @param {any} ctx */ - var reachGoal = function reachGoal(id, target, params, callback, ctx) { asyncCallbackFromOptions(null, null, { callback: callback, ctx: ctx }); }; + /** * https://yandex.ru/support/metrica/objects/set-user-id.html */ - - var setUserID = noopFunc; + /** * https://yandex.ru/support/metrica/objects/user-params.html */ + var userParams = noopFunc; - var userParams = noopFunc; // https://github.com/AdguardTeam/Scriptlets/issues/198 - + // https://github.com/AdguardTeam/Scriptlets/issues/198 var destruct = noopFunc; var api = { addFileExtension: addFileExtension, @@ -9818,21 +8964,17 @@ userParams: userParams, destruct: destruct }; - function ym(id, funcName) { for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return api[funcName] && api[funcName].apply(api, [id].concat(args)); } - function init(id) { // yaCounter object should provide api window["yaCounter".concat(id)] = api; document.dispatchEvent(new Event("yacounter".concat(id, "inited"))); } - if (typeof window.ym === 'undefined') { window.ym = ym; ym.a = []; @@ -9845,7 +8987,6 @@ init(id); }); } - hit(source); } metrikaYandexTag.names = ['metrika-yandex-tag']; @@ -9863,19 +9004,17 @@ * ||mc.yandex.ru/metrika/watch.js$script,redirect=metrika-yandex-watch * ``` */ - function metrikaYandexWatch(source) { var cbName = 'yandex_metrika_callbacks'; + /** * Gets callback and its context from options and call it in async way * @param {Object} options Yandex Metrika API options */ - var asyncCallbackFromOptions = function asyncCallbackFromOptions() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var callback = options.callback; var ctx = options.ctx; - if (typeof callback === 'function') { callback = ctx !== undefined ? callback.bind(ctx) : callback; setTimeout(function () { @@ -9883,41 +9022,34 @@ }); } }; - function Metrika() {} // constructor - - - Metrika.counters = noopArray; // Methods without options - + Metrika.counters = noopArray; + // Methods without options Metrika.prototype.addFileExtension = noopFunc; Metrika.prototype.getClientID = noopFunc; Metrika.prototype.setUserID = noopFunc; Metrika.prototype.userParams = noopFunc; Metrika.prototype.params = noopFunc; - Metrika.prototype.counters = noopArray; // Methods with options - // The order of arguments should be kept in according to API + Metrika.prototype.counters = noopArray; + // Methods with options + // The order of arguments should be kept in according to API Metrika.prototype.extLink = function (url, options) { asyncCallbackFromOptions(options); }; - Metrika.prototype.file = function (url, options) { asyncCallbackFromOptions(options); }; - Metrika.prototype.hit = function (url, options) { asyncCallbackFromOptions(options); }; - Metrika.prototype.reachGoal = function (target, params, cb, ctx) { asyncCallbackFromOptions({ callback: cb, ctx: ctx }); }; - Metrika.prototype.notBounce = asyncCallbackFromOptions; - if (window.Ya) { window.Ya.Metrika = Metrika; } else { @@ -9925,7 +9057,6 @@ Metrika: Metrika }; } - if (window[cbName] && Array.isArray(window[cbName])) { window[cbName].forEach(function (func) { if (typeof func === 'function') { @@ -9933,13 +9064,13 @@ } }); } - hit(source); } metrikaYandexWatch.names = ['metrika-yandex-watch']; metrikaYandexWatch.injections = [hit, noopFunc, noopArray]; /* eslint-disable func-names */ + /** * @redirect pardot-1.0 * @@ -9964,7 +9095,6 @@ window.piGetParameter = noopNull; window.piSetCookie = noopFunc; window.piGetCookie = noopStr; - function piTracker() { window.pi = { tracker: { @@ -9976,7 +9106,6 @@ }; window.piScriptNum += 1; } - window.piResponse = noopFunc; window.piTracker = piTracker; piTracker(); @@ -9985,6 +9114,28 @@ Pardot.names = ['pardot-1.0']; Pardot.injections = [hit, noopFunc, noopStr, noopNull]; + /** + * @redirect prevent-bab + * + * @description + * Prevents BlockAdblock script from detecting an ad blocker. + * + * Mostly it is used as `scriptlet`. + * See [scriptlet description](../wiki/about-scriptlets.md#prevent-bab). + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/a94df7f3b27080ae2dcb3b914ace39c0c294d2f6/src/web_accessible_resources/nobab.js + * + * **Example** + * ``` + * /blockadblock.$script,redirect=prevent-bab + * ``` + */ + var preventBab$1 = preventBab$2; + preventBab$1.names = ['prevent-bab' + // list of prevent-bab redirect aliases + ]; + /** * @redirect amazon-apstag * @@ -9999,7 +9150,6 @@ * ||amazon-adsystem.com/aax2/apstag.js$script,redirect=amazon-apstag * ``` */ - function AmazonApstag(source) { var apstagWrapper = { fetchBids: function fetchBids(a, b) { @@ -10018,6 +9168,7 @@ AmazonApstag.injections = [hit, noopFunc]; /* eslint-disable func-names */ + /** * @redirect matomo * @@ -10032,14 +9183,11 @@ function Matomo(source) { var Tracker = function Tracker() {}; - Tracker.prototype.setDoNotTrack = noopFunc; Tracker.prototype.setDomains = noopFunc; Tracker.prototype.setCustomDimension = noopFunc; Tracker.prototype.trackPageView = noopFunc; - var AsyncTracker = function AsyncTracker() {}; - AsyncTracker.prototype.addListener = noopFunc; var matomoWrapper = { getTracker: function getTracker() { @@ -10056,6 +9204,7 @@ Matomo.injections = [hit, noopFunc]; /* eslint-disable func-names */ + /** * @redirect fingerprintjs2 * @@ -10071,41 +9220,38 @@ * ||the-japan-news.com/modules/js/lib/fgp/fingerprint2.js$script,redirect=fingerprintjs2 * ``` */ - function Fingerprintjs2(source) { var browserId = ''; - for (var i = 0; i < 8; i += 1) { browserId += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4); } - var Fingerprint2 = function Fingerprint2() {}; - Fingerprint2.get = function (options, callback) { if (!callback) { callback = options; } - setTimeout(function () { if (callback) { callback(browserId, []); } }, 1); }; - Fingerprint2.prototype = { get: Fingerprint2.get }; window.Fingerprint2 = Fingerprint2; hit(source); } - Fingerprintjs2.names = ['fingerprintjs2', // redirect aliases are needed for conversion: + Fingerprintjs2.names = ['fingerprintjs2', + // redirect aliases are needed for conversion: // prefixed for us - 'ubo-fingerprint2.js', // original ubo name + 'ubo-fingerprint2.js', + // original ubo name 'fingerprint2.js']; Fingerprintjs2.injections = [hit]; /* eslint-disable func-names */ + /** * @redirect fingerprintjs3 * @@ -10121,20 +9267,15 @@ * ||sephora.com/js/ufe/isomorphic/thirdparty/fp.min.js$script,redirect=fingerprintjs3 * ``` */ - function Fingerprintjs3(source) { var visitorId = function () { var id = ''; - for (var i = 0; i < 8; i += 1) { id += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4); } - return id; }(); - var FingerprintJS = function FingerprintJS() {}; - FingerprintJS.prototype = { load: function load() { // eslint-disable-next-line compat/compat @@ -10151,13 +9292,16 @@ window.FingerprintJS = new FingerprintJS(); hit(source); } - Fingerprintjs3.names = ['fingerprintjs3', // redirect aliases are needed for conversion: + Fingerprintjs3.names = ['fingerprintjs3', + // redirect aliases are needed for conversion: // prefixed for us - 'ubo-fingerprint3.js', // original ubo name + 'ubo-fingerprint3.js', + // original ubo name 'fingerprint3.js']; Fingerprintjs3.injections = [hit, noopStr]; /* eslint-disable func-names */ + /** * @redirect gemius * @@ -10170,10 +9314,8 @@ * ||gapt.hit.gemius.pl/gplayer.js$script,redirect=gemius * ``` */ - function Gemius(source) { var GemiusPlayer = function GemiusPlayer() {}; - GemiusPlayer.prototype = { setVideoObject: noopFunc, newProgram: noopFunc, @@ -10199,7 +9341,6 @@ * ||bloctel.gouv.fr/assets/scripts/smarttag.js$script,redirect=ati-smarttag * ``` */ - function ATInternetSmartTag(source) { var setNoopFuncWrapper = { set: noopFunc @@ -10227,10 +9368,10 @@ removeProduct: { products: setNoopFuncWrapper } - }; // eslint-disable-next-line new-cap, func-names + }; + // eslint-disable-next-line new-cap, func-names var tag = function tag() {}; - tag.prototype = { setConfig: noopFunc, setParam: noopFunc, @@ -10275,6 +9416,7 @@ } } }; + window.ATInternet = smartTagWrapper; hit(source); } @@ -10282,6 +9424,7 @@ ATInternetSmartTag.injections = [hit, noopFunc]; /* eslint-disable consistent-return, no-eval */ + /** * @redirect prevent-bab2 * @@ -10298,37 +9441,32 @@ * /blockadblock.$script,redirect=prevent-bab2 * ``` */ - function preventBab2(source) { // eslint-disable-next-line compat/compat var script = document.currentScript; - if (script === null) { return; } - var url = script.src; - if (typeof url !== 'string') { return; } - var domainsStr = ['adclixx\\.net', 'adnetasia\\.com', 'adtrackers\\.net', 'bannertrack\\.net'].join('|'); var matchStr = "^https?://[\\w-]+\\.(".concat(domainsStr, ")/."); var domainsRegex = new RegExp(matchStr); - if (domainsRegex.test(url) === false) { return; } - window.nH7eXzOsG = 858; hit(source); } - preventBab2.names = ['prevent-bab2', // aliases are needed for matching the related scriptlet converted into our syntax + preventBab2.names = ['prevent-bab2', + // aliases are needed for matching the related scriptlet converted into our syntax 'nobab2.js']; preventBab2.injections = [hit]; /* eslint-disable func-names, no-underscore-dangle */ + /** * @redirect google-ima3 * @@ -10344,14 +9482,10 @@ function GoogleIma3(source) { var VERSION = '3.453.0'; var ima = {}; - var AdDisplayContainer = function AdDisplayContainer() {}; - AdDisplayContainer.prototype.destroy = noopFunc; AdDisplayContainer.prototype.initialize = noopFunc; - var ImaSdkSettings = function ImaSdkSettings() {}; - ImaSdkSettings.CompanionBackfillMode = { ALWAYS: 'always', ON_MASTER_AD: 'on_master_ad' @@ -10455,16 +9589,13 @@ INSECURE: 2 } }; - var EventHandler = function EventHandler() { this.listeners = new Map(); - this._dispatch = function (e) { - var listeners = this.listeners.get(e.type) || []; // eslint-disable-next-line no-restricted-syntax - + var listeners = this.listeners.get(e.type) || []; + // eslint-disable-next-line no-restricted-syntax for (var _i = 0, _Array$from = Array.from(listeners); _i < _Array$from.length; _i++) { var listener = _Array$from[_i]; - try { listener(e); } catch (r) { @@ -10472,25 +9603,19 @@ } } }; - this.addEventListener = function (t, c) { if (!this.listeners.has(t)) { this.listeners.set(t, new Set()); } - this.listeners.get(t).add(c); }; - this.removeEventListener = function (t, c) { var _this$listeners$get; - (_this$listeners$get = this.listeners.get(t)) === null || _this$listeners$get === void 0 ? void 0 : _this$listeners$get.delete(c); }; }; - var AdsManager = new EventHandler(); /* eslint-disable no-use-before-define */ - AdsManager.volume = 1; AdsManager.collapse = noopFunc; AdsManager.configureAdsManager = noopFunc; @@ -10498,57 +9623,43 @@ AdsManager.discardAdBreak = noopFunc; AdsManager.expand = noopFunc; AdsManager.focus = noopFunc; - AdsManager.getAdSkippableState = function () { return false; }; - AdsManager.getCuePoints = function () { return [0]; }; - AdsManager.getCurrentAd = function () { return currentAd; }; - AdsManager.getCurrentAdCuePoints = function () { return []; }; - AdsManager.getRemainingTime = function () { return 0; }; - AdsManager.getVolume = function () { return this.volume; }; - AdsManager.init = noopFunc; - AdsManager.isCustomClickTrackingUsed = function () { return false; }; - AdsManager.isCustomPlaybackUsed = function () { return false; }; - AdsManager.pause = noopFunc; AdsManager.requestNextAdBreak = noopFunc; AdsManager.resize = noopFunc; AdsManager.resume = noopFunc; - AdsManager.setVolume = function (v) { this.volume = v; }; - AdsManager.skip = noopFunc; - AdsManager.start = function () { // eslint-disable-next-line no-restricted-syntax for (var _i2 = 0, _arr = [AdEvent.Type.ALL_ADS_COMPLETED, AdEvent.Type.CONTENT_RESUME_REQUESTED]; _i2 < _arr.length; _i2++) { var type = _arr[_i2]; - try { this._dispatch(new ima.AdEvent(type)); } catch (e) { @@ -10556,19 +9667,16 @@ } } }; - AdsManager.stop = noopFunc; AdsManager.updateAdsRenderingSettings = noopFunc; /* eslint-enable no-use-before-define */ var manager = Object.create(AdsManager); - var AdsManagerLoadedEvent = function AdsManagerLoadedEvent(type, adsRequest, userRequestContext) { this.type = type; this.adsRequest = adsRequest; this.userRequestContext = userRequestContext; }; - AdsManagerLoadedEvent.prototype = { getAdsManager: function getAdsManager() { return manager; @@ -10577,7 +9685,6 @@ if (this.userRequestContext) { return this.userRequestContext; } - return {}; } }; @@ -10588,22 +9695,17 @@ AdsLoader.prototype.settings = new ImaSdkSettings(); AdsLoader.prototype.contentComplete = noopFunc; AdsLoader.prototype.destroy = noopFunc; - AdsLoader.prototype.getSettings = function () { return this.settings; }; - AdsLoader.prototype.getVersion = function () { return VERSION; }; - AdsLoader.prototype.requestAds = function (adsRequest, userRequestContext) { var _this = this; - requestAnimationFrame(function () { var ADS_MANAGER_LOADED = AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED; var event = new ima.AdsManagerLoadedEvent(ADS_MANAGER_LOADED, adsRequest, userRequestContext); - _this._dispatch(event); }); var e = new ima.AdError('adPlayError', 1205, 1205, 'The browser prevented playback initiated without user interaction.', adsRequest, userRequestContext); @@ -10611,19 +9713,14 @@ _this._dispatch(new ima.AdErrorEvent(e)); }); }; - var AdsRenderingSettings = noopFunc; - var AdsRequest = function AdsRequest() {}; - AdsRequest.prototype = { setAdWillAutoPlay: noopFunc, setAdWillPlayMuted: noopFunc, setContinuousPlayback: noopFunc }; - var AdPodInfo = function AdPodInfo() {}; - AdPodInfo.prototype = { getAdPosition: function getAdPosition() { return 1; @@ -10644,9 +9741,7 @@ return 1; } }; - var Ad = function Ad() {}; - Ad.prototype = { pi: new AdPodInfo(), getAdId: function getAdId() { @@ -10743,9 +9838,7 @@ return true; } }; - var CompanionAd = function CompanionAd() {}; - CompanionAd.prototype = { getAdSlotId: function getAdSlotId() { return ''; @@ -10763,65 +9856,49 @@ return 1; } }; - var AdError = function AdError(type, code, vast, message, adsRequest, userRequestContext) { this.errorCode = code; this.message = message; this.type = type; this.adsRequest = adsRequest; this.userRequestContext = userRequestContext; - this.getErrorCode = function () { return this.errorCode; }; - this.getInnerError = function () {}; - this.getMessage = function () { return this.message; }; - this.getType = function () { return this.type; }; - this.getVastErrorCode = function () { return this.vastErrorCode; }; - this.toString = function () { return "AdError ".concat(this.errorCode, ": ").concat(this.message); }; }; - AdError.ErrorCode = {}; AdError.Type = {}; - var isEngadget = function isEngadget() { try { // eslint-disable-next-line no-restricted-syntax for (var _i3 = 0, _Object$values = Object.values(window.vidible._getContexts()); _i3 < _Object$values.length; _i3++) { var _ctx$getPlayer, _ctx$getPlayer$div; - var ctx = _Object$values[_i3]; - // eslint-disable-next-line no-restricted-properties if ((_ctx$getPlayer = ctx.getPlayer()) !== null && _ctx$getPlayer !== void 0 && (_ctx$getPlayer$div = _ctx$getPlayer.div) !== null && _ctx$getPlayer$div !== void 0 && _ctx$getPlayer$div.innerHTML.includes('www.engadget.com')) { return true; } } } catch (e) {} // eslint-disable-line no-empty - - return false; }; - var currentAd = isEngadget() ? undefined : new Ad(); - var AdEvent = function AdEvent(type) { this.type = type; }; - AdEvent.prototype = { getAd: function getAd() { return currentAd; @@ -10862,38 +9939,28 @@ VOLUME_CHANGED: 'volumeChange', VOLUME_MUTED: 'mute' }; - var AdErrorEvent = function AdErrorEvent(error) { this.error = error; this.type = 'adError'; - this.getError = function () { return this.error; }; - this.getUserRequestContext = function () { var _this$error; - if ((_this$error = this.error) !== null && _this$error !== void 0 && _this$error.userRequestContext) { return this.error.userRequestContext; } - return {}; }; }; - AdErrorEvent.Type = { AD_ERROR: 'adError' }; - var CustomContentLoadedEvent = function CustomContentLoadedEvent() {}; - CustomContentLoadedEvent.Type = { CUSTOM_CONTENT_LOADED: 'deprecated-event' }; - var CompanionAdSelectionSettings = function CompanionAdSelectionSettings() {}; - CompanionAdSelectionSettings.CreativeType = { ALL: 'All', FLASH: 'Flash', @@ -10910,9 +9977,7 @@ SELECT_EXACT_MATCH: 'SelectExactMatch', SELECT_NEAR_MATCH: 'SelectNearMatch' }; - var AdCuePoints = function AdCuePoints() {}; - AdCuePoints.prototype = { getCuePoints: function getCuePoints() { return []; @@ -10925,9 +9990,7 @@ } }; var AdProgressData = noopFunc; - var UniversalAdIdInfo = function UniversalAdIdInfo() {}; - Object.assign(ima, { AdCuePoints: AdCuePoints, AdDisplayContainer: AdDisplayContainer, @@ -10963,11 +10026,9 @@ NORMAL: 'normal' } }); - if (!window.google) { window.google = {}; } - window.google.ima = ima; hit(source); } @@ -10975,6 +10036,7 @@ GoogleIma3.injections = [hit, noopFunc, logMessage]; /* eslint-disable func-names, no-underscore-dangle */ + /** * @redirect didomi-loader * @@ -10987,26 +10049,19 @@ * ||sdk.privacy-center.org/fbf86806f86e/loader.js$script,redirect=didomi-loader * ``` */ - function DidomiLoader(source) { function UserConsentStatusForVendorSubscribe() {} - UserConsentStatusForVendorSubscribe.prototype.filter = function () { return new UserConsentStatusForVendorSubscribe(); }; - UserConsentStatusForVendorSubscribe.prototype.subscribe = noopFunc; - function UserConsentStatusForVendor() {} - UserConsentStatusForVendor.prototype.first = function () { return new UserConsentStatusForVendorSubscribe(); }; - UserConsentStatusForVendor.prototype.filter = function () { return new UserConsentStatusForVendorSubscribe(); }; - UserConsentStatusForVendor.prototype.subscribe = noopFunc; var DidomiWrapper = { isConsentRequired: falseFunc, @@ -11067,16 +10122,15 @@ purpose: { consents: [] } - }; // https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#how-does-the-cmp-provide-the-api + }; + // https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#how-does-the-cmp-provide-the-api var __tcfapiWrapper = function __tcfapiWrapper(command, version, callback) { if (typeof callback !== 'function' || command === 'removeEventListener') { return; } - callback(tcData, true); }; - window.__tcfapi = __tcfapiWrapper; var didomiEventListenersWrapper = { stub: true, @@ -11089,7 +10143,6 @@ if (typeof arg !== 'function') { return; } - if (document.readyState !== 'complete') { window.addEventListener('load', function () { setTimeout(arg(window.Didomi)); @@ -11100,7 +10153,6 @@ } }; window.didomiOnReady = window.didomiOnReady || didomiOnReadyWrapper; - if (Array.isArray(window.didomiOnReady)) { window.didomiOnReady.forEach(function (arg) { if (typeof arg === 'function') { @@ -11112,13 +10164,13 @@ } }); } - hit(source); } DidomiLoader.names = ['didomi-loader']; DidomiLoader.injections = [hit, noopFunc, noopArray, trueFunc, falseFunc]; /* eslint-disable func-names */ + /** * @redirect prebid * @@ -11142,7 +10194,6 @@ } } }; - var pbjsWrapper = { addAdUnits: function addAdUnits() {}, adServers: { @@ -11182,6 +10233,7 @@ Prebid.injections = [hit, noopFunc, noopStr, noopArray]; /* eslint-disable func-names */ + /** * @redirect prebid-ads * @@ -11195,7 +10247,6 @@ * ||playerdrive.me/assets/js/prebid-ads.js$script,redirect=prebid-ads * ``` */ - function prebidAds(source) { window.canRunAds = true; window.isAdBlockActive = false; @@ -11205,6 +10256,7 @@ prebidAds.injections = [hit]; /* eslint-disable func-names */ + /** * @redirect naver-wcslog * @@ -11262,7 +10314,6 @@ throw new TypeError("Cannot call a class as a function"); } } - var classCallCheck = _classCallCheck; function _defineProperties(target, props) { @@ -11274,58 +10325,45 @@ Object.defineProperty(target, descriptor.key, descriptor); } } - function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - var createClass = _createClass; function isNothing(subject) { return typeof subject === 'undefined' || subject === null; } - function isObject(subject) { return typeof subject === 'object' && subject !== null; } - function toArray(sequence) { if (Array.isArray(sequence)) return sequence;else if (isNothing(sequence)) return []; return [sequence]; } - function extend(target, source) { var index, length, key, sourceKeys; - if (source) { sourceKeys = Object.keys(source); - for (index = 0, length = sourceKeys.length; index < length; index += 1) { key = sourceKeys[index]; target[key] = source[key]; } } - return target; } - function repeat(string, count) { var result = '', - cycle; - + cycle; for (cycle = 0; cycle < count; cycle += 1) { result += string; } - return result; } - function isNegativeZero(number) { return number === 0 && Number.NEGATIVE_INFINITY === 1 / number; } - var isNothing_1 = isNothing; var isObject_1 = isObject; var toArray_1 = toArray; @@ -11349,8 +10387,9 @@ this.name = 'YAMLException'; this.reason = reason; this.mark = mark; - this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : ''); // Include stack trace in error object + this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : ''); + // Include stack trace in error object if (Error.captureStackTrace) { // Chrome and NodeJS Error.captureStackTrace(this, this.constructor); @@ -11358,23 +10397,19 @@ // FF, IE 10+ and Safari 6+. Fallback for others this.stack = new Error().stack || ''; } - } // Inherit from Error - + } + // Inherit from Error YAMLException$1.prototype = Object.create(Error.prototype); YAMLException$1.prototype.constructor = YAMLException$1; - YAMLException$1.prototype.toString = function toString(compact) { var result = this.name + ': '; result += this.reason || '(unknown reason)'; - if (!compact && this.mark) { result += ' ' + this.mark.toString(); } - return result; }; - var exception = YAMLException$1; function Mark(name, buffer, position, line, column) { @@ -11384,7 +10419,6 @@ this.line = line; this.column = column; } - Mark.prototype.getSnippet = function getSnippet(indent, maxLength) { var head, start, tail, end, snippet; if (!this.buffer) return null; @@ -11392,63 +10426,48 @@ maxLength = maxLength || 75; head = ''; start = this.position; - while (start > 0 && "\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(start - 1)) === -1) { start -= 1; - if (this.position - start > maxLength / 2 - 1) { head = ' ... '; start += 5; break; } } - tail = ''; end = this.position; - while (end < this.buffer.length && "\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(end)) === -1) { end += 1; - if (end - this.position > maxLength / 2 - 1) { tail = ' ... '; end -= 5; break; } } - snippet = this.buffer.slice(start, end); return common.repeat(' ', indent) + head + snippet + tail + '\n' + common.repeat(' ', indent + this.position - start + head.length) + '^'; }; - Mark.prototype.toString = function toString(compact) { var snippet, - where = ''; - + where = ''; if (this.name) { where += 'in "' + this.name + '" '; } - where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1); - if (!compact) { snippet = this.getSnippet(); - if (snippet) { where += ':\n' + snippet; } } - return where; }; - var mark = Mark; var TYPE_CONSTRUCTOR_OPTIONS = ['kind', 'resolve', 'construct', 'instanceOf', 'predicate', 'represent', 'defaultStyle', 'styleAliases']; var YAML_NODE_KINDS = ['scalar', 'sequence', 'mapping']; - function compileStyleAliases(map) { var result = {}; - if (map !== null) { Object.keys(map).forEach(function (style) { map[style].forEach(function (alias) { @@ -11456,45 +10475,38 @@ }); }); } - return result; } - function Type$1(tag, options) { options = options || {}; Object.keys(options).forEach(function (name) { if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); } - }); // TODO: Add tag format check. + }); + // TODO: Add tag format check. this.tag = tag; this.kind = options['kind'] || null; - this.resolve = options['resolve'] || function () { return true; }; - this.construct = options['construct'] || function (data) { return data; }; - this.instanceOf = options['instanceOf'] || null; this.predicate = options['predicate'] || null; this.represent = options['represent'] || null; this.defaultStyle = options['defaultStyle'] || null; this.styleAliases = compileStyleAliases(options['styleAliases'] || null); - if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); } } - var type = Type$1; /*eslint-disable max-len*/ - function compileList(schema, name, result) { var exclude = []; schema.include.forEach(function (includedSchema) { @@ -11512,30 +10524,24 @@ return exclude.indexOf(index) === -1; }); } - - function compileMap() - /* lists... */ - { + function compileMap( /* lists... */ + ) { var result = { - scalar: {}, - sequence: {}, - mapping: {}, - fallback: {} - }, - index, - length; - + scalar: {}, + sequence: {}, + mapping: {}, + fallback: {} + }, + index, + length; function collectType(type) { result[type.kind][type.tag] = result['fallback'][type.tag] = type; } - for (index = 0, length = arguments.length; index < length; index += 1) { arguments[index].forEach(collectType); } - return result; } - function Schema$1(definition) { this.include = definition.include || []; this.implicit = definition.implicit || []; @@ -11549,48 +10555,38 @@ this.compiledExplicit = compileList(this, 'explicit', []); this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit); } - Schema$1.DEFAULT = null; - Schema$1.create = function createSchema() { var schemas, types; - switch (arguments.length) { case 1: schemas = Schema$1.DEFAULT; types = arguments[0]; break; - case 2: schemas = arguments[0]; types = arguments[1]; break; - default: throw new exception('Wrong number of arguments for Schema.create function'); } - schemas = common.toArray(schemas); types = common.toArray(types); - if (!schemas.every(function (schema) { return schema instanceof Schema$1; })) { throw new exception('Specified list of super schemas (or a single Schema object) contains a non-Schema object.'); } - if (!types.every(function (type$1) { return type$1 instanceof type; })) { throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.'); } - return new Schema$1({ include: schemas, explicit: types }); }; - var schema = Schema$1; var str = new type('tag:yaml.org,2002:str', { @@ -11623,15 +10619,12 @@ var max = data.length; return max === 1 && data === '~' || max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'); } - function constructYamlNull() { return null; } - function isNull(object) { return object === null; } - var _null = new type('tag:yaml.org,2002:null', { kind: 'scalar', resolve: resolveYamlNull, @@ -11659,15 +10652,12 @@ var max = data.length; return max === 4 && (data === 'true' || data === 'True' || data === 'TRUE') || max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'); } - function constructYamlBoolean(data) { return data === 'true' || data === 'True' || data === 'TRUE'; } - function isBoolean(object) { return Object.prototype.toString.call(object) === '[object Boolean]'; } - var bool = new type('tag:yaml.org,2002:bool', { kind: 'scalar', resolve: resolveYamlBoolean, @@ -11688,145 +10678,114 @@ }); function isHexCode(c) { - return 0x30 - /* 0 */ - <= c && c <= 0x39 - /* 9 */ - || 0x41 - /* A */ - <= c && c <= 0x46 - /* F */ - || 0x61 - /* a */ - <= c && c <= 0x66 - /* f */ - ; + return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */ || 0x41 /* A */ <= c && c <= 0x46 /* F */ || 0x61 /* a */ <= c && c <= 0x66 /* f */; } function isOctCode(c) { - return 0x30 - /* 0 */ - <= c && c <= 0x37 - /* 7 */ - ; + return 0x30 /* 0 */ <= c && c <= 0x37 /* 7 */; } function isDecCode(c) { - return 0x30 - /* 0 */ - <= c && c <= 0x39 - /* 9 */ - ; + return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */; } function resolveYamlInteger(data) { if (data === null) return false; var max = data.length, - index = 0, - hasDigits = false, - ch; + index = 0, + hasDigits = false, + ch; if (!max) return false; - ch = data[index]; // sign + ch = data[index]; + // sign if (ch === '-' || ch === '+') { ch = data[++index]; } - if (ch === '0') { // 0 if (index + 1 === max) return true; - ch = data[++index]; // base 2, base 8, base 16 + ch = data[++index]; + + // base 2, base 8, base 16 if (ch === 'b') { // base 2 index++; - for (; index < max; index++) { ch = data[index]; if (ch === '_') continue; if (ch !== '0' && ch !== '1') return false; hasDigits = true; } - return hasDigits && ch !== '_'; } - if (ch === 'x') { // base 16 index++; - for (; index < max; index++) { ch = data[index]; if (ch === '_') continue; if (!isHexCode(data.charCodeAt(index))) return false; hasDigits = true; } - return hasDigits && ch !== '_'; - } // base 8 - + } + // base 8 for (; index < max; index++) { ch = data[index]; if (ch === '_') continue; if (!isOctCode(data.charCodeAt(index))) return false; hasDigits = true; } - return hasDigits && ch !== '_'; - } // base 10 (except 0) or base 60 - // value should not start with `_`; + } + // base 10 (except 0) or base 60 + // value should not start with `_`; if (ch === '_') return false; - for (; index < max; index++) { ch = data[index]; if (ch === '_') continue; if (ch === ':') break; - if (!isDecCode(data.charCodeAt(index))) { return false; } - hasDigits = true; - } // Should have digits and should not end with `_` - + } - if (!hasDigits || ch === '_') return false; // if !base60 - done; + // Should have digits and should not end with `_` + if (!hasDigits || ch === '_') return false; - if (ch !== ':') return true; // base60 almost not used, no needs to optimize + // if !base60 - done; + if (ch !== ':') return true; + // base60 almost not used, no needs to optimize return /^(:[0-5]?[0-9])+$/.test(data.slice(index)); } - function constructYamlInteger(data) { var value = data, - sign = 1, - ch, - base, - digits = []; - + sign = 1, + ch, + base, + digits = []; if (value.indexOf('_') !== -1) { value = value.replace(/_/g, ''); } - ch = value[0]; - if (ch === '-' || ch === '+') { if (ch === '-') sign = -1; value = value.slice(1); ch = value[0]; } - if (value === '0') return 0; - if (ch === '0') { if (value[1] === 'b') return sign * parseInt(value.slice(2), 2); if (value[1] === 'x') return sign * parseInt(value, 16); return sign * parseInt(value, 8); } - if (value.indexOf(':') !== -1) { value.split(':').forEach(function (v) { digits.unshift(parseInt(v, 10)); @@ -11839,14 +10798,11 @@ }); return sign * value; } - return sign * parseInt(value, 10); } - function isInteger(object) { return Object.prototype.toString.call(object) === '[object Number]' && object % 1 === 0 && !common.isNegativeZero(object); } - var int = new type('tag:yaml.org,2002:int', { kind: 'scalar', resolve: resolveYamlInteger, @@ -11862,7 +10818,6 @@ decimal: function decimal(obj) { return obj.toString(10); }, - /* eslint-disable max-len */ hexadecimal: function hexadecimal(obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); @@ -11877,36 +10832,36 @@ } }); - var YAML_FLOAT_PATTERN = new RegExp( // 2.5e4, 2.5 and integers - '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' + // .2e4, .2 + var YAML_FLOAT_PATTERN = new RegExp( + // 2.5e4, 2.5 and integers + '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' + + // .2e4, .2 // special case, seems not from spec - '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' + // 20:59 - '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' + // .inf - '|[-+]?\\.(?:inf|Inf|INF)' + // .nan + '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' + + // 20:59 + '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' + + // .inf + '|[-+]?\\.(?:inf|Inf|INF)' + + // .nan '|\\.(?:nan|NaN|NAN))$'); - function resolveYamlFloat(data) { if (data === null) return false; - - if (!YAML_FLOAT_PATTERN.test(data) || // Quick hack to not allow integers end with `_` + if (!YAML_FLOAT_PATTERN.test(data) || + // Quick hack to not allow integers end with `_` // Probably should update regexp & check speed data[data.length - 1] === '_') { return false; } - return true; } - function constructYamlFloat(data) { var value, sign, base, digits; value = data.replace(/_/g, '').toLowerCase(); sign = value[0] === '-' ? -1 : 1; digits = []; - if ('+-'.indexOf(value[0]) >= 0) { value = value.slice(1); } - if (value === '.inf') { return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; } else if (value === '.nan') { @@ -11923,23 +10878,17 @@ }); return sign * value; } - return sign * parseFloat(value, 10); } - var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; - function representYamlFloat(object, style) { var res; - if (isNaN(object)) { switch (style) { case 'lowercase': return '.nan'; - case 'uppercase': return '.NAN'; - case 'camelcase': return '.NaN'; } @@ -11947,10 +10896,8 @@ switch (style) { case 'lowercase': return '.inf'; - case 'uppercase': return '.INF'; - case 'camelcase': return '.Inf'; } @@ -11958,27 +10905,24 @@ switch (style) { case 'lowercase': return '-.inf'; - case 'uppercase': return '-.INF'; - case 'camelcase': return '-.Inf'; } } else if (common.isNegativeZero(object)) { return '-0.0'; } + res = object.toString(10); - res = object.toString(10); // JS stringifier can build scientific format without dots: 5e-100, + // JS stringifier can build scientific format without dots: 5e-100, // while YAML requres dot: 5.e-100. Fix it with simple hack return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res; } - function isFloat(object) { return Object.prototype.toString.call(object) === '[object Number]' && (object % 1 !== 0 || common.isNegativeZero(object)); } - var float = new type('tag:yaml.org,2002:float', { kind: 'scalar', resolve: resolveYamlFloat, @@ -11997,19 +10941,30 @@ include: [json] }); - var YAML_DATE_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' + // [1] year - '-([0-9][0-9])' + // [2] month + var YAML_DATE_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' + + // [1] year + '-([0-9][0-9])' + + // [2] month '-([0-9][0-9])$'); // [3] day - var YAML_TIMESTAMP_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' + // [1] year - '-([0-9][0-9]?)' + // [2] month - '-([0-9][0-9]?)' + // [3] day - '(?:[Tt]|[ \\t]+)' + // ... - '([0-9][0-9]?)' + // [4] hour - ':([0-9][0-9])' + // [5] minute - ':([0-9][0-9])' + // [6] second - '(?:\\.([0-9]*))?' + // [7] fraction - '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour + var YAML_TIMESTAMP_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' + + // [1] year + '-([0-9][0-9]?)' + + // [2] month + '-([0-9][0-9]?)' + + // [3] day + '(?:[Tt]|[ \\t]+)' + + // ... + '([0-9][0-9]?)' + + // [4] hour + ':([0-9][0-9])' + + // [5] minute + ':([0-9][0-9])' + + // [6] second + '(?:\\.([0-9]*))?' + + // [7] fraction + '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + + // [8] tz [9] tz_sign [10] tz_hour '(?::([0-9][0-9]))?))?$'); // [11] tz_minute function resolveYamlTimestamp(data) { @@ -12018,70 +10973,62 @@ if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; return false; } - function constructYamlTimestamp(data) { var match, - year, - month, - day, - hour, - minute, - second, - fraction = 0, - delta = null, - tz_hour, - tz_minute, - date; + year, + month, + day, + hour, + minute, + second, + fraction = 0, + delta = null, + tz_hour, + tz_minute, + date; match = YAML_DATE_REGEXP.exec(data); if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); - if (match === null) throw new Error('Date resolve error'); // match: [1] year [2] month [3] day + if (match === null) throw new Error('Date resolve error'); + + // match: [1] year [2] month [3] day year = +match[1]; month = +match[2] - 1; // JS month starts with 0 - day = +match[3]; - if (!match[4]) { // no hour return new Date(Date.UTC(year, month, day)); - } // match: [4] hour [5] minute [6] second [7] fraction + } + // match: [4] hour [5] minute [6] second [7] fraction hour = +match[4]; minute = +match[5]; second = +match[6]; - if (match[7]) { fraction = match[7].slice(0, 3); - while (fraction.length < 3) { // milli-seconds fraction += '0'; } - fraction = +fraction; - } // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute + } + // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute if (match[9]) { tz_hour = +match[10]; tz_minute = +(match[11] || 0); delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds - if (match[9] === '-') delta = -delta; } - date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); if (delta) date.setTime(date.getTime() - delta); return date; } - - function representYamlTimestamp(object - /*, style*/ - ) { + function representYamlTimestamp(object /*, style*/) { return object.toISOString(); } - var timestamp = new type('tag:yaml.org,2002:timestamp', { kind: 'scalar', resolve: resolveYamlTimestamp, @@ -12093,7 +11040,6 @@ function resolveYamlMerge(data) { return data === '<<' || data === null; } - var merge = new type('tag:yaml.org,2002:merge', { kind: 'scalar', resolve: resolveYamlMerge @@ -12105,48 +11051,49 @@ /*eslint-disable no-bitwise*/ - var NodeBuffer; - try { // A trick for browserified version, to not include `Buffer` shim var _require$1 = commonjsRequire; NodeBuffer = _require$1('buffer').Buffer; - } catch (__) {} // [ 64, 65, 66 ] -> [ padding, CR, LF ] - + } catch (__) {} + // [ 64, 65, 66 ] -> [ padding, CR, LF ] var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r'; - function resolveYamlBinary(data) { if (data === null) return false; var code, - idx, - bitlen = 0, - max = data.length, - map = BASE64_MAP; // Convert one by one. + idx, + bitlen = 0, + max = data.length, + map = BASE64_MAP; + // Convert one by one. for (idx = 0; idx < max; idx++) { - code = map.indexOf(data.charAt(idx)); // Skip CR/LF + code = map.indexOf(data.charAt(idx)); - if (code > 64) continue; // Fail on illegal characters + // Skip CR/LF + if (code > 64) continue; + // Fail on illegal characters if (code < 0) return false; bitlen += 6; - } // If there are any bits left, source was corrupted - + } + // If there are any bits left, source was corrupted return bitlen % 8 === 0; } - function constructYamlBinary(data) { var idx, - tailbits, - input = data.replace(/[\r\n=]/g, ''), - // remove CR/LF & padding to simplify scan - max = input.length, - map = BASE64_MAP, - bits = 0, - result = []; // Collect by 6*4 bits (3 bytes) + tailbits, + input = data.replace(/[\r\n=]/g, ''), + // remove CR/LF & padding to simplify scan + max = input.length, + map = BASE64_MAP, + bits = 0, + result = []; + + // Collect by 6*4 bits (3 bytes) for (idx = 0; idx < max; idx++) { if (idx % 4 === 0 && idx) { @@ -12154,13 +11101,12 @@ result.push(bits >> 8 & 0xFF); result.push(bits & 0xFF); } - bits = bits << 6 | map.indexOf(input.charAt(idx)); - } // Dump tail + } + // Dump tail tailbits = max % 4 * 6; - if (tailbits === 0) { result.push(bits >> 16 & 0xFF); result.push(bits >> 8 & 0xFF); @@ -12170,26 +11116,24 @@ result.push(bits >> 2 & 0xFF); } else if (tailbits === 12) { result.push(bits >> 4 & 0xFF); - } // Wrap into Buffer for NodeJS and leave Array for browser - + } + // Wrap into Buffer for NodeJS and leave Array for browser if (NodeBuffer) { // Support node 6.+ Buffer API when available return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result); } - return result; } - - function representYamlBinary(object - /*, style*/ - ) { + function representYamlBinary(object /*, style*/) { var result = '', - bits = 0, - idx, - tail, - max = object.length, - map = BASE64_MAP; // Convert every three bytes to 4 ASCII characters. + bits = 0, + idx, + tail, + max = object.length, + map = BASE64_MAP; + + // Convert every three bytes to 4 ASCII characters. for (idx = 0; idx < max; idx++) { if (idx % 3 === 0 && idx) { @@ -12198,13 +11142,12 @@ result += map[bits >> 6 & 0x3F]; result += map[bits & 0x3F]; } - bits = (bits << 8) + object[idx]; - } // Dump tail + } + // Dump tail tail = max % 3; - if (tail === 0) { result += map[bits >> 18 & 0x3F]; result += map[bits >> 12 & 0x3F]; @@ -12221,14 +11164,11 @@ result += map[64]; result += map[64]; } - return result; } - function isBinary(object) { return NodeBuffer && NodeBuffer.isBuffer(object); } - var binary = new type('tag:yaml.org,2002:binary', { kind: 'scalar', resolve: resolveYamlBinary, @@ -12239,39 +11179,32 @@ var _hasOwnProperty$3 = Object.prototype.hasOwnProperty; var _toString$2 = Object.prototype.toString; - function resolveYamlOmap(data) { if (data === null) return true; var objectKeys = [], - index, - length, - pair, - pairKey, - pairHasKey, - object = data; - + index, + length, + pair, + pairKey, + pairHasKey, + object = data; for (index = 0, length = object.length; index < length; index += 1) { pair = object[index]; pairHasKey = false; if (_toString$2.call(pair) !== '[object Object]') return false; - for (pairKey in pair) { if (_hasOwnProperty$3.call(pair, pairKey)) { if (!pairHasKey) pairHasKey = true;else return false; } } - if (!pairHasKey) return false; if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);else return false; } - return true; } - function constructYamlOmap(data) { return data !== null ? data : []; } - var omap = new type('tag:yaml.org,2002:omap', { kind: 'sequence', resolve: resolveYamlOmap, @@ -12279,17 +11212,15 @@ }); var _toString$1 = Object.prototype.toString; - function resolveYamlPairs(data) { if (data === null) return true; var index, - length, - pair, - keys, - result, - object = data; + length, + pair, + keys, + result, + object = data; result = new Array(object.length); - for (index = 0, length = object.length; index < length; index += 1) { pair = object[index]; if (_toString$1.call(pair) !== '[object Object]') return false; @@ -12297,29 +11228,24 @@ if (keys.length !== 1) return false; result[index] = [keys[0], pair[keys[0]]]; } - return true; } - function constructYamlPairs(data) { if (data === null) return []; var index, - length, - pair, - keys, - result, - object = data; + length, + pair, + keys, + result, + object = data; result = new Array(object.length); - for (index = 0, length = object.length; index < length; index += 1) { pair = object[index]; keys = Object.keys(pair); result[index] = [keys[0], pair[keys[0]]]; } - return result; } - var pairs = new type('tag:yaml.org,2002:pairs', { kind: 'sequence', resolve: resolveYamlPairs, @@ -12327,25 +11253,20 @@ }); var _hasOwnProperty$2 = Object.prototype.hasOwnProperty; - function resolveYamlSet(data) { if (data === null) return true; var key, - object = data; - + object = data; for (key in object) { if (_hasOwnProperty$2.call(object, key)) { if (object[key] !== null) return false; } } - return true; } - function constructYamlSet(data) { return data !== null ? data : {}; } - var set = new type('tag:yaml.org,2002:set', { kind: 'mapping', resolve: resolveYamlSet, @@ -12361,20 +11282,16 @@ function resolveJavascriptUndefined() { return true; } - function constructJavascriptUndefined() { /*eslint-disable no-undefined*/ return undefined; } - function representJavascriptUndefined() { return ''; } - function isUndefined(object) { return typeof object === 'undefined'; } - var _undefined = new type('tag:yaml.org,2002:js/undefined', { kind: 'scalar', resolve: resolveJavascriptUndefined, @@ -12387,47 +11304,41 @@ if (data === null) return false; if (data.length === 0) return false; var regexp = data, - tail = /\/([gim]*)$/.exec(data), - modifiers = ''; // if regexp starts with '/' it can have modifiers and must be properly closed - // `/foo/gim` - modifiers tail can be maximum 3 chars + tail = /\/([gim]*)$/.exec(data), + modifiers = ''; + // if regexp starts with '/' it can have modifiers and must be properly closed + // `/foo/gim` - modifiers tail can be maximum 3 chars if (regexp[0] === '/') { if (tail) modifiers = tail[1]; - if (modifiers.length > 3) return false; // if expression starts with /, is should be properly terminated - + if (modifiers.length > 3) return false; + // if expression starts with /, is should be properly terminated if (regexp[regexp.length - modifiers.length - 1] !== '/') return false; } - return true; } - function constructJavascriptRegExp(data) { var regexp = data, - tail = /\/([gim]*)$/.exec(data), - modifiers = ''; // `/foo/gim` - tail can be maximum 4 chars + tail = /\/([gim]*)$/.exec(data), + modifiers = ''; + // `/foo/gim` - tail can be maximum 4 chars if (regexp[0] === '/') { if (tail) modifiers = tail[1]; regexp = regexp.slice(1, regexp.length - modifiers.length - 1); } - return new RegExp(regexp, modifiers); } - - function representJavascriptRegExp(object - /*, style*/ - ) { + function representJavascriptRegExp(object /*, style*/) { var result = '/' + object.source + '/'; if (object.global) result += 'g'; if (object.multiline) result += 'm'; if (object.ignoreCase) result += 'i'; return result; } - function isRegExp(object) { return Object.prototype.toString.call(object) === '[object RegExp]'; } - var regexp = new type('tag:yaml.org,2002:js/regexp', { kind: 'scalar', resolve: resolveJavascriptRegExp, @@ -12436,85 +11347,73 @@ represent: representJavascriptRegExp }); - var esprima; // Browserified version does not have esprima + var esprima; + + // Browserified version does not have esprima // // 1. For node.js just require module as deps // 2. For browser try to require mudule via external AMD system. // If not found - try to fallback to window.esprima. If not // found too - then fail to parse. // - try { // workaround to exclude package from browserify list. var _require = commonjsRequire; esprima = _require('esprima'); } catch (_) { /* eslint-disable no-redeclare */ - /* global window */ if (typeof window !== 'undefined') esprima = window.esprima; } - function resolveJavascriptFunction(data) { if (data === null) return false; - try { var source = '(' + data + ')', - ast = esprima.parse(source, { - range: true - }); - + ast = esprima.parse(source, { + range: true + }); if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') { return false; } - return true; } catch (err) { return false; } } - function constructJavascriptFunction(data) { /*jslint evil:true*/ - var source = '(' + data + ')', - ast = esprima.parse(source, { - range: true - }), - params = [], - body; + var source = '(' + data + ')', + ast = esprima.parse(source, { + range: true + }), + params = [], + body; if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') { throw new Error('Failed to resolve function'); } - ast.body[0].expression.params.forEach(function (param) { params.push(param.name); }); - body = ast.body[0].expression.body.range; // Esprima's ranges include the first '{' and the last '}' characters on - // function expressions. So cut them out. + body = ast.body[0].expression.body.range; + // Esprima's ranges include the first '{' and the last '}' characters on + // function expressions. So cut them out. if (ast.body[0].expression.body.type === 'BlockStatement') { /*eslint-disable no-new-func*/ return new Function(params, source.slice(body[0] + 1, body[1] - 1)); - } // ES6 arrow functions can omit the BlockStatement. In that case, just return + } + // ES6 arrow functions can omit the BlockStatement. In that case, just return // the body. - /*eslint-disable no-new-func*/ - - return new Function(params, 'return ' + source.slice(body[0], body[1])); } - - function representJavascriptFunction(object - /*, style*/ - ) { + function representJavascriptFunction(object /*, style*/) { return object.toString(); } - function isFunction(object) { return Object.prototype.toString.call(object) === '[object Function]'; } - var _function = new type('tag:yaml.org,2002:js/function', { kind: 'scalar', resolve: resolveJavascriptFunction, @@ -12530,7 +11429,6 @@ /*eslint-disable max-len,no-use-before-define*/ - var _hasOwnProperty$1 = Object.prototype.hasOwnProperty; var CONTEXT_FLOW_IN = 1; var CONTEXT_FLOW_OUT = 2; @@ -12544,173 +11442,74 @@ var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; - function _class(obj) { return Object.prototype.toString.call(obj); } - function is_EOL(c) { - return c === 0x0A - /* LF */ - || c === 0x0D - /* CR */ - ; + return c === 0x0A /* LF */ || c === 0x0D /* CR */; } function is_WHITE_SPACE(c) { - return c === 0x09 - /* Tab */ - || c === 0x20 - /* Space */ - ; + return c === 0x09 /* Tab */ || c === 0x20 /* Space */; } function is_WS_OR_EOL(c) { - return c === 0x09 - /* Tab */ - || c === 0x20 - /* Space */ - || c === 0x0A - /* LF */ - || c === 0x0D - /* CR */ - ; + return c === 0x09 /* Tab */ || c === 0x20 /* Space */ || c === 0x0A /* LF */ || c === 0x0D /* CR */; } function is_FLOW_INDICATOR(c) { - return c === 0x2C - /* , */ - || c === 0x5B - /* [ */ - || c === 0x5D - /* ] */ - || c === 0x7B - /* { */ - || c === 0x7D - /* } */ - ; + return c === 0x2C /* , */ || c === 0x5B /* [ */ || c === 0x5D /* ] */ || c === 0x7B /* { */ || c === 0x7D /* } */; } function fromHexCode(c) { var lc; - - if (0x30 - /* 0 */ - <= c && c <= 0x39 - /* 9 */ - ) { + if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) { return c - 0x30; } - /*eslint-disable no-bitwise*/ - + /*eslint-disable no-bitwise*/ lc = c | 0x20; - - if (0x61 - /* a */ - <= lc && lc <= 0x66 - /* f */ - ) { + if (0x61 /* a */ <= lc && lc <= 0x66 /* f */) { return lc - 0x61 + 10; } - return -1; } - function escapedHexLen(c) { - if (c === 0x78 - /* x */ - ) { - return 2; - } - - if (c === 0x75 - /* u */ - ) { - return 4; - } - - if (c === 0x55 - /* U */ - ) { - return 8; - } - - return 0; + if (c === 0x78 /* x */) { + return 2; + } + if (c === 0x75 /* u */) { + return 4; + } + if (c === 0x55 /* U */) { + return 8; + } + return 0; } - function fromDecimalCode(c) { - if (0x30 - /* 0 */ - <= c && c <= 0x39 - /* 9 */ - ) { + if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) { return c - 0x30; } - return -1; } - function simpleEscapeSequence(c) { /* eslint-disable indent */ - return c === 0x30 - /* 0 */ - ? '\x00' : c === 0x61 - /* a */ - ? '\x07' : c === 0x62 - /* b */ - ? '\x08' : c === 0x74 - /* t */ - ? '\x09' : c === 0x09 - /* Tab */ - ? '\x09' : c === 0x6E - /* n */ - ? '\x0A' : c === 0x76 - /* v */ - ? '\x0B' : c === 0x66 - /* f */ - ? '\x0C' : c === 0x72 - /* r */ - ? '\x0D' : c === 0x65 - /* e */ - ? '\x1B' : c === 0x20 - /* Space */ - ? ' ' : c === 0x22 - /* " */ - ? '\x22' : c === 0x2F - /* / */ - ? '/' : c === 0x5C - /* \ */ - ? '\x5C' : c === 0x4E - /* N */ - ? '\x85' : c === 0x5F - /* _ */ - ? '\xA0' : c === 0x4C - /* L */ - ? "\u2028" : c === 0x50 - /* P */ - ? "\u2029" : ''; + return c === 0x30 /* 0 */ ? '\x00' : c === 0x61 /* a */ ? '\x07' : c === 0x62 /* b */ ? '\x08' : c === 0x74 /* t */ ? '\x09' : c === 0x09 /* Tab */ ? '\x09' : c === 0x6E /* n */ ? '\x0A' : c === 0x76 /* v */ ? '\x0B' : c === 0x66 /* f */ ? '\x0C' : c === 0x72 /* r */ ? '\x0D' : c === 0x65 /* e */ ? '\x1B' : c === 0x20 /* Space */ ? ' ' : c === 0x22 /* " */ ? '\x22' : c === 0x2F /* / */ ? '/' : c === 0x5C /* \ */ ? '\x5C' : c === 0x4E /* N */ ? '\x85' : c === 0x5F /* _ */ ? '\xA0' : c === 0x4C /* L */ ? "\u2028" : c === 0x50 /* P */ ? "\u2029" : ''; } - function charFromCodepoint(c) { if (c <= 0xFFFF) { return String.fromCharCode(c); - } // Encode UTF-16 surrogate pair + } + // Encode UTF-16 surrogate pair // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF - - return String.fromCharCode((c - 0x010000 >> 10) + 0xD800, (c - 0x010000 & 0x03FF) + 0xDC00); } - var simpleEscapeCheck = new Array(256); // integer, for fast access - var simpleEscapeMap = new Array(256); - for (var i = 0; i < 256; i++) { simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; simpleEscapeMap[i] = simpleEscapeSequence(i); } - function State$1(input, options) { this.input = input; this.filename = options['filename'] || null; @@ -12727,6 +11526,7 @@ this.lineStart = 0; this.lineIndent = 0; this.documents = []; + /* this.version; this.checkLineBreaks; @@ -12741,85 +11541,64 @@ function generateError(state, message) { return new exception(message, new mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart)); } - function throwError(state, message) { throw generateError(state, message); } - function throwWarning(state, message) { if (state.onWarning) { state.onWarning.call(null, generateError(state, message)); } } - var directiveHandlers = { YAML: function handleYamlDirective(state, name, args) { var match, major, minor; - if (state.version !== null) { throwError(state, 'duplication of %YAML directive'); } - if (args.length !== 1) { throwError(state, 'YAML directive accepts exactly one argument'); } - match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); - if (match === null) { throwError(state, 'ill-formed argument of the YAML directive'); } - major = parseInt(match[1], 10); minor = parseInt(match[2], 10); - if (major !== 1) { throwError(state, 'unacceptable YAML version of the document'); } - state.version = args[0]; state.checkLineBreaks = minor < 2; - if (minor !== 1 && minor !== 2) { throwWarning(state, 'unsupported YAML version of the document'); } }, TAG: function handleTagDirective(state, name, args) { var handle, prefix; - if (args.length !== 2) { throwError(state, 'TAG directive accepts exactly two arguments'); } - handle = args[0]; prefix = args[1]; - if (!PATTERN_TAG_HANDLE.test(handle)) { throwError(state, 'ill-formed tag handle (first argument) of the TAG directive'); } - if (_hasOwnProperty$1.call(state.tagMap, handle)) { throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); } - if (!PATTERN_TAG_URI.test(prefix)) { throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive'); } - state.tagMap[handle] = prefix; } }; - function captureSegment(state, start, end, checkJson) { var _position, _length, _character, _result; - if (start < end) { _result = state.input.slice(start, end); - if (checkJson) { for (_position = 0, _length = _result.length; _position < _length; _position += 1) { _character = _result.charCodeAt(_position); - if (!(_character === 0x09 || 0x20 <= _character && _character <= 0x10FFFF)) { throwError(state, 'expected valid JSON character'); } @@ -12827,62 +11606,51 @@ } else if (PATTERN_NON_PRINTABLE.test(_result)) { throwError(state, 'the stream contains non-printable characters'); } - state.result += _result; } } - function mergeMappings(state, destination, source, overridableKeys) { var sourceKeys, key, index, quantity; - if (!common.isObject(source)) { throwError(state, 'cannot merge mappings; the provided source object is unacceptable'); } - sourceKeys = Object.keys(source); - for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { key = sourceKeys[index]; - if (!_hasOwnProperty$1.call(destination, key)) { destination[key] = source[key]; overridableKeys[key] = true; } } } - function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) { - var index, quantity; // The output is a plain object here, so keys can only be strings. + var index, quantity; + + // The output is a plain object here, so keys can only be strings. // We need to convert keyNode to a string, but doing so can hang the process // (deeply nested arrays that explode exponentially using aliases). - if (Array.isArray(keyNode)) { keyNode = Array.prototype.slice.call(keyNode); - for (index = 0, quantity = keyNode.length; index < quantity; index += 1) { if (Array.isArray(keyNode[index])) { throwError(state, 'nested arrays are not supported inside keys'); } - if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') { keyNode[index] = '[object Object]'; } } - } // Avoid code execution in load() via toString property + } + + // Avoid code execution in load() via toString property // (still use its own toString for arrays, timestamps, // and whatever user schema extensions happen to have @@toStringTag) - - if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') { keyNode = '[object Object]'; } - keyNode = String(keyNode); - if (_result === null) { _result = {}; } - if (keyTag === 'tag:yaml.org,2002:merge') { if (Array.isArray(valueNode)) { for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { @@ -12897,70 +11665,45 @@ state.position = startPos || state.position; throwError(state, 'duplicated mapping key'); } - _result[keyNode] = valueNode; delete overridableKeys[keyNode]; } - return _result; } - function readLineBreak(state) { var ch; ch = state.input.charCodeAt(state.position); - - if (ch === 0x0A - /* LF */ - ) { - state.position++; - } else if (ch === 0x0D - /* CR */ - ) { + if (ch === 0x0A /* LF */) { + state.position++; + } else if (ch === 0x0D /* CR */) { + state.position++; + if (state.input.charCodeAt(state.position) === 0x0A /* LF */) { state.position++; - - if (state.input.charCodeAt(state.position) === 0x0A - /* LF */ - ) { - state.position++; - } - } else { + } + } else { throwError(state, 'a line break is expected'); } - state.line += 1; state.lineStart = state.position; } - function skipSeparationSpace(state, allowComments, checkIndent) { var lineBreaks = 0, - ch = state.input.charCodeAt(state.position); - + ch = state.input.charCodeAt(state.position); while (ch !== 0) { while (is_WHITE_SPACE(ch)) { ch = state.input.charCodeAt(++state.position); } - - if (allowComments && ch === 0x23 - /* # */ - ) { - do { - ch = state.input.charCodeAt(++state.position); - } while (ch !== 0x0A - /* LF */ - && ch !== 0x0D - /* CR */ - && ch !== 0); - } - + if (allowComments && ch === 0x23 /* # */) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0x0A /* LF */ && ch !== 0x0D /* CR */ && ch !== 0); + } if (is_EOL(ch)) { readLineBreak(state); ch = state.input.charCodeAt(state.position); lineBreaks++; state.lineIndent = 0; - - while (ch === 0x20 - /* Space */ - ) { + while (ch === 0x20 /* Space */) { state.lineIndent++; ch = state.input.charCodeAt(++state.position); } @@ -12968,36 +11711,27 @@ break; } } - if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { throwWarning(state, 'deficient indentation'); } - return lineBreaks; } - function testDocumentSeparator(state) { var _position = state.position, - ch; - ch = state.input.charCodeAt(_position); // Condition state.position === state.lineStart is tested - // in parent on each call, for efficiency. No needs to test here again. + ch; + ch = state.input.charCodeAt(_position); - if ((ch === 0x2D - /* - */ - || ch === 0x2E - /* . */ - ) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) { + // Condition state.position === state.lineStart is tested + // in parent on each call, for efficiency. No needs to test here again. + if ((ch === 0x2D /* - */ || ch === 0x2E /* . */) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) { _position += 3; ch = state.input.charCodeAt(_position); - if (ch === 0 || is_WS_OR_EOL(ch)) { return true; } } - return false; } - function writeFoldedLines(state, count) { if (count === 1) { state.result += ' '; @@ -13005,90 +11739,50 @@ state.result += common.repeat('\n', count - 1); } } - function readPlainScalar(state, nodeIndent, withinFlowCollection) { var preceding, - following, - captureStart, - captureEnd, - hasPendingContent, - _line, - _lineStart, - _lineIndent, - _kind = state.kind, - _result = state.result, - ch; - + following, + captureStart, + captureEnd, + hasPendingContent, + _line, + _lineStart, + _lineIndent, + _kind = state.kind, + _result = state.result, + ch; ch = state.input.charCodeAt(state.position); - - if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 0x23 - /* # */ - || ch === 0x26 - /* & */ - || ch === 0x2A - /* * */ - || ch === 0x21 - /* ! */ - || ch === 0x7C - /* | */ - || ch === 0x3E - /* > */ - || ch === 0x27 - /* ' */ - || ch === 0x22 - /* " */ - || ch === 0x25 - /* % */ - || ch === 0x40 - /* @ */ - || ch === 0x60 - /* ` */ - ) { + if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 0x23 /* # */ || ch === 0x26 /* & */ || ch === 0x2A /* * */ || ch === 0x21 /* ! */ || ch === 0x7C /* | */ || ch === 0x3E /* > */ || ch === 0x27 /* ' */ || ch === 0x22 /* " */ || ch === 0x25 /* % */ || ch === 0x40 /* @ */ || ch === 0x60 /* ` */) { + return false; + } + if (ch === 0x3F /* ? */ || ch === 0x2D /* - */) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { return false; } - - if (ch === 0x3F - /* ? */ - || ch === 0x2D - /* - */ - ) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { - return false; - } - } - + } state.kind = 'scalar'; state.result = ''; captureStart = captureEnd = state.position; hasPendingContent = false; - while (ch !== 0) { - if (ch === 0x3A - /* : */ - ) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { - break; - } - } else if (ch === 0x23 - /* # */ - ) { - preceding = state.input.charCodeAt(state.position - 1); - - if (is_WS_OR_EOL(preceding)) { - break; - } - } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) { + if (ch === 0x3A /* : */) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { + break; + } + } else if (ch === 0x23 /* # */) { + preceding = state.input.charCodeAt(state.position - 1); + if (is_WS_OR_EOL(preceding)) { + break; + } + } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) { break; } else if (is_EOL(ch)) { _line = state.line; _lineStart = state.lineStart; _lineIndent = state.lineIndent; skipSeparationSpace(state, false, -1); - if (state.lineIndent >= nodeIndent) { hasPendingContent = true; ch = state.input.charCodeAt(state.position); @@ -13101,64 +11795,47 @@ break; } } - if (hasPendingContent) { captureSegment(state, captureStart, captureEnd, false); writeFoldedLines(state, state.line - _line); captureStart = captureEnd = state.position; hasPendingContent = false; } - if (!is_WHITE_SPACE(ch)) { captureEnd = state.position + 1; } - ch = state.input.charCodeAt(++state.position); } - captureSegment(state, captureStart, captureEnd, false); - if (state.result) { return true; } - state.kind = _kind; state.result = _result; return false; } - function readSingleQuotedScalar(state, nodeIndent) { var ch, captureStart, captureEnd; ch = state.input.charCodeAt(state.position); - - if (ch !== 0x27 - /* ' */ - ) { - return false; - } - + if (ch !== 0x27 /* ' */) { + return false; + } state.kind = 'scalar'; state.result = ''; state.position++; captureStart = captureEnd = state.position; - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 0x27 - /* ' */ - ) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); - - if (ch === 0x27 - /* ' */ - ) { - captureStart = state.position; - state.position++; - captureEnd = state.position; - } else { - return true; - } - } else if (is_EOL(ch)) { + if (ch === 0x27 /* ' */) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + if (ch === 0x27 /* ' */) { + captureStart = state.position; + state.position++; + captureEnd = state.position; + } else { + return true; + } + } else if (is_EOL(ch)) { captureSegment(state, captureStart, captureEnd, true); writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); captureStart = captureEnd = state.position; @@ -13169,65 +11846,51 @@ captureEnd = state.position; } } - throwError(state, 'unexpected end of the stream within a single quoted scalar'); } - function readDoubleQuotedScalar(state, nodeIndent) { var captureStart, captureEnd, hexLength, hexResult, tmp, ch; ch = state.input.charCodeAt(state.position); - - if (ch !== 0x22 - /* " */ - ) { - return false; - } - + if (ch !== 0x22 /* " */) { + return false; + } state.kind = 'scalar'; state.result = ''; state.position++; captureStart = captureEnd = state.position; - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 0x22 - /* " */ - ) { - captureSegment(state, captureStart, state.position, true); - state.position++; - return true; - } else if (ch === 0x5C - /* \ */ - ) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); - - if (is_EOL(ch)) { - skipSeparationSpace(state, false, nodeIndent); // TODO: rework to inline fn with no type cast? - } else if (ch < 256 && simpleEscapeCheck[ch]) { - state.result += simpleEscapeMap[ch]; - state.position++; - } else if ((tmp = escapedHexLen(ch)) > 0) { - hexLength = tmp; - hexResult = 0; - - for (; hexLength > 0; hexLength--) { - ch = state.input.charCodeAt(++state.position); + if (ch === 0x22 /* " */) { + captureSegment(state, captureStart, state.position, true); + state.position++; + return true; + } else if (ch === 0x5C /* \ */) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + if (is_EOL(ch)) { + skipSeparationSpace(state, false, nodeIndent); - if ((tmp = fromHexCode(ch)) >= 0) { - hexResult = (hexResult << 4) + tmp; - } else { - throwError(state, 'expected hexadecimal character'); - } + // TODO: rework to inline fn with no type cast? + } else if (ch < 256 && simpleEscapeCheck[ch]) { + state.result += simpleEscapeMap[ch]; + state.position++; + } else if ((tmp = escapedHexLen(ch)) > 0) { + hexLength = tmp; + hexResult = 0; + for (; hexLength > 0; hexLength--) { + ch = state.input.charCodeAt(++state.position); + if ((tmp = fromHexCode(ch)) >= 0) { + hexResult = (hexResult << 4) + tmp; + } else { + throwError(state, 'expected hexadecimal character'); } - - state.result += charFromCodepoint(hexResult); - state.position++; - } else { - throwError(state, 'unknown escape sequence'); } - - captureStart = captureEnd = state.position; - } else if (is_EOL(ch)) { + state.result += charFromCodepoint(hexResult); + state.position++; + } else { + throwError(state, 'unknown escape sequence'); + } + captureStart = captureEnd = state.position; + } else if (is_EOL(ch)) { captureSegment(state, captureStart, captureEnd, true); writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); captureStart = captureEnd = state.position; @@ -13238,59 +11901,43 @@ captureEnd = state.position; } } - throwError(state, 'unexpected end of the stream within a double quoted scalar'); } - function readFlowCollection(state, nodeIndent) { var readNext = true, - _line, - _tag = state.tag, - _result, - _anchor = state.anchor, - following, - terminator, - isPair, - isExplicitPair, - isMapping, - overridableKeys = {}, - keyNode, - keyTag, - valueNode, - ch; - + _line, + _tag = state.tag, + _result, + _anchor = state.anchor, + following, + terminator, + isPair, + isExplicitPair, + isMapping, + overridableKeys = {}, + keyNode, + keyTag, + valueNode, + ch; ch = state.input.charCodeAt(state.position); - - if (ch === 0x5B - /* [ */ - ) { - terminator = 0x5D; - /* ] */ - - isMapping = false; - _result = []; - } else if (ch === 0x7B - /* { */ - ) { - terminator = 0x7D; - /* } */ - - isMapping = true; - _result = {}; - } else { + if (ch === 0x5B /* [ */) { + terminator = 0x5D; /* ] */ + isMapping = false; + _result = []; + } else if (ch === 0x7B /* { */) { + terminator = 0x7D; /* } */ + isMapping = true; + _result = {}; + } else { return false; } - if (state.anchor !== null) { state.anchorMap[state.anchor] = _result; } - ch = state.input.charCodeAt(++state.position); - while (ch !== 0) { skipSeparationSpace(state, true, nodeIndent); ch = state.input.charCodeAt(state.position); - if (ch === terminator) { state.position++; state.tag = _tag; @@ -13301,39 +11948,29 @@ } else if (!readNext) { throwError(state, 'missed comma between flow collection entries'); } - keyTag = keyNode = valueNode = null; isPair = isExplicitPair = false; - - if (ch === 0x3F - /* ? */ - ) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following)) { - isPair = isExplicitPair = true; - state.position++; - skipSeparationSpace(state, true, nodeIndent); - } + if (ch === 0x3F /* ? */) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following)) { + isPair = isExplicitPair = true; + state.position++; + skipSeparationSpace(state, true, nodeIndent); } - + } _line = state.line; composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); keyTag = state.tag; keyNode = state.result; skipSeparationSpace(state, true, nodeIndent); ch = state.input.charCodeAt(state.position); - - if ((isExplicitPair || state.line === _line) && ch === 0x3A - /* : */ - ) { - isPair = true; - ch = state.input.charCodeAt(++state.position); - skipSeparationSpace(state, true, nodeIndent); - composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); - valueNode = state.result; - } - + if ((isExplicitPair || state.line === _line) && ch === 0x3A /* : */) { + isPair = true; + ch = state.input.charCodeAt(++state.position); + skipSeparationSpace(state, true, nodeIndent); + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + valueNode = state.result; + } if (isMapping) { storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode); } else if (isPair) { @@ -13341,67 +11978,47 @@ } else { _result.push(keyNode); } - skipSeparationSpace(state, true, nodeIndent); ch = state.input.charCodeAt(state.position); - - if (ch === 0x2C - /* , */ - ) { - readNext = true; - ch = state.input.charCodeAt(++state.position); - } else { + if (ch === 0x2C /* , */) { + readNext = true; + ch = state.input.charCodeAt(++state.position); + } else { readNext = false; } } - throwError(state, 'unexpected end of the stream within a flow collection'); } - function readBlockScalar(state, nodeIndent) { var captureStart, - folding, - chomping = CHOMPING_CLIP, - didReadContent = false, - detectedIndent = false, - textIndent = nodeIndent, - emptyLines = 0, - atMoreIndented = false, - tmp, - ch; + folding, + chomping = CHOMPING_CLIP, + didReadContent = false, + detectedIndent = false, + textIndent = nodeIndent, + emptyLines = 0, + atMoreIndented = false, + tmp, + ch; ch = state.input.charCodeAt(state.position); - - if (ch === 0x7C - /* | */ - ) { - folding = false; - } else if (ch === 0x3E - /* > */ - ) { - folding = true; - } else { + if (ch === 0x7C /* | */) { + folding = false; + } else if (ch === 0x3E /* > */) { + folding = true; + } else { return false; } - state.kind = 'scalar'; state.result = ''; - while (ch !== 0) { ch = state.input.charCodeAt(++state.position); - - if (ch === 0x2B - /* + */ - || ch === 0x2D - /* - */ - ) { - if (CHOMPING_CLIP === chomping) { - chomping = ch === 0x2B - /* + */ - ? CHOMPING_KEEP : CHOMPING_STRIP; - } else { - throwError(state, 'repeat of a chomping mode identifier'); - } - } else if ((tmp = fromDecimalCode(ch)) >= 0) { + if (ch === 0x2B /* + */ || ch === 0x2D /* - */) { + if (CHOMPING_CLIP === chomping) { + chomping = ch === 0x2B /* + */ ? CHOMPING_KEEP : CHOMPING_STRIP; + } else { + throwError(state, 'repeat of a chomping mode identifier'); + } + } else if ((tmp = fromDecimalCode(ch)) >= 0) { if (tmp === 0) { throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one'); } else if (!detectedIndent) { @@ -13414,43 +12031,33 @@ break; } } - if (is_WHITE_SPACE(ch)) { do { ch = state.input.charCodeAt(++state.position); } while (is_WHITE_SPACE(ch)); - - if (ch === 0x23 - /* # */ - ) { - do { - ch = state.input.charCodeAt(++state.position); - } while (!is_EOL(ch) && ch !== 0); - } + if (ch === 0x23 /* # */) { + do { + ch = state.input.charCodeAt(++state.position); + } while (!is_EOL(ch) && ch !== 0); + } } - while (ch !== 0) { readLineBreak(state); state.lineIndent = 0; ch = state.input.charCodeAt(state.position); - - while ((!detectedIndent || state.lineIndent < textIndent) && ch === 0x20 - /* Space */ - ) { + while ((!detectedIndent || state.lineIndent < textIndent) && ch === 0x20 /* Space */) { state.lineIndent++; ch = state.input.charCodeAt(++state.position); } - if (!detectedIndent && state.lineIndent > textIndent) { textIndent = state.lineIndent; } - if (is_EOL(ch)) { emptyLines++; continue; - } // End of the scalar. - + } + // End of the scalar. if (state.lineIndent < textIndent) { // Perform the chomping. if (chomping === CHOMPING_KEEP) { @@ -13460,107 +12067,93 @@ // i.e. only if the scalar is not empty. state.result += '\n'; } - } // Break this `while` cycle and go to the funciton's epilogue. - + } + // Break this `while` cycle and go to the funciton's epilogue. break; - } // Folded style: use fancy rules to handle line breaks. - + } + // Folded style: use fancy rules to handle line breaks. if (folding) { // Lines starting with white space characters (more-indented lines) are not folded. if (is_WHITE_SPACE(ch)) { - atMoreIndented = true; // except for the first content line (cf. Example 8.1) + atMoreIndented = true; + // except for the first content line (cf. Example 8.1) + state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); // End of more-indented block. + // End of more-indented block. } else if (atMoreIndented) { atMoreIndented = false; - state.result += common.repeat('\n', emptyLines + 1); // Just one line break - perceive as the same line. + state.result += common.repeat('\n', emptyLines + 1); + + // Just one line break - perceive as the same line. } else if (emptyLines === 0) { if (didReadContent) { // i.e. only if we have already read some scalar content. state.result += ' '; - } // Several line breaks - perceive as different lines. + } + // Several line breaks - perceive as different lines. } else { state.result += common.repeat('\n', emptyLines); - } // Literal style: just add exact number of line breaks between content lines. + } + // Literal style: just add exact number of line breaks between content lines. } else { // Keep all line breaks except the header line break. state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); } - didReadContent = true; detectedIndent = true; emptyLines = 0; captureStart = state.position; - while (!is_EOL(ch) && ch !== 0) { ch = state.input.charCodeAt(++state.position); } - captureSegment(state, captureStart, state.position, false); } - return true; } - function readBlockSequence(state, nodeIndent) { var _line, - _tag = state.tag, - _anchor = state.anchor, - _result = [], - following, - detected = false, - ch; - + _tag = state.tag, + _anchor = state.anchor, + _result = [], + following, + detected = false, + ch; if (state.anchor !== null) { state.anchorMap[state.anchor] = _result; } - ch = state.input.charCodeAt(state.position); - while (ch !== 0) { - if (ch !== 0x2D - /* - */ - ) { - break; - } - + if (ch !== 0x2D /* - */) { + break; + } following = state.input.charCodeAt(state.position + 1); - if (!is_WS_OR_EOL(following)) { break; } - detected = true; state.position++; - if (skipSeparationSpace(state, true, -1)) { if (state.lineIndent <= nodeIndent) { _result.push(null); - ch = state.input.charCodeAt(state.position); continue; } } - _line = state.line; composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); - _result.push(state.result); - skipSeparationSpace(state, true, -1); ch = state.input.charCodeAt(state.position); - if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) { throwError(state, 'bad indentation of a sequence entry'); } else if (state.lineIndent < nodeIndent) { break; } } - if (detected) { state.tag = _tag; state.anchor = _anchor; @@ -13568,97 +12161,79 @@ state.result = _result; return true; } - return false; } - function readBlockMapping(state, nodeIndent, flowIndent) { var following, - allowCompact, - _line, - _pos, - _tag = state.tag, - _anchor = state.anchor, - _result = {}, - overridableKeys = {}, - keyTag = null, - keyNode = null, - valueNode = null, - atExplicitKey = false, - detected = false, - ch; - + allowCompact, + _line, + _pos, + _tag = state.tag, + _anchor = state.anchor, + _result = {}, + overridableKeys = {}, + keyTag = null, + keyNode = null, + valueNode = null, + atExplicitKey = false, + detected = false, + ch; if (state.anchor !== null) { state.anchorMap[state.anchor] = _result; } - ch = state.input.charCodeAt(state.position); - while (ch !== 0) { following = state.input.charCodeAt(state.position + 1); _line = state.line; // Save the current line. + _pos = state.position; - _pos = state.position; // + // // Explicit notation case. There are two separate blocks: // first for the key (denoted by "?") and second for the value (denoted by ":") // - - if ((ch === 0x3F - /* ? */ - || ch === 0x3A - /* : */ - ) && is_WS_OR_EOL(following)) { - if (ch === 0x3F - /* ? */ - ) { - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); - keyTag = keyNode = valueNode = null; - } - - detected = true; - atExplicitKey = true; - allowCompact = true; - } else if (atExplicitKey) { + if ((ch === 0x3F /* ? */ || ch === 0x3A /* : */) && is_WS_OR_EOL(following)) { + if (ch === 0x3F /* ? */) { + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); + keyTag = keyNode = valueNode = null; + } + detected = true; + atExplicitKey = true; + allowCompact = true; + } else if (atExplicitKey) { // i.e. 0x3A/* : */ === character after the explicit key. atExplicitKey = false; allowCompact = true; } else { throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line'); } - state.position += 1; - ch = following; // + ch = following; + + // // Implicit notation case. Flow-style node as the key first, then ":", and the value. // } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { if (state.line === _line) { ch = state.input.charCodeAt(state.position); - while (is_WHITE_SPACE(ch)) { ch = state.input.charCodeAt(++state.position); } - - if (ch === 0x3A - /* : */ - ) { - ch = state.input.charCodeAt(++state.position); - - if (!is_WS_OR_EOL(ch)) { - throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); - } - - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); - keyTag = keyNode = valueNode = null; - } - - detected = true; - atExplicitKey = false; - allowCompact = false; - keyTag = state.tag; - keyNode = state.result; - } else if (detected) { + if (ch === 0x3A /* : */) { + ch = state.input.charCodeAt(++state.position); + if (!is_WS_OR_EOL(ch)) { + throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); + } + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); + keyTag = keyNode = valueNode = null; + } + detected = true; + atExplicitKey = false; + allowCompact = false; + keyTag = state.tag; + keyNode = state.result; + } else if (detected) { throwError(state, 'can not read an implicit mapping pair; a colon is missed'); } else { state.tag = _tag; @@ -13673,12 +12248,12 @@ return true; // Keep the result of `composeNode`. } } else { - break; // Reading is done. Go to the epilogue. - } // + break; // Reading is done. Go to the epilogue. + } + + // // Common reading code for both explicit and implicit notations. // - - if (state.line === _line || state.lineIndent > nodeIndent) { if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { if (atExplicitKey) { @@ -13687,84 +12262,66 @@ valueNode = state.result; } } - if (!atExplicitKey) { storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos); keyTag = keyNode = valueNode = null; } - skipSeparationSpace(state, true, -1); ch = state.input.charCodeAt(state.position); } - if (state.lineIndent > nodeIndent && ch !== 0) { throwError(state, 'bad indentation of a mapping entry'); } else if (state.lineIndent < nodeIndent) { break; } - } // + } + + // // Epilogue. // - // Special case: last mapping's node contains only the key in explicit notation. - + // Special case: last mapping's node contains only the key in explicit notation. if (atExplicitKey) { storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); - } // Expose the resulting mapping. - + } + // Expose the resulting mapping. if (detected) { state.tag = _tag; state.anchor = _anchor; state.kind = 'mapping'; state.result = _result; } - return detected; } - function readTagProperty(state) { var _position, - isVerbatim = false, - isNamed = false, - tagHandle, - tagName, - ch; - + isVerbatim = false, + isNamed = false, + tagHandle, + tagName, + ch; ch = state.input.charCodeAt(state.position); - if (ch !== 0x21 - /* ! */ - ) return false; - + if (ch !== 0x21 /* ! */) return false; if (state.tag !== null) { throwError(state, 'duplication of a tag property'); } - ch = state.input.charCodeAt(++state.position); - - if (ch === 0x3C - /* < */ - ) { - isVerbatim = true; - ch = state.input.charCodeAt(++state.position); - } else if (ch === 0x21 - /* ! */ - ) { - isNamed = true; - tagHandle = '!!'; - ch = state.input.charCodeAt(++state.position); - } else { + if (ch === 0x3C /* < */) { + isVerbatim = true; + ch = state.input.charCodeAt(++state.position); + } else if (ch === 0x21 /* ! */) { + isNamed = true; + tagHandle = '!!'; + ch = state.input.charCodeAt(++state.position); + } else { tagHandle = '!'; } - _position = state.position; - if (isVerbatim) { do { ch = state.input.charCodeAt(++state.position); - } while (ch !== 0 && ch !== 0x3E - /* > */ - ); + } while (ch !== 0 && ch !== 0x3E /* > */); if (state.position < state.length) { tagName = state.input.slice(_position, state.position); @@ -13774,37 +12331,28 @@ } } else { while (ch !== 0 && !is_WS_OR_EOL(ch)) { - if (ch === 0x21 - /* ! */ - ) { - if (!isNamed) { - tagHandle = state.input.slice(_position - 1, state.position + 1); - - if (!PATTERN_TAG_HANDLE.test(tagHandle)) { - throwError(state, 'named tag handle cannot contain such characters'); - } - - isNamed = true; - _position = state.position + 1; - } else { - throwError(state, 'tag suffix cannot contain exclamation marks'); + if (ch === 0x21 /* ! */) { + if (!isNamed) { + tagHandle = state.input.slice(_position - 1, state.position + 1); + if (!PATTERN_TAG_HANDLE.test(tagHandle)) { + throwError(state, 'named tag handle cannot contain such characters'); } + isNamed = true; + _position = state.position + 1; + } else { + throwError(state, 'tag suffix cannot contain exclamation marks'); } - + } ch = state.input.charCodeAt(++state.position); } - tagName = state.input.slice(_position, state.position); - if (PATTERN_FLOW_INDICATORS.test(tagName)) { throwError(state, 'tag suffix cannot contain flow indicator characters'); } } - if (tagName && !PATTERN_TAG_URI.test(tagName)) { throwError(state, 'tag name cannot contain such characters: ' + tagName); } - if (isVerbatim) { state.tag = tagName; } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) { @@ -13816,94 +12364,70 @@ } else { throwError(state, 'undeclared tag handle "' + tagHandle + '"'); } - return true; } - function readAnchorProperty(state) { var _position, ch; - ch = state.input.charCodeAt(state.position); - if (ch !== 0x26 - /* & */ - ) return false; - + if (ch !== 0x26 /* & */) return false; if (state.anchor !== null) { throwError(state, 'duplication of an anchor property'); } - ch = state.input.charCodeAt(++state.position); _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { ch = state.input.charCodeAt(++state.position); } - if (state.position === _position) { throwError(state, 'name of an anchor node must contain at least one character'); } - state.anchor = state.input.slice(_position, state.position); return true; } - function readAlias(state) { var _position, alias, ch; - ch = state.input.charCodeAt(state.position); - if (ch !== 0x2A - /* * */ - ) return false; + if (ch !== 0x2A /* * */) return false; ch = state.input.charCodeAt(++state.position); _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { ch = state.input.charCodeAt(++state.position); } - if (state.position === _position) { throwError(state, 'name of an alias node must contain at least one character'); } - alias = state.input.slice(_position, state.position); - if (!_hasOwnProperty$1.call(state.anchorMap, alias)) { throwError(state, 'unidentified alias "' + alias + '"'); } - state.result = state.anchorMap[alias]; skipSeparationSpace(state, true, -1); return true; } - function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { var allowBlockStyles, - allowBlockScalars, - allowBlockCollections, - indentStatus = 1, - // 1: this>parent, 0: this=parent, -1: thisparent, 0: this=parent, -1: this parentIndent) { indentStatus = 1; } else if (state.lineIndent === parentIndent) { @@ -13913,13 +12437,11 @@ } } } - if (indentStatus === 1) { while (readTagProperty(state) || readAnchorProperty(state)) { if (skipSeparationSpace(state, true, -1)) { atNewLine = true; allowBlockCollections = allowBlockStyles; - if (state.lineIndent > parentIndent) { indentStatus = 1; } else if (state.lineIndent === parentIndent) { @@ -13932,20 +12454,16 @@ } } } - if (allowBlockCollections) { allowBlockCollections = atNewLine || allowCompact; } - if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) { if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { flowIndent = parentIndent; } else { flowIndent = parentIndent + 1; } - blockIndent = state.position - state.lineStart; - if (indentStatus === 1) { if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) { hasContent = true; @@ -13954,18 +12472,15 @@ hasContent = true; } else if (readAlias(state)) { hasContent = true; - if (state.tag !== null || state.anchor !== null) { throwError(state, 'alias node should not have any properties'); } } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { hasContent = true; - if (state.tag === null) { state.tag = '?'; } } - if (state.anchor !== null) { state.anchorMap[state.anchor] = state.result; } @@ -13976,7 +12491,6 @@ hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); } } - if (state.tag !== null && state.tag !== '!') { if (state.tag === '?') { // Implicit resolving is not allowed for non-scalar types, and '?' @@ -13988,35 +12502,28 @@ if (state.result !== null && state.kind !== 'scalar') { throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); } - for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) { type = state.implicitTypes[typeIndex]; - if (type.resolve(state.result)) { // `state.result` updated in resolver if matched state.result = type.construct(state.result); state.tag = type.tag; - if (state.anchor !== null) { state.anchorMap[state.anchor] = state.result; } - break; } } } else if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) { type = state.typeMap[state.kind || 'fallback'][state.tag]; - if (state.result !== null && type.kind !== state.kind) { throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"'); } - if (!type.resolve(state.result)) { // `state.result` updated in resolver if matched throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); } else { state.result = type.construct(state.result); - if (state.anchor !== null) { state.anchorMap[state.anchor] = state.result; } @@ -14025,220 +12532,158 @@ throwError(state, 'unknown tag !<' + state.tag + '>'); } } - if (state.listener !== null) { state.listener('close', state); } - return state.tag !== null || state.anchor !== null || hasContent; } - function readDocument(state) { var documentStart = state.position, - _position, - directiveName, - directiveArgs, - hasDirectives = false, - ch; - + _position, + directiveName, + directiveArgs, + hasDirectives = false, + ch; state.version = null; state.checkLineBreaks = state.legacy; state.tagMap = {}; state.anchorMap = {}; - while ((ch = state.input.charCodeAt(state.position)) !== 0) { skipSeparationSpace(state, true, -1); ch = state.input.charCodeAt(state.position); - - if (state.lineIndent > 0 || ch !== 0x25 - /* % */ - ) { - break; - } - + if (state.lineIndent > 0 || ch !== 0x25 /* % */) { + break; + } hasDirectives = true; ch = state.input.charCodeAt(++state.position); _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch)) { ch = state.input.charCodeAt(++state.position); } - directiveName = state.input.slice(_position, state.position); directiveArgs = []; - if (directiveName.length < 1) { throwError(state, 'directive name must not be less than one character in length'); } - while (ch !== 0) { while (is_WHITE_SPACE(ch)) { ch = state.input.charCodeAt(++state.position); } - - if (ch === 0x23 - /* # */ - ) { - do { - ch = state.input.charCodeAt(++state.position); - } while (ch !== 0 && !is_EOL(ch)); - - break; - } - + if (ch === 0x23 /* # */) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0 && !is_EOL(ch)); + break; + } if (is_EOL(ch)) break; _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch)) { ch = state.input.charCodeAt(++state.position); } - directiveArgs.push(state.input.slice(_position, state.position)); } - if (ch !== 0) readLineBreak(state); - if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) { directiveHandlers[directiveName](state, directiveName, directiveArgs); } else { throwWarning(state, 'unknown document directive "' + directiveName + '"'); } } - skipSeparationSpace(state, true, -1); - - if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 0x2D - /* - */ - && state.input.charCodeAt(state.position + 1) === 0x2D - /* - */ - && state.input.charCodeAt(state.position + 2) === 0x2D - /* - */ - ) { - state.position += 3; - skipSeparationSpace(state, true, -1); - } else if (hasDirectives) { + if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 0x2D /* - */ && state.input.charCodeAt(state.position + 1) === 0x2D /* - */ && state.input.charCodeAt(state.position + 2) === 0x2D /* - */) { + state.position += 3; + skipSeparationSpace(state, true, -1); + } else if (hasDirectives) { throwError(state, 'directives end mark is expected'); } - composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); skipSeparationSpace(state, true, -1); - if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { throwWarning(state, 'non-ASCII line breaks are interpreted as content'); } - state.documents.push(state.result); - if (state.position === state.lineStart && testDocumentSeparator(state)) { - if (state.input.charCodeAt(state.position) === 0x2E - /* . */ - ) { - state.position += 3; - skipSeparationSpace(state, true, -1); - } - + if (state.input.charCodeAt(state.position) === 0x2E /* . */) { + state.position += 3; + skipSeparationSpace(state, true, -1); + } return; } - if (state.position < state.length - 1) { throwError(state, 'end of the stream or a document separator is expected'); } else { return; } } - function loadDocuments(input, options) { input = String(input); options = options || {}; - if (input.length !== 0) { // Add tailing `\n` if not exists - if (input.charCodeAt(input.length - 1) !== 0x0A - /* LF */ - && input.charCodeAt(input.length - 1) !== 0x0D - /* CR */ - ) { - input += '\n'; - } // Strip BOM - + if (input.charCodeAt(input.length - 1) !== 0x0A /* LF */ && input.charCodeAt(input.length - 1) !== 0x0D /* CR */) { + input += '\n'; + } + // Strip BOM if (input.charCodeAt(0) === 0xFEFF) { input = input.slice(1); } } - var state = new State$1(input, options); var nullpos = input.indexOf('\0'); - if (nullpos !== -1) { state.position = nullpos; throwError(state, 'null byte is not allowed in input'); - } // Use 0 as string terminator. That significantly simplifies bounds check. - + } + // Use 0 as string terminator. That significantly simplifies bounds check. state.input += '\0'; - - while (state.input.charCodeAt(state.position) === 0x20 - /* Space */ - ) { + while (state.input.charCodeAt(state.position) === 0x20 /* Space */) { state.lineIndent += 1; state.position += 1; } - while (state.position < state.length - 1) { readDocument(state); } - return state.documents; } - function loadAll$1(input, iterator, options) { if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') { options = iterator; iterator = null; } - var documents = loadDocuments(input, options); - if (typeof iterator !== 'function') { return documents; } - for (var index = 0, length = documents.length; index < length; index += 1) { iterator(documents[index]); } } - function load$1(input, options) { var documents = loadDocuments(input, options); - if (documents.length === 0) { /*eslint-disable no-undefined*/ return undefined; } else if (documents.length === 1) { return documents[0]; } - throw new exception('expected a single document in the stream, but found more'); } - function safeLoadAll$1(input, iterator, options) { if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') { options = iterator; iterator = null; } - return loadAll$1(input, iterator, common.extend({ schema: default_safe }, options)); } - function safeLoad$1(input, options) { return load$1(input, common.extend({ schema: default_safe }, options)); } - var loadAll_1 = loadAll$1; var load_1 = load$1; var safeLoadAll_1 = safeLoadAll$1; @@ -14252,80 +12697,32 @@ /*eslint-disable no-use-before-define*/ - var _toString = Object.prototype.toString; var _hasOwnProperty = Object.prototype.hasOwnProperty; - var CHAR_TAB = 0x09; - /* Tab */ - - var CHAR_LINE_FEED = 0x0A; - /* LF */ - - var CHAR_CARRIAGE_RETURN = 0x0D; - /* CR */ - - var CHAR_SPACE = 0x20; - /* Space */ - - var CHAR_EXCLAMATION = 0x21; - /* ! */ - - var CHAR_DOUBLE_QUOTE = 0x22; - /* " */ - - var CHAR_SHARP = 0x23; - /* # */ - - var CHAR_PERCENT = 0x25; - /* % */ - - var CHAR_AMPERSAND = 0x26; - /* & */ - - var CHAR_SINGLE_QUOTE = 0x27; - /* ' */ - - var CHAR_ASTERISK = 0x2A; - /* * */ - - var CHAR_COMMA = 0x2C; - /* , */ - - var CHAR_MINUS = 0x2D; - /* - */ - - var CHAR_COLON = 0x3A; - /* : */ - - var CHAR_EQUALS = 0x3D; - /* = */ - - var CHAR_GREATER_THAN = 0x3E; - /* > */ - - var CHAR_QUESTION = 0x3F; - /* ? */ - - var CHAR_COMMERCIAL_AT = 0x40; - /* @ */ - - var CHAR_LEFT_SQUARE_BRACKET = 0x5B; - /* [ */ - - var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; - /* ] */ - - var CHAR_GRAVE_ACCENT = 0x60; - /* ` */ - - var CHAR_LEFT_CURLY_BRACKET = 0x7B; - /* { */ - - var CHAR_VERTICAL_LINE = 0x7C; - /* | */ - - var CHAR_RIGHT_CURLY_BRACKET = 0x7D; - /* } */ + var CHAR_TAB = 0x09; /* Tab */ + var CHAR_LINE_FEED = 0x0A; /* LF */ + var CHAR_CARRIAGE_RETURN = 0x0D; /* CR */ + var CHAR_SPACE = 0x20; /* Space */ + var CHAR_EXCLAMATION = 0x21; /* ! */ + var CHAR_DOUBLE_QUOTE = 0x22; /* " */ + var CHAR_SHARP = 0x23; /* # */ + var CHAR_PERCENT = 0x25; /* % */ + var CHAR_AMPERSAND = 0x26; /* & */ + var CHAR_SINGLE_QUOTE = 0x27; /* ' */ + var CHAR_ASTERISK = 0x2A; /* * */ + var CHAR_COMMA = 0x2C; /* , */ + var CHAR_MINUS = 0x2D; /* - */ + var CHAR_COLON = 0x3A; /* : */ + var CHAR_EQUALS = 0x3D; /* = */ + var CHAR_GREATER_THAN = 0x3E; /* > */ + var CHAR_QUESTION = 0x3F; /* ? */ + var CHAR_COMMERCIAL_AT = 0x40; /* @ */ + var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */ + var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */ + var CHAR_GRAVE_ACCENT = 0x60; /* ` */ + var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */ + var CHAR_VERTICAL_LINE = 0x7C; /* | */ + var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */ var ESCAPE_SEQUENCES = {}; ESCAPE_SEQUENCES[0x00] = '\\0'; @@ -14344,37 +12741,28 @@ ESCAPE_SEQUENCES[0x2028] = '\\L'; ESCAPE_SEQUENCES[0x2029] = '\\P'; var DEPRECATED_BOOLEANS_SYNTAX = ['y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF']; - function compileStyleMap(schema, map) { var result, keys, index, length, tag, style, type; if (map === null) return {}; result = {}; keys = Object.keys(map); - for (index = 0, length = keys.length; index < length; index += 1) { tag = keys[index]; style = String(map[tag]); - if (tag.slice(0, 2) === '!!') { tag = 'tag:yaml.org,2002:' + tag.slice(2); } - type = schema.compiledTypeMap['fallback'][tag]; - if (type && _hasOwnProperty.call(type.styleAliases, style)) { style = type.styleAliases[style]; } - result[tag] = style; } - return result; } - function encodeHex(character) { var string, handle, length; string = character.toString(16).toUpperCase(); - if (character <= 0xFF) { handle = 'x'; length = 2; @@ -14387,10 +12775,8 @@ } else { throw new exception('code point within a string may not be greater than 0xFFFFFFFF'); } - return '\\' + handle + common.repeat('0', length - string.length) + string; } - function State(options) { this.schema = options['schema'] || default_full; this.indent = Math.max(1, options['indent'] || 2); @@ -14409,20 +12795,18 @@ this.result = ''; this.duplicates = []; this.usedDuplicates = null; - } // Indents every line in a string. Empty lines (\n only) are not indented. - + } + // Indents every line in a string. Empty lines (\n only) are not indented. function indentString(string, spaces) { var ind = common.repeat(' ', spaces), - position = 0, - next = -1, - result = '', - line, - length = string.length; - + position = 0, + next = -1, + result = '', + line, + length = string.length; while (position < length) { next = string.indexOf('\n', position); - if (next === -1) { line = string.slice(position); position = length; @@ -14430,120 +12814,112 @@ line = string.slice(position, next + 1); position = next + 1; } - if (line.length && line !== '\n') result += ind; result += line; } - return result; } - function generateNextLine(state, level) { return '\n' + common.repeat(' ', state.indent * level); } - function testImplicitResolving(state, str) { var index, length, type; - for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { type = state.implicitTypes[index]; - if (type.resolve(str)) { return true; } } - return false; - } // [33] s-white ::= s-space | s-tab - + } + // [33] s-white ::= s-space | s-tab function isWhitespace(c) { return c === CHAR_SPACE || c === CHAR_TAB; - } // Returns true if the character can be printed without escaping. + } + + // Returns true if the character can be printed without escaping. // From YAML 1.2: "any allowed characters known to be non-printable // should also be escaped. [However,] This isn’t mandatory" // Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029. - - function isPrintable(c) { - return 0x00020 <= c && c <= 0x00007E || 0x000A1 <= c && c <= 0x00D7FF && c !== 0x2028 && c !== 0x2029 || 0x0E000 <= c && c <= 0x00FFFD && c !== 0xFEFF - /* BOM */ - || 0x10000 <= c && c <= 0x10FFFF; - } // [34] ns-char ::= nb-char - s-white + return 0x00020 <= c && c <= 0x00007E || 0x000A1 <= c && c <= 0x00D7FF && c !== 0x2028 && c !== 0x2029 || 0x0E000 <= c && c <= 0x00FFFD && c !== 0xFEFF /* BOM */ || 0x10000 <= c && c <= 0x10FFFF; + } + + // [34] ns-char ::= nb-char - s-white // [27] nb-char ::= c-printable - b-char - c-byte-order-mark // [26] b-char ::= b-line-feed | b-carriage-return // [24] b-line-feed ::= #xA /* LF */ // [25] b-carriage-return ::= #xD /* CR */ // [3] c-byte-order-mark ::= #xFEFF - - function isNsChar(c) { - return isPrintable(c) && !isWhitespace(c) // byte-order-mark - && c !== 0xFEFF // b-char + return isPrintable(c) && !isWhitespace(c) + // byte-order-mark + && c !== 0xFEFF + // b-char && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED; - } // Simplified test for values allowed after the first character in plain style. - + } + // Simplified test for values allowed after the first character in plain style. function isPlainSafe(c, prev) { // Uses a subset of nb-char - c-flow-indicator - ":" - "#" // where nb-char ::= c-printable - b-char - c-byte-order-mark. - return isPrintable(c) && c !== 0xFEFF // - c-flow-indicator - && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET // - ":" - "#" + return isPrintable(c) && c !== 0xFEFF + // - c-flow-indicator + && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET + // - ":" - "#" // /* An ns-char preceding */ "#" && c !== CHAR_COLON && (c !== CHAR_SHARP || prev && isNsChar(prev)); - } // Simplified test for values allowed as the first character in plain style. - + } + // Simplified test for values allowed as the first character in plain style. function isPlainSafeFirst(c) { // Uses a subset of ns-char - c-indicator // where ns-char = nb-char - s-white. return isPrintable(c) && c !== 0xFEFF && !isWhitespace(c) // - s-white // - (c-indicator ::= // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}” - && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"” - && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE // | “%” | “@” | “`”) + && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET + // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"” + && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE + // | “%” | “@” | “`”) && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT; - } // Determines whether block indentation indicator is required. - + } + // Determines whether block indentation indicator is required. function needIndentIndicator(string) { var leadingSpaceRe = /^\n* /; return leadingSpaceRe.test(string); } - var STYLE_PLAIN = 1, - STYLE_SINGLE = 2, - STYLE_LITERAL = 3, - STYLE_FOLDED = 4, - STYLE_DOUBLE = 5; // Determines which scalar styles are possible and returns the preferred style. + STYLE_SINGLE = 2, + STYLE_LITERAL = 3, + STYLE_FOLDED = 4, + STYLE_DOUBLE = 5; + + // Determines which scalar styles are possible and returns the preferred style. // lineWidth = -1 => no limit. // Pre-conditions: str.length > 0. // Post-conditions: // STYLE_PLAIN or STYLE_SINGLE => no \n are in the string. // STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1). // STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1). - function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) { var i; var char, prev_char; var hasLineBreak = false; var hasFoldableLine = false; // only checked if shouldTrackWidth - var shouldTrackWidth = lineWidth !== -1; var previousLineBreak = -1; // count the first line correctly - var plain = isPlainSafeFirst(string.charCodeAt(0)) && !isWhitespace(string.charCodeAt(string.length - 1)); - if (singleLineOnly) { // Case: no block styles. // Check for disallowed characters to rule out plain and single. for (i = 0; i < string.length; i++) { char = string.charCodeAt(i); - if (!isPrintable(char)) { return STYLE_DOUBLE; } - prev_char = i > 0 ? string.charCodeAt(i - 1) : null; plain = plain && isPlainSafe(char, prev_char); } @@ -14551,62 +12927,55 @@ // Case: block styles permitted. for (i = 0; i < string.length; i++) { char = string.charCodeAt(i); - if (char === CHAR_LINE_FEED) { - hasLineBreak = true; // Check if any line can be folded. - + hasLineBreak = true; + // Check if any line can be folded. if (shouldTrackWidth) { - hasFoldableLine = hasFoldableLine || // Foldable line = too long, and not more-indented. + hasFoldableLine = hasFoldableLine || + // Foldable line = too long, and not more-indented. i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' '; previousLineBreak = i; } } else if (!isPrintable(char)) { return STYLE_DOUBLE; } - prev_char = i > 0 ? string.charCodeAt(i - 1) : null; plain = plain && isPlainSafe(char, prev_char); - } // in case the end is missing a \n - - + } + // in case the end is missing a \n hasFoldableLine = hasFoldableLine || shouldTrackWidth && i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' '; - } // Although every style can represent \n without escaping, prefer block styles + } + // Although every style can represent \n without escaping, prefer block styles // for multiline, since they're more readable and they don't add empty lines. // Also prefer folding a super-long line. - - if (!hasLineBreak && !hasFoldableLine) { // Strings interpretable as another type have to be quoted; // e.g. the string 'true' vs. the boolean true. return plain && !testAmbiguousType(string) ? STYLE_PLAIN : STYLE_SINGLE; - } // Edge case: block indentation indicator can only have one digit. - - + } + // Edge case: block indentation indicator can only have one digit. if (indentPerLevel > 9 && needIndentIndicator(string)) { return STYLE_DOUBLE; - } // At this point we know block styles are valid. + } + // At this point we know block styles are valid. // Prefer literal style unless we want to fold. - - return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; - } // Note: line breaking/folding is implemented for only the folded style. + } + + // Note: line breaking/folding is implemented for only the folded style. // NB. We drop the last trailing newline (if any) of a returned block scalar // since the dumper adds its own newline. This always works: // • No ending newline => unaffected; already using strip "-" chomping. // • Ending newline => removed then restored. // Importantly, this keeps the "+" chomp indicator from gaining an extra line. - - function writeScalar(state, string, level, iskey) { state.dump = function () { if (string.length === 0) { return "''"; } - if (!state.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) { return "'" + string + "'"; } - var indent = state.indent * Math.max(1, level); // no 0-indent scalars // As indentation gets deeper, let the width decrease monotonically // to the lower bound min(state.lineWidth, 40). @@ -14615,171 +12984,154 @@ // state.lineWidth > 40 + state.indent: width decreases until the lower bound. // This behaves better than a constant minimum width which disallows narrower options, // or an indent threshold which causes the width to suddenly increase. + var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); - var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); // Without knowing if keys are implicit/explicit, assume implicit for safety. - - var singleLineOnly = iskey // No block styles in flow mode. + // Without knowing if keys are implicit/explicit, assume implicit for safety. + var singleLineOnly = iskey + // No block styles in flow mode. || state.flowLevel > -1 && level >= state.flowLevel; - function testAmbiguity(string) { return testImplicitResolving(state, string); } - switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) { case STYLE_PLAIN: return string; - case STYLE_SINGLE: return "'" + string.replace(/'/g, "''") + "'"; - case STYLE_LITERAL: return '|' + blockHeader(string, state.indent) + dropEndingNewline(indentString(string, indent)); - case STYLE_FOLDED: return '>' + blockHeader(string, state.indent) + dropEndingNewline(indentString(foldString(string, lineWidth), indent)); - case STYLE_DOUBLE: return '"' + escapeString(string) + '"'; - default: throw new exception('impossible error: invalid scalar style'); } }(); - } // Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9. - + } + // Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9. function blockHeader(string, indentPerLevel) { - var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ''; // note the special case: the string '\n' counts as a "trailing" empty line. + var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ''; + // note the special case: the string '\n' counts as a "trailing" empty line. var clip = string[string.length - 1] === '\n'; var keep = clip && (string[string.length - 2] === '\n' || string === '\n'); var chomp = keep ? '+' : clip ? '' : '-'; return indentIndicator + chomp + '\n'; - } // (See the note for writeScalar.) - + } + // (See the note for writeScalar.) function dropEndingNewline(string) { return string[string.length - 1] === '\n' ? string.slice(0, -1) : string; - } // Note: a long line without a suitable break point will exceed the width limit. - // Pre-conditions: every char in str isPrintable, str.length > 0, width > 0. - + } + // Note: a long line without a suitable break point will exceed the width limit. + // Pre-conditions: every char in str isPrintable, str.length > 0, width > 0. function foldString(string, width) { // In folded style, $k$ consecutive newlines output as $k+1$ newlines— // unless they're before or after a more-indented line, or at the very // beginning or end, in which case $k$ maps to $k$. // Therefore, parse each chunk as newline(s) followed by a content line. - var lineRe = /(\n+)([^\n]*)/g; // first line (possibly an empty line) + var lineRe = /(\n+)([^\n]*)/g; + // first line (possibly an empty line) var result = function () { var nextLF = string.indexOf('\n'); nextLF = nextLF !== -1 ? nextLF : string.length; lineRe.lastIndex = nextLF; return foldLine(string.slice(0, nextLF), width); - }(); // If we haven't reached the first content line yet, don't add an extra \n. - - + }(); + // If we haven't reached the first content line yet, don't add an extra \n. var prevMoreIndented = string[0] === '\n' || string[0] === ' '; - var moreIndented; // rest of the lines + var moreIndented; + // rest of the lines var match; - while (match = lineRe.exec(string)) { var prefix = match[1], - line = match[2]; + line = match[2]; moreIndented = line[0] === ' '; result += prefix + (!prevMoreIndented && !moreIndented && line !== '' ? '\n' : '') + foldLine(line, width); prevMoreIndented = moreIndented; } - return result; - } // Greedy line breaking. + } + + // Greedy line breaking. // Picks the longest line under the limit each time, // otherwise settles for the shortest line over the limit. // NB. More-indented lines *cannot* be folded, as that would add an extra \n. - - function foldLine(line, width) { - if (line === '' || line[0] === ' ') return line; // Since a more-indented line adds a \n, breaks can't be followed by a space. + if (line === '' || line[0] === ' ') return line; + // Since a more-indented line adds a \n, breaks can't be followed by a space. var breakRe = / [^ ]/g; // note: the match index will always be <= length-2. - - var match; // start is an inclusive index. end, curr, and next are exclusive. - + var match; + // start is an inclusive index. end, curr, and next are exclusive. var start = 0, - end, - curr = 0, - next = 0; - var result = ''; // Invariants: 0 <= start <= length-1. + end, + curr = 0, + next = 0; + var result = ''; + + // Invariants: 0 <= start <= length-1. // 0 <= curr <= next <= max(0, length-2). curr - start <= width. // Inside the loop: // A match implies length >= 2, so curr and next are <= length-2. - while (match = breakRe.exec(line)) { - next = match.index; // maintain invariant: curr - start <= width - + next = match.index; + // maintain invariant: curr - start <= width if (next - start > width) { end = curr > start ? curr : next; // derive end <= length-2 - - result += '\n' + line.slice(start, end); // skip the space that was output as \n - + result += '\n' + line.slice(start, end); + // skip the space that was output as \n start = end + 1; // derive start <= length-1 } curr = next; - } // By the invariants, start <= length-1, so there is something left over. - // It is either the whole string or a part starting from non-whitespace. - - - result += '\n'; // Insert a break if the remainder is too long and there is a break available. + } + // By the invariants, start <= length-1, so there is something left over. + // It is either the whole string or a part starting from non-whitespace. + result += '\n'; + // Insert a break if the remainder is too long and there is a break available. if (line.length - start > width && curr > start) { result += line.slice(start, curr) + '\n' + line.slice(curr + 1); } else { result += line.slice(start); } - return result.slice(1); // drop extra \n joiner - } // Escapes a double-quoted string. - + } + // Escapes a double-quoted string. function escapeString(string) { var result = ''; var char, nextChar; var escapeSeq; - for (var i = 0; i < string.length; i++) { - char = string.charCodeAt(i); // Check for surrogate pairs (reference Unicode 3.0 section "3.7 Surrogates"). - - if (char >= 0xD800 && char <= 0xDBFF - /* high surrogate */ - ) { - nextChar = string.charCodeAt(i + 1); - - if (nextChar >= 0xDC00 && nextChar <= 0xDFFF - /* low surrogate */ - ) { - // Combine the surrogate pair and store it escaped. - result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000); // Advance index one extra since we already used that char here. - - i++; - continue; - } + char = string.charCodeAt(i); + // Check for surrogate pairs (reference Unicode 3.0 section "3.7 Surrogates"). + if (char >= 0xD800 && char <= 0xDBFF /* high surrogate */) { + nextChar = string.charCodeAt(i + 1); + if (nextChar >= 0xDC00 && nextChar <= 0xDFFF /* low surrogate */) { + // Combine the surrogate pair and store it escaped. + result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000); + // Advance index one extra since we already used that char here. + i++; + continue; } - + } escapeSeq = ESCAPE_SEQUENCES[char]; result += !escapeSeq && isPrintable(char) ? string[i] : escapeSeq || encodeHex(char); } - return result; } - function writeFlowSequence(state, level, object) { var _result = '', - _tag = state.tag, - index, - length; - + _tag = state.tag, + index, + length; for (index = 0, length = object.length; index < length; index += 1) { // Write only valid elements. if (writeNode(state, level, object[index], false, false)) { @@ -14787,86 +13139,77 @@ _result += state.dump; } } - state.tag = _tag; state.dump = '[' + _result + ']'; } - function writeBlockSequence(state, level, object, compact) { var _result = '', - _tag = state.tag, - index, - length; - + _tag = state.tag, + index, + length; for (index = 0, length = object.length; index < length; index += 1) { // Write only valid elements. if (writeNode(state, level + 1, object[index], true, true)) { if (!compact || index !== 0) { _result += generateNextLine(state, level); } - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { _result += '-'; } else { _result += '- '; } - _result += state.dump; } } - state.tag = _tag; state.dump = _result || '[]'; // Empty sequence if no valid values. } function writeFlowMapping(state, level, object) { var _result = '', - _tag = state.tag, - objectKeyList = Object.keys(object), - index, - length, - objectKey, - objectValue, - pairBuffer; - + _tag = state.tag, + objectKeyList = Object.keys(object), + index, + length, + objectKey, + objectValue, + pairBuffer; for (index = 0, length = objectKeyList.length; index < length; index += 1) { pairBuffer = ''; if (index !== 0) pairBuffer += ', '; if (state.condenseFlow) pairBuffer += '"'; objectKey = objectKeyList[index]; objectValue = object[objectKey]; - if (!writeNode(state, level, objectKey, false, false)) { continue; // Skip this pair because of invalid key; } if (state.dump.length > 1024) pairBuffer += '? '; pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' '); - if (!writeNode(state, level, objectValue, false, false)) { continue; // Skip this pair because of invalid value. } - pairBuffer += state.dump; // Both key and value are valid. + pairBuffer += state.dump; + // Both key and value are valid. _result += pairBuffer; } - state.tag = _tag; state.dump = '{' + _result + '}'; } - function writeBlockMapping(state, level, object, compact) { var _result = '', - _tag = state.tag, - objectKeyList = Object.keys(object), - index, - length, - objectKey, - objectValue, - explicitPair, - pairBuffer; // Allow sorting keys so that the output file is deterministic - + _tag = state.tag, + objectKeyList = Object.keys(object), + index, + length, + objectKey, + objectValue, + explicitPair, + pairBuffer; + + // Allow sorting keys so that the output file is deterministic if (state.sortKeys === true) { // Default sorting objectKeyList.sort(); @@ -14877,23 +13220,18 @@ // Something is wrong throw new exception('sortKeys must be a boolean or a function'); } - for (index = 0, length = objectKeyList.length; index < length; index += 1) { pairBuffer = ''; - if (!compact || index !== 0) { pairBuffer += generateNextLine(state, level); } - objectKey = objectKeyList[index]; objectValue = object[objectKey]; - if (!writeNode(state, level + 1, objectKey, true, true, true)) { continue; // Skip this pair because of invalid key. } explicitPair = state.tag !== null && state.tag !== '?' || state.dump && state.dump.length > 1024; - if (explicitPair) { if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { pairBuffer += '?'; @@ -14901,13 +13239,10 @@ pairBuffer += '? '; } } - pairBuffer += state.dump; - if (explicitPair) { pairBuffer += generateNextLine(state, level); } - if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { continue; // Skip this pair because of invalid value. } @@ -14917,30 +13252,24 @@ } else { pairBuffer += ': '; } + pairBuffer += state.dump; - pairBuffer += state.dump; // Both key and value are valid. - + // Both key and value are valid. _result += pairBuffer; } - state.tag = _tag; state.dump = _result || '{}'; // Empty mapping if no valid pairs. } function detectType(state, object, explicit) { var _result, typeList, index, length, type, style; - typeList = explicit ? state.explicitTypes : state.implicitTypes; - for (index = 0, length = typeList.length; index < length; index += 1) { type = typeList[index]; - if ((type.instanceOf || type.predicate) && (!type.instanceOf || typeof object === 'object' && object instanceof type.instanceOf) && (!type.predicate || type.predicate(object))) { state.tag = explicit ? type.tag : '?'; - if (type.represent) { style = state.styleMap[type.tag] || type.defaultStyle; - if (_toString.call(type.represent) === '[object Function]') { _result = type.represent(object, style); } else if (_hasOwnProperty.call(type.represent, style)) { @@ -14948,80 +13277,64 @@ } else { throw new exception('!<' + type.tag + '> tag resolver accepts not "' + style + '" style'); } - state.dump = _result; } - return true; } } - return false; - } // Serializes `object` and writes it to global `result`. + } + + // Serializes `object` and writes it to global `result`. // Returns true on success, or false on invalid object. // - - function writeNode(state, level, object, block, compact, iskey) { state.tag = null; state.dump = object; - if (!detectType(state, object, false)) { detectType(state, object, true); } - var type = _toString.call(state.dump); - if (block) { block = state.flowLevel < 0 || state.flowLevel > level; } - var objectOrArray = type === '[object Object]' || type === '[object Array]', - duplicateIndex, - duplicate; - + duplicateIndex, + duplicate; if (objectOrArray) { duplicateIndex = state.duplicates.indexOf(object); duplicate = duplicateIndex !== -1; } - if (state.tag !== null && state.tag !== '?' || duplicate || state.indent !== 2 && level > 0) { compact = false; } - if (duplicate && state.usedDuplicates[duplicateIndex]) { state.dump = '*ref_' + duplicateIndex; } else { if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { state.usedDuplicates[duplicateIndex] = true; } - if (type === '[object Object]') { if (block && Object.keys(state.dump).length !== 0) { writeBlockMapping(state, level, state.dump, compact); - if (duplicate) { state.dump = '&ref_' + duplicateIndex + state.dump; } } else { writeFlowMapping(state, level, state.dump); - if (duplicate) { state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; } } } else if (type === '[object Array]') { var arrayLevel = state.noArrayIndent && level > 0 ? level - 1 : level; - if (block && state.dump.length !== 0) { writeBlockSequence(state, arrayLevel, state.dump, compact); - if (duplicate) { state.dump = '&ref_' + duplicateIndex + state.dump; } } else { writeFlowSequence(state, arrayLevel, state.dump); - if (duplicate) { state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; } @@ -15034,49 +13347,39 @@ if (state.skipInvalid) return false; throw new exception('unacceptable kind of an object to dump ' + type); } - if (state.tag !== null && state.tag !== '?') { state.dump = '!<' + state.tag + '> ' + state.dump; } } - return true; } - function getDuplicateReferences(object, state) { var objects = [], - duplicatesIndexes = [], - index, - length; + duplicatesIndexes = [], + index, + length; inspectNode(object, objects, duplicatesIndexes); - for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { state.duplicates.push(objects[duplicatesIndexes[index]]); } - state.usedDuplicates = new Array(length); } - function inspectNode(object, objects, duplicatesIndexes) { var objectKeyList, index, length; - if (object !== null && typeof object === 'object') { index = objects.indexOf(object); - if (index !== -1) { if (duplicatesIndexes.indexOf(index) === -1) { duplicatesIndexes.push(index); } } else { objects.push(object); - if (Array.isArray(object)) { for (index = 0, length = object.length; index < length; index += 1) { inspectNode(object[index], objects, duplicatesIndexes); } } else { objectKeyList = Object.keys(object); - for (index = 0, length = objectKeyList.length; index < length; index += 1) { inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); } @@ -15084,7 +13387,6 @@ } } } - function dump$1(input, options) { options = options || {}; var state = new State(options); @@ -15092,13 +13394,11 @@ if (writeNode(state, 0, input, true, true)) return state.dump + '\n'; return ''; } - function safeDump$1(input, options) { return dump$1(input, common.extend({ schema: default_safe }, options)); } - var dump_1 = dump$1; var safeDump_1 = safeDump$1; var dumper = { @@ -15111,7 +13411,6 @@ throw new Error('Function ' + name + ' is deprecated and cannot be used.'); }; } - var Type = type; var Schema = schema; var FAILSAFE_SCHEMA = failsafe; @@ -15125,12 +13424,14 @@ var safeLoadAll = loader.safeLoadAll; var dump = dumper.dump; var safeDump = dumper.safeDump; - var YAMLException = exception; // Deprecated schema names from JS-YAML 2.0.x + var YAMLException = exception; + // Deprecated schema names from JS-YAML 2.0.x var MINIMAL_SCHEMA = failsafe; var SAFE_SCHEMA = default_safe; - var DEFAULT_SCHEMA = default_full; // Deprecated functions from JS-YAML 1.x.x + var DEFAULT_SCHEMA = default_full; + // Deprecated functions from JS-YAML 1.x.x var scan = deprecated('scan'); var parse = deprecated('parse'); var compose = deprecated('compose'); @@ -15161,9 +13462,9 @@ var jsYaml = jsYaml$1; - function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } + function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } /** * Redirect - object used to redirect some requests * e.g. @@ -15181,7 +13482,6 @@ * @property {boolean} [isBlocking] * @property {string} [sha] */ - var Redirects = /*#__PURE__*/function () { /** * Converts rawYaml into JS object with sources titles used as keys @@ -15191,7 +13491,6 @@ */ function Redirects(rawYaml) { classCallCheck(this, Redirects); - try { var arrOfRedirects = jsYaml.safeLoad(rawYaml); this.redirects = arrOfRedirects.reduce(function (acc, redirect) { @@ -15203,38 +13502,33 @@ throw e; } } + /** * Returns redirect source object * @param {string} title * @return {Redirect} */ - - createClass(Redirects, [{ key: "getRedirect", value: function getRedirect(title) { var _this = this; - if (Object.prototype.hasOwnProperty.call(this.redirects, title)) { return this.redirects[title]; - } // look title among aliases - + } + // look title among aliases var values = Object.keys(this.redirects).map(function (key) { return _this.redirects[key]; }); return values.find(function (redirect) { var aliases = redirect.aliases; - if (!aliases) { return false; } - return aliases.indexOf(title) > -1; }); } }]); - return Redirects; }(); @@ -15321,12 +13615,6 @@ "prebid-ads.js": "prebid-ads.js", prebid: "prebid.js", "prevent-bab": "prevent-bab.js", - "nobab.js": "prevent-bab.js", - "ubo-nobab.js": "prevent-bab.js", - "bab-defuser.js": "prevent-bab.js", - "ubo-bab-defuser.js": "prevent-bab.js", - "ubo-nobab": "prevent-bab.js", - "ubo-bab-defuser": "prevent-bab.js", "prevent-bab2": "prevent-bab2.js", "nobab2.js": "prevent-bab2.js", "prevent-fab-3.2.0": "prevent-fab-3.2.0.js", @@ -15352,7 +13640,6 @@ * Finds redirect resource by it's name * @param {string} name - redirect name */ - var getRedirectByName = function getRedirectByName(name) { var redirects = Object.keys(redirectsList).map(function (key) { return redirectsList[key]; @@ -15361,6 +13648,7 @@ return r.names && r.names.indexOf(name) > -1; }); }; + /** * @typedef {Object} Source - redirect properties * @property {string} name redirect name @@ -15375,22 +13663,19 @@ * @param {Source} source * @returns {string} redirect code */ - - var getRedirectCode = function getRedirectCode(source) { var redirect = getRedirectByName(source.name); var result = attachDependencies(redirect); - result = addCall(redirect, result); // redirect code for different sources is checked in tests - // so it should be just a code without any source and props passed + result = addCall(redirect, result); + // redirect code for different sources is checked in tests + // so it should be just a code without any source and props passed result = source.engine === 'test' ? wrapInNonameFunc(result) : passSourceAndProps(source, result, true); return result; }; - var getRedirectFilename = function getRedirectFilename(name) { return redirectsMap[name]; }; - var redirects = { Redirects: Redirects, getRedirectFilename: getRedirectFilename, @@ -15411,49 +13696,38 @@ var searchRegexp = toRegExp(search); var rid = randomId(); var SRC_DATA_MARKER = "data:text/javascript;base64,"; - var getCurrentScript = function getCurrentScript() { if ("currentScript" in document) { return document.currentScript; } - var scripts = document.getElementsByTagName("script"); return scripts[scripts.length - 1]; }; - var ourScript = getCurrentScript(); - var abort = function abort() { var scriptEl = getCurrentScript(); - if (!scriptEl) { return; } - var content = scriptEl.textContent; - try { var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, "textContent").get; content = textContentGetter.call(scriptEl); } catch (e) {} - if (content.length === 0 && typeof scriptEl.src !== "undefined" && startsWith(scriptEl.src, SRC_DATA_MARKER)) { var encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length); content = window.atob(encodedContent); } - if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { hit(source); throw new ReferenceError(rid); } }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (base instanceof Object === false && base === null) { var props = property.split("."); var propIndex = props.indexOf(prop); @@ -15462,16 +13736,13 @@ logMessage(source, message); return; } - if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -15480,33 +13751,27 @@ }); return; } - var currentValue = base[prop]; var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) { currentValue = base[prop]; origDescriptor = undefined; } - var descriptorWrapper = Object.assign(getDescriptorAddon(), { currentValue: currentValue, get: function get() { if (!this.isAbortingSuspended) { this.isolateCallback(abort); } - if (origDescriptor instanceof Object) { return origDescriptor.get.call(base); } - return this.currentValue; }, set: function set(newValue) { if (!this.isAbortingSuspended) { this.isolateCallback(abort); } - if (origDescriptor instanceof Object) { origDescriptor.set.call(base, newValue); } else { @@ -15523,38 +13788,29 @@ } }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - function randomId() { return Math.random().toString(36).substr(2, 9); } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -15562,10 +13818,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -15573,7 +13827,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -15581,11 +13834,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -15595,119 +13846,85 @@ chain: chain }; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function startsWith(str, prefix) { return !!str && str.indexOf(prefix) === 0; } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getDescriptorAddon() { return { isAbortingSuspended: false, isolateCallback: function isolateCallback(cb) { this.isAbortingSuspended = true; - try { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - var result = cb.apply(void 0, args); this.isAbortingSuspended = false; return result; @@ -15719,44 +13936,35 @@ } }; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { abortCurrentInlineScript.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function abortOnPropertyRead(source, args) { function abortOnPropertyRead(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -15765,44 +13973,34 @@ }); return; } - setPropertyAccess(base, prop, { get: abort, set: function set() {} }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - function randomId() { return Math.random().toString(36).substr(2, 9); } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -15810,10 +14008,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -15821,7 +14017,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -15829,11 +14024,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -15843,116 +14036,83 @@ chain: chain }; } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { abortOnPropertyRead.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function abortOnPropertyWrite(source, args) { function abortOnPropertyWrite(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -15961,43 +14121,33 @@ }); return; } - setPropertyAccess(base, prop, { set: abort }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - function randomId() { return Math.random().toString(36).substr(2, 9); } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -16005,10 +14155,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -16016,7 +14164,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -16024,11 +14171,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -16038,116 +14183,83 @@ chain: chain }; } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { abortOnPropertyWrite.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function abortOnStackTrace(source, args) { function abortOnStackTrace(source, property, stack) { if (!property || !stack) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -16156,26 +14268,22 @@ }); return; } - if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) { logMessage(source, "Invalid parameter: ".concat(stack)); return; } - var descriptorWrapper = Object.assign(getDescriptorAddon(), { value: base[prop], get: function get() { if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { abort(); } - return this.value; }, set: function set(newValue) { if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { abort(); } - this.value = newValue; } }); @@ -16188,38 +14296,29 @@ } }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - function randomId() { return Math.random().toString(36).substr(2, 9); } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -16227,10 +14326,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -16238,7 +14335,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -16246,11 +14342,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -16260,126 +14354,91 @@ chain: chain }; } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function matchStackTrace(stackMatch, stackTrace) { if (!stackMatch || stackMatch === "") { return true; } - if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { return true; } - var stackRegexp = toRegExp(stackMatch); var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { return line.trim(); }).join("\n"); return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); } - function getDescriptorAddon() { return { isAbortingSuspended: false, isolateCallback: function isolateCallback(cb) { this.isAbortingSuspended = true; - try { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - var result = cb.apply(void 0, args); this.isAbortingSuspended = false; return result; @@ -16391,90 +14450,69 @@ } }; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getNativeRegexpTest() { return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; } - function startsWith(str, prefix) { return !!str && str.indexOf(prefix) === 0; } - function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { var INLINE_SCRIPT_STRING = "inlineScript"; var INJECTED_SCRIPT_STRING = "injectedScript"; var INJECTED_SCRIPT_MARKER = ""; - var isInlineScript = function isInlineScript(stackMatch) { return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; }; - var isInjectedScript = function isInjectedScript(stackMatch) { return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; }; - if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { return false; } - var documentURL = window.location.href; var pos = documentURL.indexOf("#"); - if (pos !== -1) { documentURL = documentURL.slice(0, pos); } - var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { return line.trim(); }); var stackLines = stackSteps.map(function (line) { var stack; var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); - if (getStackTraceURL) { var stackURL = getStackTraceURL[2]; - if (startsWith(stackURL, "(")) { stackURL = stackURL.slice(1); } - if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { stackURL = INJECTED_SCRIPT_STRING; var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); - if (startsWith(stackFunction, "at")) { stackFunction = stackFunction.slice(2).trim(); } - stack = "".concat(stackFunction, " ").concat(stackURL).trim(); } else { stack = stackURL; @@ -16482,39 +14520,31 @@ } else { stack = line; } - return stack; }); - if (stackLines) { for (var index = 0; index < stackLines.length; index += 1) { if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { return true; } - if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { return true; } } } - return false; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { abortOnStackTrace.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function adjustSetInterval(source, args) { function adjustSetInterval(source, matchCallback, matchDelay, boost) { var nativeSetInterval = window.setInterval; var matchRegexp = toRegExp(matchCallback); - var intervalWrapper = function intervalWrapper(callback, delay) { if (!isValidCallback(callback)) { var message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'."); @@ -16523,152 +14553,110 @@ delay *= getBoostMultiplier(boost); hit(source); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeSetInterval.apply(window, [callback, delay].concat(args)); }; - window.setInterval = intervalWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function isValidCallback(callback) { return callback instanceof Function || typeof callback === "string"; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function getBoostMultiplier(boost) { var DEFAULT_MULTIPLIER = .05; var MIN_MULTIPLIER = .02; var MAX_MULTIPLIER = 50; var parsedBoost = parseFloat(boost); var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost; - if (boostMultiplier < MIN_MULTIPLIER) { boostMultiplier = MIN_MULTIPLIER; } - if (boostMultiplier > MAX_MULTIPLIER) { boostMultiplier = MAX_MULTIPLIER; } - return boostMultiplier; } - function isDelayMatched(inputDelay, realDelay) { return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function nativeIsFinite(num) { var native = Number.isFinite || window.isFinite; return native(num); } - function getMatchDelay(delay) { var DEFAULT_DELAY = 1e3; var parsedDelay = parseInt(delay, 10); var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay; return delayMatch; } - function shouldMatchAnyDelay(delay) { return delay === "*"; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { adjustSetInterval.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function adjustSetTimeout(source, args) { function adjustSetTimeout(source, matchCallback, matchDelay, boost) { var nativeSetTimeout = window.setTimeout; var matchRegexp = toRegExp(matchCallback); - var timeoutWrapper = function timeoutWrapper(callback, delay) { if (!isValidCallback(callback)) { var message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'."); @@ -16677,189 +14665,138 @@ delay *= getBoostMultiplier(boost); hit(source); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeSetTimeout.apply(window, [callback, delay].concat(args)); }; - window.setTimeout = timeoutWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function isValidCallback(callback) { return callback instanceof Function || typeof callback === "string"; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function getBoostMultiplier(boost) { var DEFAULT_MULTIPLIER = .05; var MIN_MULTIPLIER = .02; var MAX_MULTIPLIER = 50; var parsedBoost = parseFloat(boost); var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost; - if (boostMultiplier < MIN_MULTIPLIER) { boostMultiplier = MIN_MULTIPLIER; } - if (boostMultiplier > MAX_MULTIPLIER) { boostMultiplier = MAX_MULTIPLIER; } - return boostMultiplier; } - function isDelayMatched(inputDelay, realDelay) { return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function nativeIsFinite(num) { var native = Number.isFinite || window.isFinite; return native(num); } - function getMatchDelay(delay) { var DEFAULT_DELAY = 1e3; var parsedDelay = parseInt(delay, 10); var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay; return delayMatch; } - function shouldMatchAnyDelay(delay) { return delay === "*"; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { adjustSetTimeout.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function debugCurrentInlineScript(source, args) { function debugCurrentInlineScript(source, property, search) { var searchRegexp = toRegExp(search); var rid = randomId(); - var getCurrentScript = function getCurrentScript() { if ("currentScript" in document) { return document.currentScript; } - var scripts = document.getElementsByTagName("script"); return scripts[scripts.length - 1]; }; - var ourScript = getCurrentScript(); - var abort = function abort() { var scriptEl = getCurrentScript(); - if (!scriptEl) { return; } - var content = scriptEl.textContent; - try { var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, "textContent").get; content = textContentGetter.call(scriptEl); } catch (e) {} - if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { hit(source); debugger; } }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (base instanceof Object === false && base === null) { var props = property.split("."); var propIndex = props.indexOf(prop); @@ -16868,16 +14805,13 @@ logMessage(message, source.verbose); return; } - if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -16886,7 +14820,6 @@ }); return; } - var currentValue = base[prop]; setPropertyAccess(base, prop, { set: function set(value) { @@ -16899,38 +14832,29 @@ } }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - function randomId() { return Math.random().toString(36).substr(2, 9); } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -16938,10 +14862,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -16949,7 +14871,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -16957,11 +14878,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -16971,141 +14890,102 @@ chain: chain }; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { debugCurrentInlineScript.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function debugOnPropertyRead(source, args) { function debugOnPropertyRead(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); debugger; }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -17114,44 +14994,34 @@ }); return; } - setPropertyAccess(base, prop, { get: abort, set: noopFunc }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - function randomId() { return Math.random().toString(36).substr(2, 9); } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -17159,10 +15029,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -17170,7 +15038,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -17178,11 +15045,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -17192,118 +15057,84 @@ chain: chain }; } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function noopFunc() {} - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { debugOnPropertyRead.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function debugOnPropertyWrite(source, args) { function debugOnPropertyWrite(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); debugger; }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -17312,43 +15143,33 @@ }); return; } - setPropertyAccess(base, prop, { set: abort }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - function randomId() { return Math.random().toString(36).substr(2, 9); } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -17356,10 +15177,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -17367,7 +15186,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -17375,11 +15193,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -17389,174 +15205,114 @@ chain: chain }; } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { debugOnPropertyWrite.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function dirString(source, args) { function dirString(source, times) { var _console = console, - dir = _console.dir; - times = parseInt(times, 10); - + dir = _console.dir; function dirWrapper(object) { - var temp; - - for (var i = 0; i < times; i += 1) { - temp = "".concat(object); - } - if (typeof dir === "function") { dir.call(this, object); } - - hit(source, temp); + hit(source); } - console.dir = dirWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { dirString.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function disableNewtabLinks(source, args) { function disableNewtabLinks(source) { document.addEventListener("click", function (ev) { var target = ev.target; - while (target !== null) { if (target.localName === "a" && target.hasAttribute("target")) { ev.stopPropagation(); @@ -17564,79 +15320,55 @@ hit(source); break; } - target = target.parentNode; } }); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { disableNewtabLinks.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function forceWindowClose(source, args) { function forceWindowClose(source) { var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; - if (typeof window.close !== "function") { var message = "window.close() is not a function so 'close-window' scriptlet is unavailable"; logMessage(source, message); + return; } - var closeImmediately = function closeImmediately() { try { hit(source); @@ -17645,12 +15377,10 @@ logMessage(source, e); } }; - var closeByExtension = function closeByExtension() { var extCall = function extCall() { dispatchEvent(new Event("adguard:scriptlet-close-window")); }; - window.addEventListener("adguard:subscribed-to-close-window", extCall, { once: true }); @@ -17660,202 +15390,141 @@ }); }, 5e3); }; - var shouldClose = function shouldClose() { if (path === "") { return true; } - var pathRegexp = toRegExp(path); var currentPath = "".concat(window.location.pathname).concat(window.location.search); return pathRegexp.test(currentPath); }; - if (shouldClose()) { closeImmediately(); - if (navigator.userAgent.indexOf("Chrome") > -1) { closeByExtension(); } } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { forceWindowClose.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function hideInShadowDom(source, args) { function hideInShadowDom(source, selector, baseSelector) { if (!Element.prototype.attachShadow) { return; } - var hideElement = function hideElement(targetElement) { var DISPLAY_NONE_CSS = "display:none!important;"; targetElement.style.cssText = DISPLAY_NONE_CSS; }; - var hideHandler = function hideHandler() { var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); - while (hostElements.length !== 0) { var isHidden = false; - var _pierceShadowDom = pierceShadowDom(selector, hostElements), - targets = _pierceShadowDom.targets, - innerHosts = _pierceShadowDom.innerHosts; - + targets = _pierceShadowDom.targets, + innerHosts = _pierceShadowDom.innerHosts; targets.forEach(function (targetEl) { hideElement(targetEl); isHidden = true; }); - if (isHidden) { hit(source); } - hostElements = innerHosts; } }; - hideHandler(); observeDOMChanges(hideHandler, true); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function observeDOMChanges(callback) { var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; var THROTTLE_DELAY_MS = 20; var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { @@ -17872,20 +15541,16 @@ }); } }; - var disconnect = function disconnect() { observer.disconnect(); }; - function callbackWrapper() { disconnect(); callback(); connect(); } - connect(); } - function findHostElements(rootElement) { var hosts = []; var domElems = rootElement.querySelectorAll("*"); @@ -17896,7 +15561,6 @@ }); return hosts; } - function pierceShadowDom(selector, hostElements) { var targets = []; var innerHostsAcc = []; @@ -17914,17 +15578,14 @@ innerHosts: innerHosts }; } - function flatten(input) { var stack = []; input.forEach(function (el) { return stack.push(el); }); var res = []; - while (stack.length) { var next = stack.pop(); - if (Array.isArray(next)) { next.forEach(function (el) { return stack.push(el); @@ -17933,83 +15594,66 @@ res.push(next); } } - return res.reverse(); } - function throttle(cb, delay) { var wait = false; var savedArgs; - var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - if (wait) { savedArgs = args; return; } - cb.apply(void 0, args); wait = true; setTimeout(function () { wait = false; - if (savedArgs) { wrapper(savedArgs); savedArgs = null; } }, delay); }; - return wrapper; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { hideInShadowDom.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function jsonPrune(source, args) { function jsonPrune(source, propsToRemove, requiredInitialProps, stack) { if (!!stack && !matchStackTrace(stack, new Error().stack)) { return; } - var prunePaths = propsToRemove !== undefined && propsToRemove !== "" ? propsToRemove.split(/ +/) : []; var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== "" ? requiredInitialProps.split(/ +/) : []; - function isPruningNeeded(root) { if (!root) { return false; } - var shouldProcess; - if (prunePaths.length === 0 && requiredPaths.length > 0) { var rootString = JSON.stringify(root); var matchRegex = toRegExp(requiredPaths.join("")); var shouldLog = matchRegex.test(rootString); - if (shouldLog) { - logMessage(source, "".concat(window.location.hostname, " ").concat(root), true); + logMessage(source, "".concat(window.location.hostname, " ").concat(objectToString(root)), true); shouldProcess = false; return shouldProcess; } } - for (var i = 0; i < requiredPaths.length; i += 1) { var requiredPath = requiredPaths[i]; var lastNestedPropName = requiredPath.split(".").pop(); var hasWildcard = requiredPath.indexOf(".*.") > -1 || requiredPath.indexOf("*.") > -1 || requiredPath.indexOf(".*") > -1 || requiredPath.indexOf(".[].") > -1 || requiredPath.indexOf("[].") > -1 || requiredPath.indexOf(".[]") > -1; var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); shouldProcess = !hasWildcard; - for (var _i = 0; _i < details.length; _i += 1) { if (hasWildcard) { shouldProcess = !(details[_i].base[lastNestedPropName] === undefined) || shouldProcess; @@ -18018,21 +15662,17 @@ } } } - return shouldProcess; } - var jsonPruner = function jsonPruner(root) { if (prunePaths.length === 0 && requiredPaths.length === 0) { - logMessage(source, "".concat(window.location.hostname, " ").concat(root), true); + logMessage(source, "".concat(window.location.hostname, " ").concat(objectToString(root)), true); return root; } - try { if (isPruningNeeded(root) === false) { return root; } - prunePaths.forEach(function (path) { var ownerObjArr = getWildcardPropertyInChain(root, path, true); ownerObjArr.forEach(function (ownerObj) { @@ -18045,109 +15685,77 @@ } catch (e) { logMessage(source, e); } - return root; }; - var nativeJSONParse = JSON.parse; - var jsonParseWrapper = function jsonParseWrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - var root = nativeJSONParse.apply(JSON, args); return jsonPruner(root); }; - jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse); JSON.parse = jsonParseWrapper; var nativeResponseJson = Response.prototype.json; - var responseJsonWrapper = function responseJsonWrapper() { var promise = nativeResponseJson.apply(this); return promise.then(function (obj) { return jsonPruner(obj); }); }; - if (typeof Response === "undefined") { return; } - Response.prototype.json = responseJsonWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function matchStackTrace(stackMatch, stackTrace) { if (!stackMatch || stackMatch === "") { return true; } - if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { return true; } - var stackRegexp = toRegExp(stackMatch); var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { return line.trim(); }).join("\n"); return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); } - function getWildcardPropertyInChain(base, chain) { var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; var pos = chain.indexOf("."); - if (pos === -1) { if (chain === "*" || chain === "[]") { for (var key in base) { @@ -18164,13 +15772,10 @@ prop: chain }); } - return output; } - var prop = chain.slice(0, pos); var shouldLookThrough = prop === "[]" && Array.isArray(base) || prop === "*" && base instanceof Object; - if (shouldLookThrough) { var nextProp = chain.slice(pos + 1); var baseKeys = Object.keys(base); @@ -18179,95 +15784,150 @@ getWildcardPropertyInChain(item, nextProp, lookThrough, output); }); } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if (nextBase !== undefined) { getWildcardPropertyInChain(nextBase, chain, lookThrough, output); } - return output; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - + function objectToString(obj) { + return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { + var key = pair[0]; + var value = pair[1]; + var recordValueStr = value; + if (value instanceof Object) { + recordValueStr = "{ ".concat(objectToString(value), " }"); + } + return "".concat(key, ':"').concat(recordValueStr, '"'); + }).join(" "); + } function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - - function getNativeRegexpTest() { - return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; + var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0; + } + function getObjectEntries(object) { + var keys = Object.keys(object); + var entries = []; + keys.forEach(function (key) { + return entries.push([key, object[key]]); + }); + return entries; + } + function getNativeRegexpTest() { + return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; + } + function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var INLINE_SCRIPT_STRING = "inlineScript"; + var INJECTED_SCRIPT_STRING = "injectedScript"; + var INJECTED_SCRIPT_MARKER = ""; + var isInlineScript = function isInlineScript(stackMatch) { + return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; + }; + var isInjectedScript = function isInjectedScript(stackMatch) { + return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; + }; + if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { + return false; + } + var documentURL = window.location.href; + var pos = documentURL.indexOf("#"); + if (pos !== -1) { + documentURL = documentURL.slice(0, pos); + } + var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }); + var stackLines = stackSteps.map(function (line) { + var stack; + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + if (getStackTraceURL) { + var stackURL = getStackTraceURL[2]; + if (startsWith(stackURL, "(")) { + stackURL = stackURL.slice(1); + } + if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { + stackURL = INJECTED_SCRIPT_STRING; + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if (startsWith(stackFunction, "at")) { + stackFunction = stackFunction.slice(2).trim(); + } + stack = "".concat(stackFunction, " ").concat(stackURL).trim(); + } else { + stack = stackURL; + } + } else { + stack = line; + } + return stack; + }); + if (stackLines) { + for (var index = 0; index < stackLines.length; index += 1) { + if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { + return true; + } + if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { + return true; + } + } + } + return false; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { jsonPrune.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function log(source, args) { function log() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - console.log(args); } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { log.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function logAddEventListener(source, args) { function logAddEventListener(source) { var nativeAddEventListener = window.EventTarget.prototype.addEventListener; - function addEventListenerWrapper(type, listener) { if (validateType(type) && validateListener(listener)) { var _message = 'addEventListener("'.concat(type, '", ').concat(listenerToString(listener), ")"); - logMessage(source, _message, true); hit(source); } - var message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); logMessage(source, message, true); - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); } - var descriptor = { configurable: true, set: function set() {}, @@ -18279,71 +15939,47 @@ Object.defineProperty(window, "addEventListener", descriptor); Object.defineProperty(document, "addEventListener", descriptor); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function validateType(type) { return typeof type !== "undefined"; } - function validateListener(listener) { return typeof listener !== "undefined" && (typeof listener === "function" || typeof listener === "object" && listener !== null && typeof listener.handleEvent === "function"); } - function listenerToString(listener) { return typeof listener === "function" ? listener.toString() : listener.handleEvent.toString(); } - function convertTypeToString(value) { var output; - if (typeof value === "undefined") { output = "undefined"; } else if (typeof value === "object") { @@ -18355,36 +15991,28 @@ } else { output = value.toString(); } - return output; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function objectToString(obj) { return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { var key = pair[0]; var value = pair[1]; var recordValueStr = value; - if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } - return "".concat(key, ':"').concat(recordValueStr, '"'); }).join(" "); } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getObjectEntries(object) { var keys = Object.keys(object); var entries = []; @@ -18393,117 +16021,83 @@ }); return entries; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { logAddEventListener.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function logEval(source, args) { function logEval(source) { var nativeEval = window.eval; - function evalWrapper(str) { hit(source); logMessage(source, 'eval("'.concat(str, '")'), true); return nativeEval(str); } - window.eval = evalWrapper; var nativeFunction = window.Function; - function FunctionWrapper() { hit(source); - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - logMessage(source, "new Function(".concat(args.join(", "), ")"), true); return nativeFunction.apply(this, [].concat(args)); } - FunctionWrapper.prototype = Object.create(nativeFunction.prototype); FunctionWrapper.prototype.constructor = FunctionWrapper; window.Function = FunctionWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { logEval.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function logOnStacktrace(source, args) { function logOnStacktrace(source, property) { if (!property) { return; } - var refineStackTrace = function refineStackTrace(stackString) { var stackSteps = stackString.split("\n").slice(2).map(function (line) { return line.replace(/ {4}at /, ""); @@ -18513,7 +16107,6 @@ var funcFullPath; var reg = /\(([^\)]+)\)/; var regFirefox = /(.*?@)(\S+)(:\d+):\d+\)?$/; - if (line.match(reg)) { funcName = line.split(" ").slice(0, -1).join(" "); funcFullPath = line.match(reg)[1]; @@ -18524,7 +16117,6 @@ funcName = "function name is not available"; funcFullPath = line; } - return [funcName, funcFullPath]; }); var logInfoObject = {}; @@ -18533,22 +16125,18 @@ }); return logInfoObject; }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -18557,7 +16145,6 @@ }); return; } - var value = base[prop]; setPropertyAccess(base, prop, { get: function get() { @@ -18574,22 +16161,17 @@ } }); }; - setChainPropAccess(window, property); } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -18597,10 +16179,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -18608,7 +16188,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -18616,11 +16195,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -18630,165 +16207,111 @@ chain: chain }; } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { logOnStacktrace.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function noTopics(source, args) { function noTopics(source) { var TOPICS_PROPERTY_NAME = "browsingTopics"; - if (Document instanceof Object === false) { return; } - if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) { return; } - Document.prototype[TOPICS_PROPERTY_NAME] = function () { return noopPromiseResolve("[]"); }; - hit(source); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function noopPromiseResolve() { var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; - if (typeof Response === "undefined") { return; } - var response = new Response(responseBody, { status: 200, statusText: "OK" @@ -18803,101 +16326,79 @@ }); return Promise.resolve(response); } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { noTopics.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function noeval(source, args) { function noeval(source) { window.eval = function evalWrapper(s) { - hit(source, "AdGuard has prevented eval:\n".concat(s)); + hit(source); + logMessage(source, "AdGuard has prevented eval:\n".concat(s), true); }.bind(); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + if (forced || source.verbose) { + console.log("".concat(source.name, ": ").concat(message)); + } + } var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { noeval.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function nowebrtc(source, args) { function nowebrtc(source) { var propertyName = ""; - if (window.RTCPeerConnection) { propertyName = "RTCPeerConnection"; } else if (window.webkitRTCPeerConnection) { propertyName = "webkitRTCPeerConnection"; } - if (propertyName === "") { return; } - var rtcReplacement = function rtcReplacement(config) { var message = "Document tried to create an RTCPeerConnection: ".concat(convertRtcConfigToString(config)); logMessage(source, message); hit(source); }; - rtcReplacement.prototype = { close: noopFunc, createDataChannel: noopFunc, @@ -18906,7 +16407,6 @@ }; var rtc = window[propertyName]; window[propertyName] = rtcReplacement; - if (rtc.prototype) { rtc.prototype.createDataChannel = function (a, b) { return { @@ -18916,118 +16416,83 @@ }.bind(null); } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function noopFunc() {} - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function convertRtcConfigToString(config) { var UNDEF_STR = "undefined"; var str = UNDEF_STR; - if (config === null) { str = "null"; } else if (config instanceof Object) { var SERVERS_PROP_NAME = "iceServers"; var URLS_PROP_NAME = "urls"; - if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) { str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString(); } } - return str; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { nowebrtc.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventAddEventListener(source, args) { function preventAddEventListener(source, typeSearch, listenerSearch) { var typeSearchRegexp = toRegExp(typeSearch); var listenerSearchRegexp = toRegExp(listenerSearch); var nativeAddEventListener = window.EventTarget.prototype.addEventListener; - function addEventListenerWrapper(type, listener) { var shouldPrevent = false; - if (validateType(type) && validateListener(listener)) { shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); } - if (shouldPrevent) { hit(source); return undefined; } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); } - var descriptor = { configurable: true, set: function set() {}, @@ -19039,104 +16504,73 @@ Object.defineProperty(window, "addEventListener", descriptor); Object.defineProperty(document, "addEventListener", descriptor); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function validateType(type) { return typeof type !== "undefined"; } - function validateListener(listener) { return typeof listener !== "undefined" && (typeof listener === "function" || typeof listener === "object" && listener !== null && typeof listener.handleEvent === "function"); } - function listenerToString(listener) { return typeof listener === "function" ? listener.toString() : listener.handleEvent.toString(); } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventAddEventListener.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventAdfly(source, args) { function preventAdfly(source) { var isDigit = function isDigit(data) { return /^\d$/.test(data); }; - var handler = function handler(encodedURL) { var evenChars = ""; var oddChars = ""; - for (var i = 0; i < encodedURL.length; i += 1) { if (i % 2 === 0) { evenChars += encodedURL.charAt(i); @@ -19144,37 +16578,29 @@ oddChars = encodedURL.charAt(i) + oddChars; } } - var data = (evenChars + oddChars).split(""); - for (var _i = 0; _i < data.length; _i += 1) { if (isDigit(data[_i])) { for (var ii = _i + 1; ii < data.length; ii += 1) { if (isDigit(data[ii])) { var temp = parseInt(data[_i], 10) ^ parseInt(data[ii], 10); - if (temp < 10) { data[_i] = temp.toString(); } - _i = ii; break; } } } } - data = data.join(""); var decodedURL = window.atob(data).slice(16, -16); - if (window.stop) { window.stop(); } - window.onbeforeunload = null; window.location.href = decodedURL; }; - var val; var applyHandler = true; var result = setPropertyAccess(window, "ysmm", { @@ -19182,246 +16608,175 @@ set: function set(value) { if (applyHandler) { applyHandler = false; - try { if (typeof value === "string") { handler(value); } } catch (err) {} } - val = value; }, get: function get() { return val; } }); - if (result) { hit(source); } else { logMessage(source, "Failed to set up prevent-adfly scriptlet"); } } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventAdfly.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventBab(source, args) { function preventBab(source) { var nativeSetTimeout = window.setTimeout; var babRegex = /\.bab_elementid.$/; - var timeoutWrapper = function timeoutWrapper(callback) { if (typeof callback !== "string" || !babRegex.test(callback)) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeSetTimeout.apply(window, [callback].concat(args)); } - hit(source); }; - window.setTimeout = timeoutWrapper; var signatures = [["blockadblock"], ["babasbm"], [/getItem\('babn'\)/], ["getElementById", "String.fromCharCode", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "charAt", "DOMContentLoaded", "AdBlock", "addEventListener", "doScroll", "fromCharCode", "<<2|r>>4", "sessionStorage", "clientWidth", "localStorage", "Math", "random"]]; - var check = function check(str) { if (typeof str !== "string") { return false; } - for (var i = 0; i < signatures.length; i += 1) { var tokens = signatures[i]; var match = 0; - for (var j = 0; j < tokens.length; j += 1) { var token = tokens[j]; var found = token instanceof RegExp ? token.test(str) : str.indexOf(token) > -1; - if (found) { match += 1; } } - if (match / tokens.length >= .8) { return true; } } - return false; }; - var nativeEval = window.eval; - var evalWrapper = function evalWrapper(str) { if (!check(str)) { return nativeEval(str); } - hit(source); var bodyEl = document.body; - if (bodyEl) { bodyEl.style.removeProperty("visibility"); } - var el = document.getElementById("babasbmsgx"); - if (el) { el.parentNode.removeChild(el); } }; - window.eval = evalWrapper.bind(window); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventBab.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventElementSrcLoading(source, args) { function preventElementSrcLoading(source, tagName, match) { if (typeof Proxy === "undefined" || typeof Reflect === "undefined") { return; } - var srcMockData = { script: "data:text/javascript;base64,KCk9Pnt9", img: "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", iframe: "data:text/html;base64, PGRpdj48L2Rpdj4=" }; var instance; - if (tagName === "script") { instance = HTMLScriptElement; } else if (tagName === "img") { @@ -19431,10 +16786,8 @@ } else { return; } - var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === "function"; var policy; - if (hasTrustedTypes) { policy = window.trustedTypes.createPolicy("mock", { createScriptURL: function createScriptURL(arg) { @@ -19442,44 +16795,35 @@ } }); } - var SOURCE_PROPERTY_NAME = "src"; var ONERROR_PROPERTY_NAME = "onerror"; var searchRegexp = toRegExp(match); - var setMatchedAttribute = function setMatchedAttribute(elem) { return elem.setAttribute(source.name, "matched"); }; - var setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) { if (!args[0] || !args[1]) { return Reflect.apply(target, thisArg, args); } - var nodeName = thisArg.nodeName.toLowerCase(); var attrName = args[0].toLowerCase(); var attrValue = args[1]; var isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue); - if (!isMatched) { return Reflect.apply(target, thisArg, args); } - hit(source); setMatchedAttribute(thisArg); return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]); }; - var setAttributeHandler = { apply: setAttributeWrapper }; instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler); var origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME); - if (!origSrcDescriptor) { return; } - Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, { enumerable: true, configurable: true, @@ -19489,30 +16833,25 @@ set: function set(urlValue) { var nodeName = this.nodeName.toLowerCase(); var isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue); - if (!isMatched) { origSrcDescriptor.set.call(this, urlValue); return true; } - if (policy && urlValue instanceof TrustedScriptURL) { var trustedSrc = policy.createScriptURL(urlValue); origSrcDescriptor.set.call(this, trustedSrc); hit(source); return; } - setMatchedAttribute(this); origSrcDescriptor.set.call(this, srcMockData[nodeName]); hit(source); } }); var origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME); - if (!origOnerrorDescriptor) { return; } - Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, { enumerable: true, configurable: true, @@ -19521,240 +16860,168 @@ }, set: function set(cb) { var isMatched = this.getAttribute(source.name) === "matched"; - if (!isMatched) { origOnerrorDescriptor.set.call(this, cb); return true; } - origOnerrorDescriptor.set.call(this, noopFunc); return true; } }); - var addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) { if (!args[0] || !args[1]) { return Reflect.apply(target, thisArg, args); } - var eventName = args[0]; var isMatched = thisArg.getAttribute(source.name) === "matched" && eventName === "error"; - if (isMatched) { return Reflect.apply(target, thisArg, [eventName, noopFunc]); } - return Reflect.apply(target, thisArg, args); }; - var addEventListenerHandler = { apply: addEventListenerWrapper }; EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function safeGetDescriptor(obj, prop) { var descriptor = Object.getOwnPropertyDescriptor(obj, prop); - if (descriptor && descriptor.configurable) { return descriptor; } - return null; } - function noopFunc() {} - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventElementSrcLoading.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventEvalIf(source, args) { function preventEvalIf(source, search) { var searchRegexp = toRegExp(search); var nativeEval = window.eval; - window.eval = function (payload) { if (!searchRegexp.test(payload.toString())) { return nativeEval.call(window, payload); } - - hit(source, payload); + hit(source); return undefined; }.bind(window); } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventEvalIf.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventFab(source, args) { function preventFab(source) { hit(source); - var Fab = function Fab() {}; - Fab.prototype.check = noopFunc; Fab.prototype.clearEvent = noopFunc; Fab.prototype.emitEvent = noopFunc; - Fab.prototype.on = function (a, b) { if (!a) { b(); } - return this; }; - Fab.prototype.onDetected = noopThis; - Fab.prototype.onNotDetected = function (a) { a(); return this; }; - Fab.prototype.setOption = noopFunc; Fab.prototype.options = { set: noopFunc, @@ -19773,212 +17040,151 @@ }, set: function set() {} }; - if (Object.prototype.hasOwnProperty.call(window, "FuckAdBlock")) { window.FuckAdBlock = Fab; } else { Object.defineProperty(window, "FuckAdBlock", getSetFab); } - if (Object.prototype.hasOwnProperty.call(window, "BlockAdBlock")) { window.BlockAdBlock = Fab; } else { Object.defineProperty(window, "BlockAdBlock", getSetFab); } - if (Object.prototype.hasOwnProperty.call(window, "SniffAdBlock")) { window.SniffAdBlock = Fab; } else { Object.defineProperty(window, "SniffAdBlock", getSetFab); } - if (Object.prototype.hasOwnProperty.call(window, "fuckAdBlock")) { window.fuckAdBlock = fab; } else { Object.defineProperty(window, "fuckAdBlock", getsetfab); } - if (Object.prototype.hasOwnProperty.call(window, "blockAdBlock")) { window.blockAdBlock = fab; } else { Object.defineProperty(window, "blockAdBlock", getsetfab); } - if (Object.prototype.hasOwnProperty.call(window, "sniffAdBlock")) { window.sniffAdBlock = fab; } else { Object.defineProperty(window, "sniffAdBlock", getsetfab); } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function noopFunc() {} - function noopThis() { return this; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventFab.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventFetch(source, args) { function preventFetch(source, propsToMatch) { var responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "emptyObj"; var responseType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "default"; - if (typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { return; } - var strResponseBody; - - if (responseBody === "emptyObj") { + if (responseBody === "" || responseBody === "emptyObj") { strResponseBody = "{}"; } else if (responseBody === "emptyArr") { strResponseBody = "[]"; } else { return; } - if (!(responseType === "default" || responseType === "opaque")) { logMessage(source, "Invalid parameter: ".concat(responseType)); return; } - var handlerWrapper = function handlerWrapper(target, thisArg, args) { var shouldPrevent = false; var fetchData = getFetchData(args); - if (typeof propsToMatch === "undefined") { logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); hit(source); return Reflect.apply(target, thisArg, args); } - shouldPrevent = matchRequestProps(source, propsToMatch, fetchData); - if (shouldPrevent) { hit(source); return noopPromiseResolve(strResponseBody, fetchData.url, responseType); } - return Reflect.apply(target, thisArg, args); }; - var fetchHandler = { apply: handlerWrapper }; fetch = new Proxy(fetch, fetchHandler); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function getFetchData(args) { var fetchPropsObj = {}; var fetchUrl; var fetchInit; - if (args[0] instanceof Request) { var requestData = getRequestData(args[0]); fetchUrl = requestData.url; @@ -19987,41 +17193,32 @@ fetchUrl = args[0]; fetchInit = args[1]; } - fetchPropsObj.url = fetchUrl; - if (fetchInit instanceof Object) { Object.keys(fetchInit).forEach(function (prop) { fetchPropsObj[prop] = fetchInit[prop]; }); } - return fetchPropsObj; } - function objectToString(obj) { return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { var key = pair[0]; var value = pair[1]; var recordValueStr = value; - if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } - return "".concat(key, ':"').concat(recordValueStr, '"'); }).join(" "); } - function noopPromiseResolve() { var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; - if (typeof Response === "undefined") { return; } - var response = new Response(responseBody, { status: 200, statusText: "OK" @@ -20036,15 +17233,12 @@ }); return Promise.resolve(response); } - function matchRequestProps(source, propsToMatch, requestData) { if (propsToMatch === "" || propsToMatch === "*") { return true; } - var isMatched; var parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { logMessage(source, "Invalid parameter: ".concat(propsToMatch)); isMatched = false; @@ -20055,63 +17249,48 @@ return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); }); } - return isMatched; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getRequestData(request) { var requestInitOptions = getRequestProps(); var entries = requestInitOptions.map(function (key) { @@ -20120,11 +17299,9 @@ }); return getObjectFromEntries(entries); } - function getRequestProps() { return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; } - function getObjectEntries(object) { var keys = Object.keys(object); var entries = []; @@ -20133,7 +17310,6 @@ }); return entries; } - function getObjectFromEntries(entries) { var output = entries.reduce(function (acc, el) { var key = el[0]; @@ -20143,7 +17319,6 @@ }, {}); return output; } - function parseMatchProps(propsToMatchStr) { var PROPS_DIVIDER = " "; var PAIRS_MARKER = ":"; @@ -20154,7 +17329,6 @@ var dividerInd = prop.indexOf(PAIRS_MARKER); var key = prop.slice(0, dividerInd); var hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { var value = prop.slice(dividerInd + 1); propsObj[key] = value; @@ -20164,13 +17338,11 @@ }); return propsObj; } - function validateParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); }); } - function getMatchPropsData(data) { var matchData = {}; Object.keys(data).forEach(function (key) { @@ -20178,24 +17350,19 @@ }); return matchData; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventFetch.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventPopadsNet(source, args) { function preventPopadsNet(source) { var rid = randomId(); - var throwError = function throwError() { throw new ReferenceError(rid); }; - delete window.PopAds; delete window.popns; Object.defineProperties(window, { @@ -20209,93 +17376,65 @@ window.onerror = createOnErrorHandler(rid).bind(); hit(source); } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - function randomId() { return Math.random().toString(36).substr(2, 9); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventPopadsNet.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventRefresh(source, args) { function preventRefresh(source, delaySec) { var getMetaElements = function getMetaElements() { var metaNodes = []; - try { metaNodes = document.querySelectorAll('meta[http-equiv="refresh" i][content]'); } catch (e) { @@ -20305,67 +17444,52 @@ logMessage(source, e); } } - return Array.from(metaNodes); }; - var getMetaContentDelay = function getMetaContentDelay(metaElements) { var delays = metaElements.map(function (meta) { var contentString = meta.getAttribute("content"); - if (contentString.length === 0) { return null; } - var contentDelay; var limiterIndex = contentString.indexOf(";"); - if (limiterIndex !== -1) { var delaySubstring = contentString.substring(0, limiterIndex); contentDelay = getNumberFromString(delaySubstring); } else { contentDelay = getNumberFromString(contentString); } - return contentDelay; }).filter(function (delay) { return delay !== null; }); - if (!delays.length) { return null; } - var minDelay = delays.reduce(function (a, b) { return Math.min(a, b); }); return minDelay; }; - var stop = function stop() { var metaElements = getMetaElements(); - if (metaElements.length === 0) { return; } - var secondsToRun = getNumberFromString(delaySec); - if (secondsToRun === null) { secondsToRun = getMetaContentDelay(metaElements); } - if (secondsToRun === null) { return; } - var delayMs = secondsToRun * 1e3; setTimeout(function () { window.stop(); hit(source); }, delayMs); }; - if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", stop, { once: true @@ -20374,169 +17498,115 @@ stop(); } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function getNumberFromString(rawString) { var parsedDelay = parseInt(rawString, 10); var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; return validDelay; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventRefresh.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventRequestAnimationFrame(source, args) { function preventRequestAnimationFrame(source, match) { var nativeRequestAnimationFrame = window.requestAnimationFrame; var shouldLog = typeof match === "undefined"; - var _parseMatchArg = parseMatchArg(match), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; var rafWrapper = function rafWrapper(callback) { var shouldPrevent = false; - if (shouldLog) { hit(source); logMessage(source, "requestAnimationFrame(".concat(String(callback), ")"), true); } else if (isValidCallback(callback) && isValidStrPattern(match)) { shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch; } - if (shouldPrevent) { hit(source); return nativeRequestAnimationFrame(noopFunc); } - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeRequestAnimationFrame.apply(window, [callback].concat(args)); }; - window.requestAnimationFrame = rafWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function noopFunc() {} - function parseMatchArg(match) { var INVERT_MARKER = "!"; var isInvertedMatch = startsWith(match, INVERT_MARKER); @@ -20547,82 +17617,63 @@ matchRegexp: matchRegexp }; } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function isValidCallback(callback) { return callback instanceof Function || typeof callback === "string"; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function startsWith(str, prefix) { return !!str && str.indexOf(prefix) === 0; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventRequestAnimationFrame.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventSetInterval(source, args) { function preventSetInterval(source, matchCallback, matchDelay) { var isProxySupported = typeof Proxy !== "undefined"; var nativeInterval = window.setInterval; var shouldLog = typeof matchCallback === "undefined" && typeof matchDelay === "undefined"; - var legacyIntervalWrapper = function legacyIntervalWrapper(callback, delay) { var shouldPrevent = false; - if (shouldLog) { hit(source); logMessage(source, "setInterval(".concat(String(callback), ", ").concat(delay, ")"), true); @@ -20634,24 +17685,19 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); return nativeInterval(noopFunc, delay); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeInterval.apply(window, [callback, delay].concat(args)); }; - var handlerWrapper = function handlerWrapper(target, thisArg, args) { var callback = args[0]; var delay = args[1]; var shouldPrevent = false; - if (shouldLog) { hit(source); logMessage(source, "setInterval(".concat(String(callback), ", ").concat(delay, ")"), true); @@ -20663,97 +17709,67 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); args[0] = noopFunc; } - return target.apply(thisArg, args); }; - var setIntervalHandler = { apply: handlerWrapper }; window.setInterval = isProxySupported ? new Proxy(window.setInterval, setIntervalHandler) : legacyIntervalWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function noopFunc() {} - function isPreventionNeeded(_ref) { var callback = _ref.callback, - delay = _ref.delay, - matchCallback = _ref.matchCallback, - matchDelay = _ref.matchDelay; - + delay = _ref.delay, + matchCallback = _ref.matchCallback, + matchDelay = _ref.matchDelay; if (!isValidCallback(callback)) { return false; } - if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { return false; } - var _parseMatchArg = parseMatchArg(matchCallback), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; var _parseDelayArg = parseDelayArg(matchDelay), - isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, - delayMatch = _parseDelayArg.delayMatch; - + isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, + delayMatch = _parseDelayArg.delayMatch; var shouldPrevent = false; var callbackStr = String(callback); - if (delayMatch === null) { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; } else if (!matchCallback) { @@ -20761,44 +17777,34 @@ } else { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && delay === delayMatch !== isInvertedDelayMatch; } - return shouldPrevent; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function startsWith(str, prefix) { return !!str && str.indexOf(prefix) === 0; } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function parseMatchArg(match) { var INVERT_MARKER = "!"; var isInvertedMatch = startsWith(match, INVERT_MARKER); @@ -20809,7 +17815,6 @@ matchRegexp: matchRegexp }; } - function parseDelayArg(delay) { var INVERT_MARKER = "!"; var isInvertedDelayMatch = startsWith(delay, INVERT_MARKER); @@ -20821,81 +17826,62 @@ delayMatch: delayMatch }; } - function isValidCallback(callback) { return callback instanceof Function || typeof callback === "string"; } - function isValidMatchStr(match) { var INVERT_MARKER = "!"; var str = match; - if (startsWith(match, INVERT_MARKER)) { str = match.slice(1); } - return isValidStrPattern(str); } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function nativeIsFinite(num) { var native = Number.isFinite || window.isFinite; return native(num); } - function isValidMatchNumber(match) { var INVERT_MARKER = "!"; var str = match; - if (startsWith(match, INVERT_MARKER)) { str = match.slice(1); } - var num = parseFloat(str); return !nativeIsNaN(num) && nativeIsFinite(num); } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventSetInterval.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventSetTimeout(source, args) { function preventSetTimeout(source, matchCallback, matchDelay) { var isProxySupported = typeof Proxy !== "undefined"; var nativeTimeout = window.setTimeout; var shouldLog = typeof matchCallback === "undefined" && typeof matchDelay === "undefined"; - var legacyTimeoutWrapper = function legacyTimeoutWrapper(callback, delay) { var shouldPrevent = false; - if (shouldLog) { hit(source); logMessage(source, "setTimeout(".concat(String(callback), ", ").concat(delay, ")"), true); @@ -20907,24 +17893,19 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); return nativeTimeout(noopFunc, delay); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeTimeout.apply(window, [callback, delay].concat(args)); }; - var handlerWrapper = function handlerWrapper(target, thisArg, args) { var callback = args[0]; var delay = args[1]; var shouldPrevent = false; - if (shouldLog) { hit(source); logMessage(source, "setTimeout(".concat(String(callback), ", ").concat(delay, ")"), true); @@ -20936,97 +17917,67 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); args[0] = noopFunc; } - return target.apply(thisArg, args); }; - var setTimeoutHandler = { apply: handlerWrapper }; window.setTimeout = isProxySupported ? new Proxy(window.setTimeout, setTimeoutHandler) : legacyTimeoutWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function noopFunc() {} - function isPreventionNeeded(_ref) { var callback = _ref.callback, - delay = _ref.delay, - matchCallback = _ref.matchCallback, - matchDelay = _ref.matchDelay; - + delay = _ref.delay, + matchCallback = _ref.matchCallback, + matchDelay = _ref.matchDelay; if (!isValidCallback(callback)) { return false; } - if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { return false; } - var _parseMatchArg = parseMatchArg(matchCallback), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; var _parseDelayArg = parseDelayArg(matchDelay), - isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, - delayMatch = _parseDelayArg.delayMatch; - + isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, + delayMatch = _parseDelayArg.delayMatch; var shouldPrevent = false; var callbackStr = String(callback); - if (delayMatch === null) { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; } else if (!matchCallback) { @@ -21034,18 +17985,14 @@ } else { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && delay === delayMatch !== isInvertedDelayMatch; } - return shouldPrevent; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function parseMatchArg(match) { var INVERT_MARKER = "!"; var isInvertedMatch = startsWith(match, INVERT_MARKER); @@ -21056,7 +18003,6 @@ matchRegexp: matchRegexp }; } - function parseDelayArg(delay) { var INVERT_MARKER = "!"; var isInvertedDelayMatch = startsWith(delay, INVERT_MARKER); @@ -21068,98 +18014,75 @@ delayMatch: delayMatch }; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function startsWith(str, prefix) { return !!str && str.indexOf(prefix) === 0; } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function isValidCallback(callback) { return callback instanceof Function || typeof callback === "string"; } - function isValidMatchStr(match) { var INVERT_MARKER = "!"; var str = match; - if (startsWith(match, INVERT_MARKER)) { str = match.slice(1); } - return isValidStrPattern(str); } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function nativeIsFinite(num) { var native = Number.isFinite || window.isFinite; return native(num); } - function isValidMatchNumber(match) { var INVERT_MARKER = "!"; var str = match; - if (startsWith(match, INVERT_MARKER)) { str = match.slice(1); } - var num = parseFloat(str); return !nativeIsNaN(num) && nativeIsFinite(num); } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventSetTimeout.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventWindowOpen(source, args) { function preventWindowOpen(source) { var match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "*"; @@ -21167,62 +18090,48 @@ var replacement = arguments.length > 3 ? arguments[3] : undefined; var nativeOpen = window.open; var isNewSyntax = match !== "0" && match !== "1"; - var oldOpenWrapper = function oldOpenWrapper(str) { match = Number(match) > 0; - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - if (!isValidStrPattern(delay)) { logMessage(source, "Invalid parameter: ".concat(delay)); return nativeOpen.apply(window, [str].concat(args)); } - var searchRegexp = toRegExp(delay); - if (match !== searchRegexp.test(str)) { return nativeOpen.apply(window, [str].concat(args)); } - hit(source); return handleOldReplacement(replacement); }; - var newOpenWrapper = function newOpenWrapper(url) { var shouldLog = replacement && replacement.indexOf("log") > -1; - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } - if (shouldLog) { var argsStr = args && args.length > 0 ? ", ".concat(args.join(", ")) : ""; - var message = "window-open: ".concat(url).concat(argsStr); + var message = "".concat(url).concat(argsStr); logMessage(source, message, true); hit(source); } - var shouldPrevent = false; - if (match === "*") { shouldPrevent = true; } else if (isValidMatchStr(match)) { var _parseMatchArg = parseMatchArg(match), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; shouldPrevent = matchRegexp.test(url) !== isInvertedMatch; } else { logMessage(source, "Invalid parameter: ".concat(match)); shouldPrevent = false; } - if (shouldPrevent) { var parsedDelay = parseInt(delay, 10); var result; - if (nativeIsNaN(parsedDelay)) { result = noopNull(); } else { @@ -21233,7 +18142,6 @@ }; var decoy = createDecoy(decoyArgs); var popup = decoy.contentWindow; - if (typeof popup === "object" && popup !== null) { Object.defineProperty(popup, "closed", { value: false @@ -21251,127 +18159,89 @@ }); popup = decoy.contentWindow; } - result = popup; } - hit(source); return result; } - return nativeOpen.apply(window, [url].concat(args)); }; - window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper; window.open.toString = nativeOpen.toString.bind(nativeOpen); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function isValidMatchStr(match) { var INVERT_MARKER = "!"; var str = match; - if (startsWith(match, INVERT_MARKER)) { str = match.slice(1); } - return isValidStrPattern(str); } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function parseMatchArg(match) { var INVERT_MARKER = "!"; var isInvertedMatch = startsWith(match, INVERT_MARKER); @@ -21382,43 +18252,36 @@ matchRegexp: matchRegexp }; } - function handleOldReplacement(replacement) { var result; - if (!replacement) { result = noopFunc; } else if (replacement === "trueFunc") { result = trueFunc; } else if (replacement.indexOf("=") > -1) { var isProp = startsWith(replacement, "{") && endsWith(replacement, "}"); - if (isProp) { var propertyPart = replacement.slice(1, -1); var propertyName = substringBefore(propertyPart, "="); var propertyValue = substringAfter(propertyPart, "="); - if (propertyValue === "noopFunc") { result = {}; result[propertyName] = noopFunc; } } } - return result; } - function createDecoy(args) { var OBJECT_TAG_NAME = "object"; var OBJECT_URL_PROP_NAME = "data"; var IFRAME_TAG_NAME = "iframe"; var IFRAME_URL_PROP_NAME = "src"; var replacement = args.replacement, - url = args.url, - delay = args.delay; + url = args.url, + delay = args.delay; var tag; var urlProp; - if (replacement === "obj") { tag = OBJECT_TAG_NAME; urlProp = OBJECT_URL_PROP_NAME; @@ -21426,7 +18289,6 @@ tag = IFRAME_TAG_NAME; urlProp = IFRAME_URL_PROP_NAME; } - var decoy = document.createElement(tag); decoy[urlProp] = url; decoy.style.setProperty("height", "1px", "important"); @@ -21439,127 +18301,99 @@ }, delay * 1e3); return decoy; } - function getPreventGetter(nativeGetter) { var preventGetter = function preventGetter(target, prop) { if (prop && prop === "closed") { return false; } - if (typeof nativeGetter === "function") { return noopFunc; } - return prop && target[prop]; }; - return preventGetter; } - function noopNull() { return null; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function noopFunc() {} - function trueFunc() { return true; } - function startsWith(str, prefix) { return !!str && str.indexOf(prefix) === 0; } - function endsWith(str, ending) { return !!str && str.lastIndexOf(ending) === str.length - ending.length; } - function substringBefore(str, separator) { if (!str || !separator) { return str; } - var index = str.indexOf(separator); return index < 0 ? str : str.substring(0, index); } - function substringAfter(str, separator) { if (!str) { return str; } - var index = str.indexOf(separator); return index < 0 ? "" : str.substring(index + separator.length); } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventWindowOpen.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventXHR(source, args) { function preventXHR(source, propsToMatch, customResponseText) { if (typeof Proxy === "undefined") { return; } - var shouldPrevent = false; var response = ""; var responseText = ""; var responseUrl; - var openWrapper = function openWrapper(target, thisArg, args) { var xhrData = { method: args[0], url: args[1] }; responseUrl = xhrData.url; - if (typeof propsToMatch === "undefined") { logMessage(source, "xhr( ".concat(objectToString(xhrData), " )"), true); hit(source); } else { shouldPrevent = matchRequestProps(source, propsToMatch, xhrData); } - return Reflect.apply(target, thisArg, args); }; - var sendWrapper = function sendWrapper(target, thisArg, args) { if (!shouldPrevent) { return Reflect.apply(target, thisArg, args); } - if (thisArg.responseType === "blob") { response = new Blob(); } - if (thisArg.responseType === "arraybuffer") { response = new ArrayBuffer(); } - if (customResponseText) { var randomText = generateRandomResponse(customResponseText); - if (randomText) { responseText = randomText; } else { logMessage(source, "Invalid range: ".concat(customResponseText)); } } - Object.defineProperties(thisArg, { readyState: { value: 4, @@ -21601,7 +18435,6 @@ hit(source); return undefined; }; - var openHandler = { apply: openWrapper }; @@ -21611,86 +18444,59 @@ XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function objectToString(obj) { return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { var key = pair[0]; var value = pair[1]; var recordValueStr = value; - if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } - return "".concat(key, ':"').concat(recordValueStr, '"'); }).join(" "); } - function matchRequestProps(source, propsToMatch, requestData) { if (propsToMatch === "" || propsToMatch === "*") { return true; } - var isMatched; var parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { logMessage(source, "Invalid parameter: ".concat(propsToMatch)); isMatched = false; @@ -21701,94 +18507,71 @@ return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); }); } - return isMatched; } - function generateRandomResponse(customResponseText) { var customResponse = customResponseText; - if (customResponse === "true") { customResponse = Math.random().toString(36).slice(-10); return customResponse; } - customResponse = customResponse.replace("length:", ""); var rangeRegex = /^\d+-\d+$/; - if (!rangeRegex.test(customResponse)) { return null; } - var rangeMin = getNumberFromString(customResponse.split("-")[0]); var rangeMax = getNumberFromString(customResponse.split("-")[1]); - if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) { return null; } - if (rangeMin > rangeMax) { var temp = rangeMin; rangeMin = rangeMax; rangeMax = temp; } - var LENGTH_RANGE_LIMIT = 500 * 1e3; - if (rangeMax > LENGTH_RANGE_LIMIT) { return null; } - var length = getRandomIntInclusive(rangeMin, rangeMax); customResponse = getRandomStrByLength(length); return customResponse; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getObjectEntries(object) { var keys = Object.keys(object); var entries = []; @@ -21797,23 +18580,19 @@ }); return entries; } - function getNumberFromString(rawString) { var parsedDelay = parseInt(rawString, 10); var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; return validDelay; } - function nativeIsFinite(num) { var native = Number.isFinite || window.isFinite; return native(num); } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function parseMatchProps(propsToMatchStr) { var PROPS_DIVIDER = " "; var PAIRS_MARKER = ":"; @@ -21824,7 +18603,6 @@ var dividerInd = prop.indexOf(PAIRS_MARKER); var key = prop.slice(0, dividerInd); var hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { var value = prop.slice(dividerInd + 1); propsObj[key] = value; @@ -21834,13 +18612,11 @@ }); return propsObj; } - function validateParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); }); } - function getMatchPropsData(data) { var matchData = {}; Object.keys(data).forEach(function (key) { @@ -21848,61 +18624,47 @@ }); return matchData; } - function getRequestProps() { return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; } - function getRandomIntInclusive(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1) + min); } - function getRandomStrByLength(length) { var result = ""; var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~"; var charactersLength = characters.length; - for (var i = 0; i < length; i += 1) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } - return result; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventXHR.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function removeAttr(source, args) { function removeAttr(source, attrs, selector) { var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "asap stay"; - if (!attrs) { return; } - attrs = attrs.split(/\s*\|\s*/); - if (!selector) { selector = "[".concat(attrs.join("],["), "]"); } - var rmattr = function rmattr() { var nodes = []; - try { nodes = [].slice.call(document.querySelectorAll(selector)); } catch (e) { logMessage(source, "Invalid selector arg: '".concat(selector, "'")); } - var removed = false; nodes.forEach(function (node) { attrs.forEach(function (attr) { @@ -21910,24 +18672,18 @@ removed = true; }); }); - if (removed) { hit(source); } }; - var flags = parseFlags(applying); - var run = function run() { rmattr(); - if (!flags.hasFlag(flags.STAY)) { return; } - observeDOMChanges(rmattr, true); }; - if (flags.hasFlag(flags.ASAP)) { if (document.readyState === "loading") { window.addEventListener("DOMContentLoaded", rmattr, { @@ -21937,7 +18693,6 @@ rmattr(); } } - if (document.readyState !== "complete" && flags.hasFlag(flags.COMPLETE)) { window.addEventListener("load", run, { once: true @@ -21946,66 +18701,44 @@ if (!applying.indexOf(" ") !== -1) { rmattr(); } - observeDOMChanges(rmattr, true); } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function observeDOMChanges(callback) { var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; var THROTTLE_DELAY_MS = 20; var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { @@ -22022,20 +18755,16 @@ }); } }; - var disconnect = function disconnect() { observer.disconnect(); }; - function callbackWrapper() { disconnect(); callback(); connect(); } - connect(); } - function parseFlags(flags) { var FLAGS_DIVIDER = " "; var ASAP_FLAG = "asap"; @@ -22054,96 +18783,76 @@ } }; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function throttle(cb, delay) { var wait = false; var savedArgs; - var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - if (wait) { savedArgs = args; return; } - cb.apply(void 0, args); wait = true; setTimeout(function () { wait = false; - if (savedArgs) { wrapper(savedArgs); savedArgs = null; } }, delay); }; - return wrapper; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { removeAttr.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function removeClass(source, args) { function removeClass(source, classNames, selector) { var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "asap stay"; - if (!classNames) { return; } - classNames = classNames.split(/\s*\|\s*/); var selectors = []; - if (!selector) { selectors = classNames.map(function (className) { return ".".concat(className); }); } - var removeClassHandler = function removeClassHandler() { var nodes = new Set(); - if (selector) { var foundNodes = []; - try { foundNodes = [].slice.call(document.querySelectorAll(selector)); } catch (e) { logMessage(source, "Invalid selector arg: '".concat(selector, "'")); } - foundNodes.forEach(function (n) { return nodes.add(n); }); } else if (selectors.length > 0) { selectors.forEach(function (s) { var elements = document.querySelectorAll(s); - for (var i = 0; i < elements.length; i += 1) { var element = elements[i]; nodes.add(element); } }); } - var removed = false; nodes.forEach(function (node) { classNames.forEach(function (className) { @@ -22153,25 +18862,19 @@ } }); }); - if (removed) { hit(source); } }; - var CLASS_ATTR_NAME = ["class"]; var flags = parseFlags(applying); - var run = function run() { removeClassHandler(); - if (!flags.hasFlag(flags.STAY)) { return; } - observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); }; - if (flags.hasFlag(flags.ASAP)) { if (document.readyState === "loading") { window.addEventListener("DOMContentLoaded", removeClassHandler, { @@ -22181,7 +18884,6 @@ removeClassHandler(); } } - if (document.readyState !== "complete" && flags.hasFlag(flags.COMPLETE)) { window.addEventListener("load", run, { once: true @@ -22190,74 +18892,50 @@ if (!applying.indexOf(" ") !== -1) { removeClassHandler(); } - observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function observeDOMChanges(callback) { var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; var THROTTLE_DELAY_MS = 20; var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { @@ -22274,20 +18952,16 @@ }); } }; - var disconnect = function disconnect() { observer.disconnect(); }; - function callbackWrapper() { disconnect(); callback(); connect(); } - connect(); } - function parseFlags(flags) { var FLAGS_DIVIDER = " "; var ASAP_FLAG = "asap"; @@ -22306,49 +18980,39 @@ } }; } - function throttle(cb, delay) { var wait = false; var savedArgs; - var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - if (wait) { savedArgs = args; return; } - cb.apply(void 0, args); wait = true; setTimeout(function () { wait = false; - if (savedArgs) { wrapper(savedArgs); savedArgs = null; } }, delay); }; - return wrapper; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { removeClass.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function removeCookie(source, args) { function removeCookie(source, match) { var matchRegexp = toRegExp(match); - var removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) { var cookieSpec = "".concat(cookieName, "="); var domain1 = "; domain=".concat(hostName); @@ -22363,204 +19027,141 @@ document.cookie = cookieSpec + domain2 + path + expiration; hit(source); }; - var rmCookie = function rmCookie() { document.cookie.split(";").forEach(function (cookieStr) { var pos = cookieStr.indexOf("="); - if (pos === -1) { return; } - var cookieName = cookieStr.slice(0, pos).trim(); - if (!matchRegexp.test(cookieName)) { return; } - var hostParts = document.location.hostname.split("."); - for (var i = 0; i <= hostParts.length - 1; i += 1) { var hostName = hostParts.slice(i).join("."); - if (hostName) { removeCookieFromHost(cookieName, hostName); } } }); }; - rmCookie(); window.addEventListener("beforeunload", rmCookie); } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { removeCookie.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function removeInShadowDom(source, args) { function removeInShadowDom(source, selector, baseSelector) { if (!Element.prototype.attachShadow) { return; } - var removeElement = function removeElement(targetElement) { targetElement.remove(); }; - var removeHandler = function removeHandler() { var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); - while (hostElements.length !== 0) { var isRemoved = false; - var _pierceShadowDom = pierceShadowDom(selector, hostElements), - targets = _pierceShadowDom.targets, - innerHosts = _pierceShadowDom.innerHosts; - + targets = _pierceShadowDom.targets, + innerHosts = _pierceShadowDom.innerHosts; targets.forEach(function (targetEl) { removeElement(targetEl); isRemoved = true; }); - if (isRemoved) { hit(source); } - hostElements = innerHosts; } }; - removeHandler(); observeDOMChanges(removeHandler, true); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function observeDOMChanges(callback) { var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; var THROTTLE_DELAY_MS = 20; var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { @@ -22577,20 +19178,16 @@ }); } }; - var disconnect = function disconnect() { observer.disconnect(); }; - function callbackWrapper() { disconnect(); callback(); connect(); } - connect(); } - function findHostElements(rootElement) { var hosts = []; var domElems = rootElement.querySelectorAll("*"); @@ -22601,7 +19198,6 @@ }); return hosts; } - function pierceShadowDom(selector, hostElements) { var targets = []; var innerHostsAcc = []; @@ -22619,17 +19215,14 @@ innerHosts: innerHosts }; } - function flatten(input) { var stack = []; input.forEach(function (el) { return stack.push(el); }); var res = []; - while (stack.length) { var next = stack.pop(); - if (Array.isArray(next)) { next.forEach(function (el) { return stack.push(el); @@ -22638,60 +19231,47 @@ res.push(next); } } - return res.reverse(); } - function throttle(cb, delay) { var wait = false; var savedArgs; - var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - if (wait) { savedArgs = args; return; } - cb.apply(void 0, args); wait = true; setTimeout(function () { wait = false; - if (savedArgs) { wrapper(savedArgs); savedArgs = null; } }, delay); }; - return wrapper; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { removeInShadowDom.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setAttr(source, args) { function setAttr(source, selector, attr) { var value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - if (!selector || !attr) { return; } - if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767)) { return; } - var setAttr = function setAttr() { var nodes = [].slice.call(document.querySelectorAll(selector)); var set = false; @@ -22699,71 +19279,48 @@ node.setAttribute(attr, value); set = true; }); - if (set) { hit(source); } }; - setAttr(); observeDOMChanges(setAttr, true); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function observeDOMChanges(callback) { var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; var THROTTLE_DELAY_MS = 20; var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { @@ -22780,73 +19337,58 @@ }); } }; - var disconnect = function disconnect() { observer.disconnect(); }; - function callbackWrapper() { disconnect(); callback(); connect(); } - connect(); } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function throttle(cb, delay) { var wait = false; var savedArgs; - var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - if (wait) { savedArgs = args; return; } - cb.apply(void 0, args); wait = true; setTimeout(function () { wait = false; - if (savedArgs) { wrapper(savedArgs); savedArgs = null; } }, delay); }; - return wrapper; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { setAttr.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setConstant(source, args) { function setConstant(source, property, value, stack) { if (!property || !matchStackTrace(stack, new Error().stack)) { return; } - var emptyArr = noopArray(); var emptyObj = noopObject(); var constantValue; - if (value === "undefined") { constantValue = undefined; } else if (value === "false") { @@ -22871,11 +19413,9 @@ constantValue = noopPromiseReject; } else if (/^\d+$/.test(value)) { constantValue = parseFloat(value); - if (nativeIsNaN(constantValue)) { return; } - if (Math.abs(constantValue) > 32767) { return; } @@ -22890,40 +19430,31 @@ } else { return; } - var canceled = false; - var mustCancel = function mustCancel(value) { if (canceled) { return canceled; } - canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; return canceled; }; - var trapProp = function trapProp(base, prop, configurable, handler) { if (!handler.init(base[prop])) { return false; } - var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); var prevSetter; - if (origDescriptor instanceof Object) { if (!origDescriptor.configurable) { var message = "Property '".concat(prop, "' is not configurable"); logMessage(source, message); return false; } - base[prop] = constantValue; - if (origDescriptor.set instanceof Function) { prevSetter = origDescriptor.set; } } - Object.defineProperty(base, prop, { configurable: configurable, get: function get() { @@ -22933,18 +19464,16 @@ if (prevSetter !== undefined) { prevSetter(a); } - handler.set(a); } }); return true; }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; + chain = chainInfo.chain; var inChainPropHandler = { factValue: undefined, init: function init(a) { @@ -22958,9 +19487,7 @@ if (this.factValue === a) { return; } - this.factValue = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } @@ -22971,7 +19498,6 @@ if (mustCancel(a)) { return false; } - return true; }, get: function get() { @@ -22981,130 +19507,90 @@ if (!mustCancel(a)) { return; } - constantValue = a; } }; - if (!chain) { var isTrapped = trapProp(base, prop, false, endPropHandler); - if (isTrapped) { hit(source); } - return; } - if (base !== undefined && base[prop] === null) { trapProp(base, prop, true, inChainPropHandler); return; } - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { trapProp(base, prop, true, inChainPropHandler); } - var propValue = owner[prop]; - if (propValue instanceof Object || typeof propValue === "object" && propValue !== null) { setChainPropAccess(propValue, chain); } - trapProp(base, prop, true, inChainPropHandler); }; - setChainPropAccess(window, property); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function noopArray() { return []; } - function noopObject() { return {}; } - function noopFunc() {} - function trueFunc() { return true; } - function falseFunc() { return false; } - function noopPromiseReject() { return Promise.reject(); } - function noopPromiseResolve() { var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; - if (typeof Response === "undefined") { return; } - var response = new Response(responseBody, { status: 200, statusText: "OK" @@ -23119,19 +19605,15 @@ }); return Promise.resolve(response); } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -23139,10 +19621,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -23150,7 +19630,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -23158,11 +19637,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -23172,156 +19649,169 @@ chain: chain }; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function matchStackTrace(stackMatch, stackTrace) { if (!stackMatch || stackMatch === "") { return true; } - if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { return true; } - var stackRegexp = toRegExp(stackMatch); var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { return line.trim(); }).join("\n"); return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getNativeRegexpTest() { return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; } - + function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var INLINE_SCRIPT_STRING = "inlineScript"; + var INJECTED_SCRIPT_STRING = "injectedScript"; + var INJECTED_SCRIPT_MARKER = ""; + var isInlineScript = function isInlineScript(stackMatch) { + return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; + }; + var isInjectedScript = function isInjectedScript(stackMatch) { + return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; + }; + if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { + return false; + } + var documentURL = window.location.href; + var pos = documentURL.indexOf("#"); + if (pos !== -1) { + documentURL = documentURL.slice(0, pos); + } + var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }); + var stackLines = stackSteps.map(function (line) { + var stack; + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + if (getStackTraceURL) { + var stackURL = getStackTraceURL[2]; + if (startsWith(stackURL, "(")) { + stackURL = stackURL.slice(1); + } + if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { + stackURL = INJECTED_SCRIPT_STRING; + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if (startsWith(stackFunction, "at")) { + stackFunction = stackFunction.slice(2).trim(); + } + stack = "".concat(stackFunction, " ").concat(stackURL).trim(); + } else { + stack = stackURL; + } + } else { + stack = line; + } + return stack; + }); + if (stackLines) { + for (var index = 0; index < stackLines.length; index += 1) { + if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { + return true; + } + if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { + return true; + } + } + } + return false; + } var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { setConstant.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setCookie(source, args) { function setCookie(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; var validValue = getLimitedCookieValue(value); - if (validValue === null) { logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); return; } - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (!cookieToSet) { return; } - hit(source); document.cookie = cookieToSet; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function getLimitedCookieValue(value) { if (!value) { return null; } - var validValue; - if (value === "true") { validValue = "true"; } else if (value === "True") { @@ -23344,163 +19834,117 @@ validValue = "OK"; } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { return null; } - if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { return null; } } else { return null; } - return validValue; } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); } - function isValidCookiePath(rawPath) { return rawPath === "/" || rawPath === "none"; } - function getCookiePath(rawPath) { if (rawPath === "/") { return "path=/"; } - return ""; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { setCookie.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setCookieReload(source, args) { function setCookieReload(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; - if (isCookieSetWithValue(name, value)) { return; } - var validValue = getLimitedCookieValue(value); - if (validValue === null) { logMessage(source, "Invalid cookie value: '".concat(value, "'")); return; } - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (!cookieToSet) { return; } - document.cookie = cookieToSet; hit(source); - if (isCookieSetWithValue(document.cookie, name, value)) { window.location.reload(); } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function isCookieSetWithValue(cookieString, name, value) { return cookieString.split(";").some(function (cookieStr) { var pos = cookieStr.indexOf("="); - if (pos === -1) { return false; } - var cookieName = cookieStr.slice(0, pos).trim(); var cookieValue = cookieStr.slice(pos + 1).trim(); return name === cookieName && value === cookieValue; }); } - function getLimitedCookieValue(value) { if (!value) { return null; } - var validValue; - if (value === "true") { validValue = "true"; } else if (value === "True") { @@ -23523,128 +19967,94 @@ validValue = "OK"; } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { return null; } - if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { return null; } } else { return null; } - return validValue; } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); } - function isValidCookiePath(rawPath) { return rawPath === "/" || rawPath === "none"; } - function getCookiePath(rawPath) { if (rawPath === "/") { return "path=/"; } - return ""; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { setCookieReload.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setLocalStorageItem(source, args) { function setLocalStorageItem(source, key, value) { if (typeof key === "undefined") { logMessage(source, "Item key should be specified."); return; } - - var validValue = getLimitedStorageItemValue(source, value); - - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + var validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch (_unused) { + logMessage(source, "Invalid storage item value: '".concat(value, "'")); return; } - var _window = window, - localStorage = _window.localStorage; + localStorage = _window.localStorage; setStorageItem(source, localStorage, key, validValue); hit(source); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function setStorageItem(source, storage, key, value) { try { storage.setItem(key, value); @@ -23653,14 +20063,11 @@ logMessage(source, message); } } - - function getLimitedStorageItemValue(source, value) { - if (!value) { - return null; + function getLimitedStorageItemValue(value) { + if (typeof value !== "string") { + throw new Error("Invalid value"); } - var validValue; - if (value === "undefined") { validValue = undefined; } else if (value === "false") { @@ -23677,36 +20084,28 @@ validValue = ""; } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return null; + throw new Error("Invalid value"); } - if (Math.abs(validValue) > 32767) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return null; + throw new Error("Invalid value"); } } else if (value === "yes") { validValue = "yes"; } else if (value === "no") { validValue = "no"; } else { - return null; + throw new Error("Invalid value"); } - return validValue; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { setLocalStorageItem.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setPopadsDummy(source, args) { function setPopadsDummy(source) { delete window.PopAds; @@ -23726,97 +20125,101 @@ } }); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { setPopadsDummy.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setSessionStorageItem(source, args) { function setSessionStorageItem(source, key, value) { if (typeof key === "undefined") { logMessage(source, "Item key should be specified."); return; } - - var validValue = getLimitedStorageItemValue(source, value); - - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + var validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch (_unused) { + logMessage(source, "Invalid storage item value: '".concat(value, "'")); return; } - var _window = window, - sessionStorage = _window.sessionStorage; + sessionStorage = _window.sessionStorage; setStorageItem(source, sessionStorage, key, validValue); + hit(source); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function setStorageItem(source, storage, key, value) { try { storage.setItem(key, value); @@ -23825,14 +20228,11 @@ logMessage(source, message); } } - - function getLimitedStorageItemValue(source, value) { - if (!value) { - return null; + function getLimitedStorageItemValue(value) { + if (typeof value !== "string") { + throw new Error("Invalid value"); } - var validValue; - if (value === "undefined") { validValue = undefined; } else if (value === "false") { @@ -23849,45 +20249,35 @@ validValue = ""; } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return null; + throw new Error("Invalid value"); } - if (Math.abs(validValue) > 32767) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return null; + throw new Error("Invalid value"); } } else if (value === "yes") { validValue = "yes"; } else if (value === "no") { validValue = "no"; } else { - return null; + throw new Error("Invalid value"); } - return validValue; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { setSessionStorageItem.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedClickElement(source, args) { function trustedClickElement(source, selectors) { var extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; var delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN; - if (!selectors) { return; } - var OBSERVER_TIMEOUT_MS = 1e4; var THROTTLE_DELAY_MS = 20; var COOKIE_MATCH_MARKER = "cookie:"; @@ -23896,22 +20286,18 @@ var COOKIE_STRING_DELIMITER = ";"; var EXTRA_MATCH_DELIMITER = /(,\s*){1}(?=cookie:|localStorage:)/; var parsedDelay; - if (delay) { parsedDelay = parseInt(delay, 10); var isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS; - if (!isValidDelay) { var message = "Passed delay '".concat(delay, "' is invalid or bigger than ").concat(OBSERVER_TIMEOUT_MS, " ms"); logMessage(source, message); return; } } - var canClick = !parsedDelay; var cookieMatches = []; var localStorageMatches = []; - if (extraMatch) { var parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) { return matchStr.trim(); @@ -23921,115 +20307,91 @@ var cookieMatch = matchStr.replace(COOKIE_MATCH_MARKER, ""); cookieMatches.push(cookieMatch); } - if (matchStr.indexOf(LOCAL_STORAGE_MATCH_MARKER) > -1) { var localStorageMatch = matchStr.replace(LOCAL_STORAGE_MATCH_MARKER, ""); localStorageMatches.push(localStorageMatch); } }); } - if (cookieMatches.length > 0) { var parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER)); var parsedCookies = parseCookieString(document.cookie); var cookieKeys = Object.keys(parsedCookies); - if (cookieKeys.length === 0) { return; } - var cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) { var valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null; var keyMatch = toRegExp(key); return cookieKeys.some(function (key) { var keysMatched = keyMatch.test(key); - if (!keysMatched) { return false; } - if (!valueMatch) { return true; } - return valueMatch.test(parsedCookies[key]); }); }); - if (!cookiesMatched) { return; } } - if (localStorageMatches.length > 0) { var localStorageMatched = localStorageMatches.every(function (str) { var itemValue = window.localStorage.getItem(str); return itemValue || itemValue === ""; }); - if (!localStorageMatched) { return; } } - var selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) { return selector.trim(); }); - var createElementObj = function createElementObj(element) { return { element: element || null, clicked: false }; }; - var elementsSequence = Array(selectorsSequence.length).fill(createElementObj()); - var clickElementsBySequence = function clickElementsBySequence() { for (var i = 0; i < elementsSequence.length; i += 1) { var elementObj = elementsSequence[i]; - if (!elementObj.element) { break; } - if (!elementObj.clicked) { elementObj.element.click(); elementObj.clicked = true; } } - var allElementsClicked = elementsSequence.every(function (elementObj) { return elementObj.clicked === true; }); - if (allElementsClicked) { hit(source); } }; - var handleElement = function handleElement(element, i) { var elementObj = createElementObj(element); elementsSequence[i] = elementObj; - if (canClick) { clickElementsBySequence(); } }; - var findElements = function findElements(mutations, observer) { var fulfilledSelectors = []; selectorsSequence.forEach(function (selector, i) { if (!selector) { return; } - var element = document.querySelector(selector); - if (!element) { return; } - handleElement(element, i); fulfilledSelectors.push(selector); }); @@ -24039,97 +20401,69 @@ var allSelectorsFulfilled = selectorsSequence.every(function (selector) { return selector === null; }); - if (allSelectorsFulfilled) { observer.disconnect(); } }; - var observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS)); observer.observe(document.documentElement, { attributes: true, childList: true, subtree: true }); - if (parsedDelay) { setTimeout(function () { clickElementsBySequence(); canClick = true; }, parsedDelay); } - setTimeout(function () { return observer.disconnect(); }, OBSERVER_TIMEOUT_MS); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function parseCookieString(cookieString) { var COOKIE_DELIMITER = "="; var COOKIE_PAIRS_DELIMITER = ";"; @@ -24139,109 +20473,88 @@ var cookieKey; var cookieValue; var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER); - if (delimiterIndex === -1) { cookieKey = singleCookie.trim(); } else { cookieKey = singleCookie.slice(0, delimiterIndex).trim(); cookieValue = singleCookie.slice(delimiterIndex + 1); } - cookieData[cookieKey] = cookieValue || null; }); return cookieData; } - function throttle(cb, delay) { var wait = false; var savedArgs; - var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - if (wait) { savedArgs = args; return; } - cb.apply(void 0, args); wait = true; setTimeout(function () { wait = false; - if (savedArgs) { wrapper(savedArgs); savedArgs = null; } }, delay); }; - return wrapper; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { trustedClickElement.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedReplaceFetchResponse(source, args) { function trustedReplaceFetchResponse(source) { var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - if (typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { return; } - if (pattern === "" && replacement !== "") { logMessage(source, "Pattern argument should not be empty string."); return; } - var shouldLog = pattern === "" && replacement === ""; var nativeFetch = fetch; var shouldReplace = false; var fetchData; - var handlerWrapper = function handlerWrapper(target, thisArg, args) { fetchData = getFetchData(args); - if (shouldLog) { logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); hit(source); return Reflect.apply(target, thisArg, args); } - shouldReplace = matchRequestProps(source, propsToMatch, fetchData); - if (!shouldReplace) { return Reflect.apply(target, thisArg, args); } - var forgeResponse = function forgeResponse(response, textContent) { var bodyUsed = response.bodyUsed, - headers = response.headers, - ok = response.ok, - redirected = response.redirected, - status = response.status, - statusText = response.statusText, - type = response.type, - url = response.url; + headers = response.headers, + ok = response.ok, + redirected = response.redirected, + status = response.status, + statusText = response.statusText, + type = response.type, + url = response.url; var forgedResponse = new Response(textContent, { status: status, statusText: statusText, @@ -24266,10 +20579,9 @@ }); return forgedResponse; }; - - return nativeFetch.apply(void 0, toConsumableArray(args)).then(function (response) { + return nativeFetch.apply(null, args).then(function (response) { return response.text().then(function (bodyText) { - var patternRegexp = pattern === "*" ? toRegExp() : toRegExp(pattern); + var patternRegexp = pattern === "*" ? /(\n|.)*/ : toRegExp(pattern); var modifiedTextContent = bodyText.replace(patternRegexp, replacement); var forgedResponse = forgeResponse(response, modifiedTextContent); hit(source); @@ -24284,75 +20596,51 @@ return Reflect.apply(target, thisArg, args); }); }; - var fetchHandler = { apply: handlerWrapper }; fetch = new Proxy(fetch, fetchHandler); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function getFetchData(args) { var fetchPropsObj = {}; var fetchUrl; var fetchInit; - if (args[0] instanceof Request) { var requestData = getRequestData(args[0]); fetchUrl = requestData.url; @@ -24361,40 +20649,31 @@ fetchUrl = args[0]; fetchInit = args[1]; } - fetchPropsObj.url = fetchUrl; - if (fetchInit instanceof Object) { Object.keys(fetchInit).forEach(function (prop) { fetchPropsObj[prop] = fetchInit[prop]; }); } - return fetchPropsObj; } - function objectToString(obj) { return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { var key = pair[0]; var value = pair[1]; var recordValueStr = value; - if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } - return "".concat(key, ':"').concat(recordValueStr, '"'); }).join(" "); } - function matchRequestProps(source, propsToMatch, requestData) { if (propsToMatch === "" || propsToMatch === "*") { return true; } - var isMatched; var parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { logMessage(source, "Invalid parameter: ".concat(propsToMatch)); isMatched = false; @@ -24405,55 +20684,42 @@ return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); }); } - return isMatched; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getRequestData(request) { var requestInitOptions = getRequestProps(); var entries = requestInitOptions.map(function (key) { @@ -24462,11 +20728,9 @@ }); return getObjectFromEntries(entries); } - function getRequestProps() { return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; } - function getObjectEntries(object) { var keys = Object.keys(object); var entries = []; @@ -24475,7 +20739,6 @@ }); return entries; } - function getObjectFromEntries(entries) { var output = entries.reduce(function (acc, el) { var key = el[0]; @@ -24485,7 +20748,6 @@ }, {}); return output; } - function parseMatchProps(propsToMatchStr) { var PROPS_DIVIDER = " "; var PAIRS_MARKER = ":"; @@ -24496,7 +20758,6 @@ var dividerInd = prop.indexOf(PAIRS_MARKER); var key = prop.slice(0, dividerInd); var hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { var value = prop.slice(dividerInd + 1); propsObj[key] = value; @@ -24506,13 +20767,11 @@ }); return propsObj; } - function validateParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); }); } - function getMatchPropsData(data) { var matchData = {}; Object.keys(data).forEach(function (key) { @@ -24520,92 +20779,74 @@ }); return matchData; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { trustedReplaceFetchResponse.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedReplaceXhrResponse(source, args) { function trustedReplaceXhrResponse(source) { var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - if (typeof Proxy === "undefined") { return; } - if (pattern === "" && replacement !== "") { var message = "Pattern argument should not be empty string."; logMessage(source, message); return; } - var shouldLog = pattern === "" && replacement === ""; var nativeOpen = window.XMLHttpRequest.prototype.open; var nativeSend = window.XMLHttpRequest.prototype.send; var shouldReplace = false; var xhrData; var requestHeaders = []; - var openWrapper = function openWrapper(target, thisArg, args) { xhrData = getXhrData.apply(null, args); - if (shouldLog) { var _message = "xhr( ".concat(objectToString(xhrData), " )"); - logMessage(source, _message, true); hit(source); return Reflect.apply(target, thisArg, args); } - shouldReplace = matchRequestProps(source, propsToMatch, xhrData); - if (shouldReplace) { var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { requestHeaders.push(args); return Reflect.apply(target, thisArg, args); }; - var setRequestHeaderHandler = { apply: setRequestHeaderWrapper }; thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); } - return Reflect.apply(target, thisArg, args); }; - var sendWrapper = function sendWrapper(target, thisArg, args) { if (!shouldReplace) { return Reflect.apply(target, thisArg, args); } - var forgedRequest = new XMLHttpRequest(); forgedRequest.addEventListener("readystatechange", function () { if (forgedRequest.readyState !== 4) { return; } - var readyState = forgedRequest.readyState, - response = forgedRequest.response, - responseText = forgedRequest.responseText, - responseURL = forgedRequest.responseURL, - responseXML = forgedRequest.responseXML, - status = forgedRequest.status, - statusText = forgedRequest.statusText; + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; var content = responseText || response; - if (typeof content !== "string") { return; } - - var patternRegexp = pattern === "*" ? toRegExp() : toRegExp(pattern); + var patternRegexp = pattern === "*" ? /(\n|.)*/ : toRegExp(pattern); var modifiedContent = content.replace(patternRegexp, replacement); Object.defineProperties(thisArg, { readyState: { @@ -24647,16 +20888,13 @@ forgedRequest.setRequestHeader(name, value); }); requestHeaders = []; - try { nativeSend.call(forgedRequest, args); } catch (_unused) { return Reflect.apply(target, thisArg, args); } - return undefined; }; - var openHandler = { apply: openWrapper }; @@ -24666,103 +20904,72 @@ XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function objectToString(obj) { return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { var key = pair[0]; var value = pair[1]; var recordValueStr = value; - if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } - return "".concat(key, ':"').concat(recordValueStr, '"'); }).join(" "); } - function matchRequestProps(source, propsToMatch, requestData) { if (propsToMatch === "" || propsToMatch === "*") { return true; } - var isMatched; var parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { logMessage(source, "Invalid parameter: ".concat(propsToMatch)); isMatched = false; @@ -24773,10 +20980,8 @@ return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); }); } - return isMatched; } - function getXhrData(method, url, async, user, password) { return { method: method, @@ -24786,7 +20991,6 @@ password: password }; } - function getMatchPropsData(data) { var matchData = {}; Object.keys(data).forEach(function (key) { @@ -24794,17 +20998,14 @@ }); return matchData; } - function getRequestProps() { return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; } - function validateParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); }); } - function parseMatchProps(propsToMatchStr) { var PROPS_DIVIDER = " "; var PAIRS_MARKER = ":"; @@ -24815,7 +21016,6 @@ var dividerInd = prop.indexOf(PAIRS_MARKER); var key = prop.slice(0, dividerInd); var hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { var value = prop.slice(dividerInd + 1); propsObj[key] = value; @@ -24825,35 +21025,27 @@ }); return propsObj; } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getObjectEntries(object) { var keys = Object.keys(object); var entries = []; @@ -24862,442 +21054,318 @@ }); return entries; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { trustedReplaceXhrResponse.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedSetCookie(source, args) { function trustedSetCookie(source, name, value) { var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; - if (typeof name === "undefined") { logMessage(source, "Cookie name should be specified."); return; } - if (typeof value === "undefined") { logMessage(source, "Cookie value should be specified."); return; } - var parsedValue = parseKeywordValue(value); - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (!cookieToSet) { return; } - - var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); - - if (!parsedOffsetMs) { - logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); - return; + if (offsetExpiresSec) { + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); } - - var expires = Date.now() + parsedOffsetMs; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); document.cookie = cookieToSet; hit(source); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); } - function isValidCookiePath(rawPath) { return rawPath === "/" || rawPath === "none"; } - function getTrustedCookieOffsetMs(offsetExpiresSec) { - if (!offsetExpiresSec) { - return null; - } - var ONE_YEAR_EXPIRATION_KEYWORD = "1year"; var ONE_DAY_EXPIRATION_KEYWORD = "1day"; var MS_IN_SEC = 1e3; var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; var SECONDS_IN_DAY = 24 * 60 * 60; var parsedSec; - if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { parsedSec = SECONDS_IN_YEAR; } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { parsedSec = SECONDS_IN_DAY; } else { parsedSec = Number.parseInt(offsetExpiresSec, 10); - if (Number.isNaN(parsedSec)) { return null; } } - return parsedSec * MS_IN_SEC; } - function parseKeywordValue(rawValue) { var NOW_VALUE_KEYWORD = "$now$"; var CURRENT_DATE_KEYWORD = "$currentDate$"; var parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { parsedValue = Date.now().toString(); } else if (rawValue === CURRENT_DATE_KEYWORD) { parsedValue = Date(); } - return parsedValue; } - function getCookiePath(rawPath) { if (rawPath === "/") { return "path=/"; } - return ""; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { trustedSetCookie.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedSetCookieReload(source, args) { function trustedSetCookieReload(source, name, value) { var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; - if (typeof name === "undefined") { logMessage(source, "Cookie name should be specified."); return; } - if (typeof value === "undefined") { logMessage(source, "Cookie value should be specified."); return; } - if (isCookieSetWithValue(document.cookie, name, value)) { return; } - var parsedValue = parseKeywordValue(value); - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (!cookieToSet) { return; } - - var parsedOffsetExpiresMs = getTrustedCookieOffsetMs(offsetExpiresSec); - - if (!parsedOffsetExpiresMs) { - logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); - return; + if (offsetExpiresSec) { + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); } - - var expires = Date.now() + parsedOffsetExpiresMs; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); document.cookie = cookieToSet; hit(source); - if (isCookieSetWithValue(document.cookie, name, value)) { window.location.reload(); } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function isCookieSetWithValue(cookieString, name, value) { return cookieString.split(";").some(function (cookieStr) { var pos = cookieStr.indexOf("="); - if (pos === -1) { return false; } - var cookieName = cookieStr.slice(0, pos).trim(); var cookieValue = cookieStr.slice(pos + 1).trim(); return name === cookieName && value === cookieValue; }); } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); } - function isValidCookiePath(rawPath) { return rawPath === "/" || rawPath === "none"; } - function getTrustedCookieOffsetMs(offsetExpiresSec) { - if (!offsetExpiresSec) { - return null; - } - var ONE_YEAR_EXPIRATION_KEYWORD = "1year"; var ONE_DAY_EXPIRATION_KEYWORD = "1day"; var MS_IN_SEC = 1e3; var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; var SECONDS_IN_DAY = 24 * 60 * 60; var parsedSec; - if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { parsedSec = SECONDS_IN_YEAR; } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { parsedSec = SECONDS_IN_DAY; } else { parsedSec = Number.parseInt(offsetExpiresSec, 10); - if (Number.isNaN(parsedSec)) { return null; } } - return parsedSec * MS_IN_SEC; } - function parseKeywordValue(rawValue) { var NOW_VALUE_KEYWORD = "$now$"; var CURRENT_DATE_KEYWORD = "$currentDate$"; var parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { parsedValue = Date.now().toString(); } else if (rawValue === CURRENT_DATE_KEYWORD) { parsedValue = Date(); } - return parsedValue; } - function getCookiePath(rawPath) { if (rawPath === "/") { return "path=/"; } - return ""; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { trustedSetCookieReload.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedSetLocalStorageItem(source, args) { function trustedSetLocalStorageItem(source, key, value) { if (typeof key === "undefined") { logMessage(source, "Item key should be specified."); return; } - if (typeof value === "undefined") { logMessage(source, "Item value should be specified."); return; } - var parsedValue = parseKeywordValue(value); var _window = window, - localStorage = _window.localStorage; + localStorage = _window.localStorage; setStorageItem(source, localStorage, key, parsedValue); hit(source); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function setStorageItem(source, storage, key, value) { try { storage.setItem(key, value); @@ -25306,85 +21374,64 @@ logMessage(source, message); } } - function parseKeywordValue(rawValue) { var NOW_VALUE_KEYWORD = "$now$"; var CURRENT_DATE_KEYWORD = "$currentDate$"; var parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { parsedValue = Date.now().toString(); } else if (rawValue === CURRENT_DATE_KEYWORD) { parsedValue = Date(); } - return parsedValue; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { trustedSetLocalStorageItem.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function xmlPrune(source, args) { function xmlPrune(source, propsToRemove) { var _this = this; - var optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; var urlToMatch = arguments.length > 3 ? arguments[3] : undefined; - if (typeof Reflect === "undefined" || typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { return; } - var shouldPruneResponse = true; - if (!propsToRemove) { shouldPruneResponse = false; } - var urlMatchRegexp = toRegExp(urlToMatch); - var isXML = function isXML(text) { var trimedText = text.trim(); - if (startsWith(trimedText, "<") && endsWith(trimedText, ">")) { return true; } - return false; }; - var pruneXML = function pruneXML(text) { if (!isXML(text)) { shouldPruneResponse = false; return text; } - var xmlParser = new DOMParser(); var xmlDoc = xmlParser.parseFromString(text, "text/xml"); var errorNode = xmlDoc.querySelector("parsererror"); - if (errorNode) { return text; } - if (optionalProp !== "" && xmlDoc.querySelector(optionalProp) === null) { shouldPruneResponse = false; return text; } - var elems = xmlDoc.querySelectorAll(propsToRemove); - if (!elems.length) { shouldPruneResponse = false; return text; } - elems.forEach(function (elem) { elem.remove(); }); @@ -25392,20 +21439,16 @@ text = serializer.serializeToString(xmlDoc); return text; }; - var xhrWrapper = function xhrWrapper(target, thisArg, args) { var xhrURL = args[1]; - if (typeof xhrURL !== "string" || xhrURL.length === 0) { return Reflect.apply(target, thisArg, args); } - if (urlMatchRegexp.test(xhrURL)) { thisArg.addEventListener("readystatechange", function pruneResponse() { if (thisArg.readyState === 4) { var response = thisArg.response; thisArg.removeEventListener("readystatechange", pruneResponse); - if (!shouldPruneResponse) { if (isXML(response)) { var message = "XMLHttpRequest.open() URL: ".concat(xhrURL, "\nresponse: ").concat(response); @@ -25413,7 +21456,6 @@ } } else { var prunedResponseContent = pruneXML(response); - if (shouldPruneResponse) { Object.defineProperty(thisArg, "response", { value: prunedResponseContent @@ -25423,29 +21465,23 @@ }); hit(source); } - shouldPruneResponse = true; } } }); } - return Reflect.apply(target, thisArg, args); }; - var xhrHandler = { apply: xhrWrapper }; window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); var nativeFetch = window.fetch; - var fetchWrapper = function fetchWrapper(target, thisArg, args) { var fetchURL = args[0]; - if (typeof fetchURL !== "string" || fetchURL.length === 0) { return Reflect.apply(target, thisArg, args); } - if (urlMatchRegexp.test(fetchURL)) { return nativeFetch.apply(_this, args).then(function (response) { return response.text().then(function (text) { @@ -25453,12 +21489,9 @@ if (isXML(text)) { logMessage("fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(text)); } - return Reflect.apply(target, thisArg, args); } - var prunedText = pruneXML(text); - if (shouldPruneResponse) { hit(source); return new Response(prunedText, { @@ -25467,113 +21500,80 @@ headers: response.headers }); } - shouldPruneResponse = true; return Reflect.apply(target, thisArg, args); }); }); } - return Reflect.apply(target, thisArg, args); }; - var fetchHandler = { apply: fetchWrapper }; window.fetch = new Proxy(window.fetch, fetchHandler); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function startsWith(str, prefix) { return !!str && str.indexOf(prefix) === 0; } - function endsWith(str, ending) { return !!str && str.lastIndexOf(ending) === str.length - ending.length; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { xmlPrune.apply(this, updatedArgs); } catch (e) { console.log(e); } } - var scriptletsMap = { "abort-current-inline-script": abortCurrentInlineScript, "abort-current-script.js": abortCurrentInlineScript, @@ -25801,7 +21801,6 @@ "ubo-xml-prune.js": xmlPrune, "ubo-xml-prune": xmlPrune }; - var getScriptletFunction = function getScriptletFunction(name) { return scriptletsMap[name]; }; @@ -25823,16 +21822,15 @@ * @param {Source} source * @returns {string|null} scriptlet code */ - function getScriptletCode(source) { if (!validator.isValidScriptletName(source.name)) { return null; } - var scriptletFunction = getScriptletFunction(source.name).toString(); var result = source.engine === 'corelibs' || source.engine === 'test' ? wrapInNonameFunc(scriptletFunction) : passSourceAndProps(source, scriptletFunction); return result; } + /** * Scriptlets variable * @@ -25840,8 +21838,6 @@ * `invoke` method receives one argument with `Source` type * `validate` method receives one argument with `String` type */ - - var scriptletsObject = function () { return { invoke: getScriptletCode, @@ -25863,7 +21859,6 @@ * Expose scriptlets to global */ // eslint-disable-next-line no-undef - scriptlets = scriptletsObject; })(); diff --git a/dist/umd/scriptlets.umd.js b/dist/umd/scriptlets.umd.js index 5813aff9..54f2b356 100644 --- a/dist/umd/scriptlets.umd.js +++ b/dist/umd/scriptlets.umd.js @@ -14,20 +14,21 @@ */ function attachDependencies(scriptlet) { var _scriptlet$injections = scriptlet.injections, - injections = _scriptlet$injections === void 0 ? [] : _scriptlet$injections; + injections = _scriptlet$injections === void 0 ? [] : _scriptlet$injections; return injections.reduce(function (accum, dep) { return "".concat(accum, "\n").concat(dep.toString()); }, scriptlet.toString()); } + /** * Add scriptlet call to existing code * @param {Function} scriptlet * @param {string} code */ - function addCall(scriptlet, code) { return "".concat(code, "\n const updatedArgs = args ? [].concat(source).concat(args) : [source];\n try {\n ").concat(scriptlet.name, ".apply(this, updatedArgs);\n } catch (e) {\n console.log(e);\n }"); } + /** * Wrap function into IIFE (Immediately invoked function expression) * @@ -51,29 +52,24 @@ * noeval.apply(this, args); * )({"args": ["aaa", "bbb"], "name":"noeval"}, ["aaa", "bbb"])` */ - function passSourceAndProps(source, code) { var redirect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (source.hit) { source.hit = source.hit.toString(); } - var sourceString = JSON.stringify(source); var argsString = source.args ? "[".concat(source.args.map(JSON.stringify), "]") : undefined; var params = argsString ? "".concat(sourceString, ", ").concat(argsString) : sourceString; - if (redirect) { return "(function(source, args){\n".concat(code, "\n})(").concat(params, ");"); } - return "(".concat(code, ")(").concat(params, ");"); } + /** * Wrap code in no name function * @param {string} code which must be wrapped */ - function wrapInNonameFunc(code) { return "function(source, args){\n".concat(code, "\n}"); } @@ -93,6 +89,7 @@ }); return entries; }; + /** * Converts array of pairs to object. * Object.fromEntries() polyfill because it is not supported by IE @@ -100,7 +97,6 @@ * @param {Array} entries - array of pairs * @returns {Object} */ - var getObjectFromEntries = function getObjectFromEntries(entries) { var output = entries.reduce(function (acc, el) { var key = el[0]; @@ -110,31 +106,30 @@ }, {}); return output; }; + /** * Checks whether the obj is an empty object * @param {Object} obj * @returns {boolean} */ - var isEmptyObject = function isEmptyObject(obj) { return Object.keys(obj).length === 0; }; + /** * Checks whether the obj is an empty object * @param {Object} obj * @param {string} prop * @returns {Object|null} */ - var safeGetDescriptor = function safeGetDescriptor(obj, prop) { var descriptor = Object.getOwnPropertyDescriptor(obj, prop); - if (descriptor && descriptor.configurable) { return descriptor; } - return null; }; + /** * Set getter and setter to property if it's configurable * @param {Object} object target object with property @@ -142,14 +137,11 @@ * @param {PropertyDescriptor} descriptor contains getter and setter functions * @returns {boolean} is operation successful */ - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } @@ -165,29 +157,30 @@ var native = Number.isNaN || window.isNaN; return native(num); }; + /** * Determines whether the passed value is a finite number * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite * @param {*} num * @returns {boolean} */ - var nativeIsFinite = function nativeIsFinite(num) { // eslint-disable-next-line no-restricted-properties var native = Number.isFinite || window.isFinite; return native(num); }; + /** * Parses string for a number, if possible, otherwise returns null. * @param {*} rawString * @returns {number|null} */ - var getNumberFromString = function getNumberFromString(rawString) { var parsedDelay = parseInt(rawString, 10); var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; return validDelay; }; + /** * Generate a random integer between two values, inclusive * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#getting_a_random_integer_between_two_values_inclusive @@ -195,7 +188,6 @@ * @param {number} max * @returns {number} */ - function getRandomIntInclusive(min, max) { min = Math.ceil(min); max = Math.floor(max); @@ -209,19 +201,19 @@ * @param {string} newSubstr replacement * @returns {string} */ - var replaceAll = function replaceAll(input, substr, newSubstr) { return input.split(substr).join(newSubstr); }; + /** * Escapes special chars in string * @param {string} str * @returns {string} */ - var escapeRegExp = function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }; + /** * A literal string or regexp pattern wrapped in forward slashes. * For example, 'simpleStr' or '/adblock|_0x/'. @@ -235,77 +227,69 @@ * @returns {RegExp} regular expression; defaults to /.?/ * @throws {SyntaxError} Throw an error for invalid regex pattern */ - var toRegExp = function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var DEFAULT_VALUE = '.?'; var FORWARD_SLASH = '/'; - if (input === '') { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); return new RegExp(escaped); }; + /** * Checks whether the input string can be converted to regexp * @param {RawStrPattern} input literal string or regexp pattern * @returns {boolean} */ - var isValidStrPattern = function isValidStrPattern(input) { var FORWARD_SLASH = '/'; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; }; + /** * Get string before regexp first match * @param {string} str * @param {RegExp} rx */ - var getBeforeRegExp = function getBeforeRegExp(str, rx) { var index = str.search(rx); return str.substring(0, index); }; + /** * Checks whether the string starts with the substring * @param {string} str full string * @param {string} prefix substring * @returns {boolean} */ - - var startsWith = function startsWith(str, prefix) { + var startsWith$1 = function startsWith(str, prefix) { // if str === '', (str && false) will return '' // that's why it has to be !!str return !!str && str.indexOf(prefix) === 0; }; + /** * Checks whether the string ends with the substring * @param {string} str full string * @param {string} ending substring * @returns {boolean} */ - var endsWith = function endsWith(str, ending) { // if str === '', (str && false) will return '' // that's why it has to be !!str @@ -315,7 +299,6 @@ if (!str) { return str; } - var index = str.indexOf(separator); return index < 0 ? '' : str.substring(index + separator.length); }; @@ -323,44 +306,41 @@ if (!str || !separator) { return str; } - var index = str.indexOf(separator); return index < 0 ? str : str.substring(0, index); }; + /** * Wrap str in single quotes and replaces single quotes to double one * @param {string} str */ - var wrapInSingleQuotes = function wrapInSingleQuotes(str) { if (str[0] === '\'' && str[str.length - 1] === '\'' || str[0] === '"' && str[str.length - 1] === '"') { str = str.substring(1, str.length - 1); - } // eslint-disable-next-line no-useless-escape - - + } + // eslint-disable-next-line no-useless-escape str = str.replace(/\'/g, '"'); return "'".concat(str, "'"); }; + /** * Returns substring enclosed in the widest braces * @param {string} str */ - var getStringInBraces = function getStringInBraces(str) { var firstIndex = str.indexOf('('); var lastIndex = str.lastIndexOf(')'); return str.substring(firstIndex + 1, lastIndex); }; + /** * Prepares RTCPeerConnection config as string for proper logging * @param {*} config * @returns {string} stringified config */ - var convertRtcConfigToString = function convertRtcConfigToString(config) { var UNDEF_STR = 'undefined'; var str = UNDEF_STR; - if (config === null) { str = 'null'; } else if (config instanceof Object) { @@ -373,49 +353,44 @@ ], }; */ - if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) { str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString(); } } - return str; }; + /** * Checks whether the match input string can be converted to regexp, * used for match inputs with possible negation * @param {string} match literal string or regexp pattern * @returns {boolean} */ - var isValidMatchStr = function isValidMatchStr(match) { var INVERT_MARKER = '!'; var str = match; - - if (startsWith(match, INVERT_MARKER)) { + if (startsWith$1(match, INVERT_MARKER)) { str = match.slice(1); } - return isValidStrPattern(str); }; + /** * Validates the match input number, * used for match inputs with possible negation * @param {string} match string of match number * @returns {boolean} */ - var isValidMatchNumber = function isValidMatchNumber(match) { var INVERT_MARKER = '!'; var str = match; - - if (startsWith(match, INVERT_MARKER)) { + if (startsWith$1(match, INVERT_MARKER)) { str = match.slice(1); } - var num = parseFloat(str); return !nativeIsNaN(num) && nativeIsFinite(num); }; + /** * @typedef {Object} MatchData * @property {boolean} isInvertedMatch @@ -429,10 +404,9 @@ * @param {string} match * @returns {MatchData} */ - var parseMatchArg = function parseMatchArg(match) { var INVERT_MARKER = '!'; - var isInvertedMatch = startsWith(match, INVERT_MARKER); + var isInvertedMatch = startsWith$1(match, INVERT_MARKER); var matchValue = isInvertedMatch ? match.slice(1) : match; var matchRegexp = toRegExp(matchValue); return { @@ -440,6 +414,7 @@ matchRegexp: matchRegexp }; }; + /** * @typedef {Object} DelayData * @property {boolean} isInvertedDelayMatch @@ -454,10 +429,9 @@ * `isInvertedDelayMatch` is boolean, * `delayMatch` is number OR null for invalid `delay` */ - var parseDelayArg = function parseDelayArg(delay) { var INVERT_MARKER = '!'; - var isInvertedDelayMatch = startsWith(delay, INVERT_MARKER); + var isInvertedDelayMatch = startsWith$1(delay, INVERT_MARKER); var delayValue = isInvertedDelayMatch ? delay.slice(1) : delay; delayValue = parseInt(delayValue, 10); var delayMatch = nativeIsNaN(delayValue) ? null : delayValue; @@ -466,34 +440,31 @@ delayMatch: delayMatch }; }; + /** * Converts object to string for logging * @param {Object} obj data object * @returns {string} */ - var objectToString = function objectToString(obj) { return isEmptyObject(obj) ? '{}' : getObjectEntries(obj).map(function (pair) { var key = pair[0]; var value = pair[1]; var recordValueStr = value; - if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } - return "".concat(key, ":\"").concat(recordValueStr, "\""); }).join(' '); }; + /** * Converts types into a string * @param {*} value * @returns {string} */ - var convertTypeToString = function convertTypeToString(value) { var output; - if (typeof value === 'undefined') { output = 'undefined'; } else if (typeof value === 'object') { @@ -505,68 +476,58 @@ } else { output = value.toString(); } - return output; }; + /** * Generate a random string, a length of the string is provided as an argument * @param {number} length * @returns {string} */ - function getRandomStrByLength(length) { var result = ''; var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~'; var charactersLength = characters.length; - for (var i = 0; i < length; i += 1) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } - return result; } + /** * Generate a random string * @param {string} customResponseText * @returns {string|null} random string or null if passed argument is invalid */ - function generateRandomResponse(customResponseText) { var customResponse = customResponseText; - if (customResponse === 'true') { // Generate random alphanumeric string of 10 symbols customResponse = Math.random().toString(36).slice(-10); return customResponse; } - customResponse = customResponse.replace('length:', ''); - var rangeRegex = /^\d+-\d+$/; // Return empty string if range is invalid - + var rangeRegex = /^\d+-\d+$/; + // Return empty string if range is invalid if (!rangeRegex.test(customResponse)) { return null; } - var rangeMin = getNumberFromString(customResponse.split('-')[0]); var rangeMax = getNumberFromString(customResponse.split('-')[1]); - if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) { return null; - } // If rangeMin > rangeMax, swap variables - + } + // If rangeMin > rangeMax, swap variables if (rangeMin > rangeMax) { var temp = rangeMin; rangeMin = rangeMax; rangeMax = temp; } - var LENGTH_RANGE_LIMIT = 500 * 1000; - if (rangeMax > LENGTH_RANGE_LIMIT) { return null; } - var length = getRandomIntInclusive(rangeMin, rangeMax); customResponse = getRandomStrByLength(length); return customResponse; @@ -583,10 +544,8 @@ } else { obj[key] = value; } - return obj; } - var defineProperty = _defineProperty; /** @@ -598,76 +557,65 @@ */ function iterateWithTransitions(iterable, transitions, init, args) { var state = init || Object.keys(transitions)[0]; - for (var i = 0; i < iterable.length; i += 1) { state = transitions[state](iterable, i, args); } - return state; } + /** * AdGuard scriptlet rule mask */ - - var ADG_SCRIPTLET_MASK = '#//scriptlet'; + /** * Helper to accumulate an array of strings char by char */ - var wordSaver = function wordSaver() { var str = ''; var strs = []; - var saveSymb = function saveSymb(s) { str += s; return str; }; - var saveStr = function saveStr() { strs.push(str); str = ''; }; - var getAll = function getAll() { return [].concat(strs); }; - return { saveSymb: saveSymb, saveStr: saveStr, getAll: getAll }; }; - var substringAfter = function substringAfter(str, separator) { if (!str) { return str; } - var index = str.indexOf(separator); return index < 0 ? '' : str.substring(index + separator.length); }; + /** * Parse and validate scriptlet rule * @param {*} ruleText * @returns {{name: string, args: Array}} */ - - var parseRule = function parseRule(ruleText) { var _transitions; - ruleText = substringAfter(ruleText, ADG_SCRIPTLET_MASK); /** * Transition names */ - var TRANSITION = { OPENED: 'opened', PARAM: 'param', CLOSED: 'closed' }; + /** * Transition function: the current index position in start, end or between params * @param {string} rule @@ -675,12 +623,10 @@ * @param {Object} Object * @property {Object} Object.sep contains prop symb with current separator char */ - var opened = function opened(rule, index, _ref) { var sep = _ref.sep; var char = rule[index]; var transition; - switch (char) { case ' ': case '(': @@ -689,7 +635,6 @@ transition = TRANSITION.OPENED; break; } - case '\'': case '"': { @@ -697,19 +642,16 @@ transition = TRANSITION.PARAM; break; } - case ')': { transition = index === rule.length - 1 ? TRANSITION.CLOSED : TRANSITION.OPENED; break; } - default: { throw new Error('The rule is not a scriptlet'); } } - return transition; }; /** @@ -720,20 +662,16 @@ * @property {Object} Object.sep contains prop `symb` with current separator char * @property {Object} Object.saver helper which allow to save strings by car by char */ - - var param = function param(rule, index, _ref2) { var saver = _ref2.saver, - sep = _ref2.sep; + sep = _ref2.sep; var char = rule[index]; - switch (char) { case '\'': case '"': { var preIndex = index - 1; var before = rule[preIndex]; - if (char === sep.symb && before !== '\\') { sep.symb = null; saver.saveStr(); @@ -741,7 +679,6 @@ } } // eslint-disable-next-line no-fallthrough - default: { saver.saveSymb(char); @@ -749,7 +686,6 @@ } } }; - var transitions = (_transitions = {}, defineProperty(_transitions, TRANSITION.OPENED, opened), defineProperty(_transitions, TRANSITION.PARAM, param), defineProperty(_transitions, TRANSITION.CLOSED, function () {}), _transitions); var sep = { symb: null @@ -759,11 +695,9 @@ sep: sep, saver: saver }); - if (state !== 'closed') { throw new Error("Invalid scriptlet rule ".concat(ruleText)); } - var args = saver.getAll(); return { name: args[0], @@ -780,24 +714,25 @@ // https://github.com/AdguardTeam/Scriptlets/issues/125 return typeof type !== 'undefined'; }; + /** * Validates event listener * @param {*} listener * @returns {boolean} */ - var validateListener = function validateListener(listener) { // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#parameters - return typeof listener !== 'undefined' && (typeof listener === 'function' || typeof listener === 'object' // https://github.com/AdguardTeam/Scriptlets/issues/76 + return typeof listener !== 'undefined' && (typeof listener === 'function' || typeof listener === 'object' + // https://github.com/AdguardTeam/Scriptlets/issues/76 && listener !== null && typeof listener.handleEvent === 'function'); }; + /** * Serialize valid event listener * https://developer.mozilla.org/en-US/docs/Web/API/EventListener * @param {EventListener} listener valid listener * @returns {string} */ - var listenerToString = function listenerToString(listener) { return typeof listener === 'function' ? listener.toString() : listener.handleEvent.toString(); }; @@ -805,12 +740,12 @@ var shouldMatchAnyDelay = function shouldMatchAnyDelay(delay) { return delay === '*'; }; + /** * Handles input delay value * @param {*} delay * @returns {number} proper number delay value */ - var getMatchDelay = function getMatchDelay(delay) { var DEFAULT_DELAY = 1000; var parsedDelay = parseInt(delay, 10); @@ -818,22 +753,22 @@ : parsedDelay; return delayMatch; }; + /** * Checks delay match condition * @param {*} inputDelay * @param {number} realDelay * @returns {boolean} */ - var isDelayMatched = function isDelayMatched(inputDelay, realDelay) { return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); }; + /** * Handles input boost value * @param {*} boost * @returns {number} proper number boost multiplier value */ - var getBoostMultiplier = function getBoostMultiplier(boost) { var DEFAULT_MULTIPLIER = 0.05; var MIN_MULTIPLIER = 0.02; @@ -841,15 +776,12 @@ var parsedBoost = parseFloat(boost); var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER // default scriptlet value : parsedBoost; - if (boostMultiplier < MIN_MULTIPLIER) { boostMultiplier = MIN_MULTIPLIER; } - if (boostMultiplier > MAX_MULTIPLIER) { boostMultiplier = MAX_MULTIPLIER; } - return boostMultiplier; }; @@ -865,11 +797,9 @@ return stack.push(el); }); var res = []; - while (stack.length) { // pop value from stack var next = stack.pop(); - if (Array.isArray(next)) { // push back array items, won't modify the original input next.forEach(function (el) { @@ -878,17 +808,16 @@ } else { res.push(next); } - } // reverse to restore input order - - + } + // reverse to restore input order return res.reverse(); }; + /** * Predicate method to check if the array item exists * @param {any} item * @returns {boolean} */ - var isExisting = function isExisting(item) { return !!item; }; @@ -904,10 +833,10 @@ * * @returns {boolean} */ - var isValidCookiePath = function isValidCookiePath(rawPath) { return rawPath === '/' || rawPath === 'none'; }; + /** * Returns 'path=/' if rawPath is '/' * or empty string '' for other cases, `rawPath === 'none'` included @@ -916,16 +845,15 @@ * * @returns {string} */ - var getCookiePath = function getCookiePath(rawPath) { if (rawPath === '/') { return 'path=/'; - } // otherwise do not set path as invalid + } + // otherwise do not set path as invalid // the same for pathArg === 'none' - - return ''; }; + /** * Combines input cookie name, value, and path into string. * @@ -935,11 +863,11 @@ * * @returns {string|null} string OR `null` if path is not supported */ - var concatCookieNameValuePath = function concatCookieNameValuePath(rawName, rawValue, rawPath) { // eslint-disable-next-line max-len return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); }; + /** * Gets supported cookie value * @@ -947,14 +875,11 @@ * * @returns {string|null} valid cookie string if ok OR null if not */ - var getLimitedCookieValue = function getLimitedCookieValue(value) { if (!value) { return null; } - var validValue; - if (value === 'true') { validValue = 'true'; } else if (value === 'True') { @@ -977,49 +902,46 @@ validValue = 'OK'; } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { return null; } - if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { return null; } } else { return null; } - return validValue; }; + /** * Parses cookie string into object * @param {string} cookieString string that conforms to document.cookie format * @returns {Object} key:value object that corresponds with incoming cookies keys and values */ - var parseCookieString = function parseCookieString(cookieString) { var COOKIE_DELIMITER = '='; - var COOKIE_PAIRS_DELIMITER = ';'; // Get raw cookies + var COOKIE_PAIRS_DELIMITER = ';'; + // Get raw cookies var cookieChunks = cookieString.split(COOKIE_PAIRS_DELIMITER); var cookieData = {}; cookieChunks.forEach(function (singleCookie) { var cookieKey; var cookieValue; var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER); - if (delimiterIndex === -1) { cookieKey = singleCookie.trim(); } else { cookieKey = singleCookie.slice(0, delimiterIndex).trim(); cookieValue = singleCookie.slice(delimiterIndex + 1); - } // Save cookie key=value data with null instead of empty ('') values - - + } + // Save cookie key=value data with null instead of empty ('') values cookieData[cookieKey] = cookieValue || null; }); return cookieData; }; + /** * Check if cookie with specified name and value is present in a cookie string * @param {string} cookieString @@ -1027,51 +949,43 @@ * @param {string} value * @returns {boolean} */ - var isCookieSetWithValue = function isCookieSetWithValue(cookieString, name, value) { return cookieString.split(';').some(function (cookieStr) { var pos = cookieStr.indexOf('='); - if (pos === -1) { return false; } - var cookieName = cookieStr.slice(0, pos).trim(); var cookieValue = cookieStr.slice(pos + 1).trim(); return name === cookieName && value === cookieValue; }); }; + /** * Returns parsed offset expired number of ms or null if `offsetExpiresSec` is invalid * * @param {string} offsetExpiresSec input offset param in seconds * @returns {number|null} number is milliseconds OR null */ - var getTrustedCookieOffsetMs = function getTrustedCookieOffsetMs(offsetExpiresSec) { - if (!offsetExpiresSec) { - return null; - } - var ONE_YEAR_EXPIRATION_KEYWORD = '1year'; var ONE_DAY_EXPIRATION_KEYWORD = '1day'; var MS_IN_SEC = 1000; var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; var SECONDS_IN_DAY = 24 * 60 * 60; - var parsedSec; // Set predefined expire value if corresponding keyword was passed - + var parsedSec; + // Set predefined expire value if corresponding keyword was passed if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { parsedSec = SECONDS_IN_YEAR; } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { parsedSec = SECONDS_IN_DAY; } else { - parsedSec = Number.parseInt(offsetExpiresSec, 10); // If offsetExpiresSec has been parsed to NaN - do not set cookie at all - + parsedSec = Number.parseInt(offsetExpiresSec, 10); + // If offsetExpiresSec has been parsed to NaN - do not set cookie at all if (Number.isNaN(parsedSec)) { return null; } } - return parsedSec * MS_IN_SEC; }; @@ -1080,65 +994,65 @@ * @return {undefined} undefined */ var noopFunc = function noopFunc() {}; + /** * Function returns null * @return {null} null */ - var noopNull = function noopNull() { return null; }; + /** * Function returns true * @return {boolean} true */ - var trueFunc = function trueFunc() { return true; }; + /** * Function returns false * @return {boolean} false */ - var falseFunc = function falseFunc() { return false; }; + /** * Function returns this */ - function noopThis() { return this; } + /** * Function returns empty string * @return {string} empty string */ - var noopStr = function noopStr() { return ''; }; + /** * Function returns empty array * @return {Array} empty array */ - var noopArray = function noopArray() { return []; }; + /** * Function returns empty object * @return {Object} empty object */ - var noopObject = function noopObject() { return {}; }; + /** * Function returns Promise.reject() */ - var noopPromiseReject = function noopPromiseReject() { return Promise.reject(); }; // eslint-disable-line compat/compat @@ -1148,23 +1062,21 @@ * @param {string} [url=''] value of response url to set on response object * @param {string} [response='default'] value of response type to set on response object */ - var noopPromiseResolve = function noopPromiseResolve() { var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '{}'; var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'default'; - if (typeof Response === 'undefined') { return; - } // eslint-disable-next-line compat/compat - - + } + // eslint-disable-next-line compat/compat var response = new Response(responseBody, { status: 200, statusText: 'OK' - }); // Mock response' url & type to avoid adb checks - // https://github.com/AdguardTeam/Scriptlets/issues/216 + }); + // Mock response' url & type to avoid adb checks + // https://github.com/AdguardTeam/Scriptlets/issues/216 Object.defineProperties(response, { url: { value: responseUrl @@ -1172,8 +1084,9 @@ type: { value: responseType } - }); // eslint-disable-next-line compat/compat, consistent-return + }); + // eslint-disable-next-line compat/compat, consistent-return return Promise.resolve(response); }; @@ -1185,60 +1098,49 @@ * @param {string} stackTrace - script error stack trace * @returns {boolean} */ - - var shouldAbortInlineOrInjectedScript$1 = function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var shouldAbortInlineOrInjectedScript = function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { var INLINE_SCRIPT_STRING = 'inlineScript'; var INJECTED_SCRIPT_STRING = 'injectedScript'; var INJECTED_SCRIPT_MARKER = ''; - var isInlineScript = function isInlineScript(stackMatch) { return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; }; - var isInjectedScript = function isInjectedScript(stackMatch) { return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; }; - if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { return false; } - var documentURL = window.location.href; - var pos = documentURL.indexOf('#'); // Remove URL hash + var pos = documentURL.indexOf('#'); + // Remove URL hash // in Chrome, URL in stackTrace doesn't contain hash // so, it's necessary to remove it, otherwise location.href // will not match with location from stackTrace - if (pos !== -1) { documentURL = documentURL.slice(0, pos); } - var stackSteps = stackTrace.split('\n').slice(2).map(function (line) { return line.trim(); }); var stackLines = stackSteps.map(function (line) { - var stack; // Get stack trace URL + var stack; + // Get stack trace URL // in Firefox stack trace looks like this: advanceTaskQueue@http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:1834:20 // in Chrome like this: at Assert.throws (http://127.0.0.1:8080/scriptlets/tests/dist/qunit.js:3178:16) // so, first group "(.*?@)" is required for Firefox, second group contains URL - var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); - if (getStackTraceURL) { var stackURL = getStackTraceURL[2]; - - if (startsWith(stackURL, '(')) { + if (startsWith$1(stackURL, '(')) { stackURL = stackURL.slice(1); } - - if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { + if (startsWith$1(stackURL, INJECTED_SCRIPT_MARKER)) { stackURL = INJECTED_SCRIPT_STRING; var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); - - if (startsWith(stackFunction, 'at')) { + if (startsWith$1(stackFunction, 'at')) { stackFunction = stackFunction.slice(2).trim(); } - stack = "".concat(stackFunction, " ").concat(stackURL).trim(); } else { stack = stackURL; @@ -1246,22 +1148,18 @@ } else { stack = line; } - return stack; }); - if (stackLines) { for (var index = 0; index < stackLines.length; index += 1) { if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { return true; } - - if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { + if (isInjectedScript(stackMatch) && startsWith$1(stackLines[index], INJECTED_SCRIPT_STRING)) { return true; } } } - return false; }; @@ -1270,13 +1168,12 @@ * @param {HTMLElement} rootElement * @returns {HTMLElement[]} shadow-dom hosts */ - var findHostElements = function findHostElements(rootElement) { - var hosts = []; // Element.querySelectorAll() returns list of elements + var hosts = []; + // Element.querySelectorAll() returns list of elements // which are defined in DOM of Element. // Meanwhile, inner DOM of the element with shadowRoot property // is absolutely another DOM and which can not be reached by querySelectorAll('*') - var domElems = rootElement.querySelectorAll('*'); domElems.forEach(function (el) { if (el.shadowRoot) { @@ -1285,6 +1182,7 @@ }); return hosts; }; + /** * A collection of nodes. * @@ -1306,23 +1204,25 @@ * @param {HTMLElement[]|external:NodeList} hostElements * @returns {PierceData} */ - var pierceShadowDom = function pierceShadowDom(selector, hostElements) { var targets = []; - var innerHostsAcc = []; // it's possible to get a few hostElements found by baseSelector on the page + var innerHostsAcc = []; + // it's possible to get a few hostElements found by baseSelector on the page hostElements.forEach(function (host) { // check presence of selector element inside base element if it's not in shadow-dom var simpleElems = host.querySelectorAll(selector); targets = targets.concat([].slice.call(simpleElems)); var shadowRootElem = host.shadowRoot; var shadowChildren = shadowRootElem.querySelectorAll(selector); - targets = targets.concat([].slice.call(shadowChildren)); // find inner shadow-dom hosts inside processing shadow-dom + targets = targets.concat([].slice.call(shadowChildren)); + // find inner shadow-dom hosts inside processing shadow-dom innerHostsAcc.push(findHostElements(shadowRootElem)); - }); // if there were more than one host element, - // innerHostsAcc is an array of arrays and should be flatten + }); + // if there were more than one host element, + // innerHostsAcc is an array of arrays and should be flatten var innerHosts = flatten(innerHostsAcc); return { targets: targets, @@ -1335,13 +1235,14 @@ * @param {*} callback * @returns {boolean} */ - var isValidCallback = function isValidCallback(callback) { - return callback instanceof Function // passing string as 'code' arg is not recommended + return callback instanceof Function + // passing string as 'code' arg is not recommended // but it is possible and not restricted // https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#parameters || typeof callback === 'string'; }; + /** * Checks whether 'callback' and 'delay' are matching * by given parameters 'matchCallback' and 'matchDelay'. @@ -1349,36 +1250,29 @@ * @param {Object} { callback, delay, matchCallback, matchDelay } * @returns {boolean} */ - var isPreventionNeeded = function isPreventionNeeded(_ref) { var callback = _ref.callback, - delay = _ref.delay, - matchCallback = _ref.matchCallback, - matchDelay = _ref.matchDelay; - + delay = _ref.delay, + matchCallback = _ref.matchCallback, + matchDelay = _ref.matchDelay; // if callback is has not valid type // scriptlet can not prevent it // so no need for more checking and do not call hit() later if (!isValidCallback(callback)) { return false; } - if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { return false; } - var _parseMatchArg = parseMatchArg(matchCallback), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; var _parseDelayArg = parseDelayArg(matchDelay), - isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, - delayMatch = _parseDelayArg.delayMatch; - - var shouldPrevent = false; // https://github.com/AdguardTeam/Scriptlets/issues/105 - + isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, + delayMatch = _parseDelayArg.delayMatch; + var shouldPrevent = false; + // https://github.com/AdguardTeam/Scriptlets/issues/105 var callbackStr = String(callback); - if (delayMatch === null) { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; } else if (!matchCallback) { @@ -1386,13 +1280,12 @@ } else { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && delay === delayMatch !== isInvertedDelayMatch; } - return shouldPrevent; }; var handleOldReplacement = function handleOldReplacement(replacement) { - var result; // defaults to return noopFunc instead of window.open - + var result; + // defaults to return noopFunc instead of window.open if (!replacement) { result = noopFunc; } else if (replacement === 'trueFunc') { @@ -1401,20 +1294,17 @@ // We should return noopFunc instead of window.open // but with some property if website checks it (examples 5, 6) // https://github.com/AdguardTeam/Scriptlets/issues/71 - var isProp = startsWith(replacement, '{') && endsWith(replacement, '}'); - + var isProp = startsWith$1(replacement, '{') && endsWith(replacement, '}'); if (isProp) { var propertyPart = replacement.slice(1, -1); var propertyName = substringBefore(propertyPart, '='); var propertyValue = substringAfter$1(propertyPart, '='); - if (propertyValue === 'noopFunc') { result = {}; result[propertyName] = noopFunc; } } } - return result; }; var createDecoy = function createDecoy(args) { @@ -1423,11 +1313,10 @@ var IFRAME_TAG_NAME = 'iframe'; var IFRAME_URL_PROP_NAME = 'src'; var replacement = args.replacement, - url = args.url, - delay = args.delay; + url = args.url, + delay = args.delay; var tag; var urlProp; - if (replacement === 'obj') { tag = OBJECT_TAG_NAME; urlProp = OBJECT_URL_PROP_NAME; @@ -1435,7 +1324,6 @@ tag = IFRAME_TAG_NAME; urlProp = IFRAME_URL_PROP_NAME; } - var decoy = document.createElement(tag); decoy[urlProp] = url; decoy.style.setProperty('height', '1px', 'important'); @@ -1453,14 +1341,11 @@ if (prop && prop === 'closed') { return false; } - if (typeof nativeGetter === 'function') { return noopFunc; } - return prop && target[prop]; }; - return preventGetter; }; @@ -1473,16 +1358,15 @@ * Includes common 'url' and 'method' props and all other fetch-specific props * @returns {string[]} */ - var getRequestProps = function getRequestProps() { return ['url', 'method', 'headers', 'body', 'mode', 'credentials', 'cache', 'redirect', 'referrer', 'referrerPolicy', 'integrity', 'keepalive', 'signal']; }; + /** * Collects Request options to object * @param {Request} request * @returns {Object} data object */ - var getRequestData = function getRequestData(request) { var requestInitOptions = getRequestProps(); var entries = requestInitOptions.map(function (key) { @@ -1492,17 +1376,16 @@ }); return getObjectFromEntries(entries); }; + /** * Collects fetch args to object * @param {*} args fetch args * @returns {Object} data object */ - var getFetchData = function getFetchData(args) { var fetchPropsObj = {}; var fetchUrl; var fetchInit; - if (args[0] instanceof Request) { // if Request passed to fetch, it will be in array var requestData = getRequestData(args[0]); @@ -1510,20 +1393,18 @@ fetchInit = requestData; } else { fetchUrl = args[0]; // eslint-disable-line prefer-destructuring - fetchInit = args[1]; // eslint-disable-line prefer-destructuring } fetchPropsObj.url = fetchUrl; - if (fetchInit instanceof Object) { Object.keys(fetchInit).forEach(function (prop) { fetchPropsObj[prop] = fetchInit[prop]; }); } - return fetchPropsObj; }; + /** * Collect xhr.open arguments to object * @param {string} method @@ -1533,7 +1414,6 @@ * @param {string} password * @returns {Object} */ - var getXhrData = function getXhrData(method, url, async, user, password) { return { method: method, @@ -1543,13 +1423,13 @@ password: password }; }; + /** * Parse propsToMatch input string into object; * used for prevent-fetch and prevent-xhr * @param {string} propsToMatchStr * @returns {Object} object where 'key' is prop name and 'value' is prop value */ - var parseMatchProps = function parseMatchProps(propsToMatchStr) { var PROPS_DIVIDER = ' '; var PAIRS_MARKER = ':'; @@ -1560,7 +1440,6 @@ var dividerInd = prop.indexOf(PAIRS_MARKER); var key = prop.slice(0, dividerInd); var hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { var value = prop.slice(dividerInd + 1); propsObj[key] = value; @@ -1573,23 +1452,23 @@ }); return propsObj; }; + /** * Validates parsed data values * @param {Object} data * @returns {boolean} */ - var validateParsedData = function validateParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); }); }; + /** * Converts valid parsed data to data obj for further matching * @param {Object} data * @returns {Object} */ - var getMatchPropsData = function getMatchPropsData(data) { var matchData = {}; Object.keys(data).forEach(function (key) { @@ -1613,7 +1492,6 @@ */ var logMessage = function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { // eslint-disable-next-line no-console console.log("".concat(source.name, ": ").concat(message)); @@ -1632,7 +1510,6 @@ * @param {string} value * @param {boolean} shouldLog determines if helper should log on a failed set attempt */ - var setStorageItem = function setStorageItem(source, storage, key, value) { // setItem() may throw an exception if the storage is full. try { @@ -1642,21 +1519,17 @@ logMessage(source, message); } }; + /** * Gets supported storage item value - * @param {Source} source * @param {string} value input item value - * @param {boolean} verbose if logging invalid values is required * @returns {string|null|undefined|boolean} valid item value if ok OR null if not */ - - var getLimitedStorageItemValue = function getLimitedStorageItemValue(source, value) { - if (!value) { - return null; + var getLimitedStorageItemValue = function getLimitedStorageItemValue(value) { + if (typeof value !== 'string') { + throw new Error('Invalid value'); } - var validValue; - if (value === 'undefined') { validValue = undefined; } else if (value === 'false') { @@ -1673,24 +1546,19 @@ validValue = ''; } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return null; + throw new Error('Invalid value'); } - if (Math.abs(validValue) > 0x7FFF) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return null; + throw new Error('Invalid value'); } } else if (value === 'yes') { validValue = 'yes'; } else if (value === 'no') { validValue = 'no'; } else { - return null; + throw new Error('Invalid value'); } - return validValue; }; @@ -1707,15 +1575,12 @@ if (typeof error === 'string' && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } @@ -1737,29 +1602,27 @@ * * @return {Object} */ - function getDescriptorAddon() { return { isAbortingSuspended: false, isolateCallback: function isolateCallback(cb) { - this.isAbortingSuspended = true; // try...catch is required in case if there are more than one inline scripts + this.isAbortingSuspended = true; + // try...catch is required in case if there are more than one inline scripts // which should be aborted. // so after the first successful abortion, `cb(...args);` will throw error, // and we should not stop on that and continue to abort other scripts - try { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - var result = cb.apply(void 0, args); this.isAbortingSuspended = false; return result; } catch (_unused) { var rid = randomId(); - this.isAbortingSuspended = false; // It's necessary to throw error + this.isAbortingSuspended = false; + // It's necessary to throw error // otherwise script will be not aborted - throw new ReferenceError(rid); } } @@ -1784,19 +1647,17 @@ * @param {string} chain * @returns {Chain} */ - function getPropertyInChain(base, chain) { var pos = chain.indexOf('.'); - if (pos === -1) { return { base: base, prop: chain }; } + var prop = chain.slice(0, pos); - var prop = chain.slice(0, pos); // https://github.com/AdguardTeam/Scriptlets/issues/128 - + // https://github.com/AdguardTeam/Scriptlets/issues/128 if (base === null) { // if base is null, return 'null' as base. // it's needed for triggering the reason logging while debugging @@ -1806,10 +1667,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) { // for empty objects in chain return { @@ -1818,7 +1677,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -1826,11 +1684,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -1864,7 +1720,6 @@ var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; var pos = chain.indexOf('.'); - if (pos === -1) { // for paths like 'a.b.*' every final nested prop should be processed if (chain === '*' || chain === '[]') { @@ -1884,95 +1739,71 @@ prop: chain }); } - return output; } - var prop = chain.slice(0, pos); var shouldLookThrough = prop === '[]' && Array.isArray(base) || prop === '*' && base instanceof Object; - if (shouldLookThrough) { var nextProp = chain.slice(pos + 1); - var baseKeys = Object.keys(base); // if there is a wildcard prop in input chain (e.g. 'ad.*.src' for 'ad.0.src ad.1.src'), - // each one of base keys should be considered as a potential chain prop in final path + var baseKeys = Object.keys(base); + // if there is a wildcard prop in input chain (e.g. 'ad.*.src' for 'ad.0.src ad.1.src'), + // each one of base keys should be considered as a potential chain prop in final path baseKeys.forEach(function (key) { var item = base[key]; getWildcardPropertyInChain(item, nextProp, lookThrough, output); }); } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if (nextBase !== undefined) { getWildcardPropertyInChain(nextBase, chain, lookThrough, output); } - return output; } /* eslint-disable no-console, no-underscore-dangle */ - /** * Hit used only for debug purposes now * @param {Source} source - * @param {string} [message] - optional message; * use LOG_MARKER = 'log: ' at the start of a message * for logging scriptlets */ - var hit = function hit(source, message) { + var hit = function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); // eslint-disable-line compat/compat var prefix = source.ruleText || ''; - if (source.domainName) { var AG_SCRIPTLET_MARKER = '#%#//'; var UBO_SCRIPTLET_MARKER = '##+js'; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); - } // delete all domains from ruleText and leave just rule part - - - var rulePart = source.ruleText.slice(ruleStartIndex); // prepare applied scriptlet rule for specific domain - - prefix = "".concat(source.domainName).concat(rulePart); - } // Used to check if scriptlet uses 'hit' function for logging - - - var LOG_MARKER = 'log: '; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); } + // delete all domains from ruleText and leave just rule part + var rulePart = source.ruleText.slice(ruleStartIndex); + // prepare applied scriptlet rule for specific domain + prefix = "".concat(source.domainName).concat(rulePart); } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); - } catch (e) {// try catch for Edge 15 + } catch (e) { + // try catch for Edge 15 // In according to this issue https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/14495220/ // console.log throws an error - } // This is necessary for unit-tests only! - + } + // This is necessary for unit-tests only! if (typeof window.__debug === 'function') { window.__debug(source); } @@ -1991,27 +1822,23 @@ * @param {Object} requestData object with standard properties of fetch/xhr like url, method etc * @returns {boolean} */ - var matchRequestProps = function matchRequestProps(source, propsToMatch, requestData) { if (propsToMatch === '' || propsToMatch === '*') { return true; } - var isMatched; var parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { logMessage(source, "Invalid parameter: ".concat(propsToMatch)); isMatched = false; } else { - var matchData = getMatchPropsData(parsedData); // prevent only if all props match - + var matchData = getMatchPropsData(parsedData); + // prevent only if all props match isMatched = Object.keys(matchData).every(function (matchKey) { var matchValue = matchData[matchKey]; return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); }); } - return isMatched; }; @@ -2022,16 +1849,13 @@ * @param {string} stackTrace - script error stack trace * @returns {boolean} */ - var matchStackTrace = function matchStackTrace(stackMatch, stackTrace) { if (!stackMatch || stackMatch === '') { return true; } - - if (shouldAbortInlineOrInjectedScript$1(stackMatch, stackTrace)) { + if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { return true; } - var stackRegexp = toRegExp(stackMatch); var refinedStackTrace = stackTrace.split('\n').slice(2) // get rid of our own functions in the stack trace .map(function (line) { @@ -2050,29 +1874,24 @@ var throttle = function throttle(cb, delay) { var wait = false; var savedArgs; - var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - if (wait) { savedArgs = args; return; } - cb.apply(void 0, args); wait = true; setTimeout(function () { wait = false; - if (savedArgs) { wrapper(savedArgs); savedArgs = null; } }, delay); }; - return wrapper; }; @@ -2081,11 +1900,9 @@ * @param {Function} callback * @param {boolean} observeAttrs - optional parameter - should observer check attributes changes */ - var observeDOMChanges = function observeDOMChanges(callback) { var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - /** * 'delay' in milliseconds for 'throttle' method */ @@ -2094,9 +1911,7 @@ * Used for remove-class */ // eslint-disable-next-line no-use-before-define, compat/compat - var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { @@ -2113,17 +1928,14 @@ }); } }; - var disconnect = function disconnect() { observer.disconnect(); }; - function callbackWrapper() { disconnect(); callback(); connect(); } - connect(); }; @@ -2166,7 +1978,6 @@ var NOW_VALUE_KEYWORD = '$now$'; var CURRENT_DATE_KEYWORD = '$currentDate$'; var parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { // Set to current time in ms, e.g 1667915146503 parsedValue = Date.now().toString(); @@ -2174,12 +1985,10 @@ // Set to current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' parsedValue = Date(); } - return parsedValue; }; /* eslint-disable max-len */ - /** * @trustedScriptlet trusted-click-element * @@ -2234,31 +2043,25 @@ * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], input[type="submit"][value="akkoord"]', 'cookie:cmpconsent, localStorage:promo', '250') * ``` */ - /* eslint-enable max-len */ - function trustedClickElement$1(source, selectors) { var extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN; - if (!selectors) { return; } - var OBSERVER_TIMEOUT_MS = 10000; var THROTTLE_DELAY_MS = 20; var COOKIE_MATCH_MARKER = 'cookie:'; var LOCAL_STORAGE_MATCH_MARKER = 'localStorage:'; var SELECTORS_DELIMITER = ','; - var COOKIE_STRING_DELIMITER = ';'; // Regex to split match pairs by commas, avoiding the ones included in regexes - + var COOKIE_STRING_DELIMITER = ';'; + // Regex to split match pairs by commas, avoiding the ones included in regexes var EXTRA_MATCH_DELIMITER = /(,\s*){1}(?=cookie:|localStorage:)/; var parsedDelay; - if (delay) { parsedDelay = parseInt(delay, 10); var isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS; - if (!isValidDelay) { // eslint-disable-next-line max-len var message = "Passed delay '".concat(delay, "' is invalid or bigger than ").concat(OBSERVER_TIMEOUT_MS, " ms"); @@ -2266,39 +2069,34 @@ return; } } - var canClick = !parsedDelay; var cookieMatches = []; var localStorageMatches = []; - if (extraMatch) { // Get all match marker:value pairs from argument var parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) { return matchStr.trim(); - }); // Filter match pairs by marker + }); + // Filter match pairs by marker parsedExtraMatch.forEach(function (matchStr) { if (matchStr.indexOf(COOKIE_MATCH_MARKER) > -1) { var cookieMatch = matchStr.replace(COOKIE_MATCH_MARKER, ''); cookieMatches.push(cookieMatch); } - if (matchStr.indexOf(LOCAL_STORAGE_MATCH_MARKER) > -1) { var localStorageMatch = matchStr.replace(LOCAL_STORAGE_MATCH_MARKER, ''); localStorageMatches.push(localStorageMatch); } }); } - if (cookieMatches.length > 0) { var parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER)); var parsedCookies = parseCookieString(document.cookie); var cookieKeys = Object.keys(parsedCookies); - if (cookieKeys.length === 0) { return; } - var cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) { // Avoid getting /.?/ result from toRegExp on undefined // as cookie may be set without value, @@ -2307,35 +2105,31 @@ var keyMatch = toRegExp(key); return cookieKeys.some(function (key) { var keysMatched = keyMatch.test(key); - if (!keysMatched) { return false; - } // Key matching is enough if cookie value match is not specified - + } + // Key matching is enough if cookie value match is not specified if (!valueMatch) { return true; } - return valueMatch.test(parsedCookies[key]); }); }); - if (!cookiesMatched) { return; } } - if (localStorageMatches.length > 0) { var localStorageMatched = localStorageMatches.every(function (str) { var itemValue = window.localStorage.getItem(str); return itemValue || itemValue === ''; }); - if (!localStorageMatched) { return; } } + /** * Create selectors array and swap selectors to null on finding it's element * @@ -2344,60 +2138,52 @@ * - always know on what index corresponding element should be put * - prevent selectors from being queried multiple times */ - - var selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) { return selector.trim(); }); - var createElementObj = function createElementObj(element) { return { element: element || null, clicked: false }; }; - var elementsSequence = Array(selectorsSequence.length).fill(createElementObj()); + /** * Go through elementsSequence from left to right, clicking on found elements * * Element should not be clicked if it is already clicked, * or a previous element is not found or clicked yet */ - var clickElementsBySequence = function clickElementsBySequence() { for (var i = 0; i < elementsSequence.length; i += 1) { - var elementObj = elementsSequence[i]; // Stop clicking if that pos element is not found yet - + var elementObj = elementsSequence[i]; + // Stop clicking if that pos element is not found yet if (!elementObj.element) { break; - } // Skip already clicked elements - - + } + // Skip already clicked elements if (!elementObj.clicked) { elementObj.element.click(); elementObj.clicked = true; } } - var allElementsClicked = elementsSequence.every(function (elementObj) { return elementObj.clicked === true; }); - if (allElementsClicked) { // At this stage observer is already disconnected hit(source); } }; - var handleElement = function handleElement(element, i) { var elementObj = createElementObj(element); elementsSequence[i] = elementObj; - if (canClick) { clickElementsBySequence(); } }; + /** * Query all selectors from queue on each mutation * Each selector is swapped to null in selectorsSequence on founding corresponding element @@ -2406,46 +2192,41 @@ * when delay is getting off after the last mutation took place. * */ - - var findElements = function findElements(mutations, observer) { var fulfilledSelectors = []; selectorsSequence.forEach(function (selector, i) { if (!selector) { return; } - var element = document.querySelector(selector); - if (!element) { return; } - handleElement(element, i); fulfilledSelectors.push(selector); - }); // selectorsSequence should be modified after the loop to not break loop indexation + }); + // selectorsSequence should be modified after the loop to not break loop indexation selectorsSequence = selectorsSequence.map(function (selector) { return fulfilledSelectors.indexOf(selector) === -1 ? selector : null; - }); // Disconnect observer after finding all elements + }); + // Disconnect observer after finding all elements var allSelectorsFulfilled = selectorsSequence.every(function (selector) { return selector === null; }); - if (allSelectorsFulfilled) { observer.disconnect(); } - }; // eslint-disable-next-line compat/compat - + }; + // eslint-disable-next-line compat/compat var observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS)); observer.observe(document.documentElement, { attributes: true, childList: true, subtree: true }); - if (parsedDelay) { setTimeout(function () { // Click previously collected elements @@ -2453,17 +2234,17 @@ canClick = true; }, parsedDelay); } - setTimeout(function () { return observer.disconnect(); }, OBSERVER_TIMEOUT_MS); } - trustedClickElement$1.names = ['trusted-click-element' // trusted scriptlets support no aliases + trustedClickElement$1.names = ['trusted-click-element' + // trusted scriptlets support no aliases ]; + trustedClickElement$1.injections = [hit, toRegExp, parseCookieString, throttle, logMessage]; /* eslint-disable max-len */ - /** * @scriptlet abort-on-property-read * @@ -2492,36 +2273,28 @@ * example.org#%#//scriptlet('abort-on-property-read', 'navigator.language') * ``` */ - /* eslint-enable max-len */ - function abortOnPropertyRead$1(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -2530,22 +2303,20 @@ }); return; } - setPropertyAccess(base, prop, { get: abort, set: function set() {} }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - abortOnPropertyRead$1.names = ['abort-on-property-read', // aliases are needed for matching the related scriptlet converted into our syntax + abortOnPropertyRead$1.names = ['abort-on-property-read', + // aliases are needed for matching the related scriptlet converted into our syntax 'abort-on-property-read.js', 'ubo-abort-on-property-read.js', 'aopr.js', 'ubo-aopr.js', 'ubo-abort-on-property-read', 'ubo-aopr', 'abp-abort-on-property-read']; abortOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; /* eslint-disable max-len */ - /** * @scriptlet abort-on-property-write * @@ -2571,36 +2342,28 @@ * example.org#%#//scriptlet('abort-on-property-write', 'adblock') * ``` */ - /* eslint-enable max-len */ - function abortOnPropertyWrite$1(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -2609,21 +2372,19 @@ }); return; } - setPropertyAccess(base, prop, { set: abort }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - abortOnPropertyWrite$1.names = ['abort-on-property-write', // aliases are needed for matching the related scriptlet converted into our syntax + abortOnPropertyWrite$1.names = ['abort-on-property-write', + // aliases are needed for matching the related scriptlet converted into our syntax 'abort-on-property-write.js', 'ubo-abort-on-property-write.js', 'aopw.js', 'ubo-aopw.js', 'ubo-abort-on-property-write', 'ubo-aopw', 'abp-abort-on-property-write']; abortOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; /* eslint-disable max-len */ - /** * @scriptlet prevent-setTimeout * @@ -2725,24 +2486,21 @@ * }, 500); * ``` */ - /* eslint-enable max-len */ - function preventSetTimeout$1(source, matchCallback, matchDelay) { // if browser does not support Proxy (e.g. Internet Explorer), // we use none-proxy "legacy" wrapper for preventing // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy var isProxySupported = typeof Proxy !== 'undefined'; - var nativeTimeout = window.setTimeout; // logs setTimeouts to console if no arguments have been specified + var nativeTimeout = window.setTimeout; + // logs setTimeouts to console if no arguments have been specified var shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined'; - var legacyTimeoutWrapper = function legacyTimeoutWrapper(callback, delay) { var shouldPrevent = false; - if (shouldLog) { - hit(source); // https://github.com/AdguardTeam/Scriptlets/issues/105 - + hit(source); + // https://github.com/AdguardTeam/Scriptlets/issues/105 logMessage(source, "setTimeout(".concat(String(callback), ", ").concat(delay, ")"), true); } else { shouldPrevent = isPreventionNeeded({ @@ -2752,27 +2510,22 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); return nativeTimeout(noopFunc, delay); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeTimeout.apply(window, [callback, delay].concat(args)); }; - var handlerWrapper = function handlerWrapper(target, thisArg, args) { var callback = args[0]; var delay = args[1]; var shouldPrevent = false; - if (shouldLog) { - hit(source); // https://github.com/AdguardTeam/Scriptlets/issues/105 - + hit(source); + // https://github.com/AdguardTeam/Scriptlets/issues/105 logMessage(source, "setTimeout(".concat(String(callback), ", ").concat(delay, ")"), true); } else { shouldPrevent = isPreventionNeeded({ @@ -2782,32 +2535,33 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); args[0] = noopFunc; } - return target.apply(thisArg, args); }; - var setTimeoutHandler = { apply: handlerWrapper }; window.setTimeout = isProxySupported ? new Proxy(window.setTimeout, setTimeoutHandler) : legacyTimeoutWrapper; } - preventSetTimeout$1.names = ['prevent-setTimeout', // aliases are needed for matching the related scriptlet converted into our syntax - 'no-setTimeout-if.js', // new implementation of setTimeout-defuser.js - 'ubo-no-setTimeout-if.js', 'nostif.js', // new short name of no-setTimeout-if - 'ubo-nostif.js', 'ubo-no-setTimeout-if', 'ubo-nostif', // old scriptlet names which should be supported as well. + preventSetTimeout$1.names = ['prevent-setTimeout', + // aliases are needed for matching the related scriptlet converted into our syntax + 'no-setTimeout-if.js', + // new implementation of setTimeout-defuser.js + 'ubo-no-setTimeout-if.js', 'nostif.js', + // new short name of no-setTimeout-if + 'ubo-nostif.js', 'ubo-no-setTimeout-if', 'ubo-nostif', + // old scriptlet names which should be supported as well. // should be removed eventually. // do not remove until other filter lists maintainers use them 'setTimeout-defuser.js', 'ubo-setTimeout-defuser.js', 'ubo-setTimeout-defuser', 'std.js', 'ubo-std.js', 'ubo-std']; - preventSetTimeout$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage, // following helpers should be injected as helpers above use them - parseMatchArg, parseDelayArg, toRegExp, startsWith, nativeIsNaN, isValidCallback, isValidMatchStr, escapeRegExp, isValidStrPattern, nativeIsFinite, isValidMatchNumber]; + preventSetTimeout$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage, + // following helpers should be injected as helpers above use them + parseMatchArg, parseDelayArg, toRegExp, startsWith$1, nativeIsNaN, isValidCallback, isValidMatchStr, escapeRegExp, isValidStrPattern, nativeIsFinite, isValidMatchNumber]; /* eslint-disable max-len */ - /** * @scriptlet prevent-setInterval * @@ -2909,24 +2663,21 @@ * }, 500); * ``` */ - /* eslint-enable max-len */ - function preventSetInterval$1(source, matchCallback, matchDelay) { // if browser does not support Proxy (e.g. Internet Explorer), // we use none-proxy "legacy" wrapper for preventing // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy var isProxySupported = typeof Proxy !== 'undefined'; - var nativeInterval = window.setInterval; // logs setIntervals to console if no arguments have been specified + var nativeInterval = window.setInterval; + // logs setIntervals to console if no arguments have been specified var shouldLog = typeof matchCallback === 'undefined' && typeof matchDelay === 'undefined'; - var legacyIntervalWrapper = function legacyIntervalWrapper(callback, delay) { var shouldPrevent = false; - if (shouldLog) { - hit(source); // https://github.com/AdguardTeam/Scriptlets/issues/105 - + hit(source); + // https://github.com/AdguardTeam/Scriptlets/issues/105 logMessage(source, "setInterval(".concat(String(callback), ", ").concat(delay, ")"), true); } else { shouldPrevent = isPreventionNeeded({ @@ -2936,27 +2687,22 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); return nativeInterval(noopFunc, delay); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeInterval.apply(window, [callback, delay].concat(args)); }; - var handlerWrapper = function handlerWrapper(target, thisArg, args) { var callback = args[0]; var delay = args[1]; var shouldPrevent = false; - if (shouldLog) { - hit(source); // https://github.com/AdguardTeam/Scriptlets/issues/105 - + hit(source); + // https://github.com/AdguardTeam/Scriptlets/issues/105 logMessage(source, "setInterval(".concat(String(callback), ", ").concat(delay, ")"), true); } else { shouldPrevent = isPreventionNeeded({ @@ -2966,31 +2712,33 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); args[0] = noopFunc; } - return target.apply(thisArg, args); }; - var setIntervalHandler = { apply: handlerWrapper }; window.setInterval = isProxySupported ? new Proxy(window.setInterval, setIntervalHandler) : legacyIntervalWrapper; } - preventSetInterval$1.names = ['prevent-setInterval', // aliases are needed for matching the related scriptlet converted into our syntax - 'no-setInterval-if.js', // new implementation of setInterval-defuser.js - 'ubo-no-setInterval-if.js', 'setInterval-defuser.js', // old name should be supported as well - 'ubo-setInterval-defuser.js', 'nosiif.js', // new short name of no-setInterval-if - 'ubo-nosiif.js', 'sid.js', // old short scriptlet name + preventSetInterval$1.names = ['prevent-setInterval', + // aliases are needed for matching the related scriptlet converted into our syntax + 'no-setInterval-if.js', + // new implementation of setInterval-defuser.js + 'ubo-no-setInterval-if.js', 'setInterval-defuser.js', + // old name should be supported as well + 'ubo-setInterval-defuser.js', 'nosiif.js', + // new short name of no-setInterval-if + 'ubo-nosiif.js', 'sid.js', + // old short scriptlet name 'ubo-sid.js', 'ubo-no-setInterval-if', 'ubo-setInterval-defuser', 'ubo-nosiif', 'ubo-sid']; - preventSetInterval$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage, // following helpers should be injected as helpers above use them - toRegExp, startsWith, nativeIsNaN, parseMatchArg, parseDelayArg, isValidCallback, isValidMatchStr, isValidStrPattern, escapeRegExp, nativeIsFinite, isValidMatchNumber]; + preventSetInterval$1.injections = [hit, noopFunc, isPreventionNeeded, logMessage, + // following helpers should be injected as helpers above use them + toRegExp, startsWith$1, nativeIsNaN, parseMatchArg, parseDelayArg, isValidCallback, isValidMatchStr, isValidStrPattern, escapeRegExp, nativeIsFinite, isValidMatchNumber]; /* eslint-disable max-len */ - /** * @scriptlet prevent-window-open * @@ -3051,9 +2799,7 @@ * * > For better compatibility with uBO, old syntax is not recommended to use. */ - /* eslint-enable max-len */ - function preventWindowOpen$1(source) { var match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '*'; var delay = arguments.length > 2 ? arguments[2] : undefined; @@ -3062,62 +2808,49 @@ // if scriptlet runs without args var nativeOpen = window.open; var isNewSyntax = match !== '0' && match !== '1'; - var oldOpenWrapper = function oldOpenWrapper(str) { - match = Number(match) > 0; // 'delay' was 'search' prop for matching in old syntax - + match = Number(match) > 0; + // 'delay' was 'search' prop for matching in old syntax for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - if (!isValidStrPattern(delay)) { logMessage(source, "Invalid parameter: ".concat(delay)); return nativeOpen.apply(window, [str].concat(args)); } - var searchRegexp = toRegExp(delay); - if (match !== searchRegexp.test(str)) { return nativeOpen.apply(window, [str].concat(args)); } - hit(source); return handleOldReplacement(replacement); }; - var newOpenWrapper = function newOpenWrapper(url) { var shouldLog = replacement && replacement.indexOf('log') > -1; - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } - if (shouldLog) { var argsStr = args && args.length > 0 ? ", ".concat(args.join(', ')) : ''; - var message = "window-open: ".concat(url).concat(argsStr); + var message = "".concat(url).concat(argsStr); logMessage(source, message, true); hit(source); } - var shouldPrevent = false; - if (match === '*') { shouldPrevent = true; } else if (isValidMatchStr(match)) { var _parseMatchArg = parseMatchArg(match), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; shouldPrevent = matchRegexp.test(url) !== isInvertedMatch; } else { logMessage(source, "Invalid parameter: ".concat(match)); shouldPrevent = false; } - if (shouldPrevent) { var parsedDelay = parseInt(delay, 10); var result; - if (nativeIsNaN(parsedDelay)) { result = noopNull(); } else { @@ -3128,7 +2861,6 @@ }; var decoy = createDecoy(decoyArgs); var popup = decoy.contentWindow; - if (typeof popup === 'object' && popup !== null) { Object.defineProperty(popup, 'closed', { value: false @@ -3146,27 +2878,24 @@ }); popup = decoy.contentWindow; } - result = popup; } - hit(source); return result; } - return nativeOpen.apply(window, [url].concat(args)); }; + window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper; - window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper; // Protect window.open from native code check - + // Protect window.open from native code check window.open.toString = nativeOpen.toString.bind(nativeOpen); } - preventWindowOpen$1.names = ['prevent-window-open', // aliases are needed for matching the related scriptlet converted into our syntax + preventWindowOpen$1.names = ['prevent-window-open', + // aliases are needed for matching the related scriptlet converted into our syntax 'window.open-defuser.js', 'ubo-window.open-defuser.js', 'ubo-window.open-defuser', 'nowoif.js', 'ubo-nowoif.js', 'ubo-nowoif']; - preventWindowOpen$1.injections = [hit, isValidStrPattern, escapeRegExp, isValidMatchStr, toRegExp, nativeIsNaN, parseMatchArg, handleOldReplacement, createDecoy, getPreventGetter, noopNull, logMessage, noopFunc, trueFunc, startsWith, endsWith, substringBefore, substringAfter$1]; + preventWindowOpen$1.injections = [hit, isValidStrPattern, escapeRegExp, isValidMatchStr, toRegExp, nativeIsNaN, parseMatchArg, handleOldReplacement, createDecoy, getPreventGetter, noopNull, logMessage, noopFunc, trueFunc, startsWith$1, endsWith, substringBefore, substringAfter$1]; /* eslint-disable max-len */ - /** * @scriptlet abort-current-inline-script * @@ -3229,14 +2958,11 @@ * * ``` */ - /* eslint-enable max-len */ - function abortCurrentInlineScript$1(source, property, search) { var searchRegexp = toRegExp(search); var rid = randomId(); var SRC_DATA_MARKER = 'data:text/javascript;base64,'; - var getCurrentScript = function getCurrentScript() { if ('currentScript' in document) { return document.currentScript; // eslint-disable-line compat/compat @@ -3245,49 +2971,42 @@ var scripts = document.getElementsByTagName('script'); return scripts[scripts.length - 1]; }; - var ourScript = getCurrentScript(); - var abort = function abort() { var scriptEl = getCurrentScript(); - if (!scriptEl) { return; } + var content = scriptEl.textContent; - var content = scriptEl.textContent; // We are using Node.prototype.textContent property descriptor + // We are using Node.prototype.textContent property descriptor // to get the real script content // even when document.currentScript.textContent is replaced. // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991 - try { var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get; content = textContentGetter.call(scriptEl); } catch (e) {} // eslint-disable-line no-empty - // https://github.com/AdguardTeam/Scriptlets/issues/130 - - if (content.length === 0 && typeof scriptEl.src !== 'undefined' && startsWith(scriptEl.src, SRC_DATA_MARKER)) { + // https://github.com/AdguardTeam/Scriptlets/issues/130 + if (content.length === 0 && typeof scriptEl.src !== 'undefined' && startsWith$1(scriptEl.src, SRC_DATA_MARKER)) { var encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length); content = window.atob(encodedContent); } - if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { hit(source); throw new ReferenceError(rid); } }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; // The scriptlet might be executed before the chain property has been created + chain = chainInfo.chain; // The scriptlet might be executed before the chain property has been created // (for instance, document.body before the HTML body was loaded). // In this case we're checking whether the base element exists or not // and if not, we simply exit without overriding anything. // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092 - if (base instanceof Object === false && base === null) { var props = property.split('.'); var propIndex = props.indexOf(prop); @@ -3296,16 +3015,13 @@ logMessage(source, message); return; } - if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -3314,33 +3030,27 @@ }); return; } - var currentValue = base[prop]; var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) { currentValue = base[prop]; origDescriptor = undefined; } - var descriptorWrapper = Object.assign(getDescriptorAddon(), { currentValue: currentValue, get: function get() { if (!this.isAbortingSuspended) { this.isolateCallback(abort); } - if (origDescriptor instanceof Object) { return origDescriptor.get.call(base); } - return this.currentValue; }, set: function set(newValue) { if (!this.isAbortingSuspended) { this.isolateCallback(abort); } - if (origDescriptor instanceof Object) { origDescriptor.set.call(base, newValue); } else { @@ -3358,18 +3068,19 @@ } }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - abortCurrentInlineScript$1.names = ['abort-current-inline-script', // aliases are needed for matching the related scriptlet converted into our syntax - 'abort-current-script.js', 'ubo-abort-current-script.js', 'acs.js', 'ubo-acs.js', // "ubo"-aliases with no "js"-ending - 'ubo-abort-current-script', 'ubo-acs', // obsolete but supported aliases + abortCurrentInlineScript$1.names = ['abort-current-inline-script', + // aliases are needed for matching the related scriptlet converted into our syntax + 'abort-current-script.js', 'ubo-abort-current-script.js', 'acs.js', 'ubo-acs.js', + // "ubo"-aliases with no "js"-ending + 'ubo-abort-current-script', 'ubo-acs', + // obsolete but supported aliases 'abort-current-inline-script.js', 'ubo-abort-current-inline-script.js', 'acis.js', 'ubo-acis.js', 'ubo-abort-current-inline-script', 'ubo-acis', 'abp-abort-current-inline-script']; - abortCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, startsWith, createOnErrorHandler, hit, logMessage, isEmptyObject, getDescriptorAddon]; + abortCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, startsWith$1, createOnErrorHandler, hit, logMessage, isEmptyObject, getDescriptorAddon]; /* eslint-disable max-len */ - /** * @scriptlet set-constant * @@ -3436,18 +3147,14 @@ * ✔ document.third() === true // if the condition described above is met * ``` */ - /* eslint-enable max-len */ - function setConstant$1(source, property, value, stack) { if (!property || !matchStackTrace(stack, new Error().stack)) { return; } - var emptyArr = noopArray(); var emptyObj = noopObject(); var constantValue; - if (value === 'undefined') { constantValue = undefined; } else if (value === 'false') { @@ -3472,11 +3179,9 @@ constantValue = noopPromiseReject; } else if (/^\d+$/.test(value)) { constantValue = parseFloat(value); - if (nativeIsNaN(constantValue)) { return; } - if (Math.abs(constantValue) > 0x7FFF) { return; } @@ -3491,26 +3196,21 @@ } else { return; } - var canceled = false; - var mustCancel = function mustCancel(value) { if (canceled) { return canceled; } - canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; return canceled; }; - var trapProp = function trapProp(base, prop, configurable, handler) { if (!handler.init(base[prop])) { return false; } - var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - var prevSetter; // This is required to prevent scriptlets overwrite each over - + var prevSetter; + // This is required to prevent scriptlets overwrite each over if (origDescriptor instanceof Object) { // This check is required to avoid defining non-configurable props if (!origDescriptor.configurable) { @@ -3518,14 +3218,11 @@ logMessage(source, message); return false; } - base[prop] = constantValue; - if (origDescriptor.set instanceof Function) { prevSetter = origDescriptor.set; } } - Object.defineProperty(base, prop, { configurable: configurable, get: function get() { @@ -3535,20 +3232,17 @@ if (prevSetter !== undefined) { prevSetter(a); } - handler.set(a); } }); return true; }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; // Handler method init is used to keep track of factual value + chain = chainInfo.chain; // Handler method init is used to keep track of factual value // and apply mustCancel() check only on end prop - var inChainPropHandler = { factValue: undefined, init: function init(a) { @@ -3563,9 +3257,7 @@ if (this.factValue === a) { return; } - this.factValue = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } @@ -3576,7 +3268,6 @@ if (mustCancel(a)) { return false; } - return true; }, get: function get() { @@ -3586,51 +3277,50 @@ if (!mustCancel(a)) { return; } - constantValue = a; } - }; // End prop case + }; + // End prop case if (!chain) { var isTrapped = trapProp(base, prop, false, endPropHandler); - if (isTrapped) { hit(source); } - return; - } // Null prop in chain - + } + // Null prop in chain if (base !== undefined && base[prop] === null) { trapProp(base, prop, true, inChainPropHandler); return; - } // Empty object prop in chain - + } + // Empty object prop in chain if ((base instanceof Object || typeof base === 'object') && isEmptyObject(base)) { trapProp(base, prop, true, inChainPropHandler); - } // Defined prop in chain - + } + // Defined prop in chain var propValue = owner[prop]; - if (propValue instanceof Object || typeof propValue === 'object' && propValue !== null) { setChainPropAccess(propValue, chain); - } // Undefined prop in chain - + } + // Undefined prop in chain trapProp(base, prop, true, inChainPropHandler); }; - setChainPropAccess(window, property); } - setConstant$1.names = ['set-constant', // aliases are needed for matching the related scriptlet converted into our syntax + setConstant$1.names = ['set-constant', + // aliases are needed for matching the related scriptlet converted into our syntax 'set-constant.js', 'ubo-set-constant.js', 'set.js', 'ubo-set.js', 'ubo-set-constant', 'ubo-set', 'abp-override-property-read']; - setConstant$1.injections = [hit, logMessage, noopArray, noopObject, noopFunc, trueFunc, falseFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest]; + setConstant$1.injections = [hit, logMessage, noopArray, noopObject, noopFunc, trueFunc, falseFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, setPropertyAccess, toRegExp, matchStackTrace, nativeIsNaN, isEmptyObject, getNativeRegexpTest, + // following helpers should be imported and injected + // because they are used by helpers above + shouldAbortInlineOrInjectedScript]; /* eslint-disable max-len */ - /** * @scriptlet remove-cookie * @@ -3663,12 +3353,9 @@ * document.cookie = '__example=randomValue'; * ``` */ - /* eslint-enable max-len */ - function removeCookie$1(source, match) { var matchRegexp = toRegExp(match); - var removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) { var cookieSpec = "".concat(cookieName, "="); var domain1 = "; domain=".concat(hostName); @@ -3683,42 +3370,34 @@ document.cookie = cookieSpec + domain2 + path + expiration; hit(source); }; - var rmCookie = function rmCookie() { document.cookie.split(';').forEach(function (cookieStr) { var pos = cookieStr.indexOf('='); - if (pos === -1) { return; } - var cookieName = cookieStr.slice(0, pos).trim(); - if (!matchRegexp.test(cookieName)) { return; } - var hostParts = document.location.hostname.split('.'); - for (var i = 0; i <= hostParts.length - 1; i += 1) { var hostName = hostParts.slice(i).join('.'); - if (hostName) { removeCookieFromHost(cookieName, hostName); } } }); }; - rmCookie(); window.addEventListener('beforeunload', rmCookie); } - removeCookie$1.names = ['remove-cookie', // aliases are needed for matching the related scriptlet converted into our syntax + removeCookie$1.names = ['remove-cookie', + // aliases are needed for matching the related scriptlet converted into our syntax 'cookie-remover.js', 'ubo-cookie-remover.js', 'ubo-cookie-remover']; removeCookie$1.injections = [toRegExp, hit]; /* eslint-disable max-len */ - /** * @scriptlet prevent-addEventListener * @@ -3756,51 +3435,45 @@ * }); * ``` */ - /* eslint-enable max-len */ - function preventAddEventListener$1(source, typeSearch, listenerSearch) { var typeSearchRegexp = toRegExp(typeSearch); var listenerSearchRegexp = toRegExp(listenerSearch); var nativeAddEventListener = window.EventTarget.prototype.addEventListener; - function addEventListenerWrapper(type, listener) { var shouldPrevent = false; - if (validateType(type) && validateListener(listener)) { shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); } - if (shouldPrevent) { hit(source); return undefined; } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); } - var descriptor = { configurable: true, set: function set() {}, get: function get() { return addEventListenerWrapper; } - }; // https://github.com/AdguardTeam/Scriptlets/issues/215 + }; + // https://github.com/AdguardTeam/Scriptlets/issues/215 // https://github.com/AdguardTeam/Scriptlets/issues/143 - Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor); Object.defineProperty(window, 'addEventListener', descriptor); Object.defineProperty(document, 'addEventListener', descriptor); } - preventAddEventListener$1.names = ['prevent-addEventListener', // aliases are needed for matching the related scriptlet converted into our syntax + preventAddEventListener$1.names = ['prevent-addEventListener', + // aliases are needed for matching the related scriptlet converted into our syntax 'addEventListener-defuser.js', 'ubo-addEventListener-defuser.js', 'aeld.js', 'ubo-aeld.js', 'ubo-addEventListener-defuser', 'ubo-aeld']; preventAddEventListener$1.injections = [hit, toRegExp, validateType, validateListener, listenerToString]; /* eslint-disable consistent-return, no-eval */ + /** * @scriptlet prevent-bab * @@ -3818,82 +3491,65 @@ * example.org#%#//scriptlet('prevent-bab') * ``` */ - - function preventBab$1(source) { + function preventBab$2(source) { var nativeSetTimeout = window.setTimeout; var babRegex = /\.bab_elementid.$/; - var timeoutWrapper = function timeoutWrapper(callback) { if (typeof callback !== 'string' || !babRegex.test(callback)) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeSetTimeout.apply(window, [callback].concat(args)); } - hit(source); }; - window.setTimeout = timeoutWrapper; var signatures = [['blockadblock'], ['babasbm'], [/getItem\('babn'\)/], ['getElementById', 'String.fromCharCode', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'charAt', 'DOMContentLoaded', 'AdBlock', 'addEventListener', 'doScroll', 'fromCharCode', '<<2|r>>4', 'sessionStorage', 'clientWidth', 'localStorage', 'Math', 'random']]; - var check = function check(str) { if (typeof str !== 'string') { return false; } - for (var i = 0; i < signatures.length; i += 1) { var tokens = signatures[i]; var match = 0; - for (var j = 0; j < tokens.length; j += 1) { var token = tokens[j]; var found = token instanceof RegExp ? token.test(str) : str.indexOf(token) > -1; - if (found) { match += 1; } } - if (match / tokens.length >= 0.8) { return true; } } - return false; }; - var nativeEval = window.eval; - var evalWrapper = function evalWrapper(str) { if (!check(str)) { return nativeEval(str); } - hit(source); var bodyEl = document.body; - if (bodyEl) { bodyEl.style.removeProperty('visibility'); } - var el = document.getElementById('babasbmsgx'); - if (el) { el.parentNode.removeChild(el); } }; - window.eval = evalWrapper.bind(window); } - preventBab$1.names = ['prevent-bab', // aliases are needed for matching the related scriptlet converted into our syntax + preventBab$2.names = ['prevent-bab', + // aliases are needed for matching the related scriptlet converted into our syntax 'nobab.js', 'ubo-nobab.js', 'bab-defuser.js', 'ubo-bab-defuser.js', 'ubo-nobab', 'ubo-bab-defuser']; - preventBab$1.injections = [hit]; + preventBab$2.injections = [hit]; /* eslint-disable no-unused-vars, no-extra-bind, func-names */ - /* eslint-disable max-len */ + /* eslint-disable max-len */ /** * @scriptlet nowebrtc * @@ -3908,29 +3564,23 @@ * example.org#%#//scriptlet('nowebrtc') * ``` */ - /* eslint-enable max-len */ - function nowebrtc$1(source) { var propertyName = ''; - if (window.RTCPeerConnection) { propertyName = 'RTCPeerConnection'; } else if (window.webkitRTCPeerConnection) { propertyName = 'webkitRTCPeerConnection'; } - if (propertyName === '') { return; } - var rtcReplacement = function rtcReplacement(config) { // eslint-disable-next-line max-len var message = "Document tried to create an RTCPeerConnection: ".concat(convertRtcConfigToString(config)); logMessage(source, message); hit(source); }; - rtcReplacement.prototype = { close: noopFunc, createDataChannel: noopFunc, @@ -3939,7 +3589,6 @@ }; var rtc = window[propertyName]; window[propertyName] = rtcReplacement; - if (rtc.prototype) { rtc.prototype.createDataChannel = function (a, b) { return { @@ -3949,7 +3598,8 @@ }.bind(null); } } - nowebrtc$1.names = ['nowebrtc', // aliases are needed for matching the related scriptlet converted into our syntax + nowebrtc$1.names = ['nowebrtc', + // aliases are needed for matching the related scriptlet converted into our syntax 'nowebrtc.js', 'ubo-nowebrtc.js', 'ubo-nowebrtc']; nowebrtc$1.injections = [hit, noopFunc, logMessage, convertRtcConfigToString]; @@ -3967,47 +3617,43 @@ * example.org#%#//scriptlet('log-addEventListener') * ``` */ - function logAddEventListener$1(source) { var nativeAddEventListener = window.EventTarget.prototype.addEventListener; - function addEventListenerWrapper(type, listener) { if (validateType(type) && validateListener(listener)) { var _message = "addEventListener(\"".concat(type, "\", ").concat(listenerToString(listener), ")"); - logMessage(source, _message, true); hit(source); - } // logging while debugging - + } + // logging while debugging var message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); logMessage(source, message, true); - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); } - var descriptor = { configurable: true, set: function set() {}, get: function get() { return addEventListenerWrapper; } - }; // https://github.com/AdguardTeam/Scriptlets/issues/215 + }; + // https://github.com/AdguardTeam/Scriptlets/issues/215 // https://github.com/AdguardTeam/Scriptlets/issues/143 - Object.defineProperty(window.EventTarget.prototype, 'addEventListener', descriptor); Object.defineProperty(window, 'addEventListener', descriptor); Object.defineProperty(document, 'addEventListener', descriptor); } - logAddEventListener$1.names = ['log-addEventListener', // aliases are needed for matching the related scriptlet converted into our syntax + logAddEventListener$1.names = ['log-addEventListener', + // aliases are needed for matching the related scriptlet converted into our syntax 'addEventListener-logger.js', 'ubo-addEventListener-logger.js', 'aell.js', 'ubo-aell.js', 'ubo-addEventListener-logger', 'ubo-aell']; logAddEventListener$1.injections = [hit, validateType, validateListener, listenerToString, convertTypeToString, logMessage, objectToString, isEmptyObject, getObjectEntries]; /* eslint-disable no-eval */ + /** * @scriptlet log-eval * @@ -4019,32 +3665,26 @@ * example.org#%#//scriptlet('log-eval') * ``` */ - function logEval$1(source) { // wrap eval function var nativeEval = window.eval; - function evalWrapper(str) { hit(source); logMessage(source, "eval(\"".concat(str, "\")"), true); return nativeEval(str); } + window.eval = evalWrapper; - window.eval = evalWrapper; // wrap new Function - + // wrap new Function var nativeFunction = window.Function; - function FunctionWrapper() { hit(source); - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - logMessage(source, "new Function(".concat(args.join(', '), ")"), true); return nativeFunction.apply(this, [].concat(args)); } - FunctionWrapper.prototype = Object.create(nativeFunction.prototype); FunctionWrapper.prototype.constructor = FunctionWrapper; window.Function = FunctionWrapper; @@ -4068,12 +3708,13 @@ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - console.log(args); // eslint-disable-line no-console } + log$1.names = ['log']; /* eslint-disable no-eval, no-extra-bind */ + /** * @scriptlet noeval * @@ -4092,17 +3733,19 @@ * example.org#%#//scriptlet('noeval') * ``` */ - function noeval$1(source) { window.eval = function evalWrapper(s) { - hit(source, "AdGuard has prevented eval:\n".concat(s)); + hit(source); + logMessage(source, "AdGuard has prevented eval:\n".concat(s), true); }.bind(); } - noeval$1.names = ['noeval', // aliases are needed for matching the related scriptlet converted into our syntax + noeval$1.names = ['noeval', + // aliases are needed for matching the related scriptlet converted into our syntax 'noeval.js', 'silent-noeval.js', 'ubo-noeval.js', 'ubo-silent-noeval.js', 'ubo-noeval', 'ubo-silent-noeval']; - noeval$1.injections = [hit]; + noeval$1.injections = [hit, logMessage]; /* eslint-disable no-eval, no-extra-bind, func-names */ + /** * @scriptlet prevent-eval-if * @@ -4127,25 +3770,24 @@ * example.org#%#//scriptlet('prevent-eval-if', 'test') * ``` */ - function preventEvalIf$1(source, search) { var searchRegexp = toRegExp(search); var nativeEval = window.eval; - window.eval = function (payload) { if (!searchRegexp.test(payload.toString())) { return nativeEval.call(window, payload); } - - hit(source, payload); + hit(source); return undefined; }.bind(window); } - preventEvalIf$1.names = ['prevent-eval-if', // aliases are needed for matching the related scriptlet converted into our syntax + preventEvalIf$1.names = ['prevent-eval-if', + // aliases are needed for matching the related scriptlet converted into our syntax 'noeval-if.js', 'ubo-noeval-if.js', 'ubo-noeval-if']; preventEvalIf$1.injections = [toRegExp, hit]; /* eslint-disable func-names, no-multi-assign */ + /** * @scriptlet prevent-fab-3.2.0 * @@ -4160,31 +3802,25 @@ * example.org#%#//scriptlet('prevent-fab-3.2.0') * ``` */ - function preventFab$1(source) { - hit(source); // redefines Fab function for adblock detection + hit(source); + // redefines Fab function for adblock detection var Fab = function Fab() {}; - Fab.prototype.check = noopFunc; Fab.prototype.clearEvent = noopFunc; Fab.prototype.emitEvent = noopFunc; - Fab.prototype.on = function (a, b) { if (!a) { b(); } - return this; }; - Fab.prototype.onDetected = noopThis; - Fab.prototype.onNotDetected = function (a) { a(); return this; }; - Fab.prototype.setOption = noopFunc; Fab.prototype.options = { set: noopFunc, @@ -4202,50 +3838,48 @@ return fab; }, set: function set() {} - }; // redefined Fab data properties which if 'FuckAdBlock' variable exists + }; + // redefined Fab data properties which if 'FuckAdBlock' variable exists if (Object.prototype.hasOwnProperty.call(window, 'FuckAdBlock')) { window.FuckAdBlock = Fab; } else { // or redefined Fab accessor properties Object.defineProperty(window, 'FuckAdBlock', getSetFab); } - if (Object.prototype.hasOwnProperty.call(window, 'BlockAdBlock')) { window.BlockAdBlock = Fab; } else { Object.defineProperty(window, 'BlockAdBlock', getSetFab); } - if (Object.prototype.hasOwnProperty.call(window, 'SniffAdBlock')) { window.SniffAdBlock = Fab; } else { Object.defineProperty(window, 'SniffAdBlock', getSetFab); } - if (Object.prototype.hasOwnProperty.call(window, 'fuckAdBlock')) { window.fuckAdBlock = fab; } else { Object.defineProperty(window, 'fuckAdBlock', getsetfab); } - if (Object.prototype.hasOwnProperty.call(window, 'blockAdBlock')) { window.blockAdBlock = fab; } else { Object.defineProperty(window, 'blockAdBlock', getsetfab); } - if (Object.prototype.hasOwnProperty.call(window, 'sniffAdBlock')) { window.sniffAdBlock = fab; } else { Object.defineProperty(window, 'sniffAdBlock', getsetfab); } } - preventFab$1.names = ['prevent-fab-3.2.0', // aliases are needed for matching the related scriptlet converted into our syntax + preventFab$1.names = ['prevent-fab-3.2.0', + // aliases are needed for matching the related scriptlet converted into our syntax 'nofab.js', 'ubo-nofab.js', 'fuckadblock.js-3.2.0', 'ubo-fuckadblock.js-3.2.0', 'ubo-nofab']; preventFab$1.injections = [hit, noopFunc, noopThis]; /* eslint-disable func-names, no-multi-assign */ + /** * @scriptlet set-popads-dummy * @@ -4260,7 +3894,6 @@ * example.org#%#//scriptlet('set-popads-dummy') * ``` */ - function setPopadsDummy$1(source) { delete window.PopAds; delete window.popns; @@ -4279,7 +3912,8 @@ } }); } - setPopadsDummy$1.names = ['set-popads-dummy', // aliases are needed for matching the related scriptlet converted into our syntax + setPopadsDummy$1.names = ['set-popads-dummy', + // aliases are needed for matching the related scriptlet converted into our syntax 'popads-dummy.js', 'ubo-popads-dummy.js', 'ubo-popads-dummy']; setPopadsDummy$1.injections = [hit]; @@ -4297,14 +3931,11 @@ * example.org#%#//scriptlet('prevent-popads-net') * ``` */ - function preventPopadsNet$1(source) { var rid = randomId(); - var throwError = function throwError() { throw new ReferenceError(rid); }; - delete window.PopAds; delete window.popns; Object.defineProperties(window, { @@ -4318,11 +3949,13 @@ window.onerror = createOnErrorHandler(rid).bind(); hit(source); } - preventPopadsNet$1.names = ['prevent-popads-net', // aliases are needed for matching the related scriptlet converted into our syntax + preventPopadsNet$1.names = ['prevent-popads-net', + // aliases are needed for matching the related scriptlet converted into our syntax 'popads.net.js', 'ubo-popads.net.js', 'ubo-popads.net']; preventPopadsNet$1.injections = [createOnErrorHandler, randomId, hit]; /* eslint-disable func-names */ + /** * @scriptlet prevent-adfly * @@ -4337,16 +3970,13 @@ * example.org#%#//scriptlet('prevent-adfly') * ``` */ - function preventAdfly$1(source) { var isDigit = function isDigit(data) { return /^\d$/.test(data); }; - var handler = function handler(encodedURL) { var evenChars = ''; var oddChars = ''; - for (var i = 0; i < encodedURL.length; i += 1) { if (i % 2 === 0) { evenChars += encodedURL.charAt(i); @@ -4354,56 +3984,45 @@ oddChars = encodedURL.charAt(i) + oddChars; } } - var data = (evenChars + oddChars).split(''); - for (var _i = 0; _i < data.length; _i += 1) { if (isDigit(data[_i])) { for (var ii = _i + 1; ii < data.length; ii += 1) { if (isDigit(data[ii])) { // eslint-disable-next-line no-bitwise var temp = parseInt(data[_i], 10) ^ parseInt(data[ii], 10); - if (temp < 10) { data[_i] = temp.toString(); } - _i = ii; break; } } } } - data = data.join(''); var decodedURL = window.atob(data).slice(16, -16); /* eslint-disable compat/compat */ - if (window.stop) { window.stop(); } /* eslint-enable compat/compat */ - - window.onbeforeunload = null; window.location.href = decodedURL; }; - - var val; // Do not apply handler more than one time - + var val; + // Do not apply handler more than one time var applyHandler = true; var result = setPropertyAccess(window, 'ysmm', { configurable: false, set: function set(value) { if (applyHandler) { applyHandler = false; - try { if (typeof value === 'string') { handler(value); } } catch (err) {} // eslint-disable-line no-empty - } val = value; @@ -4412,19 +4031,18 @@ return val; } }); - if (result) { hit(source); } else { logMessage(source, 'Failed to set up prevent-adfly scriptlet'); } } - preventAdfly$1.names = ['prevent-adfly', // aliases are needed for matching the related scriptlet converted into our syntax + preventAdfly$1.names = ['prevent-adfly', + // aliases are needed for matching the related scriptlet converted into our syntax 'adfly-defuser.js', 'ubo-adfly-defuser.js', 'ubo-adfly-defuser']; preventAdfly$1.injections = [setPropertyAccess, hit, logMessage]; /* eslint-disable max-len */ - /** * @scriptlet debug-on-property-read * @@ -4441,16 +4059,12 @@ * example.org#%#//scriptlet('debug-on-property-read', 'open') * ``` */ - /* eslint-enable max-len */ - function debugOnPropertyRead$1(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); debugger; // eslint-disable-line no-debugger @@ -4460,17 +4074,14 @@ var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -4479,13 +4090,11 @@ }); return; } - setPropertyAccess(base, prop, { get: abort, set: noopFunc }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } @@ -4493,7 +4102,6 @@ debugOnPropertyRead$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, noopFunc, isEmptyObject]; /* eslint-disable max-len */ - /** * @scriptlet debug-on-property-write * @@ -4508,16 +4116,12 @@ * example.org#%#//scriptlet('debug-on-property-write', 'test') * ``` */ - /* eslint-enable max-len */ - function debugOnPropertyWrite$1(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); debugger; // eslint-disable-line no-debugger @@ -4527,17 +4131,14 @@ var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -4546,12 +4147,10 @@ }); return; } - setPropertyAccess(base, prop, { set: abort }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } @@ -4559,7 +4158,6 @@ debugOnPropertyWrite$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isEmptyObject]; /* eslint-disable max-len */ - /** * @scriptlet debug-current-inline-script * @@ -4574,13 +4172,10 @@ * example.org#%#//scriptlet('debug-current-inline-script', 'alert') * ``` */ - /* eslint-enable max-len */ - function debugCurrentInlineScript$1(source, property, search) { var searchRegexp = toRegExp(search); var rid = randomId(); - var getCurrentScript = function getCurrentScript() { if ('currentScript' in document) { return document.currentScript; // eslint-disable-line compat/compat @@ -4589,27 +4184,23 @@ var scripts = document.getElementsByTagName('script'); return scripts[scripts.length - 1]; }; - var ourScript = getCurrentScript(); - var abort = function abort() { var scriptEl = getCurrentScript(); - if (!scriptEl) { return; } + var content = scriptEl.textContent; - var content = scriptEl.textContent; // We are using Node.prototype.textContent property descriptor + // We are using Node.prototype.textContent property descriptor // to get the real script content // even when document.currentScript.textContent is replaced. // https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-593638991 - try { var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent').get; content = textContentGetter.call(scriptEl); } catch (e) {} // eslint-disable-line no-empty - if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { hit(source); debugger; // eslint-disable-line no-debugger @@ -4620,12 +4211,11 @@ var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; // The scriptlet might be executed before the chain property has been created + chain = chainInfo.chain; // The scriptlet might be executed before the chain property has been created // (for instance, document.body before the HTML body was loaded). // In this case we're checking whether the base element exists or not // and if not, we simply exit without overriding anything. // e.g. https://github.com/AdguardTeam/Scriptlets/issues/57#issuecomment-575841092 - if (base instanceof Object === false && base === null) { var props = property.split('.'); var propIndex = props.indexOf(prop); @@ -4634,16 +4224,13 @@ logMessage(message, source.verbose); return; } - if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -4652,7 +4239,6 @@ }); return; } - var currentValue = base[prop]; setPropertyAccess(base, prop, { set: function set(value) { @@ -4665,7 +4251,6 @@ } }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } @@ -4673,7 +4258,6 @@ debugCurrentInlineScript$1.injections = [randomId, setPropertyAccess, getPropertyInChain, toRegExp, createOnErrorHandler, hit, logMessage, isEmptyObject]; /* eslint-disable max-len */ - /** * @scriptlet remove-attr * @@ -4733,31 +4317,23 @@ * example.org#%#//scriptlet('remove-attr', 'example', 'html', 'asap complete') * ``` */ - /* eslint-enable max-len */ - function removeAttr$1(source, attrs, selector) { var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay'; - if (!attrs) { return; } - attrs = attrs.split(/\s*\|\s*/); - if (!selector) { selector = "[".concat(attrs.join('],['), "]"); } - var rmattr = function rmattr() { var nodes = []; - try { nodes = [].slice.call(document.querySelectorAll(selector)); } catch (e) { logMessage(source, "Invalid selector arg: '".concat(selector, "'")); } - var removed = false; nodes.forEach(function (node) { attrs.forEach(function (attr) { @@ -4765,25 +4341,19 @@ removed = true; }); }); - if (removed) { hit(source); } }; - var flags = parseFlags(applying); - var run = function run() { rmattr(); - if (!flags.hasFlag(flags.STAY)) { return; - } // 'true' for observing attributes - - + } + // 'true' for observing attributes observeDOMChanges(rmattr, true); }; - if (flags.hasFlag(flags.ASAP)) { // https://github.com/AdguardTeam/Scriptlets/issues/245 // Call rmattr on DOM content loaded @@ -4796,7 +4366,6 @@ rmattr(); } } - if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) { window.addEventListener('load', run, { once: true @@ -4805,20 +4374,20 @@ // Only call rmattr for single 'stay' flag if (!applying.indexOf(' ') !== -1) { rmattr(); - } // 'true' for observing attributes - - + } + // 'true' for observing attributes observeDOMChanges(rmattr, true); } } - removeAttr$1.names = ['remove-attr', // aliases are needed for matching the related scriptlet converted into our syntax + removeAttr$1.names = ['remove-attr', + // aliases are needed for matching the related scriptlet converted into our syntax 'remove-attr.js', 'ubo-remove-attr.js', 'ra.js', 'ubo-ra.js', 'ubo-remove-attr', 'ubo-ra']; - removeAttr$1.injections = [hit, observeDOMChanges, parseFlags, logMessage, // following helpers should be imported and injected + removeAttr$1.injections = [hit, observeDOMChanges, parseFlags, logMessage, + // following helpers should be imported and injected // because they are used by helpers above throttle]; /* eslint-disable max-len */ - /** * @scriptlet set-attr * @@ -4863,21 +4432,16 @@ * Some text * ``` */ - /* eslint-enable max-len */ - function setAttr$1(source, selector, attr) { var value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - if (!selector || !attr) { return; - } // Drop strings that cant be parsed into number, negative numbers and numbers below 32767 - - + } + // Drop strings that cant be parsed into number, negative numbers and numbers below 32767 if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 0x7FFF)) { return; } - var setAttr = function setAttr() { var nodes = [].slice.call(document.querySelectorAll(selector)); var set = false; @@ -4885,22 +4449,20 @@ node.setAttribute(attr, value); set = true; }); - if (set) { hit(source); } }; - setAttr(); observeDOMChanges(setAttr, true); } setAttr$1.names = ['set-attr']; - setAttr$1.injections = [hit, observeDOMChanges, nativeIsNaN, // following helpers should be imported and injected + setAttr$1.injections = [hit, observeDOMChanges, nativeIsNaN, + // following helpers should be imported and injected // because they are used by helpers above throttle]; /* eslint-disable max-len */ - /** * @scriptlet remove-class * @@ -4964,51 +4526,41 @@ * example.org#%#//scriptlet('remove-class', 'branding', 'div[class^="inner"]', 'asap complete') * ``` */ - /* eslint-enable max-len */ function removeClass$1(source, classNames, selector) { var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'asap stay'; - if (!classNames) { return; } - classNames = classNames.split(/\s*\|\s*/); var selectors = []; - if (!selector) { selectors = classNames.map(function (className) { return ".".concat(className); }); } - var removeClassHandler = function removeClassHandler() { var nodes = new Set(); - if (selector) { var foundNodes = []; - try { foundNodes = [].slice.call(document.querySelectorAll(selector)); } catch (e) { logMessage(source, "Invalid selector arg: '".concat(selector, "'")); } - foundNodes.forEach(function (n) { return nodes.add(n); }); } else if (selectors.length > 0) { selectors.forEach(function (s) { var elements = document.querySelectorAll(s); - for (var i = 0; i < elements.length; i += 1) { var element = elements[i]; nodes.add(element); } }); } - var removed = false; nodes.forEach(function (node) { classNames.forEach(function (className) { @@ -5018,27 +4570,21 @@ } }); }); - if (removed) { hit(source); } }; - var CLASS_ATTR_NAME = ['class']; var flags = parseFlags(applying); - var run = function run() { removeClassHandler(); - if (!flags.hasFlag(flags.STAY)) { return; - } // 'true' for observing attributes + } + // 'true' for observing attributes // 'class' for observing only classes - - observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); }; - if (flags.hasFlag(flags.ASAP)) { // https://github.com/AdguardTeam/Scriptlets/issues/245 // Call removeClassHandler on DOM content loaded @@ -5051,7 +4597,6 @@ removeClassHandler(); } } - if (document.readyState !== 'complete' && flags.hasFlag(flags.COMPLETE)) { window.addEventListener('load', run, { once: true @@ -5061,13 +4606,14 @@ if (!applying.indexOf(' ') !== -1) { removeClassHandler(); } - observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); } } - removeClass$1.names = ['remove-class', // aliases are needed for matching the related scriptlet converted into our syntax + removeClass$1.names = ['remove-class', + // aliases are needed for matching the related scriptlet converted into our syntax 'remove-class.js', 'ubo-remove-class.js', 'rc.js', 'ubo-rc.js', 'ubo-remove-class', 'ubo-rc']; - removeClass$1.injections = [hit, logMessage, observeDOMChanges, parseFlags, // following helpers should be imported and injected + removeClass$1.injections = [hit, logMessage, observeDOMChanges, parseFlags, + // following helpers should be imported and injected // because they are used by helpers above throttle]; @@ -5085,11 +4631,9 @@ * example.org#%#//scriptlet('disable-newtab-links') * ``` */ - function disableNewtabLinks$1(source) { document.addEventListener('click', function (ev) { var target = ev.target; - while (target !== null) { if (target.localName === 'a' && target.hasAttribute('target')) { ev.stopPropagation(); @@ -5097,17 +4641,16 @@ hit(source); break; } - target = target.parentNode; } }); } - disableNewtabLinks$1.names = ['disable-newtab-links', // aliases are needed for matching the related scriptlet converted into our syntax + disableNewtabLinks$1.names = ['disable-newtab-links', + // aliases are needed for matching the related scriptlet converted into our syntax 'disable-newtab-links.js', 'ubo-disable-newtab-links.js', 'ubo-disable-newtab-links']; disableNewtabLinks$1.injections = [hit]; /* eslint-disable max-len */ - /** * @scriptlet adjust-setInterval * @@ -5156,13 +4699,10 @@ * example.org#%#//scriptlet('adjust-setInterval', '', '*', '0.02') * ``` */ - /* eslint-enable max-len */ - function adjustSetInterval$1(source, matchCallback, matchDelay, boost) { var nativeSetInterval = window.setInterval; var matchRegexp = toRegExp(matchCallback); - var intervalWrapper = function intervalWrapper(callback, delay) { // https://github.com/AdguardTeam/Scriptlets/issues/221 if (!isValidCallback(callback)) { @@ -5173,23 +4713,21 @@ delay *= getBoostMultiplier(boost); hit(source); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeSetInterval.apply(window, [callback, delay].concat(args)); }; - window.setInterval = intervalWrapper; } - adjustSetInterval$1.names = ['adjust-setInterval', // aliases are needed for matching the related scriptlet converted into our syntax + adjustSetInterval$1.names = ['adjust-setInterval', + // aliases are needed for matching the related scriptlet converted into our syntax 'nano-setInterval-booster.js', 'ubo-nano-setInterval-booster.js', 'nano-sib.js', 'ubo-nano-sib.js', 'ubo-nano-setInterval-booster', 'ubo-nano-sib']; - adjustSetInterval$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage, // following helpers should be injected as helpers above use them + adjustSetInterval$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage, + // following helpers should be injected as helpers above use them nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay]; /* eslint-disable max-len */ - /** * @scriptlet adjust-setTimeout * @@ -5238,13 +4776,10 @@ * example.org#%#//scriptlet('adjust-setTimeout', 'test', '*') * ``` */ - /* eslint-enable max-len */ - function adjustSetTimeout$1(source, matchCallback, matchDelay, boost) { var nativeSetTimeout = window.setTimeout; var matchRegexp = toRegExp(matchCallback); - var timeoutWrapper = function timeoutWrapper(callback, delay) { // https://github.com/AdguardTeam/Scriptlets/issues/221 if (!isValidCallback(callback)) { @@ -5255,23 +4790,21 @@ delay *= getBoostMultiplier(boost); hit(source); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeSetTimeout.apply(window, [callback, delay].concat(args)); }; - window.setTimeout = timeoutWrapper; } - adjustSetTimeout$1.names = ['adjust-setTimeout', // aliases are needed for matching the related scriptlet converted into our syntax + adjustSetTimeout$1.names = ['adjust-setTimeout', + // aliases are needed for matching the related scriptlet converted into our syntax 'nano-setTimeout-booster.js', 'ubo-nano-setTimeout-booster.js', 'nano-stb.js', 'ubo-nano-stb.js', 'ubo-nano-setTimeout-booster', 'ubo-nano-stb']; - adjustSetTimeout$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage, // following helpers should be injected as helpers above use them + adjustSetTimeout$1.injections = [hit, isValidCallback, toRegExp, getBoostMultiplier, isDelayMatched, logMessage, + // following helpers should be injected as helpers above use them nativeIsNaN, nativeIsFinite, getMatchDelay, shouldMatchAnyDelay]; /* eslint-disable max-len */ - /** * @scriptlet dir-string * @@ -5297,38 +4830,23 @@ * example.org#%#//scriptlet('dir-string', '2') * ``` */ - /* eslint-enable max-len */ - function dirString$1(source, times) { var _console = console, - dir = _console.dir; - times = parseInt(times, 10); - + dir = _console.dir; function dirWrapper(object) { - // eslint-disable-next-line no-unused-vars - var temp; - - for (var i = 0; i < times; i += 1) { - // eslint-disable-next-line no-unused-expressions - temp = "".concat(object); - } - if (typeof dir === 'function') { dir.call(this, object); } - - hit(source, temp); - } // eslint-disable-next-line no-console - - + hit(source); + } + // eslint-disable-next-line no-console console.dir = dirWrapper; } dirString$1.names = ['dir-string', 'abp-dir-string']; dirString$1.injections = [hit]; /* eslint-disable max-len */ - /** * @scriptlet json-prune * @@ -5404,45 +4922,40 @@ * example.org#%#//scriptlet('json-prune', '', '"id":"117458"') * ``` */ - /* eslint-enable max-len */ - function jsonPrune$1(source, propsToRemove, requiredInitialProps, stack) { if (!!stack && !matchStackTrace(stack, new Error().stack)) { return; } - var prunePaths = propsToRemove !== undefined && propsToRemove !== '' ? propsToRemove.split(/ +/) : []; var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== '' ? requiredInitialProps.split(/ +/) : []; - function isPruningNeeded(root) { if (!root) { return false; } + var shouldProcess; - var shouldProcess; // Only log hostname and matched JSON payload if only second argument is present - + // Only log hostname and matched JSON payload if only second argument is present if (prunePaths.length === 0 && requiredPaths.length > 0) { var rootString = JSON.stringify(root); var matchRegex = toRegExp(requiredPaths.join('')); var shouldLog = matchRegex.test(rootString); - if (shouldLog) { - logMessage(source, "".concat(window.location.hostname, " ").concat(root), true); + logMessage(source, "".concat(window.location.hostname, " ").concat(objectToString(root)), true); shouldProcess = false; return shouldProcess; } } - for (var i = 0; i < requiredPaths.length; i += 1) { var requiredPath = requiredPaths[i]; var lastNestedPropName = requiredPath.split('.').pop(); - var hasWildcard = requiredPath.indexOf('.*.') > -1 || requiredPath.indexOf('*.') > -1 || requiredPath.indexOf('.*') > -1 || requiredPath.indexOf('.[].') > -1 || requiredPath.indexOf('[].') > -1 || requiredPath.indexOf('.[]') > -1; // if the path has wildcard, getPropertyInChain should 'look through' chain props + var hasWildcard = requiredPath.indexOf('.*.') > -1 || requiredPath.indexOf('*.') > -1 || requiredPath.indexOf('.*') > -1 || requiredPath.indexOf('.[].') > -1 || requiredPath.indexOf('[].') > -1 || requiredPath.indexOf('.[]') > -1; - var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); // start value of 'shouldProcess' due to checking below + // if the path has wildcard, getPropertyInChain should 'look through' chain props + var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); + // start value of 'shouldProcess' due to checking below shouldProcess = !hasWildcard; - for (var _i = 0; _i < details.length; _i += 1) { if (hasWildcard) { // if there is a wildcard, @@ -5454,28 +4967,25 @@ } } } - return shouldProcess; } + /** * Prunes properties of 'root' object * @param {Object} root */ - - var jsonPruner = function jsonPruner(root) { if (prunePaths.length === 0 && requiredPaths.length === 0) { - logMessage(source, "".concat(window.location.hostname, " ").concat(root), true); + logMessage(source, "".concat(window.location.hostname, " ").concat(objectToString(root)), true); return root; } - try { if (isPruningNeeded(root) === false) { return root; - } // if pruning is needed, we check every input pathToRemove - // and delete it if root has it - + } + // if pruning is needed, we check every input pathToRemove + // and delete it if root has it prunePaths.forEach(function (path) { var ownerObjArr = getWildcardPropertyInChain(root, path, true); ownerObjArr.forEach(function (ownerObj) { @@ -5488,51 +4998,50 @@ } catch (e) { logMessage(source, e); } - return root; }; - var nativeJSONParse = JSON.parse; - var jsonParseWrapper = function jsonParseWrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - // dealing with stringified json in args, which should be parsed. // so we call nativeJSONParse as JSON.parse which is bound to JSON object var root = nativeJSONParse.apply(JSON, args); return jsonPruner(root); - }; // JSON.parse mocking - + }; + // JSON.parse mocking jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse); - JSON.parse = jsonParseWrapper; // eslint-disable-next-line compat/compat - - var nativeResponseJson = Response.prototype.json; // eslint-disable-next-line func-names + JSON.parse = jsonParseWrapper; + // eslint-disable-next-line compat/compat + var nativeResponseJson = Response.prototype.json; + // eslint-disable-next-line func-names var responseJsonWrapper = function responseJsonWrapper() { var promise = nativeResponseJson.apply(this); return promise.then(function (obj) { return jsonPruner(obj); }); - }; // do nothing if browser does not support Response (e.g. Internet Explorer) - // https://developer.mozilla.org/en-US/docs/Web/API/Response - + }; + // do nothing if browser does not support Response (e.g. Internet Explorer) + // https://developer.mozilla.org/en-US/docs/Web/API/Response if (typeof Response === 'undefined') { return; - } // eslint-disable-next-line compat/compat - + } + // eslint-disable-next-line compat/compat Response.prototype.json = responseJsonWrapper; } - jsonPrune$1.names = ['json-prune', // aliases are needed for matching the related scriptlet converted into our syntax + jsonPrune$1.names = ['json-prune', + // aliases are needed for matching the related scriptlet converted into our syntax 'json-prune.js', 'ubo-json-prune.js', 'ubo-json-prune', 'abp-json-prune']; - jsonPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage, toRegExp, getNativeRegexpTest]; + jsonPrune$1.injections = [hit, matchStackTrace, getWildcardPropertyInChain, logMessage, objectToString, + // following helpers are needed for helpers above + toRegExp, isEmptyObject, getObjectEntries, getNativeRegexpTest, shouldAbortInlineOrInjectedScript]; /* eslint-disable max-len */ - /** * @scriptlet prevent-requestAnimationFrame * @@ -5600,49 +5109,43 @@ * }); * ``` */ - /* eslint-enable max-len */ function preventRequestAnimationFrame$1(source, match) { - var nativeRequestAnimationFrame = window.requestAnimationFrame; // logs requestAnimationFrame to console if no arguments have been specified + var nativeRequestAnimationFrame = window.requestAnimationFrame; + // logs requestAnimationFrame to console if no arguments have been specified var shouldLog = typeof match === 'undefined'; - var _parseMatchArg = parseMatchArg(match), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; var rafWrapper = function rafWrapper(callback) { var shouldPrevent = false; - if (shouldLog) { hit(source); logMessage(source, "requestAnimationFrame(".concat(String(callback), ")"), true); } else if (isValidCallback(callback) && isValidStrPattern(match)) { shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch; } - if (shouldPrevent) { hit(source); return nativeRequestAnimationFrame(noopFunc); } - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeRequestAnimationFrame.apply(window, [callback].concat(args)); }; - window.requestAnimationFrame = rafWrapper; } - preventRequestAnimationFrame$1.names = ['prevent-requestAnimationFrame', // aliases are needed for matching the related scriptlet converted into our syntax + preventRequestAnimationFrame$1.names = ['prevent-requestAnimationFrame', + // aliases are needed for matching the related scriptlet converted into our syntax 'no-requestAnimationFrame-if.js', 'ubo-no-requestAnimationFrame-if.js', 'norafif.js', 'ubo-norafif.js', 'ubo-no-requestAnimationFrame-if', 'ubo-norafif']; - preventRequestAnimationFrame$1.injections = [hit, noopFunc, parseMatchArg, isValidStrPattern, isValidCallback, logMessage, // following helpers should be injected as helpers above use them - escapeRegExp, toRegExp, startsWith]; + preventRequestAnimationFrame$1.injections = [hit, noopFunc, parseMatchArg, isValidStrPattern, isValidCallback, logMessage, + // following helpers should be injected as helpers above use them + escapeRegExp, toRegExp, startsWith$1]; /* eslint-disable max-len */ - /** * @scriptlet set-cookie * @@ -5676,29 +5179,22 @@ * example.org#%#//scriptlet('set-cookie', 'cookie_consent', 'ok', 'none') * ``` */ - /* eslint-enable max-len */ - function setCookie$1(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; var validValue = getLimitedCookieValue(value); - if (validValue === null) { logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); return; } - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (!cookieToSet) { return; } - hit(source); document.cookie = cookieToSet; } @@ -5740,36 +5236,29 @@ * example.org#%#//scriptlet('set-cookie-reload', 'cookie-set', 'true', 'none') * ``` */ - function setCookieReload$1(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; - if (isCookieSetWithValue(name, value)) { return; } - var validValue = getLimitedCookieValue(value); - if (validValue === null) { logMessage(source, "Invalid cookie value: '".concat(value, "'")); return; } - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (!cookieToSet) { return; } - document.cookie = cookieToSet; - hit(source); // Only reload the page if cookie was set - // https://github.com/AdguardTeam/Scriptlets/issues/212 + hit(source); + // Only reload the page if cookie was set + // https://github.com/AdguardTeam/Scriptlets/issues/212 if (isCookieSetWithValue(document.cookie, name, value)) { window.location.reload(); } @@ -5804,54 +5293,49 @@ * virustotal.com#%#//scriptlet('hide-in-shadow-dom', 'vt-ui-contact-fab') * ``` */ - function hideInShadowDom$1(source, selector, baseSelector) { // do nothing if browser does not support ShadowRoot // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot if (!Element.prototype.attachShadow) { return; } - var hideElement = function hideElement(targetElement) { var DISPLAY_NONE_CSS = 'display:none!important;'; targetElement.style.cssText = DISPLAY_NONE_CSS; }; + /** * Handles shadow-dom piercing and hiding of found elements */ - - var hideHandler = function hideHandler() { // start value of shadow-dom hosts for the page dom - var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); // if there is shadow-dom host, they should be explored + var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); + // if there is shadow-dom host, they should be explored while (hostElements.length !== 0) { var isHidden = false; - var _pierceShadowDom = pierceShadowDom(selector, hostElements), - targets = _pierceShadowDom.targets, - innerHosts = _pierceShadowDom.innerHosts; - + targets = _pierceShadowDom.targets, + innerHosts = _pierceShadowDom.innerHosts; targets.forEach(function (targetEl) { hideElement(targetEl); isHidden = true; }); - if (isHidden) { hit(source); - } // continue to pierce for inner shadow-dom hosts - // and search inside them while the next iteration - + } + // continue to pierce for inner shadow-dom hosts + // and search inside them while the next iteration hostElements = innerHosts; } }; - hideHandler(); observeDOMChanges(hideHandler, true); } hideInShadowDom$1.names = ['hide-in-shadow-dom']; - hideInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom, // following helpers should be imported and injected + hideInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom, + // following helpers should be imported and injected // because they are used by helpers above flatten, throttle]; @@ -5882,58 +5366,52 @@ * virustotal.com#%#//scriptlet('remove-in-shadow-dom', 'vt-ui-contact-fab') * ``` */ - function removeInShadowDom$1(source, selector, baseSelector) { // do nothing if browser does not support ShadowRoot // https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot if (!Element.prototype.attachShadow) { return; } - var removeElement = function removeElement(targetElement) { targetElement.remove(); }; + /** * Handles shadow-dom piercing and removing of found elements */ - - var removeHandler = function removeHandler() { // start value of shadow-dom hosts for the page dom - var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); // if there is shadow-dom host, they should be explored + var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); + // if there is shadow-dom host, they should be explored while (hostElements.length !== 0) { var isRemoved = false; - var _pierceShadowDom = pierceShadowDom(selector, hostElements), - targets = _pierceShadowDom.targets, - innerHosts = _pierceShadowDom.innerHosts; - + targets = _pierceShadowDom.targets, + innerHosts = _pierceShadowDom.innerHosts; targets.forEach(function (targetEl) { removeElement(targetEl); isRemoved = true; }); - if (isRemoved) { hit(source); - } // continue to pierce for inner shadow-dom hosts - // and search inside them while the next iteration - + } + // continue to pierce for inner shadow-dom hosts + // and search inside them while the next iteration hostElements = innerHosts; } }; - removeHandler(); observeDOMChanges(removeHandler, true); } removeInShadowDom$1.names = ['remove-in-shadow-dom']; - removeInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom, // following helpers should be imported and injected + removeInShadowDom$1.injections = [hit, observeDOMChanges, findHostElements, pierceShadowDom, + // following helpers should be imported and injected // because they are used by helpers above flatten, throttle]; /* eslint-disable max-len */ - /** * @scriptlet prevent-fetch * @@ -5999,68 +5477,63 @@ * ! Specify response body for all fetch calls * example.org#%#//scriptlet('prevent-fetch', '', 'emptyArr') * ``` + * + * 7. Prevent all fetch calls and specify response type value + * ``` + * example.org#%#//scriptlet('prevent-fetch', '*', '', 'opaque') + * ``` */ - /* eslint-enable max-len */ - function preventFetch$1(source, propsToMatch) { var responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'emptyObj'; var responseType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'default'; - // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer) // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { return; } - var strResponseBody; - - if (responseBody === 'emptyObj') { + if (responseBody === '' || responseBody === 'emptyObj') { strResponseBody = '{}'; } else if (responseBody === 'emptyArr') { strResponseBody = '[]'; } else { return; - } // Skip disallowed response types - + } + // Skip disallowed response types if (!(responseType === 'default' || responseType === 'opaque')) { logMessage(source, "Invalid parameter: ".concat(responseType)); return; } - var handlerWrapper = function handlerWrapper(target, thisArg, args) { var shouldPrevent = false; var fetchData = getFetchData(args); - if (typeof propsToMatch === 'undefined') { logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); hit(source); return Reflect.apply(target, thisArg, args); } - shouldPrevent = matchRequestProps(source, propsToMatch, fetchData); - if (shouldPrevent) { hit(source); return noopPromiseResolve(strResponseBody, fetchData.url, responseType); } - return Reflect.apply(target, thisArg, args); }; - var fetchHandler = { apply: handlerWrapper }; fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign } - preventFetch$1.names = ['prevent-fetch', // aliases are needed for matching the related scriptlet converted into our syntax + + preventFetch$1.names = ['prevent-fetch', + // aliases are needed for matching the related scriptlet converted into our syntax 'no-fetch-if.js', 'ubo-no-fetch-if.js', 'ubo-no-fetch-if']; preventFetch$1.injections = [hit, getFetchData, objectToString, noopPromiseResolve, matchRequestProps, logMessage, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; /* eslint-disable max-len */ - /** * @scriptlet set-local-storage-item * @@ -6094,7 +5567,6 @@ * example.org#%#//scriptlet('set-local-storage-item', 'exit-intent-marketing', '1') * ``` */ - /* eslint-enable max-len */ function setLocalStorageItem$1(source, key, value) { @@ -6102,16 +5574,15 @@ logMessage(source, 'Item key should be specified.'); return; } - - var validValue = getLimitedStorageItemValue(source, value); - - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + var validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch (_unused) { + logMessage(source, "Invalid storage item value: '".concat(value, "'")); return; } - var _window = window, - localStorage = _window.localStorage; + localStorage = _window.localStorage; setStorageItem(source, localStorage, key, validValue); hit(source); } @@ -6119,7 +5590,6 @@ setLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, getLimitedStorageItemValue]; /* eslint-disable max-len */ - /** * @scriptlet set-session-storage-item * @@ -6153,7 +5623,6 @@ * example.org#%#//scriptlet('set-session-storage-item', 'exit-intent-marketing', '1') * ``` */ - /* eslint-enable max-len */ function setSessionStorageItem$1(source, key, value) { @@ -6161,23 +5630,22 @@ logMessage(source, 'Item key should be specified.'); return; } - - var validValue = getLimitedStorageItemValue(source, value); - - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + var validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch (_unused) { + logMessage(source, "Invalid storage item value: '".concat(value, "'")); return; } - var _window = window, - sessionStorage = _window.sessionStorage; + sessionStorage = _window.sessionStorage; setStorageItem(source, sessionStorage, key, validValue); + hit(source); } setSessionStorageItem$1.names = ['set-session-storage-item']; setSessionStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, getLimitedStorageItemValue]; /* eslint-disable max-len */ - /** * @scriptlet abort-on-stack-trace * @@ -6217,36 +5685,28 @@ * example.org#%#//scriptlet('abort-on-stack-trace', 'Ya', 'injectedScript') * ``` */ - /* eslint-enable max-len */ - function abortOnStackTrace$1(source, property, stack) { if (!property || !stack) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -6255,27 +5715,24 @@ }); return; } - if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) { logMessage(source, "Invalid parameter: ".concat(stack)); return; - } // Prevent infinite loops when trapping prop used by helpers in getter/setter - + } + // Prevent infinite loops when trapping prop used by helpers in getter/setter var descriptorWrapper = Object.assign(getDescriptorAddon(), { value: base[prop], get: function get() { if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { abort(); } - return this.value; }, set: function set(newValue) { if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { abort(); } - this.value = newValue; } }); @@ -6289,16 +5746,15 @@ } }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - abortOnStackTrace$1.names = ['abort-on-stack-trace', // aliases are needed for matching the related scriptlet converted into our syntax + abortOnStackTrace$1.names = ['abort-on-stack-trace', + // aliases are needed for matching the related scriptlet converted into our syntax 'abort-on-stack-trace.js', 'ubo-abort-on-stack-trace.js', 'aost.js', 'ubo-aost.js', 'ubo-abort-on-stack-trace', 'ubo-aost', 'abp-abort-on-stack-trace']; - abortOnStackTrace$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isValidStrPattern, escapeRegExp, matchStackTrace, getDescriptorAddon, logMessage, toRegExp, isEmptyObject, getNativeRegexpTest, startsWith, shouldAbortInlineOrInjectedScript$1]; + abortOnStackTrace$1.injections = [randomId, setPropertyAccess, getPropertyInChain, createOnErrorHandler, hit, isValidStrPattern, escapeRegExp, matchStackTrace, getDescriptorAddon, logMessage, toRegExp, isEmptyObject, getNativeRegexpTest, startsWith$1, shouldAbortInlineOrInjectedScript]; /* eslint-disable max-len */ - /** * @scriptlet log-on-stack-trace * @@ -6315,48 +5771,40 @@ * * - `property` - required, path to a property. The property must be attached to window. */ - /* eslint-enable max-len */ - function logOnStacktrace$1(source, property) { if (!property) { return; } - var refineStackTrace = function refineStackTrace(stackString) { // Split stack trace string by lines and remove first two elements ('Error' and getter call) // Remove ' at ' at the start of each string var stackSteps = stackString.split('\n').slice(2).map(function (line) { return line.replace(/ {4}at /, ''); - }); // Trim each line extracting funcName : fullPath pair - + }); + // Trim each line extracting funcName : fullPath pair var logInfoArray = stackSteps.map(function (line) { var funcName; var funcFullPath; /* eslint-disable-next-line no-useless-escape */ - var reg = /\(([^\)]+)\)/; var regFirefox = /(.*?@)(\S+)(:\d+):\d+\)?$/; - if (line.match(reg)) { funcName = line.split(' ').slice(0, -1).join(' '); /* eslint-disable-next-line prefer-destructuring */ - funcFullPath = line.match(reg)[1]; } else if (line.match(regFirefox)) { funcName = line.split('@').slice(0, -1).join(' '); /* eslint-disable-next-line prefer-destructuring */ - funcFullPath = line.match(regFirefox)[2]; } else { // For when func name is not available funcName = 'function name is not available'; funcFullPath = line; } - return [funcName, funcFullPath]; - }); // Convert array into object for better display using console.table - + }); + // Convert array into object for better display using console.table var logInfoObject = {}; logInfoArray.forEach(function (pair) { /* eslint-disable-next-line prefer-destructuring */ @@ -6364,22 +5812,18 @@ }); return logInfoObject; }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -6388,10 +5832,8 @@ }); return; } - var value = base[prop]; /* eslint-disable no-console, compat/compat */ - setPropertyAccess(base, prop, { get: function get() { hit(source); @@ -6415,7 +5857,6 @@ logOnStacktrace$1.injections = [getPropertyInChain, setPropertyAccess, hit, logMessage, isEmptyObject]; /* eslint-disable max-len */ - /** * @scriptlet prevent-xhr * @@ -6481,21 +5922,17 @@ * example.org#%#//scriptlet('prevent-xhr', 'example.org', 'length:100-300') * ``` */ - /* eslint-enable max-len */ - function preventXHR$1(source, propsToMatch, customResponseText) { // do nothing if browser does not support Proxy (e.g. Internet Explorer) // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy if (typeof Proxy === 'undefined') { return; } - var shouldPrevent = false; var response = ''; var responseText = ''; var responseUrl; - var openWrapper = function openWrapper(target, thisArg, args) { // Get method and url from .open() var xhrData = { @@ -6503,7 +5940,6 @@ url: args[1] }; responseUrl = xhrData.url; - if (typeof propsToMatch === 'undefined') { // Log if no propsToMatch given logMessage(source, "xhr( ".concat(objectToString(xhrData), " )"), true); @@ -6511,34 +5947,27 @@ } else { shouldPrevent = matchRequestProps(source, propsToMatch, xhrData); } - return Reflect.apply(target, thisArg, args); }; - var sendWrapper = function sendWrapper(target, thisArg, args) { if (!shouldPrevent) { return Reflect.apply(target, thisArg, args); } - if (thisArg.responseType === 'blob') { response = new Blob(); } - if (thisArg.responseType === 'arraybuffer') { response = new ArrayBuffer(); } - if (customResponseText) { var randomText = generateRandomResponse(customResponseText); - if (randomText) { responseText = randomText; } else { logMessage(source, "Invalid range: ".concat(customResponseText)); } - } // Mock response object - - + } + // Mock response object Object.defineProperties(thisArg, { readyState: { value: 4, @@ -6568,8 +5997,8 @@ value: 'OK', writable: false } - }); // Mock events - + }); + // Mock events setTimeout(function () { var stateEvent = new Event('readystatechange'); thisArg.dispatchEvent(stateEvent); @@ -6581,7 +6010,6 @@ hit(source); return undefined; }; - var openHandler = { apply: openWrapper }; @@ -6591,7 +6019,8 @@ XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); } - preventXHR$1.names = ['prevent-xhr', // aliases are needed for matching the related scriptlet converted into our syntax + preventXHR$1.names = ['prevent-xhr', + // aliases are needed for matching the related scriptlet converted into our syntax 'no-xhr-if.js', 'ubo-no-xhr-if.js', 'ubo-no-xhr-if']; preventXHR$1.injections = [hit, logMessage, objectToString, matchRequestProps, generateRandomResponse, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries, getNumberFromString, nativeIsFinite, nativeIsNaN, parseMatchProps, validateParsedData, getMatchPropsData, getRequestProps, getRandomIntInclusive, getRandomStrByLength]; @@ -6602,7 +6031,7 @@ * Closes the browser tab immediately. * * > `window.close()` usage is restricted in Chrome. In this case - * tab will only be closed if using AdGuard browser extension. + * tab will only be closed when using AdGuard browser extension. * * **Syntax** * ``` @@ -6622,16 +6051,14 @@ * example.org#%#//scriptlet('close-window', '/example-page.html') * ``` */ - function forceWindowClose$1(source) { var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - // https://github.com/AdguardTeam/Scriptlets/issues/158#issuecomment-993423036 if (typeof window.close !== 'function') { var message = 'window.close() is not a function so \'close-window\' scriptlet is unavailable'; logMessage(source, message); + return; } - var closeImmediately = function closeImmediately() { try { hit(source); @@ -6642,12 +6069,10 @@ logMessage(source, e); } }; - var closeByExtension = function closeByExtension() { var extCall = function extCall() { dispatchEvent(new Event('adguard:scriptlet-close-window')); }; - window.addEventListener('adguard:subscribed-to-close-window', extCall, { once: true }); @@ -6657,20 +6082,16 @@ }); }, 5000); }; - var shouldClose = function shouldClose() { if (path === '') { return true; } - var pathRegexp = toRegExp(path); var currentPath = "".concat(window.location.pathname).concat(window.location.search); return pathRegexp.test(currentPath); }; - if (shouldClose()) { closeImmediately(); - if (navigator.userAgent.indexOf('Chrome') > -1) { closeByExtension(); } @@ -6680,7 +6101,6 @@ forceWindowClose$1.injections = [hit, toRegExp, logMessage]; /* eslint-disable max-len */ - /** * @scriptlet prevent-refresh * @@ -6708,13 +6128,10 @@ * cryptodirectories.com#%#//scriptlet('prevent-refresh', 3) * ``` */ - /* eslint-enable max-len */ - function preventRefresh$1(source, delaySec) { var getMetaElements = function getMetaElements() { var metaNodes = []; - try { metaNodes = document.querySelectorAll('meta[http-equiv="refresh" i][content]'); } catch (e) { @@ -6725,72 +6142,59 @@ logMessage(source, e); } } - return Array.from(metaNodes); }; - var getMetaContentDelay = function getMetaContentDelay(metaElements) { var delays = metaElements.map(function (meta) { var contentString = meta.getAttribute('content'); - if (contentString.length === 0) { return null; } - - var contentDelay; // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-http-equiv - + var contentDelay; + // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-http-equiv var limiterIndex = contentString.indexOf(';'); - if (limiterIndex !== -1) { var delaySubstring = contentString.substring(0, limiterIndex); contentDelay = getNumberFromString(delaySubstring); } else { contentDelay = getNumberFromString(contentString); } - return contentDelay; }).filter(function (delay) { return delay !== null; - }); // Check if "delays" array is empty, may happens when meta's content is invalid + }); + // Check if "delays" array is empty, may happens when meta's content is invalid // and reduce() method cannot be used with empty arrays without initial value - if (!delays.length) { return null; - } // Get smallest delay of all metas on the page - - + } + // Get smallest delay of all metas on the page var minDelay = delays.reduce(function (a, b) { return Math.min(a, b); - }); // eslint-disable-next-line consistent-return - + }); + // eslint-disable-next-line consistent-return return minDelay; }; - var stop = function stop() { var metaElements = getMetaElements(); - if (metaElements.length === 0) { return; } - - var secondsToRun = getNumberFromString(delaySec); // Check if argument is provided - + var secondsToRun = getNumberFromString(delaySec); + // Check if argument is provided if (secondsToRun === null) { secondsToRun = getMetaContentDelay(metaElements); - } // Check if meta tag has delay - - + } + // Check if meta tag has delay if (secondsToRun === null) { return; } - var delayMs = secondsToRun * 1000; setTimeout(function () { window.stop(); hit(source); }, delayMs); }; - if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', stop, { once: true @@ -6799,15 +6203,16 @@ stop(); } } - preventRefresh$1.names = ['prevent-refresh', // Aliases are needed for matching the related scriptlet converted into our syntax + preventRefresh$1.names = ['prevent-refresh', + // Aliases are needed for matching the related scriptlet converted into our syntax // These are used by UBO rules syntax // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets - 'refresh-defuser.js', 'refresh-defuser', // Prefix 'ubo-' is required to run converted rules + 'refresh-defuser.js', 'refresh-defuser', + // Prefix 'ubo-' is required to run converted rules 'ubo-refresh-defuser.js', 'ubo-refresh-defuser']; preventRefresh$1.injections = [hit, getNumberFromString, logMessage, nativeIsNaN]; /* eslint-disable max-len, consistent-return */ - /** * @scriptlet prevent-element-src-loading * @@ -6831,15 +6236,12 @@ * example.org#%#//scriptlet('prevent-element-src-loading', 'script' ,'adsbygoogle') * ``` */ - /* eslint-enable max-len */ - function preventElementSrcLoading$1(source, tagName, match) { // do nothing if browser does not support Proxy or Reflect if (typeof Proxy === 'undefined' || typeof Reflect === 'undefined') { return; } - var srcMockData = { // "KCk9Pnt9" = "()=>{}" script: 'data:text/javascript;base64,KCk9Pnt9', @@ -6849,7 +6251,6 @@ iframe: 'data:text/html;base64, PGRpdj48L2Rpdj4=' }; var instance; - if (tagName === 'script') { instance = HTMLScriptElement; } else if (tagName === 'img') { @@ -6858,13 +6259,12 @@ instance = HTMLIFrameElement; } else { return; - } // For websites that use Trusted Types - // https://w3c.github.io/webappsec-trusted-types/dist/spec/ - + } + // For websites that use Trusted Types + // https://w3c.github.io/webappsec-trusted-types/dist/spec/ var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function'; var policy; - if (hasTrustedTypes) { policy = window.trustedTypes.createPolicy('mock', { createScriptURL: function createScriptURL(arg) { @@ -6872,48 +6272,41 @@ } }); } - var SOURCE_PROPERTY_NAME = 'src'; var ONERROR_PROPERTY_NAME = 'onerror'; - var searchRegexp = toRegExp(match); // This will be needed to silent error events on matched element, - // as url wont be available + var searchRegexp = toRegExp(match); + // This will be needed to silent error events on matched element, + // as url wont be available var setMatchedAttribute = function setMatchedAttribute(elem) { return elem.setAttribute(source.name, 'matched'); }; - var setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) { // Check if arguments are present if (!args[0] || !args[1]) { return Reflect.apply(target, thisArg, args); } - var nodeName = thisArg.nodeName.toLowerCase(); var attrName = args[0].toLowerCase(); var attrValue = args[1]; var isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue); - if (!isMatched) { return Reflect.apply(target, thisArg, args); } - hit(source); - setMatchedAttribute(thisArg); // Forward the URI that corresponds with element's MIME type - + setMatchedAttribute(thisArg); + // Forward the URI that corresponds with element's MIME type return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]); }; - var setAttributeHandler = { apply: setAttributeWrapper - }; // eslint-disable-next-line max-len - + }; + // eslint-disable-next-line max-len instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler); var origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME); - if (!origSrcDescriptor) { return; } - Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, { enumerable: true, configurable: true, @@ -6923,33 +6316,30 @@ set: function set(urlValue) { var nodeName = this.nodeName.toLowerCase(); var isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue); - if (!isMatched) { origSrcDescriptor.set.call(this, urlValue); return true; - } // eslint-disable-next-line no-undef - + } + // eslint-disable-next-line no-undef if (policy && urlValue instanceof TrustedScriptURL) { var trustedSrc = policy.createScriptURL(urlValue); origSrcDescriptor.set.call(this, trustedSrc); hit(source); return; } - setMatchedAttribute(this); origSrcDescriptor.set.call(this, srcMockData[nodeName]); hit(source); } - }); // https://github.com/AdguardTeam/Scriptlets/issues/228 - // Prevent error event being triggered by other sources + }); + // https://github.com/AdguardTeam/Scriptlets/issues/228 + // Prevent error event being triggered by other sources var origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME); - if (!origOnerrorDescriptor) { return; } - Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, { enumerable: true, configurable: true, @@ -6958,37 +6348,30 @@ }, set: function set(cb) { var isMatched = this.getAttribute(source.name) === 'matched'; - if (!isMatched) { origOnerrorDescriptor.set.call(this, cb); return true; } - origOnerrorDescriptor.set.call(this, noopFunc); return true; } }); - var addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) { // Check if arguments are present if (!args[0] || !args[1]) { return Reflect.apply(target, thisArg, args); } - var eventName = args[0]; var isMatched = thisArg.getAttribute(source.name) === 'matched' && eventName === 'error'; - if (isMatched) { return Reflect.apply(target, thisArg, [eventName, noopFunc]); } - return Reflect.apply(target, thisArg, args); }; - var addEventListenerHandler = { apply: addEventListenerWrapper - }; // eslint-disable-next-line max-len - + }; + // eslint-disable-next-line max-len EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler); } preventElementSrcLoading$1.names = ['prevent-element-src-loading']; @@ -7006,31 +6389,26 @@ * example.org#%#//scriptlet('no-topics') * ``` */ - function noTopics$1(source) { var TOPICS_PROPERTY_NAME = 'browsingTopics'; - if (Document instanceof Object === false) { return; } - if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) { return; - } // document.browsingTopics() is async function so it's better to return noopPromiseResolve() - // https://github.com/patcg-individual-drafts/topics#the-api-and-how-it-works - + } + // document.browsingTopics() is async function so it's better to return noopPromiseResolve() + // https://github.com/patcg-individual-drafts/topics#the-api-and-how-it-works Document.prototype[TOPICS_PROPERTY_NAME] = function () { return noopPromiseResolve('[]'); }; - hit(source); } noTopics$1.names = ['no-topics']; noTopics$1.injections = [hit, noopPromiseResolve]; /* eslint-disable max-len */ - /** * @trustedScriptlet trusted-replace-xhr-response * @@ -7083,102 +6461,89 @@ * example.org#%#//scriptlet('trusted-replace-xhr-response', '*', '', 'example.com') * ``` */ - /* eslint-enable max-len */ - function trustedReplaceXhrResponse$1(source) { var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - // do nothing if browser does not support Proxy (e.g. Internet Explorer) // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy if (typeof Proxy === 'undefined') { return; - } // Only allow pattern as empty string for logging purposes - + } + // Only allow pattern as empty string for logging purposes if (pattern === '' && replacement !== '') { var message = 'Pattern argument should not be empty string.'; logMessage(source, message); return; } - var shouldLog = pattern === '' && replacement === ''; var nativeOpen = window.XMLHttpRequest.prototype.open; var nativeSend = window.XMLHttpRequest.prototype.send; var shouldReplace = false; var xhrData; var requestHeaders = []; - var openWrapper = function openWrapper(target, thisArg, args) { // eslint-disable-next-line prefer-spread xhrData = getXhrData.apply(null, args); - if (shouldLog) { // Log if no propsToMatch given var _message = "xhr( ".concat(objectToString(xhrData), " )"); - logMessage(source, _message, true); hit(source); return Reflect.apply(target, thisArg, args); } + shouldReplace = matchRequestProps(source, propsToMatch, xhrData); - shouldReplace = matchRequestProps(source, propsToMatch, xhrData); // Trap setRequestHeader of target xhr object to mimic request headers later - + // Trap setRequestHeader of target xhr object to mimic request headers later if (shouldReplace) { var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { // Collect headers requestHeaders.push(args); return Reflect.apply(target, thisArg, args); }; - var setRequestHeaderHandler = { apply: setRequestHeaderWrapper - }; // setRequestHeader can only be called on open xhr object, - // so we can safely proxy it here + }; + // setRequestHeader can only be called on open xhr object, + // so we can safely proxy it here thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); } - return Reflect.apply(target, thisArg, args); }; - var sendWrapper = function sendWrapper(target, thisArg, args) { if (!shouldReplace) { return Reflect.apply(target, thisArg, args); } + /** * Create separate XHR request with original request's input * to be able to collect response data without triggering * listeners on original XHR object */ - - var forgedRequest = new XMLHttpRequest(); forgedRequest.addEventListener('readystatechange', function () { if (forgedRequest.readyState !== 4) { return; } - var readyState = forgedRequest.readyState, - response = forgedRequest.response, - responseText = forgedRequest.responseText, - responseURL = forgedRequest.responseURL, - responseXML = forgedRequest.responseXML, - status = forgedRequest.status, - statusText = forgedRequest.statusText; // Extract content from response - + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; // Extract content from response var content = responseText || response; - if (typeof content !== 'string') { return; } + var patternRegexp = pattern === '*' ? /(\n|.)*/ : toRegExp(pattern); + var modifiedContent = content.replace(patternRegexp, replacement); - var patternRegexp = pattern === '*' ? toRegExp() : toRegExp(pattern); - var modifiedContent = content.replace(patternRegexp, replacement); // Manually put required values into target XHR object + // Manually put required values into target XHR object // as thisArg can't be redefined and XHR objects can't be (re)assigned or copied - Object.defineProperties(thisArg, { readyState: { value: readyState @@ -7201,8 +6566,9 @@ statusText: { value: statusText } - }); // Mock events + }); + // Mock events setTimeout(function () { var stateEvent = new Event('readystatechange'); thisArg.dispatchEvent(stateEvent); @@ -7213,25 +6579,23 @@ }, 1); hit(source); }); - nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); // Mimic request headers before sending - // setRequestHeader can only be called on open request objects + nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]); + // Mimic request headers before sending + // setRequestHeader can only be called on open request objects requestHeaders.forEach(function (header) { var name = header[0]; var value = header[1]; forgedRequest.setRequestHeader(name, value); }); requestHeaders = []; - try { nativeSend.call(forgedRequest, args); } catch (_unused) { return Reflect.apply(target, thisArg, args); } - return undefined; }; - var openHandler = { apply: openWrapper }; @@ -7241,12 +6605,13 @@ XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); } - trustedReplaceXhrResponse$1.names = ['trusted-replace-xhr-response' // trusted scriptlets support no aliases + trustedReplaceXhrResponse$1.names = ['trusted-replace-xhr-response' + // trusted scriptlets support no aliases ]; + trustedReplaceXhrResponse$1.injections = [hit, logMessage, toRegExp, objectToString, matchRequestProps, getXhrData, getMatchPropsData, getRequestProps, validateParsedData, parseMatchProps, isValidStrPattern, escapeRegExp, isEmptyObject, getObjectEntries]; /* eslint-disable max-len */ - /** * @scriptlet xml-prune * @@ -7291,15 +6656,12 @@ * example.org#%#//scriptlet('xml-prune', '', '', '.mpd') * ``` */ - /* eslint-enable max-len */ function xmlPrune$1(source, propsToRemove) { var _this = this; - var optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var urlToMatch = arguments.length > 3 ? arguments[3] : undefined; - // do nothing if browser does not support Reflect, fetch or Proxy (e.g. Internet Explorer) // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy @@ -7307,55 +6669,42 @@ if (typeof Reflect === 'undefined' || typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { return; } - var shouldPruneResponse = true; - if (!propsToRemove) { // If "propsToRemove" is not defined, then response shouldn't be pruned // but it should be logged in browser console shouldPruneResponse = false; } - var urlMatchRegexp = toRegExp(urlToMatch); - var isXML = function isXML(text) { // Check if "text" starts with "<" and check if it ends with ">" // If so, then it might be an XML file and should be pruned or logged var trimedText = text.trim(); - - if (startsWith(trimedText, '<') && endsWith(trimedText, '>')) { + if (startsWith$1(trimedText, '<') && endsWith(trimedText, '>')) { return true; } - return false; }; - var pruneXML = function pruneXML(text) { if (!isXML(text)) { shouldPruneResponse = false; return text; } - var xmlParser = new DOMParser(); var xmlDoc = xmlParser.parseFromString(text, 'text/xml'); var errorNode = xmlDoc.querySelector('parsererror'); - if (errorNode) { return text; } - if (optionalProp !== '' && xmlDoc.querySelector(optionalProp) === null) { shouldPruneResponse = false; return text; } - var elems = xmlDoc.querySelectorAll(propsToRemove); - if (!elems.length) { shouldPruneResponse = false; return text; } - elems.forEach(function (elem) { elem.remove(); }); @@ -7363,20 +6712,16 @@ text = serializer.serializeToString(xmlDoc); return text; }; - var xhrWrapper = function xhrWrapper(target, thisArg, args) { var xhrURL = args[1]; - if (typeof xhrURL !== 'string' || xhrURL.length === 0) { return Reflect.apply(target, thisArg, args); } - if (urlMatchRegexp.test(xhrURL)) { thisArg.addEventListener('readystatechange', function pruneResponse() { if (thisArg.readyState === 4) { var response = thisArg.response; thisArg.removeEventListener('readystatechange', pruneResponse); - if (!shouldPruneResponse) { if (isXML(response)) { // eslint-disable-next-line max-len @@ -7385,7 +6730,6 @@ } } else { var prunedResponseContent = pruneXML(response); - if (shouldPruneResponse) { Object.defineProperty(thisArg, 'response', { value: prunedResponseContent @@ -7394,36 +6738,31 @@ value: prunedResponseContent }); hit(source); - } // In case if response shouldn't be pruned + } + // In case if response shouldn't be pruned // pruneXML sets shouldPruneResponse to false // so it's necessary to set it to true again // otherwise response will be only logged - - shouldPruneResponse = true; } } }); } - return Reflect.apply(target, thisArg, args); }; - var xhrHandler = { apply: xhrWrapper - }; // eslint-disable-next-line max-len - - window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); // eslint-disable-next-line compat/compat + }; + // eslint-disable-next-line max-len + window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); + // eslint-disable-next-line compat/compat var nativeFetch = window.fetch; - var fetchWrapper = function fetchWrapper(target, thisArg, args) { var fetchURL = args[0]; - if (typeof fetchURL !== 'string' || fetchURL.length === 0) { return Reflect.apply(target, thisArg, args); } - if (urlMatchRegexp.test(fetchURL)) { return nativeFetch.apply(_this, args).then(function (response) { return response.text().then(function (text) { @@ -7431,12 +6770,9 @@ if (isXML(text)) { logMessage("fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(text)); } - return Reflect.apply(target, thisArg, args); } - var prunedText = pruneXML(text); - if (shouldPruneResponse) { hit(source); return new Response(prunedText, { @@ -7444,33 +6780,30 @@ statusText: response.statusText, headers: response.headers }); - } // If response shouldn't be pruned + } + // If response shouldn't be pruned // pruneXML sets shouldPruneResponse to false // so it's necessary to set it to true again // otherwise response will be only logged - - shouldPruneResponse = true; return Reflect.apply(target, thisArg, args); }); }); } - return Reflect.apply(target, thisArg, args); }; - var fetchHandler = { apply: fetchWrapper - }; // eslint-disable-next-line compat/compat - + }; + // eslint-disable-next-line compat/compat window.fetch = new Proxy(window.fetch, fetchHandler); } - xmlPrune$1.names = ['xml-prune', // aliases are needed for matching the related scriptlet converted into our syntax + xmlPrune$1.names = ['xml-prune', + // aliases are needed for matching the related scriptlet converted into our syntax 'xml-prune.js', 'ubo-xml-prune.js', 'ubo-xml-prune']; - xmlPrune$1.injections = [hit, logMessage, toRegExp, startsWith, endsWith]; + xmlPrune$1.injections = [hit, logMessage, toRegExp, startsWith$1, endsWith]; /* eslint-disable max-len */ - /** * @trustedScriptlet trusted-set-cookie * @@ -7525,54 +6858,47 @@ * example.org#%#//scriptlet('trusted-set-cookie', 'cmpconsent', 'decline', '', 'none') * ``` */ - /* eslint-enable max-len */ function trustedSetCookie$1(source, name, value) { var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; - if (typeof name === 'undefined') { logMessage(source, 'Cookie name should be specified.'); return; } - if (typeof value === 'undefined') { logMessage(source, 'Cookie value should be specified.'); return; } - var parsedValue = parseKeywordValue(value); - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (!cookieToSet) { return; } - - var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); - - if (!parsedOffsetMs) { - logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); - return; + if (offsetExpiresSec) { + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); } - - var expires = Date.now() + parsedOffsetMs; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); document.cookie = cookieToSet; hit(source); } - trustedSetCookie$1.names = ['trusted-set-cookie' // trusted scriptlets support no aliases + trustedSetCookie$1.names = ['trusted-set-cookie' + // trusted scriptlets support no aliases ]; + trustedSetCookie$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; /* eslint-disable max-len */ - /** * @trustedScriptlet trusted-set-cookie-reload * @@ -7628,112 +6954,59 @@ * example.org#%#//scriptlet('trusted-set-cookie-reload', 'cmpconsent', 'decline', '', 'none') * ``` */ - /* eslint-enable max-len */ function trustedSetCookieReload$1(source, name, value) { var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '/'; - if (typeof name === 'undefined') { logMessage(source, 'Cookie name should be specified.'); return; } - if (typeof value === 'undefined') { logMessage(source, 'Cookie value should be specified.'); return; - } // Prevent infinite reloads if cookie was already set or blocked by the browser - // https://github.com/AdguardTeam/Scriptlets/issues/212 - + } + // Prevent infinite reloads if cookie was already set or blocked by the browser + // https://github.com/AdguardTeam/Scriptlets/issues/212 if (isCookieSetWithValue(document.cookie, name, value)) { return; } - var parsedValue = parseKeywordValue(value); - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (!cookieToSet) { return; } - - var parsedOffsetExpiresMs = getTrustedCookieOffsetMs(offsetExpiresSec); - - if (!parsedOffsetExpiresMs) { - logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); - return; + if (offsetExpiresSec) { + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); } - - var expires = Date.now() + parsedOffsetExpiresMs; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); document.cookie = cookieToSet; - hit(source); // Only reload the page if cookie was set - // https://github.com/AdguardTeam/Scriptlets/issues/212 + hit(source); + // Only reload the page if cookie was set + // https://github.com/AdguardTeam/Scriptlets/issues/212 if (isCookieSetWithValue(document.cookie, name, value)) { window.location.reload(); } } - trustedSetCookieReload$1.names = ['trusted-set-cookie-reload' // trusted scriptlets support no aliases + trustedSetCookieReload$1.names = ['trusted-set-cookie-reload' + // trusted scriptlets support no aliases ]; - trustedSetCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; - } - - var arrayLikeToArray = _arrayLikeToArray; - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return arrayLikeToArray(arr); - } - - var arrayWithoutHoles = _arrayWithoutHoles; - - function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); - } - - var iterableToArray = _iterableToArray; - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); - } - - var unsupportedIterableToArray = _unsupportedIterableToArray; - - function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - var nonIterableSpread = _nonIterableSpread; - - function _toConsumableArray(arr) { - return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread(); - } - - var toConsumableArray$1 = _toConsumableArray; + trustedSetCookieReload$1.injections = [hit, logMessage, nativeIsNaN, isCookieSetWithValue, concatCookieNameValuePath, isValidCookiePath, getTrustedCookieOffsetMs, parseKeywordValue, getCookiePath]; /* eslint-disable max-len */ - /** * @trustedScriptlet trusted-replace-fetch-response * @@ -7789,47 +7062,40 @@ * example.org#%#//scriptlet('trusted-replace-fetch-response', '*', '', 'example.com') * ``` */ - /* eslint-enable max-len */ - function trustedReplaceFetchResponse$1(source) { var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - // do nothing if browser does not support fetch or Proxy (e.g. Internet Explorer) // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy if (typeof fetch === 'undefined' || typeof Proxy === 'undefined' || typeof Response === 'undefined') { return; - } // Only allow pattern as empty string for logging purposes - + } + // Only allow pattern as empty string for logging purposes if (pattern === '' && replacement !== '') { logMessage(source, 'Pattern argument should not be empty string.'); return; } - var shouldLog = pattern === '' && replacement === ''; var nativeFetch = fetch; var shouldReplace = false; var fetchData; - var handlerWrapper = function handlerWrapper(target, thisArg, args) { fetchData = getFetchData(args); - if (shouldLog) { // log if no propsToMatch given logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); hit(source); return Reflect.apply(target, thisArg, args); } - shouldReplace = matchRequestProps(source, propsToMatch, fetchData); - if (!shouldReplace) { return Reflect.apply(target, thisArg, args); } + /** * Create new Response object using original response' properties * and given text as body content @@ -7837,24 +7103,22 @@ * @param {string} textContent text to set as body content * @returns {Response} */ - - var forgeResponse = function forgeResponse(response, textContent) { var bodyUsed = response.bodyUsed, - headers = response.headers, - ok = response.ok, - redirected = response.redirected, - status = response.status, - statusText = response.statusText, - type = response.type, - url = response.url; // eslint-disable-next-line compat/compat - + headers = response.headers, + ok = response.ok, + redirected = response.redirected, + status = response.status, + statusText = response.statusText, + type = response.type, + url = response.url; // eslint-disable-next-line compat/compat var forgedResponse = new Response(textContent, { status: status, statusText: statusText, headers: headers - }); // Manually set properties which can't be set by Response constructor + }); + // Manually set properties which can't be set by Response constructor Object.defineProperties(forgedResponse, { url: { value: url @@ -7875,9 +7139,10 @@ return forgedResponse; }; - return nativeFetch.apply(void 0, toConsumableArray$1(args)).then(function (response) { + // eslint-disable-next-line prefer-spread + return nativeFetch.apply(null, args).then(function (response) { return response.text().then(function (bodyText) { - var patternRegexp = pattern === '*' ? toRegExp() : toRegExp(pattern); + var patternRegexp = pattern === '*' ? /(\n|.)*/ : toRegExp(pattern); var modifiedTextContent = bodyText.replace(patternRegexp, replacement); var forgedResponse = forgeResponse(response, modifiedTextContent); hit(source); @@ -7893,17 +7158,16 @@ return Reflect.apply(target, thisArg, args); }); }; - var fetchHandler = { apply: handlerWrapper }; fetch = new Proxy(fetch, fetchHandler); // eslint-disable-line no-global-assign } + trustedReplaceFetchResponse$1.names = ['trusted-replace-fetch-response']; trustedReplaceFetchResponse$1.injections = [hit, logMessage, getFetchData, objectToString, matchRequestProps, toRegExp, isValidStrPattern, escapeRegExp, isEmptyObject, getRequestData, getRequestProps, getObjectEntries, getObjectFromEntries, parseMatchProps, validateParsedData, getMatchPropsData]; /* eslint-disable max-len */ - /** * @trustedScriptlet trusted-set-local-storage-item * @@ -7949,7 +7213,6 @@ * example.org#%#//scriptlet('trusted-set-local-storage-item', 'ppu_main_none', '') * ``` */ - /* eslint-enable max-len */ function trustedSetLocalStorageItem$1(source, key, value) { @@ -7957,20 +7220,20 @@ logMessage(source, 'Item key should be specified.'); return; } - if (typeof value === 'undefined') { logMessage(source, 'Item value should be specified.'); return; } - var parsedValue = parseKeywordValue(value); var _window = window, - localStorage = _window.localStorage; + localStorage = _window.localStorage; setStorageItem(source, localStorage, key, parsedValue); hit(source); } - trustedSetLocalStorageItem$1.names = ['trusted-set-local-storage-item' // trusted scriptlets support no aliases + trustedSetLocalStorageItem$1.names = ['trusted-set-local-storage-item' + // trusted scriptlets support no aliases ]; + trustedSetLocalStorageItem$1.injections = [hit, logMessage, nativeIsNaN, setStorageItem, parseKeywordValue]; /** @@ -7989,7 +7252,7 @@ setConstant: setConstant$1, removeCookie: removeCookie$1, preventAddEventListener: preventAddEventListener$1, - preventBab: preventBab$1, + preventBab: preventBab$2, nowebrtc: nowebrtc$1, logAddEventListener: logAddEventListener$1, logEval: logEval$1, @@ -8179,15 +7442,16 @@ var JS_RULE_MARKER = '#%#'; var COMMENT_MARKER = '!'; + /** * Checks if rule text is comment e.g. !!example.org##+js(set-constant.js, test, false) * @param {string} rule * @return {boolean} */ - var isComment = function isComment(rule) { - return startsWith(rule, COMMENT_MARKER); + return startsWith$1(rule, COMMENT_MARKER); }; + /* ************************************************************************ * * Scriptlets @@ -8197,85 +7461,79 @@ /** * uBlock scriptlet rule mask */ - - var UBO_SCRIPTLET_MASK_REG = /#@?#script:inject|#@?#\s*\+js/; var UBO_SCRIPTLET_MASK_1 = '##+js'; var UBO_SCRIPTLET_MASK_2 = '##script:inject'; var UBO_SCRIPTLET_EXCEPTION_MASK_1 = '#@#+js'; var UBO_SCRIPTLET_EXCEPTION_MASK_2 = '#@#script:inject'; + /** * AdBlock Plus snippet rule mask */ - var ABP_SCRIPTLET_MASK = '#$#'; var ABP_SCRIPTLET_EXCEPTION_MASK = '#@$#'; + /** * AdGuard CSS rule mask */ - var ADG_CSS_MASK_REG = /#@?\$#.+?\s*\{.*\}\s*$/g; + /** * Checks if the `rule` is AdGuard scriptlet rule * @param {string} rule - rule text */ - var isAdgScriptletRule = function isAdgScriptletRule(rule) { return !isComment(rule) && rule.indexOf(ADG_SCRIPTLET_MASK) > -1; }; + /** * Checks if the `rule` is uBO scriptlet rule * @param {string} rule rule text */ - - var isUboScriptletRule = function isUboScriptletRule(rule) { return (rule.indexOf(UBO_SCRIPTLET_MASK_1) > -1 || rule.indexOf(UBO_SCRIPTLET_MASK_2) > -1 || rule.indexOf(UBO_SCRIPTLET_EXCEPTION_MASK_1) > -1 || rule.indexOf(UBO_SCRIPTLET_EXCEPTION_MASK_2) > -1) && UBO_SCRIPTLET_MASK_REG.test(rule) && !isComment(rule); }; + /** * Checks if the `rule` is AdBlock Plus snippet * @param {string} rule rule text */ - - var isAbpSnippetRule = function isAbpSnippetRule(rule) { return (rule.indexOf(ABP_SCRIPTLET_MASK) > -1 || rule.indexOf(ABP_SCRIPTLET_EXCEPTION_MASK) > -1) && rule.search(ADG_CSS_MASK_REG) === -1 && !isComment(rule); }; + /** * Finds scriptlet by it's name * @param {string} name - scriptlet name */ - - var getScriptletByName = function getScriptletByName(name) { var scriptlets = Object.keys(scriptletList).map(function (key) { return scriptletList[key]; }); return scriptlets.find(function (s) { - return s.names // full match name checking - && (s.names.indexOf(name) > -1 // or check ubo alias name without '.js' at the end + return s.names + // full match name checking + && (s.names.indexOf(name) > -1 + // or check ubo alias name without '.js' at the end || !endsWith(name, '.js') && s.names.indexOf("".concat(name, ".js")) > -1); }); }; + /** * Checks if the scriptlet name is valid * @param {string} name - Scriptlet name */ - - var isValidScriptletName = function isValidScriptletName(name) { if (!name) { return false; } - var scriptlet = getScriptletByName(name); - if (!scriptlet) { return false; } - return true; }; + /* ************************************************************************ * * Redirects @@ -8285,18 +7543,16 @@ /** * Redirect resources markers */ - - var ADG_UBO_REDIRECT_MARKER = 'redirect='; var ADG_UBO_REDIRECT_RULE_MARKER = 'redirect-rule='; var ABP_REDIRECT_MARKER = 'rewrite=abp-resource:'; var EMPTY_REDIRECT_MARKER = 'empty'; var VALID_SOURCE_TYPES = ['image', 'media', 'subdocument', 'stylesheet', 'script', 'xmlhttprequest', 'other']; + /** * Source types for redirect rules if there is no one of them. * Used for ADG -> UBO conversion. */ - var ABSENT_SOURCE_TYPE_REPLACEMENT = [{ NAME: 'nooptext', TYPES: VALID_SOURCE_TYPES @@ -8328,41 +7584,41 @@ var validAdgRedirects = redirects$1.filter(function (el) { return el.adg; }); + /** * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names * It's used for UBO -> ADG converting */ - var uboToAdgCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) { return el.ubo; }).map(function (el) { return [el.ubo, el.adg]; })); + /** * Compatibility object where KEYS = ABP redirect names and VALUES = ADG redirect names * It's used for ABP -> ADG converting */ - var abpToAdgCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) { return el.abp; }).map(function (el) { return [el.abp, el.adg]; })); + /** * Compatibility object where KEYS = UBO redirect names and VALUES = ADG redirect names * It's used for ADG -> UBO converting */ - var adgToUboCompatibility = getObjectFromEntries(validAdgRedirects.filter(function (el) { return el.ubo; }).map(function (el) { return [el.adg, el.ubo]; })); + /** * Needed for AdGuard redirect names validation where KEYS = **valid** AdGuard redirect names * 'adgToUboCompatibility' is still needed for ADG -> UBO converting */ - var validAdgCompatibility = getObjectFromEntries(validAdgRedirects.map(function (el) { return [el.adg, 'valid adg redirect']; })); @@ -8387,23 +7643,22 @@ compatibility: abpToAdgCompatibility } }; + /** * Parses redirect rule modifiers * @param {string} rule * @returns {Array} */ - var parseModifiers = function parseModifiers(rule) { return substringAfter$1(rule, '$').split(','); }; + /** * Gets redirect resource name * @param {string} rule * @param {string} marker - specific Adg/Ubo or Abp redirect resources marker * @returns {string} - redirect resource name */ - - var getRedirectName = function getRedirectName(rule, marker) { var ruleModifiers = parseModifiers(rule); var redirectNamePart = ruleModifiers.find(function (el) { @@ -8411,104 +7666,95 @@ }); return substringAfter$1(redirectNamePart, marker); }; + /** * Checks if the `rule` is AdGuard redirect rule. * Discards comments and JS rules and checks if the `rule` has 'redirect' modifier. * @param {string} rule - rule text */ - - var isAdgRedirectRule = function isAdgRedirectRule(rule) { var MARKER_IN_BASE_PART_MASK = '/((?!\\$|\\,).{1})redirect((-rule)?)=(.{0,}?)\\$(popup)?/'; - return !isComment(rule) && (rule.indexOf(REDIRECT_RULE_TYPES.ADG.redirectMarker) > -1 || rule.indexOf(REDIRECT_RULE_TYPES.ADG.redirectRuleMarker) > -1) // some js rules may have 'redirect=' in it, so we should get rid of them - && rule.indexOf(JS_RULE_MARKER) === -1 // get rid of rules like '_redirect=*://look.$popup' + return !isComment(rule) && (rule.indexOf(REDIRECT_RULE_TYPES.ADG.redirectMarker) > -1 || rule.indexOf(REDIRECT_RULE_TYPES.ADG.redirectRuleMarker) > -1) + // some js rules may have 'redirect=' in it, so we should get rid of them + && rule.indexOf(JS_RULE_MARKER) === -1 + // get rid of rules like '_redirect=*://look.$popup' && !toRegExp(MARKER_IN_BASE_PART_MASK).test(rule); - }; // const getRedirectResourceMarkerData = () + }; + + // const getRedirectResourceMarkerData = () /** * Checks if the `rule` satisfies the `type` * @param {string} rule - rule text * @param {'VALID_ADG'|'ADG'|'UBO'|'ABP'} type - type of a redirect rule */ - - var isRedirectRuleByType = function isRedirectRuleByType(rule, type) { var _REDIRECT_RULE_TYPES$ = REDIRECT_RULE_TYPES[type], - redirectMarker = _REDIRECT_RULE_TYPES$.redirectMarker, - redirectRuleMarker = _REDIRECT_RULE_TYPES$.redirectRuleMarker, - compatibility = _REDIRECT_RULE_TYPES$.compatibility; - + redirectMarker = _REDIRECT_RULE_TYPES$.redirectMarker, + redirectRuleMarker = _REDIRECT_RULE_TYPES$.redirectRuleMarker, + compatibility = _REDIRECT_RULE_TYPES$.compatibility; if (rule && !isComment(rule)) { - var marker; // check if there is a $redirect-rule modifier in rule - + var marker; + // check if there is a $redirect-rule modifier in rule var markerIndex = redirectRuleMarker ? rule.indexOf(redirectRuleMarker) : -1; - if (markerIndex > -1) { marker = redirectRuleMarker; } else { // check if there $redirect modifier in rule markerIndex = rule.indexOf(redirectMarker); - if (markerIndex > -1) { marker = redirectMarker; } else { return false; } } - var redirectName = getRedirectName(rule, marker); - if (!redirectName) { return false; } - return redirectName === Object.keys(compatibility).find(function (el) { return el === redirectName; }); } - return false; }; + /** * Checks if the `rule` is **valid** AdGuard redirect resource rule * @param {string} rule - rule text * @returns {boolean} */ - - var isValidAdgRedirectRule = function isValidAdgRedirectRule(rule) { return isRedirectRuleByType(rule, 'VALID_ADG'); }; + /** * Checks if the AdGuard redirect `rule` has Ubo analog. Needed for Adg->Ubo conversion * @param {string} rule - AdGuard rule text * @returns {boolean} - true if the rule can be converted to Ubo */ - - var isAdgRedirectCompatibleWithUbo = function isAdgRedirectCompatibleWithUbo(rule) { return isAdgRedirectRule(rule) && isRedirectRuleByType(rule, 'ADG'); }; + /** * Checks if the Ubo redirect `rule` has AdGuard analog. Needed for Ubo->Adg conversion * @param {string} rule - Ubo rule text * @returns {boolean} - true if the rule can be converted to AdGuard */ - - var isUboRedirectCompatibleWithAdg = function isUboRedirectCompatibleWithAdg(rule) { return isRedirectRuleByType(rule, 'UBO'); }; + /** * Checks if the Abp redirect `rule` has AdGuard analog. Needed for Abp->Adg conversion * @param {string} rule - Abp rule text * @returns {boolean} - true if the rule can be converted to AdGuard */ - - var isAbpRedirectCompatibleWithAdg = function isAbpRedirectCompatibleWithAdg(rule) { return isRedirectRuleByType(rule, 'ABP'); }; + /** * Checks if the rule has specified content type before Adg -> Ubo conversion. * @@ -8525,26 +7771,21 @@ * @param {string} rule * @returns {boolean} */ - - var hasValidContentType = function hasValidContentType(rule) { - var ruleModifiers = parseModifiers(rule); // rule can have more than one source type modifier - + var ruleModifiers = parseModifiers(rule); + // rule can have more than one source type modifier var sourceTypes = ruleModifiers.filter(function (el) { return VALID_SOURCE_TYPES.indexOf(el) > -1; }); - var isSourceTypeSpecified = sourceTypes.length > 0; // eslint-disable-next-line max-len - + var isSourceTypeSpecified = sourceTypes.length > 0; + // eslint-disable-next-line max-len var isEmptyRedirect = ruleModifiers.indexOf("".concat(ADG_UBO_REDIRECT_MARKER).concat(EMPTY_REDIRECT_MARKER)) > -1 || ruleModifiers.indexOf("".concat(ADG_UBO_REDIRECT_RULE_MARKER).concat(EMPTY_REDIRECT_MARKER)) > -1; - if (isEmptyRedirect) { // no source type for 'empty' is allowed return true; } - return isSourceTypeSpecified; }; - var validator = { UBO_SCRIPTLET_MASK_REG: UBO_SCRIPTLET_MASK_REG, ABP_SCRIPTLET_MASK: ABP_SCRIPTLET_MASK, @@ -8568,44 +7809,80 @@ hasValidContentType: hasValidContentType }; + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + return arr2; + } + var arrayLikeToArray = _arrayLikeToArray; + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return arrayLikeToArray(arr); + } + var arrayWithoutHoles = _arrayWithoutHoles; + + function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); + } + var iterableToArray = _iterableToArray; + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); + } + var unsupportedIterableToArray = _unsupportedIterableToArray; + + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + var nonIterableSpread = _nonIterableSpread; + + function _toConsumableArray(arr) { + return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread(); + } + var toConsumableArray = _toConsumableArray; + function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - var arrayWithHoles = _arrayWithHoles; function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - var nonIterableRest = _nonIterableRest; function _toArray(arr) { return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest(); } - var toArray$1 = _toArray; /** * AdGuard scriptlet rule */ - - var ADGUARD_SCRIPTLET_MASK_REG = /#@?%#\/\/scriptlet\(.+\)/; // eslint-disable-next-line no-template-curly-in-string - - var ADGUARD_SCRIPTLET_TEMPLATE = '${domains}#%#//scriptlet(${args})'; // eslint-disable-next-line no-template-curly-in-string - + var ADGUARD_SCRIPTLET_MASK_REG = /#@?%#\/\/scriptlet\(.+\)/; + // eslint-disable-next-line no-template-curly-in-string + var ADGUARD_SCRIPTLET_TEMPLATE = '${domains}#%#//scriptlet(${args})'; + // eslint-disable-next-line no-template-curly-in-string var ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@%#//scriptlet(${args})'; + /** * uBlock scriptlet rule mask */ // eslint-disable-next-line no-template-curly-in-string - - var UBO_SCRIPTLET_TEMPLATE = '${domains}##+js(${args})'; // eslint-disable-next-line no-template-curly-in-string - + var UBO_SCRIPTLET_TEMPLATE = '${domains}##+js(${args})'; + // eslint-disable-next-line no-template-curly-in-string var UBO_SCRIPTLET_EXCEPTION_TEMPLATE = '${domains}#@#+js(${args})'; var UBO_ALIAS_NAME_MARKER = 'ubo-'; - var UBO_SCRIPTLET_JS_ENDING = '.js'; // https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#xhr + var UBO_SCRIPTLET_JS_ENDING = '.js'; + // https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#xhr var UBO_XHR_TYPE = 'xhr'; var ADG_XHR_TYPE = 'xmlhttprequest'; var ADG_SET_CONSTANT_NAME = 'set-constant'; @@ -8624,22 +7901,21 @@ var ADG_REMOVE_ATTR_NAME = REMOVE_ATTR_ALIASES[0]; var ADG_REMOVE_CLASS_NAME = REMOVE_CLASS_ALIASES[0]; var REMOVE_ATTR_CLASS_APPLYING = ['asap', 'stay', 'complete']; + /** * Returns array of strings separated by space which not in quotes * @param {string} str */ - var getSentences = function getSentences(str) { var reg = /'.*?'|".*?"|\S+/g; return str.match(reg); }; + /** * Replaces string with data by placeholders * @param {string} str * @param {Object} data - where keys are placeholders names */ - - var replacePlaceholders = function replacePlaceholders(str, data) { return Object.keys(data).reduce(function (acc, key) { var reg = new RegExp("\\$\\{".concat(key, "\\}"), 'g'); @@ -8647,11 +7923,9 @@ return acc; }, str); }; - var splitArgs = function splitArgs(str) { var args = []; var prevArgStart = 0; - for (var i = 0; i < str.length; i += 1) { // do not split args by escaped comma // https://github.com/AdguardTeam/Scriptlets/issues/133 @@ -8659,39 +7933,35 @@ args.push(str.slice(prevArgStart, i).trim()); prevArgStart = i + 1; } - } // collect arg after last comma - - + } + // collect arg after last comma args.push(str.slice(prevArgStart, str.length).trim()); return args; }; + /** * Validates remove-attr/class scriptlet args * @param {string[]} parsedArgs * @returns {string[]|Error} valid args OR error for invalid selector */ - - var validateRemoveAttrClassArgs = function validateRemoveAttrClassArgs(parsedArgs) { var _parsedArgs = toArray$1(parsedArgs), - name = _parsedArgs[0], - value = _parsedArgs[1], - restArgs = _parsedArgs.slice(2); // no extra checking if there are only scriptlet name and value + name = _parsedArgs[0], + value = _parsedArgs[1], + restArgs = _parsedArgs.slice(2); // no extra checking if there are only scriptlet name and value // https://github.com/AdguardTeam/Scriptlets/issues/235 - - if (restArgs.length === 0) { return [name, value]; - } // remove-attr/class scriptlet might have multiple selectors separated by comma. so we should: + } + + // remove-attr/class scriptlet might have multiple selectors separated by comma. so we should: // 1. check if last arg is 'applying' parameter // 2. join 'selector' into one arg // 3. combine all args // https://github.com/AdguardTeam/Scriptlets/issues/133 - - var lastArg = restArgs.pop(); - var applying; // check the last parsed arg for matching possible 'applying' vale - + var applying; + // check the last parsed arg for matching possible 'applying' vale if (REMOVE_ATTR_CLASS_APPLYING.some(function (el) { return lastArg.indexOf(el) > -1; })) { @@ -8699,57 +7969,46 @@ } else { restArgs.push(lastArg); } - var selector = replaceAll(restArgs.join(', '), ESCAPED_COMMA_SEPARATOR, COMMA_SEPARATOR); - if (selector.length > 0 && typeof document !== 'undefined') { // empty selector is valid for these scriptlets as it applies to all elements, // all other selectors should be validated // e.g. #%#//scriptlet('ubo-remove-class.js', 'blur', ', html') document.querySelectorAll(selector); } - var validArgs = applying ? [name, value, selector, applying] : [name, value, selector]; return validArgs; }; + /** * Converts string of UBO scriptlet rule to AdGuard scriptlet rule * @param {string} rule - UBO scriptlet rule * @returns {string[]} - array with one AdGuard scriptlet rule */ - - var convertUboScriptletToAdg = function convertUboScriptletToAdg(rule) { var domains = getBeforeRegExp(rule, validator.UBO_SCRIPTLET_MASK_REG); var mask = rule.match(validator.UBO_SCRIPTLET_MASK_REG)[0]; var template; - if (mask.indexOf('@') > -1) { template = ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE; } else { template = ADGUARD_SCRIPTLET_TEMPLATE; } - var argsStr = getStringInBraces(rule); var parsedArgs = splitArgs(argsStr); var scriptletName = parsedArgs[0].indexOf(UBO_SCRIPTLET_JS_ENDING) > -1 ? "ubo-".concat(parsedArgs[0]) : "ubo-".concat(parsedArgs[0]).concat(UBO_SCRIPTLET_JS_ENDING); - if (REMOVE_ATTR_ALIASES.indexOf(scriptletName) > -1 || REMOVE_CLASS_ALIASES.indexOf(scriptletName) > -1) { parsedArgs = validateRemoveAttrClassArgs(parsedArgs); } - var args = parsedArgs.map(function (arg, index) { var outputArg = arg; - if (index === 0) { outputArg = scriptletName; - } // for example: example.org##+js(abort-current-inline-script, $, popup) - - + } + // for example: example.org##+js(abort-current-inline-script, $, popup) if (arg === '$') { outputArg = '$$'; } - return outputArg; }).map(function (arg) { return wrapInSingleQuotes(arg); @@ -8760,20 +8019,21 @@ }); return [adgRule]; }; + /** * Convert string of ABP snippet rule to AdGuard scriptlet rule * @param {string} rule - ABP snippet rule * @returns {Array} - array of AdGuard scriptlet rules - * one or few items depends on Abp-rule */ - var convertAbpSnippetToAdg = function convertAbpSnippetToAdg(rule) { var SEMICOLON_DIVIDER = /;(?=(?:(?:[^"]*"){2})*[^"]*$)/g; var mask = rule.indexOf(validator.ABP_SCRIPTLET_MASK) > -1 ? validator.ABP_SCRIPTLET_MASK : validator.ABP_SCRIPTLET_EXCEPTION_MASK; var template = mask === validator.ABP_SCRIPTLET_MASK ? ADGUARD_SCRIPTLET_TEMPLATE : ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE; var domains = substringBefore(rule, mask); var args = substringAfter$1(rule, mask); - return args.split(SEMICOLON_DIVIDER) // abp-rule may have `;` at the end which makes last array item irrelevant + return args.split(SEMICOLON_DIVIDER) + // abp-rule may have `;` at the end which makes last array item irrelevant // https://github.com/AdguardTeam/Scriptlets/issues/236 .filter(isExisting).map(function (args) { return getSentences(args).map(function (arg, index) { @@ -8788,16 +8048,15 @@ }); }); }; + /** * Converts scriptlet rule to AdGuard one * @param {string} rule * @returns {Array} - array of AdGuard scriptlet rules - * one item for Adg and Ubo or few items for Abp */ - var convertScriptletToAdg = function convertScriptletToAdg(rule) { var result; - if (validator.isUboScriptletRule(rule)) { result = convertUboScriptletToAdg(rule); } else if (validator.isAbpSnippetRule(rule)) { @@ -8805,44 +8064,41 @@ } else if (validator.isAdgScriptletRule(rule) || validator.isComment(rule)) { result = [rule]; } - return result; }; + /** * Converts UBO scriptlet rule to AdGuard one * @param {string} rule - AdGuard scriptlet rule * @returns {string} - UBO scriptlet rule */ - var convertAdgScriptletToUbo = function convertAdgScriptletToUbo(rule) { var res; - if (validator.isAdgScriptletRule(rule)) { var _parseRule = parseRule(rule), - parsedName = _parseRule.name, - parsedParams = _parseRule.args; - - var preparedParams; // https://github.com/AdguardTeam/FiltersCompiler/issues/102 - + parsedName = _parseRule.name, + parsedParams = _parseRule.args; + var preparedParams; + // https://github.com/AdguardTeam/FiltersCompiler/issues/102 if (parsedName === ADG_SET_CONSTANT_NAME && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) { preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_STRING]; - } else if (parsedName === ADG_PREVENT_FETCH_NAME // https://github.com/AdguardTeam/Scriptlets/issues/109 + } else if (parsedName === ADG_PREVENT_FETCH_NAME + // https://github.com/AdguardTeam/Scriptlets/issues/109 && (parsedParams[0] === ADG_PREVENT_FETCH_WILDCARD || parsedParams[0] === ADG_PREVENT_FETCH_EMPTY_STRING)) { preparedParams = [UBO_NO_FETCH_IF_WILDCARD]; } else if ((parsedName === ADG_REMOVE_ATTR_NAME || parsedName === ADG_REMOVE_CLASS_NAME) && parsedParams[1] && parsedParams[1].indexOf(COMMA_SEPARATOR) > -1) { preparedParams = [parsedParams[0], replaceAll(parsedParams[1], COMMA_SEPARATOR, ESCAPED_COMMA_SEPARATOR)]; } else { preparedParams = parsedParams; - } // object of name and aliases for the Adg-scriptlet - + } + // object of name and aliases for the Adg-scriptlet var adgScriptletObject = Object.keys(scriptletList).map(function (el) { return scriptletList[el]; }).map(function (s) { var _s$names = toArray$1(s.names), - name = _s$names[0], - aliases = _s$names.slice(1); - + name = _s$names[0], + aliases = _s$names.slice(1); return { name: name, aliases: aliases @@ -8851,25 +8107,23 @@ return el.name === parsedName || el.aliases.indexOf(parsedName) >= 0; }); var aliases = adgScriptletObject.aliases; - if (aliases.length > 0) { - var uboAlias = adgScriptletObject.aliases // eslint-disable-next-line no-restricted-properties + var uboAlias = adgScriptletObject.aliases + // eslint-disable-next-line no-restricted-properties .find(function (alias) { return alias.includes(UBO_ALIAS_NAME_MARKER); }); - if (uboAlias) { var mask = rule.match(ADGUARD_SCRIPTLET_MASK_REG)[0]; var template; - if (mask.indexOf('@') > -1) { template = UBO_SCRIPTLET_EXCEPTION_TEMPLATE; } else { template = UBO_SCRIPTLET_TEMPLATE; } - var domains = getBeforeRegExp(rule, ADGUARD_SCRIPTLET_MASK_REG); - var uboName = uboAlias.replace(UBO_ALIAS_NAME_MARKER, '') // '.js' in the Ubo scriptlet name can be omitted + var uboName = uboAlias.replace(UBO_ALIAS_NAME_MARKER, '') + // '.js' in the Ubo scriptlet name can be omitted // https://github.com/gorhill/uBlock/wiki/Resources-Library#general-purpose-scriptlets .replace(UBO_SCRIPTLET_JS_ENDING, ''); var args = preparedParams.length > 0 ? "".concat(uboName, ", ").concat(preparedParams.join("".concat(COMMA_SEPARATOR, " "))) : uboName; @@ -8881,30 +8135,30 @@ } } } - return res; }; + /** * Checks whether the ADG scriptlet exists or UBO/ABP scriptlet is compatible to ADG * @param {string} input - can be ADG or UBO or ABP scriptlet rule * @returns {boolean} */ - var isValidScriptletRule = function isValidScriptletRule(input) { if (!input) { return false; - } // ABP 'input' rule may contain more than one snippet - + } + // ABP 'input' rule may contain more than one snippet + var rulesArray = convertScriptletToAdg(input); - var rulesArray = convertScriptletToAdg(input); // checking if each of parsed scriptlets is valid + // checking if each of parsed scriptlets is valid // if at least one of them is not valid - whole 'input' rule is not valid too - var isValid = rulesArray.every(function (rule) { var parsedRule = parseRule(rule); return validator.isValidScriptletName(parsedRule.name); }); return isValid; }; + /** * Gets index and redirect resource marker from UBO/ADG modifiers array * @param {string[]} modifiers @@ -8912,39 +8166,34 @@ * @param {string} rule * @returns {Object} { index, marker } */ - var getMarkerData = function getMarkerData(modifiers, redirectsData, rule) { var marker; var index = modifiers.findIndex(function (m) { return m.indexOf(redirectsData.redirectRuleMarker) > -1; }); - if (index > -1) { marker = redirectsData.redirectRuleMarker; } else { index = modifiers.findIndex(function (m) { return m.indexOf(redirectsData.redirectMarker) > -1; }); - if (index > -1) { marker = redirectsData.redirectMarker; } else { throw new Error("No redirect resource modifier found in rule: ".concat(rule)); } } - return { index: index, marker: marker }; }; + /** * Converts Ubo redirect rule to Adg one * @param {string} rule * @returns {string} */ - - var convertUboRedirectToAdg = function convertUboRedirectToAdg(rule) { var firstPartOfRule = substringBefore(rule, '$'); var uboModifiers = validator.parseModifiers(rule); @@ -8956,21 +8205,19 @@ var adgMarker = uboMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.ADG.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.ADG.redirectMarker; return "".concat(adgMarker).concat(adgName); } - if (modifier === UBO_XHR_TYPE) { return ADG_XHR_TYPE; } - return modifier; }).join(COMMA_SEPARATOR); return "".concat(firstPartOfRule, "$").concat(adgModifiers); }; + /** * Converts Abp redirect rule to Adg one * @param {string} rule * @returns {string} */ - var convertAbpRedirectToAdg = function convertAbpRedirectToAdg(rule) { var firstPartOfRule = substringBefore(rule, '$'); var abpModifiers = validator.parseModifiers(rule); @@ -8980,20 +8227,18 @@ var adgName = validator.REDIRECT_RULE_TYPES.ABP.compatibility[abpName]; return "".concat(validator.REDIRECT_RULE_TYPES.ADG.redirectMarker).concat(adgName); } - return modifier; }).join(COMMA_SEPARATOR); return "".concat(firstPartOfRule, "$").concat(adgModifiers); }; + /** * Converts redirect rule to AdGuard one * @param {string} rule * @returns {string} */ - var convertRedirectToAdg = function convertRedirectToAdg(rule) { var result; - if (validator.isUboRedirectCompatibleWithAdg(rule)) { result = convertUboRedirectToAdg(rule); } else if (validator.isAbpRedirectCompatibleWithAdg(rule)) { @@ -9001,9 +8246,9 @@ } else if (validator.isValidAdgRedirectRule(rule)) { result = rule; } - return result; }; + /** * Converts Adg redirect rule to Ubo one * 1. Checks if there is Ubo analog for Adg rule @@ -9015,40 +8260,33 @@ * @param {string} rule * @returns {string} */ - var convertAdgRedirectToUbo = function convertAdgRedirectToUbo(rule) { if (!validator.isAdgRedirectCompatibleWithUbo(rule)) { throw new Error("Unable to convert for uBO - unsupported redirect in rule: ".concat(rule)); } - var basePart = substringBefore(rule, '$'); var adgModifiers = validator.parseModifiers(rule); var adgMarkerData = getMarkerData(adgModifiers, validator.REDIRECT_RULE_TYPES.ADG, rule); var adgRedirectName = adgModifiers[adgMarkerData.index].slice(adgMarkerData.marker.length); - if (!validator.hasValidContentType(rule)) { // add missed source types as content type modifiers var sourceTypesData = validator.ABSENT_SOURCE_TYPE_REPLACEMENT.find(function (el) { return el.NAME === adgRedirectName; }); - if (typeof sourceTypesData === 'undefined') { // eslint-disable-next-line max-len throw new Error("Unable to convert for uBO - no types to add for specific redirect in rule: ".concat(rule)); } - var additionModifiers = sourceTypesData.TYPES; - adgModifiers.push.apply(adgModifiers, toConsumableArray$1(additionModifiers)); + adgModifiers.push.apply(adgModifiers, toConsumableArray(additionModifiers)); } - var uboModifiers = adgModifiers.map(function (el, index) { if (index === adgMarkerData.index) { - var uboMarker = adgMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.UBO.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.UBO.redirectMarker; // eslint-disable-next-line max-len - + var uboMarker = adgMarkerData.marker === validator.ADG_UBO_REDIRECT_RULE_MARKER ? validator.REDIRECT_RULE_TYPES.UBO.redirectRuleMarker : validator.REDIRECT_RULE_TYPES.UBO.redirectMarker; + // eslint-disable-next-line max-len var uboRedirectName = validator.REDIRECT_RULE_TYPES.ADG.compatibility[adgRedirectName]; return "".concat(uboMarker).concat(uboRedirectName); } - return el; }).join(COMMA_SEPARATOR); return "".concat(basePart, "$").concat(uboModifiers); @@ -9070,30 +8308,24 @@ * ||googletagmanager.com/gtm.js$script,redirect=googletagmanager-gtm * ``` */ - function GoogleAnalytics(source) { // eslint-disable-next-line func-names var Tracker = function Tracker() {}; // constructor - - var proto = Tracker.prototype; proto.get = noopFunc; proto.set = noopFunc; proto.send = noopFunc; - var googleAnalyticsName = window.GoogleAnalyticsObject || 'ga'; // a -- fake arg for 'ga.length < 1' antiadblock checking + var googleAnalyticsName = window.GoogleAnalyticsObject || 'ga'; + // a -- fake arg for 'ga.length < 1' antiadblock checking // eslint-disable-next-line no-unused-vars - function ga(a) { var len = arguments.length; - if (len === 0) { return; - } // eslint-disable-next-line prefer-rest-params - - + } + // eslint-disable-next-line prefer-rest-params var lastArg = arguments[len - 1]; var replacer; - if (lastArg instanceof Object && lastArg !== null && typeof lastArg.hitCallback === 'function') { replacer = lastArg.hitCallback; } else if (typeof lastArg === 'function') { @@ -9102,79 +8334,68 @@ lastArg(ga.create()); }; } - try { - setTimeout(replacer, 1); // eslint-disable-next-line no-empty + setTimeout(replacer, 1); + // eslint-disable-next-line no-empty } catch (ex) {} } - ga.create = function () { return new Tracker(); - }; // https://github.com/AdguardTeam/Scriptlets/issues/134 - - + }; + // https://github.com/AdguardTeam/Scriptlets/issues/134 ga.getByName = function () { return new Tracker(); }; - ga.getAll = function () { return [new Tracker()]; }; - ga.remove = noopFunc; ga.loaded = true; window[googleAnalyticsName] = ga; var _window = window, - dataLayer = _window.dataLayer, - google_optimize = _window.google_optimize; // eslint-disable-line camelcase - + dataLayer = _window.dataLayer, + google_optimize = _window.google_optimize; // eslint-disable-line camelcase if (dataLayer instanceof Object === false) { return; } - if (dataLayer.hide instanceof Object && typeof dataLayer.hide.end === 'function') { dataLayer.hide.end(); } + /** * checks data object and delays callback * @param {Object|Array} data gtag payload * @param {string} funcName callback prop name * @returns */ - - var handleCallback = function handleCallback(dataObj, funcName) { if (dataObj && typeof dataObj[funcName] === 'function') { setTimeout(dataObj[funcName]); } }; - if (typeof dataLayer.push === 'function') { dataLayer.push = function (data) { if (data instanceof Object) { - handleCallback(data, 'eventCallback'); // eslint-disable-next-line no-restricted-syntax, guard-for-in - + handleCallback(data, 'eventCallback'); + // eslint-disable-next-line no-restricted-syntax, guard-for-in for (var key in data) { handleCallback(data[key], 'event_callback'); - } // eslint-disable-next-line no-prototype-builtins - - + } + // eslint-disable-next-line no-prototype-builtins if (!data.hasOwnProperty('eventCallback') && !data.hasOwnProperty('eventCallback')) { [].push.call(window.dataLayer, data); } } - if (Array.isArray(data)) { data.forEach(function (arg) { handleCallback(arg, 'callback'); }); } - return noopFunc; }; - } // https://github.com/AdguardTeam/Scriptlets/issues/81 - + } + // https://github.com/AdguardTeam/Scriptlets/issues/81 if (google_optimize instanceof Object && typeof google_optimize.get === 'function') { // eslint-disable-line camelcase var googleOptimizeWrapper = { @@ -9182,14 +8403,15 @@ }; window.google_optimize = googleOptimizeWrapper; } - hit(source); } - GoogleAnalytics.names = ['google-analytics', 'ubo-google-analytics_analytics.js', 'google-analytics_analytics.js', // https://github.com/AdguardTeam/Scriptlets/issues/127 + GoogleAnalytics.names = ['google-analytics', 'ubo-google-analytics_analytics.js', 'google-analytics_analytics.js', + // https://github.com/AdguardTeam/Scriptlets/issues/127 'googletagmanager-gtm', 'ubo-googletagmanager_gtm.js', 'googletagmanager_gtm.js']; GoogleAnalytics.injections = [hit, noopFunc, noopNull, noopArray]; /* eslint-disable no-underscore-dangle */ + /** * @redirect google-analytics-ga * @@ -9204,11 +8426,9 @@ * ||google-analytics.com/ga.js$script,redirect=google-analytics-ga * ``` */ - function GoogleAnalyticsGa(source) { // Gaq constructor function Gaq() {} - Gaq.prototype.Na = noopFunc; Gaq.prototype.O = noopFunc; Gaq.prototype.Sa = noopFunc; @@ -9217,80 +8437,67 @@ Gaq.prototype._createAsyncTracker = noopFunc; Gaq.prototype._getAsyncTracker = noopFunc; Gaq.prototype._getPlugin = noopFunc; - Gaq.prototype.push = function (data) { if (typeof data === 'function') { data(); return; } - if (Array.isArray(data) === false) { return; - } // https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiDomainDirectory#_gat.GA_Tracker_._link + } + // https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiDomainDirectory#_gat.GA_Tracker_._link // https://github.com/uBlockOrigin/uBlock-issues/issues/1807 - - if (typeof data[0] === 'string' && /(^|\.)_link$/.test(data[0]) && typeof data[1] === 'string') { window.location.assign(data[1]); - } // https://github.com/gorhill/uBlock/issues/2162 - - + } + // https://github.com/gorhill/uBlock/issues/2162 if (data[0] === '_set' && data[1] === 'hitCallback' && typeof data[2] === 'function') { data[2](); } }; - var gaq = new Gaq(); var asyncTrackers = window._gaq || []; - if (Array.isArray(asyncTrackers)) { while (asyncTrackers[0]) { gaq.push(asyncTrackers.shift()); } - } // eslint-disable-next-line no-multi-assign - - - window._gaq = gaq.qf = gaq; // Gat constructor - - function Gat() {} // Mock tracker api + } + // eslint-disable-next-line no-multi-assign + window._gaq = gaq.qf = gaq; + // Gat constructor + function Gat() {} + // Mock tracker api var api = ['_addIgnoredOrganic', '_addIgnoredRef', '_addItem', '_addOrganic', '_addTrans', '_clearIgnoredOrganic', '_clearIgnoredRef', '_clearOrganic', '_cookiePathCopy', '_deleteCustomVar', '_getName', '_setAccount', '_getAccount', '_getClientInfo', '_getDetectFlash', '_getDetectTitle', '_getLinkerUrl', '_getLocalGifPath', '_getServiceMode', '_getVersion', '_getVisitorCustomVar', '_initData', '_link', '_linkByPost', '_setAllowAnchor', '_setAllowHash', '_setAllowLinker', '_setCampContentKey', '_setCampMediumKey', '_setCampNameKey', '_setCampNOKey', '_setCampSourceKey', '_setCampTermKey', '_setCampaignCookieTimeout', '_setCampaignTrack', '_setClientInfo', '_setCookiePath', '_setCookiePersistence', '_setCookieTimeout', '_setCustomVar', '_setDetectFlash', '_setDetectTitle', '_setDomainName', '_setLocalGifPath', '_setLocalRemoteServerMode', '_setLocalServerMode', '_setReferrerOverride', '_setRemoteServerMode', '_setSampleRate', '_setSessionTimeout', '_setSiteSpeedSampleRate', '_setSessionCookieTimeout', '_setVar', '_setVisitorCookieTimeout', '_trackEvent', '_trackPageLoadTime', '_trackPageview', '_trackSocial', '_trackTiming', '_trackTrans', '_visitCode']; var tracker = api.reduce(function (res, funcName) { res[funcName] = noopFunc; return res; }, {}); - tracker._getLinkerUrl = function (a) { return a; - }; // https://github.com/AdguardTeam/Scriptlets/issues/154 - - + }; + // https://github.com/AdguardTeam/Scriptlets/issues/154 tracker._link = function (url) { if (typeof url !== 'string') { return; } - try { window.location.assign(url); } catch (e) { logMessage(source, e); } }; - Gat.prototype._anonymizeIP = noopFunc; Gat.prototype._createTracker = noopFunc; Gat.prototype._forceSSL = noopFunc; Gat.prototype._getPlugin = noopFunc; - Gat.prototype._getTracker = function () { return tracker; }; - Gat.prototype._getTrackerByName = function () { return tracker; }; - Gat.prototype._getTrackers = noopFunc; Gat.prototype.aa = noopFunc; Gat.prototype.ab = noopFunc; @@ -9307,7 +8514,6 @@ GoogleAnalyticsGa.injections = [hit, noopFunc, logMessage]; /* eslint-disable max-len */ - /** * @redirect googlesyndication-adsbygoogle * @@ -9322,9 +8528,7 @@ * ||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js$script,redirect=googlesyndication-adsbygoogle * ``` */ - /* eslint-enable max-len */ - function GoogleSyndicationAdsByGoogle(source) { window.adsbygoogle = { // https://github.com/AdguardTeam/Scriptlets/issues/113 @@ -9336,12 +8540,10 @@ this.length = 0; this.length += 1; } - if (arg !== null && arg instanceof Object && arg.constructor.name === 'Object') { // eslint-disable-next-line no-restricted-syntax for (var _i = 0, _Object$keys = Object.keys(arg); _i < _Object$keys.length; _i++) { var key = _Object$keys[_i]; - if (typeof arg[key] === 'function') { try { // https://github.com/AdguardTeam/Scriptlets/issues/252 @@ -9361,22 +8563,21 @@ var ASWIFT_IFRAME_MARKER = 'aswift_'; var GOOGLE_ADS_IFRAME_MARKER = 'google_ads_iframe_'; var executed = false; - for (var i = 0; i < adElems.length; i += 1) { var adElemChildNodes = adElems[i].childNodes; - var childNodesQuantity = adElemChildNodes.length; // childNodes of .adsbygoogle can be defined if scriptlet was executed before + var childNodesQuantity = adElemChildNodes.length; + // childNodes of .adsbygoogle can be defined if scriptlet was executed before // so we should check that childNodes are exactly defined by us // TODO: remake after scriptlets context developing in 1.3 - var areIframesDefined = false; - if (childNodesQuantity > 0) { // it should be only 2 child iframes if scriptlet was executed - areIframesDefined = childNodesQuantity === 2 // the first of child nodes should be aswift iframe - && adElemChildNodes[0].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[0].id.indexOf(ASWIFT_IFRAME_MARKER) > -1 // the second of child nodes should be google_ads iframe + areIframesDefined = childNodesQuantity === 2 + // the first of child nodes should be aswift iframe + && adElemChildNodes[0].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[0].id.indexOf(ASWIFT_IFRAME_MARKER) > -1 + // the second of child nodes should be google_ads iframe && adElemChildNodes[1].nodeName.toLowerCase() === 'iframe' && adElemChildNodes[1].id.indexOf(GOOGLE_ADS_IFRAME_MARKER) > -1; } - if (!areIframesDefined) { // here we do the job if scriptlet has not been executed earlier adElems[i].setAttribute(statusAttrName, 'done'); @@ -9395,7 +8596,6 @@ executed = true; } } - if (executed) { hit(source); } @@ -9404,6 +8604,7 @@ GoogleSyndicationAdsByGoogle.injections = [hit]; /* eslint-disable func-names */ + /** * @redirect googletagservices-gpt * @@ -9418,29 +8619,23 @@ * ||googletagservices.com/tag/js/gpt.js$script,redirect=googletagservices-gpt * ``` */ - function GoogleTagServicesGpt(source) { var slots = new Map(); var slotsById = new Map(); var eventCallbacks = new Map(); - var addEventListener = function addEventListener(name, listener) { if (!eventCallbacks.has(name)) { eventCallbacks.set(name, new Set()); } - eventCallbacks.get(name).add(listener); return this; }; - var removeEventListener = function removeEventListener(name, listener) { if (eventCallbacks.has(name)) { return eventCallbacks.get(name).delete(listener); } - return false; }; - var fireSlotEvent = function fireSlotEvent(name, slot) { // eslint-disable-next-line compat/compat return new Promise(function (resolve) { @@ -9448,7 +8643,6 @@ var size = [0, 0]; var callbacksSet = eventCallbacks.get(name) || []; var callbackArray = Array.from(callbacksSet); - for (var i = 0; i < callbackArray.length; i += 1) { callbackArray[i]({ isEmpty: true, @@ -9456,36 +8650,28 @@ slot: slot }); } - resolve(); }); }); }; - var displaySlot = function displaySlot(slot) { if (!slot) { return; } - var id = slot.getSlotElementId(); - if (!document.getElementById(id)) { return; } - var parent = document.getElementById(id); - if (parent) { parent.appendChild(document.createElement('div')); } - fireSlotEvent('slotRenderEnded', slot); fireSlotEvent('slotRequested', slot); fireSlotEvent('slotResponseReceived', slot); fireSlotEvent('slotOnload', slot); fireSlotEvent('impressionViewable', slot); }; - var companionAdsService = { addEventListener: addEventListener, removeEventListener: removeEventListener, @@ -9498,10 +8684,8 @@ removeEventListener: removeEventListener, setContent: noopFunc }; - function PassbackSlot() {} // constructor - PassbackSlot.prototype.display = noopFunc; PassbackSlot.prototype.get = noopNull; PassbackSlot.prototype.set = noopThis; @@ -9509,50 +8693,36 @@ PassbackSlot.prototype.setTagForChildDirectedTreatment = noopThis; PassbackSlot.prototype.setTargeting = noopThis; PassbackSlot.prototype.updateTargetingFromMap = noopThis; - function SizeMappingBuilder() {} // constructor - - SizeMappingBuilder.prototype.addSize = noopThis; SizeMappingBuilder.prototype.build = noopNull; - function Slot(adUnitPath, creatives, optDiv) { this.adUnitPath = adUnitPath; this.creatives = creatives; this.optDiv = optDiv; - if (slotsById.has(optDiv)) { var _document$getElementB; - (_document$getElementB = document.getElementById(optDiv)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.remove(); return slotsById.get(optDiv); } - slotsById.set(optDiv, this); } // constructor - - Slot.prototype.addService = noopThis; Slot.prototype.clearCategoryExclusions = noopThis; Slot.prototype.clearTargeting = noopThis; Slot.prototype.defineSizeMapping = noopThis; Slot.prototype.get = noopNull; - Slot.prototype.getAdUnitPath = function () { return this.adUnitPath; }; - Slot.prototype.getAttributeKeys = noopArray; Slot.prototype.getCategoryExclusions = noopArray; - Slot.prototype.getDomId = function () { return this.optDiv; }; - Slot.prototype.getSlotElementId = function () { return this.optDiv; }; - Slot.prototype.getSlotId = noopThis; Slot.prototype.getSizes = noopArray; Slot.prototype.getTargeting = noopArray; @@ -9604,48 +8774,38 @@ setVideoContent: noopThis, updateCorrelator: noopFunc }; - var getNewSlot = function getNewSlot(adUnitPath, creatives, optDiv) { return new Slot(adUnitPath, creatives, optDiv); }; - var _window = window, - _window$googletag = _window.googletag, - googletag = _window$googletag === void 0 ? {} : _window$googletag; + _window$googletag = _window.googletag, + googletag = _window$googletag === void 0 ? {} : _window$googletag; var _googletag$cmd = googletag.cmd, - cmd = _googletag$cmd === void 0 ? [] : _googletag$cmd; + cmd = _googletag$cmd === void 0 ? [] : _googletag$cmd; googletag.apiReady = true; googletag.cmd = []; - googletag.cmd.push = function (a) { try { - a(); // eslint-disable-next-line no-empty + a(); + // eslint-disable-next-line no-empty } catch (ex) {} - return 1; }; - googletag.companionAds = function () { return companionAdsService; }; - googletag.content = function () { return contentService; }; - googletag.defineOutOfPageSlot = getNewSlot; googletag.defineSlot = getNewSlot; - googletag.destroySlots = function () { slots.clear(); slotsById.clear(); }; - googletag.disablePublisherConsole = noopFunc; - googletag.display = function (arg) { var id; - if (arg !== null && arg !== void 0 && arg.getSlotElementId) { id = arg.getSlotElementId(); } else if (arg !== null && arg !== void 0 && arg.nodeType) { @@ -9653,30 +8813,22 @@ } else { id = String(arg); } - displaySlot(slotsById.get(id)); }; - googletag.enableServices = noopFunc; googletag.getVersion = noopStr; - googletag.pubads = function () { return pubAdsService; }; - googletag.pubadsReady = true; googletag.setAdIframeTitle = noopFunc; - googletag.sizeMapping = function () { return new SizeMappingBuilder(); }; - window.googletag = googletag; - while (cmd.length !== 0) { googletag.cmd.push(cmd.shift()); } - hit(source); } GoogleTagServicesGpt.names = ['googletagservices-gpt', 'ubo-googletagservices_gpt.js', 'googletagservices_gpt.js']; @@ -9696,7 +8848,6 @@ * ||sb.scorecardresearch.com/beacon.js$script,redirect=scorecardresearch-beacon * ``` */ - function ScoreCardResearchBeacon(source) { window.COMSCORE = { purge: function purge() { @@ -9722,13 +8873,11 @@ * ||mc.yandex.ru/metrika/tag.js$script,redirect=metrika-yandex-tag * ``` */ - function metrikaYandexTag(source) { var asyncCallbackFromOptions = function asyncCallbackFromOptions(id, param) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var callback = options.callback; var ctx = options.ctx; - if (typeof callback === 'function') { callback = ctx !== undefined ? callback.bind(ctx) : callback; setTimeout(function () { @@ -9736,50 +8885,48 @@ }); } }; + /** * https://yandex.ru/support/metrica/objects/addfileextension.html */ - - var addFileExtension = noopFunc; + /** * https://yandex.ru/support/metrica/objects/extlink.html */ - var extLink = asyncCallbackFromOptions; + /** * https://yandex.ru/support/metrica/objects/file.html */ - var file = asyncCallbackFromOptions; + /** * https://yandex.ru/support/metrica/objects/get-client-id.html * @param {Function} cb */ - var getClientID = function getClientID(id, cb) { if (!cb) { return; } - setTimeout(cb(null)); }; + /** * https://yandex.ru/support/metrica/objects/hit.html */ - - var hitFunc = asyncCallbackFromOptions; + /** * https://yandex.ru/support/metrica/objects/notbounce.html */ - var notBounce = asyncCallbackFromOptions; + /** * https://yandex.ru/support/metrica/objects/params-method.html */ - var params = noopFunc; + /** * https://yandex.ru/support/metrica/objects/reachgoal.html * @param {string} target @@ -9787,25 +8934,24 @@ * @param {Function} callback * @param {any} ctx */ - var reachGoal = function reachGoal(id, target, params, callback, ctx) { asyncCallbackFromOptions(null, null, { callback: callback, ctx: ctx }); }; + /** * https://yandex.ru/support/metrica/objects/set-user-id.html */ - - var setUserID = noopFunc; + /** * https://yandex.ru/support/metrica/objects/user-params.html */ + var userParams = noopFunc; - var userParams = noopFunc; // https://github.com/AdguardTeam/Scriptlets/issues/198 - + // https://github.com/AdguardTeam/Scriptlets/issues/198 var destruct = noopFunc; var api = { addFileExtension: addFileExtension, @@ -9820,21 +8966,17 @@ userParams: userParams, destruct: destruct }; - function ym(id, funcName) { for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return api[funcName] && api[funcName].apply(api, [id].concat(args)); } - function init(id) { // yaCounter object should provide api window["yaCounter".concat(id)] = api; document.dispatchEvent(new Event("yacounter".concat(id, "inited"))); } - if (typeof window.ym === 'undefined') { window.ym = ym; ym.a = []; @@ -9847,7 +8989,6 @@ init(id); }); } - hit(source); } metrikaYandexTag.names = ['metrika-yandex-tag']; @@ -9865,19 +9006,17 @@ * ||mc.yandex.ru/metrika/watch.js$script,redirect=metrika-yandex-watch * ``` */ - function metrikaYandexWatch(source) { var cbName = 'yandex_metrika_callbacks'; + /** * Gets callback and its context from options and call it in async way * @param {Object} options Yandex Metrika API options */ - var asyncCallbackFromOptions = function asyncCallbackFromOptions() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var callback = options.callback; var ctx = options.ctx; - if (typeof callback === 'function') { callback = ctx !== undefined ? callback.bind(ctx) : callback; setTimeout(function () { @@ -9885,41 +9024,34 @@ }); } }; - function Metrika() {} // constructor - - - Metrika.counters = noopArray; // Methods without options - + Metrika.counters = noopArray; + // Methods without options Metrika.prototype.addFileExtension = noopFunc; Metrika.prototype.getClientID = noopFunc; Metrika.prototype.setUserID = noopFunc; Metrika.prototype.userParams = noopFunc; Metrika.prototype.params = noopFunc; - Metrika.prototype.counters = noopArray; // Methods with options - // The order of arguments should be kept in according to API + Metrika.prototype.counters = noopArray; + // Methods with options + // The order of arguments should be kept in according to API Metrika.prototype.extLink = function (url, options) { asyncCallbackFromOptions(options); }; - Metrika.prototype.file = function (url, options) { asyncCallbackFromOptions(options); }; - Metrika.prototype.hit = function (url, options) { asyncCallbackFromOptions(options); }; - Metrika.prototype.reachGoal = function (target, params, cb, ctx) { asyncCallbackFromOptions({ callback: cb, ctx: ctx }); }; - Metrika.prototype.notBounce = asyncCallbackFromOptions; - if (window.Ya) { window.Ya.Metrika = Metrika; } else { @@ -9927,7 +9059,6 @@ Metrika: Metrika }; } - if (window[cbName] && Array.isArray(window[cbName])) { window[cbName].forEach(function (func) { if (typeof func === 'function') { @@ -9935,13 +9066,13 @@ } }); } - hit(source); } metrikaYandexWatch.names = ['metrika-yandex-watch']; metrikaYandexWatch.injections = [hit, noopFunc, noopArray]; /* eslint-disable func-names */ + /** * @redirect pardot-1.0 * @@ -9966,7 +9097,6 @@ window.piGetParameter = noopNull; window.piSetCookie = noopFunc; window.piGetCookie = noopStr; - function piTracker() { window.pi = { tracker: { @@ -9978,7 +9108,6 @@ }; window.piScriptNum += 1; } - window.piResponse = noopFunc; window.piTracker = piTracker; piTracker(); @@ -9987,6 +9116,28 @@ Pardot.names = ['pardot-1.0']; Pardot.injections = [hit, noopFunc, noopStr, noopNull]; + /** + * @redirect prevent-bab + * + * @description + * Prevents BlockAdblock script from detecting an ad blocker. + * + * Mostly it is used as `scriptlet`. + * See [scriptlet description](../wiki/about-scriptlets.md#prevent-bab). + * + * Related UBO redirect resource: + * https://github.com/gorhill/uBlock/blob/a94df7f3b27080ae2dcb3b914ace39c0c294d2f6/src/web_accessible_resources/nobab.js + * + * **Example** + * ``` + * /blockadblock.$script,redirect=prevent-bab + * ``` + */ + var preventBab$1 = preventBab$2; + preventBab$1.names = ['prevent-bab' + // list of prevent-bab redirect aliases + ]; + /** * @redirect amazon-apstag * @@ -10001,7 +9152,6 @@ * ||amazon-adsystem.com/aax2/apstag.js$script,redirect=amazon-apstag * ``` */ - function AmazonApstag(source) { var apstagWrapper = { fetchBids: function fetchBids(a, b) { @@ -10020,6 +9170,7 @@ AmazonApstag.injections = [hit, noopFunc]; /* eslint-disable func-names */ + /** * @redirect matomo * @@ -10034,14 +9185,11 @@ function Matomo(source) { var Tracker = function Tracker() {}; - Tracker.prototype.setDoNotTrack = noopFunc; Tracker.prototype.setDomains = noopFunc; Tracker.prototype.setCustomDimension = noopFunc; Tracker.prototype.trackPageView = noopFunc; - var AsyncTracker = function AsyncTracker() {}; - AsyncTracker.prototype.addListener = noopFunc; var matomoWrapper = { getTracker: function getTracker() { @@ -10058,6 +9206,7 @@ Matomo.injections = [hit, noopFunc]; /* eslint-disable func-names */ + /** * @redirect fingerprintjs2 * @@ -10073,41 +9222,38 @@ * ||the-japan-news.com/modules/js/lib/fgp/fingerprint2.js$script,redirect=fingerprintjs2 * ``` */ - function Fingerprintjs2(source) { var browserId = ''; - for (var i = 0; i < 8; i += 1) { browserId += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4); } - var Fingerprint2 = function Fingerprint2() {}; - Fingerprint2.get = function (options, callback) { if (!callback) { callback = options; } - setTimeout(function () { if (callback) { callback(browserId, []); } }, 1); }; - Fingerprint2.prototype = { get: Fingerprint2.get }; window.Fingerprint2 = Fingerprint2; hit(source); } - Fingerprintjs2.names = ['fingerprintjs2', // redirect aliases are needed for conversion: + Fingerprintjs2.names = ['fingerprintjs2', + // redirect aliases are needed for conversion: // prefixed for us - 'ubo-fingerprint2.js', // original ubo name + 'ubo-fingerprint2.js', + // original ubo name 'fingerprint2.js']; Fingerprintjs2.injections = [hit]; /* eslint-disable func-names */ + /** * @redirect fingerprintjs3 * @@ -10123,20 +9269,15 @@ * ||sephora.com/js/ufe/isomorphic/thirdparty/fp.min.js$script,redirect=fingerprintjs3 * ``` */ - function Fingerprintjs3(source) { var visitorId = function () { var id = ''; - for (var i = 0; i < 8; i += 1) { id += (Math.random() * 0x10000 + 0x1000).toString(16).slice(-4); } - return id; }(); - var FingerprintJS = function FingerprintJS() {}; - FingerprintJS.prototype = { load: function load() { // eslint-disable-next-line compat/compat @@ -10153,13 +9294,16 @@ window.FingerprintJS = new FingerprintJS(); hit(source); } - Fingerprintjs3.names = ['fingerprintjs3', // redirect aliases are needed for conversion: + Fingerprintjs3.names = ['fingerprintjs3', + // redirect aliases are needed for conversion: // prefixed for us - 'ubo-fingerprint3.js', // original ubo name + 'ubo-fingerprint3.js', + // original ubo name 'fingerprint3.js']; Fingerprintjs3.injections = [hit, noopStr]; /* eslint-disable func-names */ + /** * @redirect gemius * @@ -10172,10 +9316,8 @@ * ||gapt.hit.gemius.pl/gplayer.js$script,redirect=gemius * ``` */ - function Gemius(source) { var GemiusPlayer = function GemiusPlayer() {}; - GemiusPlayer.prototype = { setVideoObject: noopFunc, newProgram: noopFunc, @@ -10201,7 +9343,6 @@ * ||bloctel.gouv.fr/assets/scripts/smarttag.js$script,redirect=ati-smarttag * ``` */ - function ATInternetSmartTag(source) { var setNoopFuncWrapper = { set: noopFunc @@ -10229,10 +9370,10 @@ removeProduct: { products: setNoopFuncWrapper } - }; // eslint-disable-next-line new-cap, func-names + }; + // eslint-disable-next-line new-cap, func-names var tag = function tag() {}; - tag.prototype = { setConfig: noopFunc, setParam: noopFunc, @@ -10277,6 +9418,7 @@ } } }; + window.ATInternet = smartTagWrapper; hit(source); } @@ -10284,6 +9426,7 @@ ATInternetSmartTag.injections = [hit, noopFunc]; /* eslint-disable consistent-return, no-eval */ + /** * @redirect prevent-bab2 * @@ -10300,37 +9443,32 @@ * /blockadblock.$script,redirect=prevent-bab2 * ``` */ - function preventBab2(source) { // eslint-disable-next-line compat/compat var script = document.currentScript; - if (script === null) { return; } - var url = script.src; - if (typeof url !== 'string') { return; } - var domainsStr = ['adclixx\\.net', 'adnetasia\\.com', 'adtrackers\\.net', 'bannertrack\\.net'].join('|'); var matchStr = "^https?://[\\w-]+\\.(".concat(domainsStr, ")/."); var domainsRegex = new RegExp(matchStr); - if (domainsRegex.test(url) === false) { return; } - window.nH7eXzOsG = 858; hit(source); } - preventBab2.names = ['prevent-bab2', // aliases are needed for matching the related scriptlet converted into our syntax + preventBab2.names = ['prevent-bab2', + // aliases are needed for matching the related scriptlet converted into our syntax 'nobab2.js']; preventBab2.injections = [hit]; /* eslint-disable func-names, no-underscore-dangle */ + /** * @redirect google-ima3 * @@ -10346,14 +9484,10 @@ function GoogleIma3(source) { var VERSION = '3.453.0'; var ima = {}; - var AdDisplayContainer = function AdDisplayContainer() {}; - AdDisplayContainer.prototype.destroy = noopFunc; AdDisplayContainer.prototype.initialize = noopFunc; - var ImaSdkSettings = function ImaSdkSettings() {}; - ImaSdkSettings.CompanionBackfillMode = { ALWAYS: 'always', ON_MASTER_AD: 'on_master_ad' @@ -10457,16 +9591,13 @@ INSECURE: 2 } }; - var EventHandler = function EventHandler() { this.listeners = new Map(); - this._dispatch = function (e) { - var listeners = this.listeners.get(e.type) || []; // eslint-disable-next-line no-restricted-syntax - + var listeners = this.listeners.get(e.type) || []; + // eslint-disable-next-line no-restricted-syntax for (var _i = 0, _Array$from = Array.from(listeners); _i < _Array$from.length; _i++) { var listener = _Array$from[_i]; - try { listener(e); } catch (r) { @@ -10474,25 +9605,19 @@ } } }; - this.addEventListener = function (t, c) { if (!this.listeners.has(t)) { this.listeners.set(t, new Set()); } - this.listeners.get(t).add(c); }; - this.removeEventListener = function (t, c) { var _this$listeners$get; - (_this$listeners$get = this.listeners.get(t)) === null || _this$listeners$get === void 0 ? void 0 : _this$listeners$get.delete(c); }; }; - var AdsManager = new EventHandler(); /* eslint-disable no-use-before-define */ - AdsManager.volume = 1; AdsManager.collapse = noopFunc; AdsManager.configureAdsManager = noopFunc; @@ -10500,57 +9625,43 @@ AdsManager.discardAdBreak = noopFunc; AdsManager.expand = noopFunc; AdsManager.focus = noopFunc; - AdsManager.getAdSkippableState = function () { return false; }; - AdsManager.getCuePoints = function () { return [0]; }; - AdsManager.getCurrentAd = function () { return currentAd; }; - AdsManager.getCurrentAdCuePoints = function () { return []; }; - AdsManager.getRemainingTime = function () { return 0; }; - AdsManager.getVolume = function () { return this.volume; }; - AdsManager.init = noopFunc; - AdsManager.isCustomClickTrackingUsed = function () { return false; }; - AdsManager.isCustomPlaybackUsed = function () { return false; }; - AdsManager.pause = noopFunc; AdsManager.requestNextAdBreak = noopFunc; AdsManager.resize = noopFunc; AdsManager.resume = noopFunc; - AdsManager.setVolume = function (v) { this.volume = v; }; - AdsManager.skip = noopFunc; - AdsManager.start = function () { // eslint-disable-next-line no-restricted-syntax for (var _i2 = 0, _arr = [AdEvent.Type.ALL_ADS_COMPLETED, AdEvent.Type.CONTENT_RESUME_REQUESTED]; _i2 < _arr.length; _i2++) { var type = _arr[_i2]; - try { this._dispatch(new ima.AdEvent(type)); } catch (e) { @@ -10558,19 +9669,16 @@ } } }; - AdsManager.stop = noopFunc; AdsManager.updateAdsRenderingSettings = noopFunc; /* eslint-enable no-use-before-define */ var manager = Object.create(AdsManager); - var AdsManagerLoadedEvent = function AdsManagerLoadedEvent(type, adsRequest, userRequestContext) { this.type = type; this.adsRequest = adsRequest; this.userRequestContext = userRequestContext; }; - AdsManagerLoadedEvent.prototype = { getAdsManager: function getAdsManager() { return manager; @@ -10579,7 +9687,6 @@ if (this.userRequestContext) { return this.userRequestContext; } - return {}; } }; @@ -10590,22 +9697,17 @@ AdsLoader.prototype.settings = new ImaSdkSettings(); AdsLoader.prototype.contentComplete = noopFunc; AdsLoader.prototype.destroy = noopFunc; - AdsLoader.prototype.getSettings = function () { return this.settings; }; - AdsLoader.prototype.getVersion = function () { return VERSION; }; - AdsLoader.prototype.requestAds = function (adsRequest, userRequestContext) { var _this = this; - requestAnimationFrame(function () { var ADS_MANAGER_LOADED = AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED; var event = new ima.AdsManagerLoadedEvent(ADS_MANAGER_LOADED, adsRequest, userRequestContext); - _this._dispatch(event); }); var e = new ima.AdError('adPlayError', 1205, 1205, 'The browser prevented playback initiated without user interaction.', adsRequest, userRequestContext); @@ -10613,19 +9715,14 @@ _this._dispatch(new ima.AdErrorEvent(e)); }); }; - var AdsRenderingSettings = noopFunc; - var AdsRequest = function AdsRequest() {}; - AdsRequest.prototype = { setAdWillAutoPlay: noopFunc, setAdWillPlayMuted: noopFunc, setContinuousPlayback: noopFunc }; - var AdPodInfo = function AdPodInfo() {}; - AdPodInfo.prototype = { getAdPosition: function getAdPosition() { return 1; @@ -10646,9 +9743,7 @@ return 1; } }; - var Ad = function Ad() {}; - Ad.prototype = { pi: new AdPodInfo(), getAdId: function getAdId() { @@ -10745,9 +9840,7 @@ return true; } }; - var CompanionAd = function CompanionAd() {}; - CompanionAd.prototype = { getAdSlotId: function getAdSlotId() { return ''; @@ -10765,65 +9858,49 @@ return 1; } }; - var AdError = function AdError(type, code, vast, message, adsRequest, userRequestContext) { this.errorCode = code; this.message = message; this.type = type; this.adsRequest = adsRequest; this.userRequestContext = userRequestContext; - this.getErrorCode = function () { return this.errorCode; }; - this.getInnerError = function () {}; - this.getMessage = function () { return this.message; }; - this.getType = function () { return this.type; }; - this.getVastErrorCode = function () { return this.vastErrorCode; }; - this.toString = function () { return "AdError ".concat(this.errorCode, ": ").concat(this.message); }; }; - AdError.ErrorCode = {}; AdError.Type = {}; - var isEngadget = function isEngadget() { try { // eslint-disable-next-line no-restricted-syntax for (var _i3 = 0, _Object$values = Object.values(window.vidible._getContexts()); _i3 < _Object$values.length; _i3++) { var _ctx$getPlayer, _ctx$getPlayer$div; - var ctx = _Object$values[_i3]; - // eslint-disable-next-line no-restricted-properties if ((_ctx$getPlayer = ctx.getPlayer()) !== null && _ctx$getPlayer !== void 0 && (_ctx$getPlayer$div = _ctx$getPlayer.div) !== null && _ctx$getPlayer$div !== void 0 && _ctx$getPlayer$div.innerHTML.includes('www.engadget.com')) { return true; } } } catch (e) {} // eslint-disable-line no-empty - - return false; }; - var currentAd = isEngadget() ? undefined : new Ad(); - var AdEvent = function AdEvent(type) { this.type = type; }; - AdEvent.prototype = { getAd: function getAd() { return currentAd; @@ -10864,38 +9941,28 @@ VOLUME_CHANGED: 'volumeChange', VOLUME_MUTED: 'mute' }; - var AdErrorEvent = function AdErrorEvent(error) { this.error = error; this.type = 'adError'; - this.getError = function () { return this.error; }; - this.getUserRequestContext = function () { var _this$error; - if ((_this$error = this.error) !== null && _this$error !== void 0 && _this$error.userRequestContext) { return this.error.userRequestContext; } - return {}; }; }; - AdErrorEvent.Type = { AD_ERROR: 'adError' }; - var CustomContentLoadedEvent = function CustomContentLoadedEvent() {}; - CustomContentLoadedEvent.Type = { CUSTOM_CONTENT_LOADED: 'deprecated-event' }; - var CompanionAdSelectionSettings = function CompanionAdSelectionSettings() {}; - CompanionAdSelectionSettings.CreativeType = { ALL: 'All', FLASH: 'Flash', @@ -10912,9 +9979,7 @@ SELECT_EXACT_MATCH: 'SelectExactMatch', SELECT_NEAR_MATCH: 'SelectNearMatch' }; - var AdCuePoints = function AdCuePoints() {}; - AdCuePoints.prototype = { getCuePoints: function getCuePoints() { return []; @@ -10927,9 +9992,7 @@ } }; var AdProgressData = noopFunc; - var UniversalAdIdInfo = function UniversalAdIdInfo() {}; - Object.assign(ima, { AdCuePoints: AdCuePoints, AdDisplayContainer: AdDisplayContainer, @@ -10965,11 +10028,9 @@ NORMAL: 'normal' } }); - if (!window.google) { window.google = {}; } - window.google.ima = ima; hit(source); } @@ -10977,6 +10038,7 @@ GoogleIma3.injections = [hit, noopFunc, logMessage]; /* eslint-disable func-names, no-underscore-dangle */ + /** * @redirect didomi-loader * @@ -10989,26 +10051,19 @@ * ||sdk.privacy-center.org/fbf86806f86e/loader.js$script,redirect=didomi-loader * ``` */ - function DidomiLoader(source) { function UserConsentStatusForVendorSubscribe() {} - UserConsentStatusForVendorSubscribe.prototype.filter = function () { return new UserConsentStatusForVendorSubscribe(); }; - UserConsentStatusForVendorSubscribe.prototype.subscribe = noopFunc; - function UserConsentStatusForVendor() {} - UserConsentStatusForVendor.prototype.first = function () { return new UserConsentStatusForVendorSubscribe(); }; - UserConsentStatusForVendor.prototype.filter = function () { return new UserConsentStatusForVendorSubscribe(); }; - UserConsentStatusForVendor.prototype.subscribe = noopFunc; var DidomiWrapper = { isConsentRequired: falseFunc, @@ -11069,16 +10124,15 @@ purpose: { consents: [] } - }; // https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#how-does-the-cmp-provide-the-api + }; + // https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#how-does-the-cmp-provide-the-api var __tcfapiWrapper = function __tcfapiWrapper(command, version, callback) { if (typeof callback !== 'function' || command === 'removeEventListener') { return; } - callback(tcData, true); }; - window.__tcfapi = __tcfapiWrapper; var didomiEventListenersWrapper = { stub: true, @@ -11091,7 +10145,6 @@ if (typeof arg !== 'function') { return; } - if (document.readyState !== 'complete') { window.addEventListener('load', function () { setTimeout(arg(window.Didomi)); @@ -11102,7 +10155,6 @@ } }; window.didomiOnReady = window.didomiOnReady || didomiOnReadyWrapper; - if (Array.isArray(window.didomiOnReady)) { window.didomiOnReady.forEach(function (arg) { if (typeof arg === 'function') { @@ -11114,13 +10166,13 @@ } }); } - hit(source); } DidomiLoader.names = ['didomi-loader']; DidomiLoader.injections = [hit, noopFunc, noopArray, trueFunc, falseFunc]; /* eslint-disable func-names */ + /** * @redirect prebid * @@ -11144,7 +10196,6 @@ } } }; - var pbjsWrapper = { addAdUnits: function addAdUnits() {}, adServers: { @@ -11184,6 +10235,7 @@ Prebid.injections = [hit, noopFunc, noopStr, noopArray]; /* eslint-disable func-names */ + /** * @redirect prebid-ads * @@ -11197,7 +10249,6 @@ * ||playerdrive.me/assets/js/prebid-ads.js$script,redirect=prebid-ads * ``` */ - function prebidAds(source) { window.canRunAds = true; window.isAdBlockActive = false; @@ -11207,6 +10258,7 @@ prebidAds.injections = [hit]; /* eslint-disable func-names */ + /** * @redirect naver-wcslog * @@ -11264,7 +10316,6 @@ throw new TypeError("Cannot call a class as a function"); } } - var classCallCheck = _classCallCheck; function _defineProperties(target, props) { @@ -11276,58 +10327,45 @@ Object.defineProperty(target, descriptor.key, descriptor); } } - function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - var createClass = _createClass; function isNothing(subject) { return typeof subject === 'undefined' || subject === null; } - function isObject(subject) { return typeof subject === 'object' && subject !== null; } - function toArray(sequence) { if (Array.isArray(sequence)) return sequence;else if (isNothing(sequence)) return []; return [sequence]; } - function extend(target, source) { var index, length, key, sourceKeys; - if (source) { sourceKeys = Object.keys(source); - for (index = 0, length = sourceKeys.length; index < length; index += 1) { key = sourceKeys[index]; target[key] = source[key]; } } - return target; } - function repeat(string, count) { var result = '', - cycle; - + cycle; for (cycle = 0; cycle < count; cycle += 1) { result += string; } - return result; } - function isNegativeZero(number) { return number === 0 && Number.NEGATIVE_INFINITY === 1 / number; } - var isNothing_1 = isNothing; var isObject_1 = isObject; var toArray_1 = toArray; @@ -11351,8 +10389,9 @@ this.name = 'YAMLException'; this.reason = reason; this.mark = mark; - this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : ''); // Include stack trace in error object + this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : ''); + // Include stack trace in error object if (Error.captureStackTrace) { // Chrome and NodeJS Error.captureStackTrace(this, this.constructor); @@ -11360,23 +10399,19 @@ // FF, IE 10+ and Safari 6+. Fallback for others this.stack = new Error().stack || ''; } - } // Inherit from Error - + } + // Inherit from Error YAMLException$1.prototype = Object.create(Error.prototype); YAMLException$1.prototype.constructor = YAMLException$1; - YAMLException$1.prototype.toString = function toString(compact) { var result = this.name + ': '; result += this.reason || '(unknown reason)'; - if (!compact && this.mark) { result += ' ' + this.mark.toString(); } - return result; }; - var exception = YAMLException$1; function Mark(name, buffer, position, line, column) { @@ -11386,7 +10421,6 @@ this.line = line; this.column = column; } - Mark.prototype.getSnippet = function getSnippet(indent, maxLength) { var head, start, tail, end, snippet; if (!this.buffer) return null; @@ -11394,63 +10428,48 @@ maxLength = maxLength || 75; head = ''; start = this.position; - while (start > 0 && "\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(start - 1)) === -1) { start -= 1; - if (this.position - start > maxLength / 2 - 1) { head = ' ... '; start += 5; break; } } - tail = ''; end = this.position; - while (end < this.buffer.length && "\0\r\n\x85\u2028\u2029".indexOf(this.buffer.charAt(end)) === -1) { end += 1; - if (end - this.position > maxLength / 2 - 1) { tail = ' ... '; end -= 5; break; } } - snippet = this.buffer.slice(start, end); return common.repeat(' ', indent) + head + snippet + tail + '\n' + common.repeat(' ', indent + this.position - start + head.length) + '^'; }; - Mark.prototype.toString = function toString(compact) { var snippet, - where = ''; - + where = ''; if (this.name) { where += 'in "' + this.name + '" '; } - where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1); - if (!compact) { snippet = this.getSnippet(); - if (snippet) { where += ':\n' + snippet; } } - return where; }; - var mark = Mark; var TYPE_CONSTRUCTOR_OPTIONS = ['kind', 'resolve', 'construct', 'instanceOf', 'predicate', 'represent', 'defaultStyle', 'styleAliases']; var YAML_NODE_KINDS = ['scalar', 'sequence', 'mapping']; - function compileStyleAliases(map) { var result = {}; - if (map !== null) { Object.keys(map).forEach(function (style) { map[style].forEach(function (alias) { @@ -11458,45 +10477,38 @@ }); }); } - return result; } - function Type$1(tag, options) { options = options || {}; Object.keys(options).forEach(function (name) { if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); } - }); // TODO: Add tag format check. + }); + // TODO: Add tag format check. this.tag = tag; this.kind = options['kind'] || null; - this.resolve = options['resolve'] || function () { return true; }; - this.construct = options['construct'] || function (data) { return data; }; - this.instanceOf = options['instanceOf'] || null; this.predicate = options['predicate'] || null; this.represent = options['represent'] || null; this.defaultStyle = options['defaultStyle'] || null; this.styleAliases = compileStyleAliases(options['styleAliases'] || null); - if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); } } - var type = Type$1; /*eslint-disable max-len*/ - function compileList(schema, name, result) { var exclude = []; schema.include.forEach(function (includedSchema) { @@ -11514,30 +10526,24 @@ return exclude.indexOf(index) === -1; }); } - - function compileMap() - /* lists... */ - { + function compileMap( /* lists... */ + ) { var result = { - scalar: {}, - sequence: {}, - mapping: {}, - fallback: {} - }, - index, - length; - + scalar: {}, + sequence: {}, + mapping: {}, + fallback: {} + }, + index, + length; function collectType(type) { result[type.kind][type.tag] = result['fallback'][type.tag] = type; } - for (index = 0, length = arguments.length; index < length; index += 1) { arguments[index].forEach(collectType); } - return result; } - function Schema$1(definition) { this.include = definition.include || []; this.implicit = definition.implicit || []; @@ -11551,48 +10557,38 @@ this.compiledExplicit = compileList(this, 'explicit', []); this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit); } - Schema$1.DEFAULT = null; - Schema$1.create = function createSchema() { var schemas, types; - switch (arguments.length) { case 1: schemas = Schema$1.DEFAULT; types = arguments[0]; break; - case 2: schemas = arguments[0]; types = arguments[1]; break; - default: throw new exception('Wrong number of arguments for Schema.create function'); } - schemas = common.toArray(schemas); types = common.toArray(types); - if (!schemas.every(function (schema) { return schema instanceof Schema$1; })) { throw new exception('Specified list of super schemas (or a single Schema object) contains a non-Schema object.'); } - if (!types.every(function (type$1) { return type$1 instanceof type; })) { throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.'); } - return new Schema$1({ include: schemas, explicit: types }); }; - var schema = Schema$1; var str = new type('tag:yaml.org,2002:str', { @@ -11625,15 +10621,12 @@ var max = data.length; return max === 1 && data === '~' || max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'); } - function constructYamlNull() { return null; } - function isNull(object) { return object === null; } - var _null = new type('tag:yaml.org,2002:null', { kind: 'scalar', resolve: resolveYamlNull, @@ -11661,15 +10654,12 @@ var max = data.length; return max === 4 && (data === 'true' || data === 'True' || data === 'TRUE') || max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'); } - function constructYamlBoolean(data) { return data === 'true' || data === 'True' || data === 'TRUE'; } - function isBoolean(object) { return Object.prototype.toString.call(object) === '[object Boolean]'; } - var bool = new type('tag:yaml.org,2002:bool', { kind: 'scalar', resolve: resolveYamlBoolean, @@ -11690,145 +10680,114 @@ }); function isHexCode(c) { - return 0x30 - /* 0 */ - <= c && c <= 0x39 - /* 9 */ - || 0x41 - /* A */ - <= c && c <= 0x46 - /* F */ - || 0x61 - /* a */ - <= c && c <= 0x66 - /* f */ - ; + return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */ || 0x41 /* A */ <= c && c <= 0x46 /* F */ || 0x61 /* a */ <= c && c <= 0x66 /* f */; } function isOctCode(c) { - return 0x30 - /* 0 */ - <= c && c <= 0x37 - /* 7 */ - ; + return 0x30 /* 0 */ <= c && c <= 0x37 /* 7 */; } function isDecCode(c) { - return 0x30 - /* 0 */ - <= c && c <= 0x39 - /* 9 */ - ; + return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */; } function resolveYamlInteger(data) { if (data === null) return false; var max = data.length, - index = 0, - hasDigits = false, - ch; + index = 0, + hasDigits = false, + ch; if (!max) return false; - ch = data[index]; // sign + ch = data[index]; + // sign if (ch === '-' || ch === '+') { ch = data[++index]; } - if (ch === '0') { // 0 if (index + 1 === max) return true; - ch = data[++index]; // base 2, base 8, base 16 + ch = data[++index]; + + // base 2, base 8, base 16 if (ch === 'b') { // base 2 index++; - for (; index < max; index++) { ch = data[index]; if (ch === '_') continue; if (ch !== '0' && ch !== '1') return false; hasDigits = true; } - return hasDigits && ch !== '_'; } - if (ch === 'x') { // base 16 index++; - for (; index < max; index++) { ch = data[index]; if (ch === '_') continue; if (!isHexCode(data.charCodeAt(index))) return false; hasDigits = true; } - return hasDigits && ch !== '_'; - } // base 8 - + } + // base 8 for (; index < max; index++) { ch = data[index]; if (ch === '_') continue; if (!isOctCode(data.charCodeAt(index))) return false; hasDigits = true; } - return hasDigits && ch !== '_'; - } // base 10 (except 0) or base 60 - // value should not start with `_`; + } + // base 10 (except 0) or base 60 + // value should not start with `_`; if (ch === '_') return false; - for (; index < max; index++) { ch = data[index]; if (ch === '_') continue; if (ch === ':') break; - if (!isDecCode(data.charCodeAt(index))) { return false; } - hasDigits = true; - } // Should have digits and should not end with `_` - + } - if (!hasDigits || ch === '_') return false; // if !base60 - done; + // Should have digits and should not end with `_` + if (!hasDigits || ch === '_') return false; - if (ch !== ':') return true; // base60 almost not used, no needs to optimize + // if !base60 - done; + if (ch !== ':') return true; + // base60 almost not used, no needs to optimize return /^(:[0-5]?[0-9])+$/.test(data.slice(index)); } - function constructYamlInteger(data) { var value = data, - sign = 1, - ch, - base, - digits = []; - + sign = 1, + ch, + base, + digits = []; if (value.indexOf('_') !== -1) { value = value.replace(/_/g, ''); } - ch = value[0]; - if (ch === '-' || ch === '+') { if (ch === '-') sign = -1; value = value.slice(1); ch = value[0]; } - if (value === '0') return 0; - if (ch === '0') { if (value[1] === 'b') return sign * parseInt(value.slice(2), 2); if (value[1] === 'x') return sign * parseInt(value, 16); return sign * parseInt(value, 8); } - if (value.indexOf(':') !== -1) { value.split(':').forEach(function (v) { digits.unshift(parseInt(v, 10)); @@ -11841,14 +10800,11 @@ }); return sign * value; } - return sign * parseInt(value, 10); } - function isInteger(object) { return Object.prototype.toString.call(object) === '[object Number]' && object % 1 === 0 && !common.isNegativeZero(object); } - var int = new type('tag:yaml.org,2002:int', { kind: 'scalar', resolve: resolveYamlInteger, @@ -11864,7 +10820,6 @@ decimal: function decimal(obj) { return obj.toString(10); }, - /* eslint-disable max-len */ hexadecimal: function hexadecimal(obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); @@ -11879,36 +10834,36 @@ } }); - var YAML_FLOAT_PATTERN = new RegExp( // 2.5e4, 2.5 and integers - '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' + // .2e4, .2 + var YAML_FLOAT_PATTERN = new RegExp( + // 2.5e4, 2.5 and integers + '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' + + // .2e4, .2 // special case, seems not from spec - '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' + // 20:59 - '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' + // .inf - '|[-+]?\\.(?:inf|Inf|INF)' + // .nan + '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' + + // 20:59 + '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' + + // .inf + '|[-+]?\\.(?:inf|Inf|INF)' + + // .nan '|\\.(?:nan|NaN|NAN))$'); - function resolveYamlFloat(data) { if (data === null) return false; - - if (!YAML_FLOAT_PATTERN.test(data) || // Quick hack to not allow integers end with `_` + if (!YAML_FLOAT_PATTERN.test(data) || + // Quick hack to not allow integers end with `_` // Probably should update regexp & check speed data[data.length - 1] === '_') { return false; } - return true; } - function constructYamlFloat(data) { var value, sign, base, digits; value = data.replace(/_/g, '').toLowerCase(); sign = value[0] === '-' ? -1 : 1; digits = []; - if ('+-'.indexOf(value[0]) >= 0) { value = value.slice(1); } - if (value === '.inf') { return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; } else if (value === '.nan') { @@ -11925,23 +10880,17 @@ }); return sign * value; } - return sign * parseFloat(value, 10); } - var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; - function representYamlFloat(object, style) { var res; - if (isNaN(object)) { switch (style) { case 'lowercase': return '.nan'; - case 'uppercase': return '.NAN'; - case 'camelcase': return '.NaN'; } @@ -11949,10 +10898,8 @@ switch (style) { case 'lowercase': return '.inf'; - case 'uppercase': return '.INF'; - case 'camelcase': return '.Inf'; } @@ -11960,27 +10907,24 @@ switch (style) { case 'lowercase': return '-.inf'; - case 'uppercase': return '-.INF'; - case 'camelcase': return '-.Inf'; } } else if (common.isNegativeZero(object)) { return '-0.0'; } + res = object.toString(10); - res = object.toString(10); // JS stringifier can build scientific format without dots: 5e-100, + // JS stringifier can build scientific format without dots: 5e-100, // while YAML requres dot: 5.e-100. Fix it with simple hack return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res; } - function isFloat(object) { return Object.prototype.toString.call(object) === '[object Number]' && (object % 1 !== 0 || common.isNegativeZero(object)); } - var float = new type('tag:yaml.org,2002:float', { kind: 'scalar', resolve: resolveYamlFloat, @@ -11999,19 +10943,30 @@ include: [json] }); - var YAML_DATE_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' + // [1] year - '-([0-9][0-9])' + // [2] month + var YAML_DATE_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' + + // [1] year + '-([0-9][0-9])' + + // [2] month '-([0-9][0-9])$'); // [3] day - var YAML_TIMESTAMP_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' + // [1] year - '-([0-9][0-9]?)' + // [2] month - '-([0-9][0-9]?)' + // [3] day - '(?:[Tt]|[ \\t]+)' + // ... - '([0-9][0-9]?)' + // [4] hour - ':([0-9][0-9])' + // [5] minute - ':([0-9][0-9])' + // [6] second - '(?:\\.([0-9]*))?' + // [7] fraction - '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour + var YAML_TIMESTAMP_REGEXP = new RegExp('^([0-9][0-9][0-9][0-9])' + + // [1] year + '-([0-9][0-9]?)' + + // [2] month + '-([0-9][0-9]?)' + + // [3] day + '(?:[Tt]|[ \\t]+)' + + // ... + '([0-9][0-9]?)' + + // [4] hour + ':([0-9][0-9])' + + // [5] minute + ':([0-9][0-9])' + + // [6] second + '(?:\\.([0-9]*))?' + + // [7] fraction + '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + + // [8] tz [9] tz_sign [10] tz_hour '(?::([0-9][0-9]))?))?$'); // [11] tz_minute function resolveYamlTimestamp(data) { @@ -12020,70 +10975,62 @@ if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; return false; } - function constructYamlTimestamp(data) { var match, - year, - month, - day, - hour, - minute, - second, - fraction = 0, - delta = null, - tz_hour, - tz_minute, - date; + year, + month, + day, + hour, + minute, + second, + fraction = 0, + delta = null, + tz_hour, + tz_minute, + date; match = YAML_DATE_REGEXP.exec(data); if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); - if (match === null) throw new Error('Date resolve error'); // match: [1] year [2] month [3] day + if (match === null) throw new Error('Date resolve error'); + + // match: [1] year [2] month [3] day year = +match[1]; month = +match[2] - 1; // JS month starts with 0 - day = +match[3]; - if (!match[4]) { // no hour return new Date(Date.UTC(year, month, day)); - } // match: [4] hour [5] minute [6] second [7] fraction + } + // match: [4] hour [5] minute [6] second [7] fraction hour = +match[4]; minute = +match[5]; second = +match[6]; - if (match[7]) { fraction = match[7].slice(0, 3); - while (fraction.length < 3) { // milli-seconds fraction += '0'; } - fraction = +fraction; - } // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute + } + // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute if (match[9]) { tz_hour = +match[10]; tz_minute = +(match[11] || 0); delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds - if (match[9] === '-') delta = -delta; } - date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); if (delta) date.setTime(date.getTime() - delta); return date; } - - function representYamlTimestamp(object - /*, style*/ - ) { + function representYamlTimestamp(object /*, style*/) { return object.toISOString(); } - var timestamp = new type('tag:yaml.org,2002:timestamp', { kind: 'scalar', resolve: resolveYamlTimestamp, @@ -12095,7 +11042,6 @@ function resolveYamlMerge(data) { return data === '<<' || data === null; } - var merge = new type('tag:yaml.org,2002:merge', { kind: 'scalar', resolve: resolveYamlMerge @@ -12107,48 +11053,49 @@ /*eslint-disable no-bitwise*/ - var NodeBuffer; - try { // A trick for browserified version, to not include `Buffer` shim var _require$1 = commonjsRequire; NodeBuffer = _require$1('buffer').Buffer; - } catch (__) {} // [ 64, 65, 66 ] -> [ padding, CR, LF ] - + } catch (__) {} + // [ 64, 65, 66 ] -> [ padding, CR, LF ] var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r'; - function resolveYamlBinary(data) { if (data === null) return false; var code, - idx, - bitlen = 0, - max = data.length, - map = BASE64_MAP; // Convert one by one. + idx, + bitlen = 0, + max = data.length, + map = BASE64_MAP; + // Convert one by one. for (idx = 0; idx < max; idx++) { - code = map.indexOf(data.charAt(idx)); // Skip CR/LF + code = map.indexOf(data.charAt(idx)); - if (code > 64) continue; // Fail on illegal characters + // Skip CR/LF + if (code > 64) continue; + // Fail on illegal characters if (code < 0) return false; bitlen += 6; - } // If there are any bits left, source was corrupted - + } + // If there are any bits left, source was corrupted return bitlen % 8 === 0; } - function constructYamlBinary(data) { var idx, - tailbits, - input = data.replace(/[\r\n=]/g, ''), - // remove CR/LF & padding to simplify scan - max = input.length, - map = BASE64_MAP, - bits = 0, - result = []; // Collect by 6*4 bits (3 bytes) + tailbits, + input = data.replace(/[\r\n=]/g, ''), + // remove CR/LF & padding to simplify scan + max = input.length, + map = BASE64_MAP, + bits = 0, + result = []; + + // Collect by 6*4 bits (3 bytes) for (idx = 0; idx < max; idx++) { if (idx % 4 === 0 && idx) { @@ -12156,13 +11103,12 @@ result.push(bits >> 8 & 0xFF); result.push(bits & 0xFF); } - bits = bits << 6 | map.indexOf(input.charAt(idx)); - } // Dump tail + } + // Dump tail tailbits = max % 4 * 6; - if (tailbits === 0) { result.push(bits >> 16 & 0xFF); result.push(bits >> 8 & 0xFF); @@ -12172,26 +11118,24 @@ result.push(bits >> 2 & 0xFF); } else if (tailbits === 12) { result.push(bits >> 4 & 0xFF); - } // Wrap into Buffer for NodeJS and leave Array for browser - + } + // Wrap into Buffer for NodeJS and leave Array for browser if (NodeBuffer) { // Support node 6.+ Buffer API when available return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result); } - return result; } - - function representYamlBinary(object - /*, style*/ - ) { + function representYamlBinary(object /*, style*/) { var result = '', - bits = 0, - idx, - tail, - max = object.length, - map = BASE64_MAP; // Convert every three bytes to 4 ASCII characters. + bits = 0, + idx, + tail, + max = object.length, + map = BASE64_MAP; + + // Convert every three bytes to 4 ASCII characters. for (idx = 0; idx < max; idx++) { if (idx % 3 === 0 && idx) { @@ -12200,13 +11144,12 @@ result += map[bits >> 6 & 0x3F]; result += map[bits & 0x3F]; } - bits = (bits << 8) + object[idx]; - } // Dump tail + } + // Dump tail tail = max % 3; - if (tail === 0) { result += map[bits >> 18 & 0x3F]; result += map[bits >> 12 & 0x3F]; @@ -12223,14 +11166,11 @@ result += map[64]; result += map[64]; } - return result; } - function isBinary(object) { return NodeBuffer && NodeBuffer.isBuffer(object); } - var binary = new type('tag:yaml.org,2002:binary', { kind: 'scalar', resolve: resolveYamlBinary, @@ -12241,39 +11181,32 @@ var _hasOwnProperty$3 = Object.prototype.hasOwnProperty; var _toString$2 = Object.prototype.toString; - function resolveYamlOmap(data) { if (data === null) return true; var objectKeys = [], - index, - length, - pair, - pairKey, - pairHasKey, - object = data; - + index, + length, + pair, + pairKey, + pairHasKey, + object = data; for (index = 0, length = object.length; index < length; index += 1) { pair = object[index]; pairHasKey = false; if (_toString$2.call(pair) !== '[object Object]') return false; - for (pairKey in pair) { if (_hasOwnProperty$3.call(pair, pairKey)) { if (!pairHasKey) pairHasKey = true;else return false; } } - if (!pairHasKey) return false; if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);else return false; } - return true; } - function constructYamlOmap(data) { return data !== null ? data : []; } - var omap = new type('tag:yaml.org,2002:omap', { kind: 'sequence', resolve: resolveYamlOmap, @@ -12281,17 +11214,15 @@ }); var _toString$1 = Object.prototype.toString; - function resolveYamlPairs(data) { if (data === null) return true; var index, - length, - pair, - keys, - result, - object = data; + length, + pair, + keys, + result, + object = data; result = new Array(object.length); - for (index = 0, length = object.length; index < length; index += 1) { pair = object[index]; if (_toString$1.call(pair) !== '[object Object]') return false; @@ -12299,29 +11230,24 @@ if (keys.length !== 1) return false; result[index] = [keys[0], pair[keys[0]]]; } - return true; } - function constructYamlPairs(data) { if (data === null) return []; var index, - length, - pair, - keys, - result, - object = data; + length, + pair, + keys, + result, + object = data; result = new Array(object.length); - for (index = 0, length = object.length; index < length; index += 1) { pair = object[index]; keys = Object.keys(pair); result[index] = [keys[0], pair[keys[0]]]; } - return result; } - var pairs = new type('tag:yaml.org,2002:pairs', { kind: 'sequence', resolve: resolveYamlPairs, @@ -12329,25 +11255,20 @@ }); var _hasOwnProperty$2 = Object.prototype.hasOwnProperty; - function resolveYamlSet(data) { if (data === null) return true; var key, - object = data; - + object = data; for (key in object) { if (_hasOwnProperty$2.call(object, key)) { if (object[key] !== null) return false; } } - return true; } - function constructYamlSet(data) { return data !== null ? data : {}; } - var set = new type('tag:yaml.org,2002:set', { kind: 'mapping', resolve: resolveYamlSet, @@ -12363,20 +11284,16 @@ function resolveJavascriptUndefined() { return true; } - function constructJavascriptUndefined() { /*eslint-disable no-undefined*/ return undefined; } - function representJavascriptUndefined() { return ''; } - function isUndefined(object) { return typeof object === 'undefined'; } - var _undefined = new type('tag:yaml.org,2002:js/undefined', { kind: 'scalar', resolve: resolveJavascriptUndefined, @@ -12389,47 +11306,41 @@ if (data === null) return false; if (data.length === 0) return false; var regexp = data, - tail = /\/([gim]*)$/.exec(data), - modifiers = ''; // if regexp starts with '/' it can have modifiers and must be properly closed - // `/foo/gim` - modifiers tail can be maximum 3 chars + tail = /\/([gim]*)$/.exec(data), + modifiers = ''; + // if regexp starts with '/' it can have modifiers and must be properly closed + // `/foo/gim` - modifiers tail can be maximum 3 chars if (regexp[0] === '/') { if (tail) modifiers = tail[1]; - if (modifiers.length > 3) return false; // if expression starts with /, is should be properly terminated - + if (modifiers.length > 3) return false; + // if expression starts with /, is should be properly terminated if (regexp[regexp.length - modifiers.length - 1] !== '/') return false; } - return true; } - function constructJavascriptRegExp(data) { var regexp = data, - tail = /\/([gim]*)$/.exec(data), - modifiers = ''; // `/foo/gim` - tail can be maximum 4 chars + tail = /\/([gim]*)$/.exec(data), + modifiers = ''; + // `/foo/gim` - tail can be maximum 4 chars if (regexp[0] === '/') { if (tail) modifiers = tail[1]; regexp = regexp.slice(1, regexp.length - modifiers.length - 1); } - return new RegExp(regexp, modifiers); } - - function representJavascriptRegExp(object - /*, style*/ - ) { + function representJavascriptRegExp(object /*, style*/) { var result = '/' + object.source + '/'; if (object.global) result += 'g'; if (object.multiline) result += 'm'; if (object.ignoreCase) result += 'i'; return result; } - function isRegExp(object) { return Object.prototype.toString.call(object) === '[object RegExp]'; } - var regexp = new type('tag:yaml.org,2002:js/regexp', { kind: 'scalar', resolve: resolveJavascriptRegExp, @@ -12438,85 +11349,73 @@ represent: representJavascriptRegExp }); - var esprima; // Browserified version does not have esprima + var esprima; + + // Browserified version does not have esprima // // 1. For node.js just require module as deps // 2. For browser try to require mudule via external AMD system. // If not found - try to fallback to window.esprima. If not // found too - then fail to parse. // - try { // workaround to exclude package from browserify list. var _require = commonjsRequire; esprima = _require('esprima'); } catch (_) { /* eslint-disable no-redeclare */ - /* global window */ if (typeof window !== 'undefined') esprima = window.esprima; } - function resolveJavascriptFunction(data) { if (data === null) return false; - try { var source = '(' + data + ')', - ast = esprima.parse(source, { - range: true - }); - + ast = esprima.parse(source, { + range: true + }); if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') { return false; } - return true; } catch (err) { return false; } } - function constructJavascriptFunction(data) { /*jslint evil:true*/ - var source = '(' + data + ')', - ast = esprima.parse(source, { - range: true - }), - params = [], - body; + var source = '(' + data + ')', + ast = esprima.parse(source, { + range: true + }), + params = [], + body; if (ast.type !== 'Program' || ast.body.length !== 1 || ast.body[0].type !== 'ExpressionStatement' || ast.body[0].expression.type !== 'ArrowFunctionExpression' && ast.body[0].expression.type !== 'FunctionExpression') { throw new Error('Failed to resolve function'); } - ast.body[0].expression.params.forEach(function (param) { params.push(param.name); }); - body = ast.body[0].expression.body.range; // Esprima's ranges include the first '{' and the last '}' characters on - // function expressions. So cut them out. + body = ast.body[0].expression.body.range; + // Esprima's ranges include the first '{' and the last '}' characters on + // function expressions. So cut them out. if (ast.body[0].expression.body.type === 'BlockStatement') { /*eslint-disable no-new-func*/ return new Function(params, source.slice(body[0] + 1, body[1] - 1)); - } // ES6 arrow functions can omit the BlockStatement. In that case, just return + } + // ES6 arrow functions can omit the BlockStatement. In that case, just return // the body. - /*eslint-disable no-new-func*/ - - return new Function(params, 'return ' + source.slice(body[0], body[1])); } - - function representJavascriptFunction(object - /*, style*/ - ) { + function representJavascriptFunction(object /*, style*/) { return object.toString(); } - function isFunction(object) { return Object.prototype.toString.call(object) === '[object Function]'; } - var _function = new type('tag:yaml.org,2002:js/function', { kind: 'scalar', resolve: resolveJavascriptFunction, @@ -12532,7 +11431,6 @@ /*eslint-disable max-len,no-use-before-define*/ - var _hasOwnProperty$1 = Object.prototype.hasOwnProperty; var CONTEXT_FLOW_IN = 1; var CONTEXT_FLOW_OUT = 2; @@ -12546,173 +11444,74 @@ var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; - function _class(obj) { return Object.prototype.toString.call(obj); } - function is_EOL(c) { - return c === 0x0A - /* LF */ - || c === 0x0D - /* CR */ - ; + return c === 0x0A /* LF */ || c === 0x0D /* CR */; } function is_WHITE_SPACE(c) { - return c === 0x09 - /* Tab */ - || c === 0x20 - /* Space */ - ; + return c === 0x09 /* Tab */ || c === 0x20 /* Space */; } function is_WS_OR_EOL(c) { - return c === 0x09 - /* Tab */ - || c === 0x20 - /* Space */ - || c === 0x0A - /* LF */ - || c === 0x0D - /* CR */ - ; + return c === 0x09 /* Tab */ || c === 0x20 /* Space */ || c === 0x0A /* LF */ || c === 0x0D /* CR */; } function is_FLOW_INDICATOR(c) { - return c === 0x2C - /* , */ - || c === 0x5B - /* [ */ - || c === 0x5D - /* ] */ - || c === 0x7B - /* { */ - || c === 0x7D - /* } */ - ; + return c === 0x2C /* , */ || c === 0x5B /* [ */ || c === 0x5D /* ] */ || c === 0x7B /* { */ || c === 0x7D /* } */; } function fromHexCode(c) { var lc; - - if (0x30 - /* 0 */ - <= c && c <= 0x39 - /* 9 */ - ) { + if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) { return c - 0x30; } - /*eslint-disable no-bitwise*/ - + /*eslint-disable no-bitwise*/ lc = c | 0x20; - - if (0x61 - /* a */ - <= lc && lc <= 0x66 - /* f */ - ) { + if (0x61 /* a */ <= lc && lc <= 0x66 /* f */) { return lc - 0x61 + 10; } - return -1; } - function escapedHexLen(c) { - if (c === 0x78 - /* x */ - ) { - return 2; - } - - if (c === 0x75 - /* u */ - ) { - return 4; - } - - if (c === 0x55 - /* U */ - ) { - return 8; - } - - return 0; + if (c === 0x78 /* x */) { + return 2; + } + if (c === 0x75 /* u */) { + return 4; + } + if (c === 0x55 /* U */) { + return 8; + } + return 0; } - function fromDecimalCode(c) { - if (0x30 - /* 0 */ - <= c && c <= 0x39 - /* 9 */ - ) { + if (0x30 /* 0 */ <= c && c <= 0x39 /* 9 */) { return c - 0x30; } - return -1; } - function simpleEscapeSequence(c) { /* eslint-disable indent */ - return c === 0x30 - /* 0 */ - ? '\x00' : c === 0x61 - /* a */ - ? '\x07' : c === 0x62 - /* b */ - ? '\x08' : c === 0x74 - /* t */ - ? '\x09' : c === 0x09 - /* Tab */ - ? '\x09' : c === 0x6E - /* n */ - ? '\x0A' : c === 0x76 - /* v */ - ? '\x0B' : c === 0x66 - /* f */ - ? '\x0C' : c === 0x72 - /* r */ - ? '\x0D' : c === 0x65 - /* e */ - ? '\x1B' : c === 0x20 - /* Space */ - ? ' ' : c === 0x22 - /* " */ - ? '\x22' : c === 0x2F - /* / */ - ? '/' : c === 0x5C - /* \ */ - ? '\x5C' : c === 0x4E - /* N */ - ? '\x85' : c === 0x5F - /* _ */ - ? '\xA0' : c === 0x4C - /* L */ - ? "\u2028" : c === 0x50 - /* P */ - ? "\u2029" : ''; + return c === 0x30 /* 0 */ ? '\x00' : c === 0x61 /* a */ ? '\x07' : c === 0x62 /* b */ ? '\x08' : c === 0x74 /* t */ ? '\x09' : c === 0x09 /* Tab */ ? '\x09' : c === 0x6E /* n */ ? '\x0A' : c === 0x76 /* v */ ? '\x0B' : c === 0x66 /* f */ ? '\x0C' : c === 0x72 /* r */ ? '\x0D' : c === 0x65 /* e */ ? '\x1B' : c === 0x20 /* Space */ ? ' ' : c === 0x22 /* " */ ? '\x22' : c === 0x2F /* / */ ? '/' : c === 0x5C /* \ */ ? '\x5C' : c === 0x4E /* N */ ? '\x85' : c === 0x5F /* _ */ ? '\xA0' : c === 0x4C /* L */ ? "\u2028" : c === 0x50 /* P */ ? "\u2029" : ''; } - function charFromCodepoint(c) { if (c <= 0xFFFF) { return String.fromCharCode(c); - } // Encode UTF-16 surrogate pair + } + // Encode UTF-16 surrogate pair // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF - - return String.fromCharCode((c - 0x010000 >> 10) + 0xD800, (c - 0x010000 & 0x03FF) + 0xDC00); } - var simpleEscapeCheck = new Array(256); // integer, for fast access - var simpleEscapeMap = new Array(256); - for (var i = 0; i < 256; i++) { simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; simpleEscapeMap[i] = simpleEscapeSequence(i); } - function State$1(input, options) { this.input = input; this.filename = options['filename'] || null; @@ -12729,6 +11528,7 @@ this.lineStart = 0; this.lineIndent = 0; this.documents = []; + /* this.version; this.checkLineBreaks; @@ -12743,85 +11543,64 @@ function generateError(state, message) { return new exception(message, new mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart)); } - function throwError(state, message) { throw generateError(state, message); } - function throwWarning(state, message) { if (state.onWarning) { state.onWarning.call(null, generateError(state, message)); } } - var directiveHandlers = { YAML: function handleYamlDirective(state, name, args) { var match, major, minor; - if (state.version !== null) { throwError(state, 'duplication of %YAML directive'); } - if (args.length !== 1) { throwError(state, 'YAML directive accepts exactly one argument'); } - match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); - if (match === null) { throwError(state, 'ill-formed argument of the YAML directive'); } - major = parseInt(match[1], 10); minor = parseInt(match[2], 10); - if (major !== 1) { throwError(state, 'unacceptable YAML version of the document'); } - state.version = args[0]; state.checkLineBreaks = minor < 2; - if (minor !== 1 && minor !== 2) { throwWarning(state, 'unsupported YAML version of the document'); } }, TAG: function handleTagDirective(state, name, args) { var handle, prefix; - if (args.length !== 2) { throwError(state, 'TAG directive accepts exactly two arguments'); } - handle = args[0]; prefix = args[1]; - if (!PATTERN_TAG_HANDLE.test(handle)) { throwError(state, 'ill-formed tag handle (first argument) of the TAG directive'); } - if (_hasOwnProperty$1.call(state.tagMap, handle)) { throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); } - if (!PATTERN_TAG_URI.test(prefix)) { throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive'); } - state.tagMap[handle] = prefix; } }; - function captureSegment(state, start, end, checkJson) { var _position, _length, _character, _result; - if (start < end) { _result = state.input.slice(start, end); - if (checkJson) { for (_position = 0, _length = _result.length; _position < _length; _position += 1) { _character = _result.charCodeAt(_position); - if (!(_character === 0x09 || 0x20 <= _character && _character <= 0x10FFFF)) { throwError(state, 'expected valid JSON character'); } @@ -12829,62 +11608,51 @@ } else if (PATTERN_NON_PRINTABLE.test(_result)) { throwError(state, 'the stream contains non-printable characters'); } - state.result += _result; } } - function mergeMappings(state, destination, source, overridableKeys) { var sourceKeys, key, index, quantity; - if (!common.isObject(source)) { throwError(state, 'cannot merge mappings; the provided source object is unacceptable'); } - sourceKeys = Object.keys(source); - for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { key = sourceKeys[index]; - if (!_hasOwnProperty$1.call(destination, key)) { destination[key] = source[key]; overridableKeys[key] = true; } } } - function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) { - var index, quantity; // The output is a plain object here, so keys can only be strings. + var index, quantity; + + // The output is a plain object here, so keys can only be strings. // We need to convert keyNode to a string, but doing so can hang the process // (deeply nested arrays that explode exponentially using aliases). - if (Array.isArray(keyNode)) { keyNode = Array.prototype.slice.call(keyNode); - for (index = 0, quantity = keyNode.length; index < quantity; index += 1) { if (Array.isArray(keyNode[index])) { throwError(state, 'nested arrays are not supported inside keys'); } - if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') { keyNode[index] = '[object Object]'; } } - } // Avoid code execution in load() via toString property + } + + // Avoid code execution in load() via toString property // (still use its own toString for arrays, timestamps, // and whatever user schema extensions happen to have @@toStringTag) - - if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') { keyNode = '[object Object]'; } - keyNode = String(keyNode); - if (_result === null) { _result = {}; } - if (keyTag === 'tag:yaml.org,2002:merge') { if (Array.isArray(valueNode)) { for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { @@ -12899,70 +11667,45 @@ state.position = startPos || state.position; throwError(state, 'duplicated mapping key'); } - _result[keyNode] = valueNode; delete overridableKeys[keyNode]; } - return _result; } - function readLineBreak(state) { var ch; ch = state.input.charCodeAt(state.position); - - if (ch === 0x0A - /* LF */ - ) { - state.position++; - } else if (ch === 0x0D - /* CR */ - ) { + if (ch === 0x0A /* LF */) { + state.position++; + } else if (ch === 0x0D /* CR */) { + state.position++; + if (state.input.charCodeAt(state.position) === 0x0A /* LF */) { state.position++; - - if (state.input.charCodeAt(state.position) === 0x0A - /* LF */ - ) { - state.position++; - } - } else { + } + } else { throwError(state, 'a line break is expected'); } - state.line += 1; state.lineStart = state.position; } - function skipSeparationSpace(state, allowComments, checkIndent) { var lineBreaks = 0, - ch = state.input.charCodeAt(state.position); - + ch = state.input.charCodeAt(state.position); while (ch !== 0) { while (is_WHITE_SPACE(ch)) { ch = state.input.charCodeAt(++state.position); } - - if (allowComments && ch === 0x23 - /* # */ - ) { - do { - ch = state.input.charCodeAt(++state.position); - } while (ch !== 0x0A - /* LF */ - && ch !== 0x0D - /* CR */ - && ch !== 0); - } - + if (allowComments && ch === 0x23 /* # */) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0x0A /* LF */ && ch !== 0x0D /* CR */ && ch !== 0); + } if (is_EOL(ch)) { readLineBreak(state); ch = state.input.charCodeAt(state.position); lineBreaks++; state.lineIndent = 0; - - while (ch === 0x20 - /* Space */ - ) { + while (ch === 0x20 /* Space */) { state.lineIndent++; ch = state.input.charCodeAt(++state.position); } @@ -12970,36 +11713,27 @@ break; } } - if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { throwWarning(state, 'deficient indentation'); } - return lineBreaks; } - function testDocumentSeparator(state) { var _position = state.position, - ch; - ch = state.input.charCodeAt(_position); // Condition state.position === state.lineStart is tested - // in parent on each call, for efficiency. No needs to test here again. + ch; + ch = state.input.charCodeAt(_position); - if ((ch === 0x2D - /* - */ - || ch === 0x2E - /* . */ - ) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) { + // Condition state.position === state.lineStart is tested + // in parent on each call, for efficiency. No needs to test here again. + if ((ch === 0x2D /* - */ || ch === 0x2E /* . */) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) { _position += 3; ch = state.input.charCodeAt(_position); - if (ch === 0 || is_WS_OR_EOL(ch)) { return true; } } - return false; } - function writeFoldedLines(state, count) { if (count === 1) { state.result += ' '; @@ -13007,90 +11741,50 @@ state.result += common.repeat('\n', count - 1); } } - function readPlainScalar(state, nodeIndent, withinFlowCollection) { var preceding, - following, - captureStart, - captureEnd, - hasPendingContent, - _line, - _lineStart, - _lineIndent, - _kind = state.kind, - _result = state.result, - ch; - + following, + captureStart, + captureEnd, + hasPendingContent, + _line, + _lineStart, + _lineIndent, + _kind = state.kind, + _result = state.result, + ch; ch = state.input.charCodeAt(state.position); - - if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 0x23 - /* # */ - || ch === 0x26 - /* & */ - || ch === 0x2A - /* * */ - || ch === 0x21 - /* ! */ - || ch === 0x7C - /* | */ - || ch === 0x3E - /* > */ - || ch === 0x27 - /* ' */ - || ch === 0x22 - /* " */ - || ch === 0x25 - /* % */ - || ch === 0x40 - /* @ */ - || ch === 0x60 - /* ` */ - ) { + if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 0x23 /* # */ || ch === 0x26 /* & */ || ch === 0x2A /* * */ || ch === 0x21 /* ! */ || ch === 0x7C /* | */ || ch === 0x3E /* > */ || ch === 0x27 /* ' */ || ch === 0x22 /* " */ || ch === 0x25 /* % */ || ch === 0x40 /* @ */ || ch === 0x60 /* ` */) { + return false; + } + if (ch === 0x3F /* ? */ || ch === 0x2D /* - */) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { return false; } - - if (ch === 0x3F - /* ? */ - || ch === 0x2D - /* - */ - ) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { - return false; - } - } - + } state.kind = 'scalar'; state.result = ''; captureStart = captureEnd = state.position; hasPendingContent = false; - while (ch !== 0) { - if (ch === 0x3A - /* : */ - ) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { - break; - } - } else if (ch === 0x23 - /* # */ - ) { - preceding = state.input.charCodeAt(state.position - 1); - - if (is_WS_OR_EOL(preceding)) { - break; - } - } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) { + if (ch === 0x3A /* : */) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { + break; + } + } else if (ch === 0x23 /* # */) { + preceding = state.input.charCodeAt(state.position - 1); + if (is_WS_OR_EOL(preceding)) { + break; + } + } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) { break; } else if (is_EOL(ch)) { _line = state.line; _lineStart = state.lineStart; _lineIndent = state.lineIndent; skipSeparationSpace(state, false, -1); - if (state.lineIndent >= nodeIndent) { hasPendingContent = true; ch = state.input.charCodeAt(state.position); @@ -13103,64 +11797,47 @@ break; } } - if (hasPendingContent) { captureSegment(state, captureStart, captureEnd, false); writeFoldedLines(state, state.line - _line); captureStart = captureEnd = state.position; hasPendingContent = false; } - if (!is_WHITE_SPACE(ch)) { captureEnd = state.position + 1; } - ch = state.input.charCodeAt(++state.position); } - captureSegment(state, captureStart, captureEnd, false); - if (state.result) { return true; } - state.kind = _kind; state.result = _result; return false; } - function readSingleQuotedScalar(state, nodeIndent) { var ch, captureStart, captureEnd; ch = state.input.charCodeAt(state.position); - - if (ch !== 0x27 - /* ' */ - ) { - return false; - } - + if (ch !== 0x27 /* ' */) { + return false; + } state.kind = 'scalar'; state.result = ''; state.position++; captureStart = captureEnd = state.position; - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 0x27 - /* ' */ - ) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); - - if (ch === 0x27 - /* ' */ - ) { - captureStart = state.position; - state.position++; - captureEnd = state.position; - } else { - return true; - } - } else if (is_EOL(ch)) { + if (ch === 0x27 /* ' */) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + if (ch === 0x27 /* ' */) { + captureStart = state.position; + state.position++; + captureEnd = state.position; + } else { + return true; + } + } else if (is_EOL(ch)) { captureSegment(state, captureStart, captureEnd, true); writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); captureStart = captureEnd = state.position; @@ -13171,65 +11848,51 @@ captureEnd = state.position; } } - throwError(state, 'unexpected end of the stream within a single quoted scalar'); } - function readDoubleQuotedScalar(state, nodeIndent) { var captureStart, captureEnd, hexLength, hexResult, tmp, ch; ch = state.input.charCodeAt(state.position); - - if (ch !== 0x22 - /* " */ - ) { - return false; - } - + if (ch !== 0x22 /* " */) { + return false; + } state.kind = 'scalar'; state.result = ''; state.position++; captureStart = captureEnd = state.position; - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 0x22 - /* " */ - ) { - captureSegment(state, captureStart, state.position, true); - state.position++; - return true; - } else if (ch === 0x5C - /* \ */ - ) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); - - if (is_EOL(ch)) { - skipSeparationSpace(state, false, nodeIndent); // TODO: rework to inline fn with no type cast? - } else if (ch < 256 && simpleEscapeCheck[ch]) { - state.result += simpleEscapeMap[ch]; - state.position++; - } else if ((tmp = escapedHexLen(ch)) > 0) { - hexLength = tmp; - hexResult = 0; - - for (; hexLength > 0; hexLength--) { - ch = state.input.charCodeAt(++state.position); + if (ch === 0x22 /* " */) { + captureSegment(state, captureStart, state.position, true); + state.position++; + return true; + } else if (ch === 0x5C /* \ */) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + if (is_EOL(ch)) { + skipSeparationSpace(state, false, nodeIndent); - if ((tmp = fromHexCode(ch)) >= 0) { - hexResult = (hexResult << 4) + tmp; - } else { - throwError(state, 'expected hexadecimal character'); - } + // TODO: rework to inline fn with no type cast? + } else if (ch < 256 && simpleEscapeCheck[ch]) { + state.result += simpleEscapeMap[ch]; + state.position++; + } else if ((tmp = escapedHexLen(ch)) > 0) { + hexLength = tmp; + hexResult = 0; + for (; hexLength > 0; hexLength--) { + ch = state.input.charCodeAt(++state.position); + if ((tmp = fromHexCode(ch)) >= 0) { + hexResult = (hexResult << 4) + tmp; + } else { + throwError(state, 'expected hexadecimal character'); } - - state.result += charFromCodepoint(hexResult); - state.position++; - } else { - throwError(state, 'unknown escape sequence'); } - - captureStart = captureEnd = state.position; - } else if (is_EOL(ch)) { + state.result += charFromCodepoint(hexResult); + state.position++; + } else { + throwError(state, 'unknown escape sequence'); + } + captureStart = captureEnd = state.position; + } else if (is_EOL(ch)) { captureSegment(state, captureStart, captureEnd, true); writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); captureStart = captureEnd = state.position; @@ -13240,59 +11903,43 @@ captureEnd = state.position; } } - throwError(state, 'unexpected end of the stream within a double quoted scalar'); } - function readFlowCollection(state, nodeIndent) { var readNext = true, - _line, - _tag = state.tag, - _result, - _anchor = state.anchor, - following, - terminator, - isPair, - isExplicitPair, - isMapping, - overridableKeys = {}, - keyNode, - keyTag, - valueNode, - ch; - + _line, + _tag = state.tag, + _result, + _anchor = state.anchor, + following, + terminator, + isPair, + isExplicitPair, + isMapping, + overridableKeys = {}, + keyNode, + keyTag, + valueNode, + ch; ch = state.input.charCodeAt(state.position); - - if (ch === 0x5B - /* [ */ - ) { - terminator = 0x5D; - /* ] */ - - isMapping = false; - _result = []; - } else if (ch === 0x7B - /* { */ - ) { - terminator = 0x7D; - /* } */ - - isMapping = true; - _result = {}; - } else { + if (ch === 0x5B /* [ */) { + terminator = 0x5D; /* ] */ + isMapping = false; + _result = []; + } else if (ch === 0x7B /* { */) { + terminator = 0x7D; /* } */ + isMapping = true; + _result = {}; + } else { return false; } - if (state.anchor !== null) { state.anchorMap[state.anchor] = _result; } - ch = state.input.charCodeAt(++state.position); - while (ch !== 0) { skipSeparationSpace(state, true, nodeIndent); ch = state.input.charCodeAt(state.position); - if (ch === terminator) { state.position++; state.tag = _tag; @@ -13303,39 +11950,29 @@ } else if (!readNext) { throwError(state, 'missed comma between flow collection entries'); } - keyTag = keyNode = valueNode = null; isPair = isExplicitPair = false; - - if (ch === 0x3F - /* ? */ - ) { - following = state.input.charCodeAt(state.position + 1); - - if (is_WS_OR_EOL(following)) { - isPair = isExplicitPair = true; - state.position++; - skipSeparationSpace(state, true, nodeIndent); - } + if (ch === 0x3F /* ? */) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following)) { + isPair = isExplicitPair = true; + state.position++; + skipSeparationSpace(state, true, nodeIndent); } - + } _line = state.line; composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); keyTag = state.tag; keyNode = state.result; skipSeparationSpace(state, true, nodeIndent); ch = state.input.charCodeAt(state.position); - - if ((isExplicitPair || state.line === _line) && ch === 0x3A - /* : */ - ) { - isPair = true; - ch = state.input.charCodeAt(++state.position); - skipSeparationSpace(state, true, nodeIndent); - composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); - valueNode = state.result; - } - + if ((isExplicitPair || state.line === _line) && ch === 0x3A /* : */) { + isPair = true; + ch = state.input.charCodeAt(++state.position); + skipSeparationSpace(state, true, nodeIndent); + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + valueNode = state.result; + } if (isMapping) { storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode); } else if (isPair) { @@ -13343,67 +11980,47 @@ } else { _result.push(keyNode); } - skipSeparationSpace(state, true, nodeIndent); ch = state.input.charCodeAt(state.position); - - if (ch === 0x2C - /* , */ - ) { - readNext = true; - ch = state.input.charCodeAt(++state.position); - } else { + if (ch === 0x2C /* , */) { + readNext = true; + ch = state.input.charCodeAt(++state.position); + } else { readNext = false; } } - throwError(state, 'unexpected end of the stream within a flow collection'); } - function readBlockScalar(state, nodeIndent) { var captureStart, - folding, - chomping = CHOMPING_CLIP, - didReadContent = false, - detectedIndent = false, - textIndent = nodeIndent, - emptyLines = 0, - atMoreIndented = false, - tmp, - ch; + folding, + chomping = CHOMPING_CLIP, + didReadContent = false, + detectedIndent = false, + textIndent = nodeIndent, + emptyLines = 0, + atMoreIndented = false, + tmp, + ch; ch = state.input.charCodeAt(state.position); - - if (ch === 0x7C - /* | */ - ) { - folding = false; - } else if (ch === 0x3E - /* > */ - ) { - folding = true; - } else { + if (ch === 0x7C /* | */) { + folding = false; + } else if (ch === 0x3E /* > */) { + folding = true; + } else { return false; } - state.kind = 'scalar'; state.result = ''; - while (ch !== 0) { ch = state.input.charCodeAt(++state.position); - - if (ch === 0x2B - /* + */ - || ch === 0x2D - /* - */ - ) { - if (CHOMPING_CLIP === chomping) { - chomping = ch === 0x2B - /* + */ - ? CHOMPING_KEEP : CHOMPING_STRIP; - } else { - throwError(state, 'repeat of a chomping mode identifier'); - } - } else if ((tmp = fromDecimalCode(ch)) >= 0) { + if (ch === 0x2B /* + */ || ch === 0x2D /* - */) { + if (CHOMPING_CLIP === chomping) { + chomping = ch === 0x2B /* + */ ? CHOMPING_KEEP : CHOMPING_STRIP; + } else { + throwError(state, 'repeat of a chomping mode identifier'); + } + } else if ((tmp = fromDecimalCode(ch)) >= 0) { if (tmp === 0) { throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one'); } else if (!detectedIndent) { @@ -13416,43 +12033,33 @@ break; } } - if (is_WHITE_SPACE(ch)) { do { ch = state.input.charCodeAt(++state.position); } while (is_WHITE_SPACE(ch)); - - if (ch === 0x23 - /* # */ - ) { - do { - ch = state.input.charCodeAt(++state.position); - } while (!is_EOL(ch) && ch !== 0); - } + if (ch === 0x23 /* # */) { + do { + ch = state.input.charCodeAt(++state.position); + } while (!is_EOL(ch) && ch !== 0); + } } - while (ch !== 0) { readLineBreak(state); state.lineIndent = 0; ch = state.input.charCodeAt(state.position); - - while ((!detectedIndent || state.lineIndent < textIndent) && ch === 0x20 - /* Space */ - ) { + while ((!detectedIndent || state.lineIndent < textIndent) && ch === 0x20 /* Space */) { state.lineIndent++; ch = state.input.charCodeAt(++state.position); } - if (!detectedIndent && state.lineIndent > textIndent) { textIndent = state.lineIndent; } - if (is_EOL(ch)) { emptyLines++; continue; - } // End of the scalar. - + } + // End of the scalar. if (state.lineIndent < textIndent) { // Perform the chomping. if (chomping === CHOMPING_KEEP) { @@ -13462,107 +12069,93 @@ // i.e. only if the scalar is not empty. state.result += '\n'; } - } // Break this `while` cycle and go to the funciton's epilogue. - + } + // Break this `while` cycle and go to the funciton's epilogue. break; - } // Folded style: use fancy rules to handle line breaks. - + } + // Folded style: use fancy rules to handle line breaks. if (folding) { // Lines starting with white space characters (more-indented lines) are not folded. if (is_WHITE_SPACE(ch)) { - atMoreIndented = true; // except for the first content line (cf. Example 8.1) + atMoreIndented = true; + // except for the first content line (cf. Example 8.1) + state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); - state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); // End of more-indented block. + // End of more-indented block. } else if (atMoreIndented) { atMoreIndented = false; - state.result += common.repeat('\n', emptyLines + 1); // Just one line break - perceive as the same line. + state.result += common.repeat('\n', emptyLines + 1); + + // Just one line break - perceive as the same line. } else if (emptyLines === 0) { if (didReadContent) { // i.e. only if we have already read some scalar content. state.result += ' '; - } // Several line breaks - perceive as different lines. + } + // Several line breaks - perceive as different lines. } else { state.result += common.repeat('\n', emptyLines); - } // Literal style: just add exact number of line breaks between content lines. + } + // Literal style: just add exact number of line breaks between content lines. } else { // Keep all line breaks except the header line break. state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines); } - didReadContent = true; detectedIndent = true; emptyLines = 0; captureStart = state.position; - while (!is_EOL(ch) && ch !== 0) { ch = state.input.charCodeAt(++state.position); } - captureSegment(state, captureStart, state.position, false); } - return true; } - function readBlockSequence(state, nodeIndent) { var _line, - _tag = state.tag, - _anchor = state.anchor, - _result = [], - following, - detected = false, - ch; - + _tag = state.tag, + _anchor = state.anchor, + _result = [], + following, + detected = false, + ch; if (state.anchor !== null) { state.anchorMap[state.anchor] = _result; } - ch = state.input.charCodeAt(state.position); - while (ch !== 0) { - if (ch !== 0x2D - /* - */ - ) { - break; - } - + if (ch !== 0x2D /* - */) { + break; + } following = state.input.charCodeAt(state.position + 1); - if (!is_WS_OR_EOL(following)) { break; } - detected = true; state.position++; - if (skipSeparationSpace(state, true, -1)) { if (state.lineIndent <= nodeIndent) { _result.push(null); - ch = state.input.charCodeAt(state.position); continue; } } - _line = state.line; composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); - _result.push(state.result); - skipSeparationSpace(state, true, -1); ch = state.input.charCodeAt(state.position); - if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) { throwError(state, 'bad indentation of a sequence entry'); } else if (state.lineIndent < nodeIndent) { break; } } - if (detected) { state.tag = _tag; state.anchor = _anchor; @@ -13570,97 +12163,79 @@ state.result = _result; return true; } - return false; } - function readBlockMapping(state, nodeIndent, flowIndent) { var following, - allowCompact, - _line, - _pos, - _tag = state.tag, - _anchor = state.anchor, - _result = {}, - overridableKeys = {}, - keyTag = null, - keyNode = null, - valueNode = null, - atExplicitKey = false, - detected = false, - ch; - + allowCompact, + _line, + _pos, + _tag = state.tag, + _anchor = state.anchor, + _result = {}, + overridableKeys = {}, + keyTag = null, + keyNode = null, + valueNode = null, + atExplicitKey = false, + detected = false, + ch; if (state.anchor !== null) { state.anchorMap[state.anchor] = _result; } - ch = state.input.charCodeAt(state.position); - while (ch !== 0) { following = state.input.charCodeAt(state.position + 1); _line = state.line; // Save the current line. + _pos = state.position; - _pos = state.position; // + // // Explicit notation case. There are two separate blocks: // first for the key (denoted by "?") and second for the value (denoted by ":") // - - if ((ch === 0x3F - /* ? */ - || ch === 0x3A - /* : */ - ) && is_WS_OR_EOL(following)) { - if (ch === 0x3F - /* ? */ - ) { - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); - keyTag = keyNode = valueNode = null; - } - - detected = true; - atExplicitKey = true; - allowCompact = true; - } else if (atExplicitKey) { + if ((ch === 0x3F /* ? */ || ch === 0x3A /* : */) && is_WS_OR_EOL(following)) { + if (ch === 0x3F /* ? */) { + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); + keyTag = keyNode = valueNode = null; + } + detected = true; + atExplicitKey = true; + allowCompact = true; + } else if (atExplicitKey) { // i.e. 0x3A/* : */ === character after the explicit key. atExplicitKey = false; allowCompact = true; } else { throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line'); } - state.position += 1; - ch = following; // + ch = following; + + // // Implicit notation case. Flow-style node as the key first, then ":", and the value. // } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { if (state.line === _line) { ch = state.input.charCodeAt(state.position); - while (is_WHITE_SPACE(ch)) { ch = state.input.charCodeAt(++state.position); } - - if (ch === 0x3A - /* : */ - ) { - ch = state.input.charCodeAt(++state.position); - - if (!is_WS_OR_EOL(ch)) { - throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); - } - - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); - keyTag = keyNode = valueNode = null; - } - - detected = true; - atExplicitKey = false; - allowCompact = false; - keyTag = state.tag; - keyNode = state.result; - } else if (detected) { + if (ch === 0x3A /* : */) { + ch = state.input.charCodeAt(++state.position); + if (!is_WS_OR_EOL(ch)) { + throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping'); + } + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); + keyTag = keyNode = valueNode = null; + } + detected = true; + atExplicitKey = false; + allowCompact = false; + keyTag = state.tag; + keyNode = state.result; + } else if (detected) { throwError(state, 'can not read an implicit mapping pair; a colon is missed'); } else { state.tag = _tag; @@ -13675,12 +12250,12 @@ return true; // Keep the result of `composeNode`. } } else { - break; // Reading is done. Go to the epilogue. - } // + break; // Reading is done. Go to the epilogue. + } + + // // Common reading code for both explicit and implicit notations. // - - if (state.line === _line || state.lineIndent > nodeIndent) { if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { if (atExplicitKey) { @@ -13689,84 +12264,66 @@ valueNode = state.result; } } - if (!atExplicitKey) { storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos); keyTag = keyNode = valueNode = null; } - skipSeparationSpace(state, true, -1); ch = state.input.charCodeAt(state.position); } - if (state.lineIndent > nodeIndent && ch !== 0) { throwError(state, 'bad indentation of a mapping entry'); } else if (state.lineIndent < nodeIndent) { break; } - } // + } + + // // Epilogue. // - // Special case: last mapping's node contains only the key in explicit notation. - + // Special case: last mapping's node contains only the key in explicit notation. if (atExplicitKey) { storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); - } // Expose the resulting mapping. - + } + // Expose the resulting mapping. if (detected) { state.tag = _tag; state.anchor = _anchor; state.kind = 'mapping'; state.result = _result; } - return detected; } - function readTagProperty(state) { var _position, - isVerbatim = false, - isNamed = false, - tagHandle, - tagName, - ch; - + isVerbatim = false, + isNamed = false, + tagHandle, + tagName, + ch; ch = state.input.charCodeAt(state.position); - if (ch !== 0x21 - /* ! */ - ) return false; - + if (ch !== 0x21 /* ! */) return false; if (state.tag !== null) { throwError(state, 'duplication of a tag property'); } - ch = state.input.charCodeAt(++state.position); - - if (ch === 0x3C - /* < */ - ) { - isVerbatim = true; - ch = state.input.charCodeAt(++state.position); - } else if (ch === 0x21 - /* ! */ - ) { - isNamed = true; - tagHandle = '!!'; - ch = state.input.charCodeAt(++state.position); - } else { + if (ch === 0x3C /* < */) { + isVerbatim = true; + ch = state.input.charCodeAt(++state.position); + } else if (ch === 0x21 /* ! */) { + isNamed = true; + tagHandle = '!!'; + ch = state.input.charCodeAt(++state.position); + } else { tagHandle = '!'; } - _position = state.position; - if (isVerbatim) { do { ch = state.input.charCodeAt(++state.position); - } while (ch !== 0 && ch !== 0x3E - /* > */ - ); + } while (ch !== 0 && ch !== 0x3E /* > */); if (state.position < state.length) { tagName = state.input.slice(_position, state.position); @@ -13776,37 +12333,28 @@ } } else { while (ch !== 0 && !is_WS_OR_EOL(ch)) { - if (ch === 0x21 - /* ! */ - ) { - if (!isNamed) { - tagHandle = state.input.slice(_position - 1, state.position + 1); - - if (!PATTERN_TAG_HANDLE.test(tagHandle)) { - throwError(state, 'named tag handle cannot contain such characters'); - } - - isNamed = true; - _position = state.position + 1; - } else { - throwError(state, 'tag suffix cannot contain exclamation marks'); + if (ch === 0x21 /* ! */) { + if (!isNamed) { + tagHandle = state.input.slice(_position - 1, state.position + 1); + if (!PATTERN_TAG_HANDLE.test(tagHandle)) { + throwError(state, 'named tag handle cannot contain such characters'); } + isNamed = true; + _position = state.position + 1; + } else { + throwError(state, 'tag suffix cannot contain exclamation marks'); } - + } ch = state.input.charCodeAt(++state.position); } - tagName = state.input.slice(_position, state.position); - if (PATTERN_FLOW_INDICATORS.test(tagName)) { throwError(state, 'tag suffix cannot contain flow indicator characters'); } } - if (tagName && !PATTERN_TAG_URI.test(tagName)) { throwError(state, 'tag name cannot contain such characters: ' + tagName); } - if (isVerbatim) { state.tag = tagName; } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) { @@ -13818,94 +12366,70 @@ } else { throwError(state, 'undeclared tag handle "' + tagHandle + '"'); } - return true; } - function readAnchorProperty(state) { var _position, ch; - ch = state.input.charCodeAt(state.position); - if (ch !== 0x26 - /* & */ - ) return false; - + if (ch !== 0x26 /* & */) return false; if (state.anchor !== null) { throwError(state, 'duplication of an anchor property'); } - ch = state.input.charCodeAt(++state.position); _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { ch = state.input.charCodeAt(++state.position); } - if (state.position === _position) { throwError(state, 'name of an anchor node must contain at least one character'); } - state.anchor = state.input.slice(_position, state.position); return true; } - function readAlias(state) { var _position, alias, ch; - ch = state.input.charCodeAt(state.position); - if (ch !== 0x2A - /* * */ - ) return false; + if (ch !== 0x2A /* * */) return false; ch = state.input.charCodeAt(++state.position); _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { ch = state.input.charCodeAt(++state.position); } - if (state.position === _position) { throwError(state, 'name of an alias node must contain at least one character'); } - alias = state.input.slice(_position, state.position); - if (!_hasOwnProperty$1.call(state.anchorMap, alias)) { throwError(state, 'unidentified alias "' + alias + '"'); } - state.result = state.anchorMap[alias]; skipSeparationSpace(state, true, -1); return true; } - function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { var allowBlockStyles, - allowBlockScalars, - allowBlockCollections, - indentStatus = 1, - // 1: this>parent, 0: this=parent, -1: thisparent, 0: this=parent, -1: this parentIndent) { indentStatus = 1; } else if (state.lineIndent === parentIndent) { @@ -13915,13 +12439,11 @@ } } } - if (indentStatus === 1) { while (readTagProperty(state) || readAnchorProperty(state)) { if (skipSeparationSpace(state, true, -1)) { atNewLine = true; allowBlockCollections = allowBlockStyles; - if (state.lineIndent > parentIndent) { indentStatus = 1; } else if (state.lineIndent === parentIndent) { @@ -13934,20 +12456,16 @@ } } } - if (allowBlockCollections) { allowBlockCollections = atNewLine || allowCompact; } - if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) { if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { flowIndent = parentIndent; } else { flowIndent = parentIndent + 1; } - blockIndent = state.position - state.lineStart; - if (indentStatus === 1) { if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) { hasContent = true; @@ -13956,18 +12474,15 @@ hasContent = true; } else if (readAlias(state)) { hasContent = true; - if (state.tag !== null || state.anchor !== null) { throwError(state, 'alias node should not have any properties'); } } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { hasContent = true; - if (state.tag === null) { state.tag = '?'; } } - if (state.anchor !== null) { state.anchorMap[state.anchor] = state.result; } @@ -13978,7 +12493,6 @@ hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); } } - if (state.tag !== null && state.tag !== '!') { if (state.tag === '?') { // Implicit resolving is not allowed for non-scalar types, and '?' @@ -13990,35 +12504,28 @@ if (state.result !== null && state.kind !== 'scalar') { throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); } - for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) { type = state.implicitTypes[typeIndex]; - if (type.resolve(state.result)) { // `state.result` updated in resolver if matched state.result = type.construct(state.result); state.tag = type.tag; - if (state.anchor !== null) { state.anchorMap[state.anchor] = state.result; } - break; } } } else if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) { type = state.typeMap[state.kind || 'fallback'][state.tag]; - if (state.result !== null && type.kind !== state.kind) { throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"'); } - if (!type.resolve(state.result)) { // `state.result` updated in resolver if matched throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); } else { state.result = type.construct(state.result); - if (state.anchor !== null) { state.anchorMap[state.anchor] = state.result; } @@ -14027,220 +12534,158 @@ throwError(state, 'unknown tag !<' + state.tag + '>'); } } - if (state.listener !== null) { state.listener('close', state); } - return state.tag !== null || state.anchor !== null || hasContent; } - function readDocument(state) { var documentStart = state.position, - _position, - directiveName, - directiveArgs, - hasDirectives = false, - ch; - + _position, + directiveName, + directiveArgs, + hasDirectives = false, + ch; state.version = null; state.checkLineBreaks = state.legacy; state.tagMap = {}; state.anchorMap = {}; - while ((ch = state.input.charCodeAt(state.position)) !== 0) { skipSeparationSpace(state, true, -1); ch = state.input.charCodeAt(state.position); - - if (state.lineIndent > 0 || ch !== 0x25 - /* % */ - ) { - break; - } - + if (state.lineIndent > 0 || ch !== 0x25 /* % */) { + break; + } hasDirectives = true; ch = state.input.charCodeAt(++state.position); _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch)) { ch = state.input.charCodeAt(++state.position); } - directiveName = state.input.slice(_position, state.position); directiveArgs = []; - if (directiveName.length < 1) { throwError(state, 'directive name must not be less than one character in length'); } - while (ch !== 0) { while (is_WHITE_SPACE(ch)) { ch = state.input.charCodeAt(++state.position); } - - if (ch === 0x23 - /* # */ - ) { - do { - ch = state.input.charCodeAt(++state.position); - } while (ch !== 0 && !is_EOL(ch)); - - break; - } - + if (ch === 0x23 /* # */) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0 && !is_EOL(ch)); + break; + } if (is_EOL(ch)) break; _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch)) { ch = state.input.charCodeAt(++state.position); } - directiveArgs.push(state.input.slice(_position, state.position)); } - if (ch !== 0) readLineBreak(state); - if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) { directiveHandlers[directiveName](state, directiveName, directiveArgs); } else { throwWarning(state, 'unknown document directive "' + directiveName + '"'); } } - skipSeparationSpace(state, true, -1); - - if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 0x2D - /* - */ - && state.input.charCodeAt(state.position + 1) === 0x2D - /* - */ - && state.input.charCodeAt(state.position + 2) === 0x2D - /* - */ - ) { - state.position += 3; - skipSeparationSpace(state, true, -1); - } else if (hasDirectives) { + if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 0x2D /* - */ && state.input.charCodeAt(state.position + 1) === 0x2D /* - */ && state.input.charCodeAt(state.position + 2) === 0x2D /* - */) { + state.position += 3; + skipSeparationSpace(state, true, -1); + } else if (hasDirectives) { throwError(state, 'directives end mark is expected'); } - composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); skipSeparationSpace(state, true, -1); - if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { throwWarning(state, 'non-ASCII line breaks are interpreted as content'); } - state.documents.push(state.result); - if (state.position === state.lineStart && testDocumentSeparator(state)) { - if (state.input.charCodeAt(state.position) === 0x2E - /* . */ - ) { - state.position += 3; - skipSeparationSpace(state, true, -1); - } - + if (state.input.charCodeAt(state.position) === 0x2E /* . */) { + state.position += 3; + skipSeparationSpace(state, true, -1); + } return; } - if (state.position < state.length - 1) { throwError(state, 'end of the stream or a document separator is expected'); } else { return; } } - function loadDocuments(input, options) { input = String(input); options = options || {}; - if (input.length !== 0) { // Add tailing `\n` if not exists - if (input.charCodeAt(input.length - 1) !== 0x0A - /* LF */ - && input.charCodeAt(input.length - 1) !== 0x0D - /* CR */ - ) { - input += '\n'; - } // Strip BOM - + if (input.charCodeAt(input.length - 1) !== 0x0A /* LF */ && input.charCodeAt(input.length - 1) !== 0x0D /* CR */) { + input += '\n'; + } + // Strip BOM if (input.charCodeAt(0) === 0xFEFF) { input = input.slice(1); } } - var state = new State$1(input, options); var nullpos = input.indexOf('\0'); - if (nullpos !== -1) { state.position = nullpos; throwError(state, 'null byte is not allowed in input'); - } // Use 0 as string terminator. That significantly simplifies bounds check. - + } + // Use 0 as string terminator. That significantly simplifies bounds check. state.input += '\0'; - - while (state.input.charCodeAt(state.position) === 0x20 - /* Space */ - ) { + while (state.input.charCodeAt(state.position) === 0x20 /* Space */) { state.lineIndent += 1; state.position += 1; } - while (state.position < state.length - 1) { readDocument(state); } - return state.documents; } - function loadAll$1(input, iterator, options) { if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') { options = iterator; iterator = null; } - var documents = loadDocuments(input, options); - if (typeof iterator !== 'function') { return documents; } - for (var index = 0, length = documents.length; index < length; index += 1) { iterator(documents[index]); } } - function load$1(input, options) { var documents = loadDocuments(input, options); - if (documents.length === 0) { /*eslint-disable no-undefined*/ return undefined; } else if (documents.length === 1) { return documents[0]; } - throw new exception('expected a single document in the stream, but found more'); } - function safeLoadAll$1(input, iterator, options) { if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') { options = iterator; iterator = null; } - return loadAll$1(input, iterator, common.extend({ schema: default_safe }, options)); } - function safeLoad$1(input, options) { return load$1(input, common.extend({ schema: default_safe }, options)); } - var loadAll_1 = loadAll$1; var load_1 = load$1; var safeLoadAll_1 = safeLoadAll$1; @@ -14254,80 +12699,32 @@ /*eslint-disable no-use-before-define*/ - var _toString = Object.prototype.toString; var _hasOwnProperty = Object.prototype.hasOwnProperty; - var CHAR_TAB = 0x09; - /* Tab */ - - var CHAR_LINE_FEED = 0x0A; - /* LF */ - - var CHAR_CARRIAGE_RETURN = 0x0D; - /* CR */ - - var CHAR_SPACE = 0x20; - /* Space */ - - var CHAR_EXCLAMATION = 0x21; - /* ! */ - - var CHAR_DOUBLE_QUOTE = 0x22; - /* " */ - - var CHAR_SHARP = 0x23; - /* # */ - - var CHAR_PERCENT = 0x25; - /* % */ - - var CHAR_AMPERSAND = 0x26; - /* & */ - - var CHAR_SINGLE_QUOTE = 0x27; - /* ' */ - - var CHAR_ASTERISK = 0x2A; - /* * */ - - var CHAR_COMMA = 0x2C; - /* , */ - - var CHAR_MINUS = 0x2D; - /* - */ - - var CHAR_COLON = 0x3A; - /* : */ - - var CHAR_EQUALS = 0x3D; - /* = */ - - var CHAR_GREATER_THAN = 0x3E; - /* > */ - - var CHAR_QUESTION = 0x3F; - /* ? */ - - var CHAR_COMMERCIAL_AT = 0x40; - /* @ */ - - var CHAR_LEFT_SQUARE_BRACKET = 0x5B; - /* [ */ - - var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; - /* ] */ - - var CHAR_GRAVE_ACCENT = 0x60; - /* ` */ - - var CHAR_LEFT_CURLY_BRACKET = 0x7B; - /* { */ - - var CHAR_VERTICAL_LINE = 0x7C; - /* | */ - - var CHAR_RIGHT_CURLY_BRACKET = 0x7D; - /* } */ + var CHAR_TAB = 0x09; /* Tab */ + var CHAR_LINE_FEED = 0x0A; /* LF */ + var CHAR_CARRIAGE_RETURN = 0x0D; /* CR */ + var CHAR_SPACE = 0x20; /* Space */ + var CHAR_EXCLAMATION = 0x21; /* ! */ + var CHAR_DOUBLE_QUOTE = 0x22; /* " */ + var CHAR_SHARP = 0x23; /* # */ + var CHAR_PERCENT = 0x25; /* % */ + var CHAR_AMPERSAND = 0x26; /* & */ + var CHAR_SINGLE_QUOTE = 0x27; /* ' */ + var CHAR_ASTERISK = 0x2A; /* * */ + var CHAR_COMMA = 0x2C; /* , */ + var CHAR_MINUS = 0x2D; /* - */ + var CHAR_COLON = 0x3A; /* : */ + var CHAR_EQUALS = 0x3D; /* = */ + var CHAR_GREATER_THAN = 0x3E; /* > */ + var CHAR_QUESTION = 0x3F; /* ? */ + var CHAR_COMMERCIAL_AT = 0x40; /* @ */ + var CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */ + var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */ + var CHAR_GRAVE_ACCENT = 0x60; /* ` */ + var CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */ + var CHAR_VERTICAL_LINE = 0x7C; /* | */ + var CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */ var ESCAPE_SEQUENCES = {}; ESCAPE_SEQUENCES[0x00] = '\\0'; @@ -14346,37 +12743,28 @@ ESCAPE_SEQUENCES[0x2028] = '\\L'; ESCAPE_SEQUENCES[0x2029] = '\\P'; var DEPRECATED_BOOLEANS_SYNTAX = ['y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON', 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF']; - function compileStyleMap(schema, map) { var result, keys, index, length, tag, style, type; if (map === null) return {}; result = {}; keys = Object.keys(map); - for (index = 0, length = keys.length; index < length; index += 1) { tag = keys[index]; style = String(map[tag]); - if (tag.slice(0, 2) === '!!') { tag = 'tag:yaml.org,2002:' + tag.slice(2); } - type = schema.compiledTypeMap['fallback'][tag]; - if (type && _hasOwnProperty.call(type.styleAliases, style)) { style = type.styleAliases[style]; } - result[tag] = style; } - return result; } - function encodeHex(character) { var string, handle, length; string = character.toString(16).toUpperCase(); - if (character <= 0xFF) { handle = 'x'; length = 2; @@ -14389,10 +12777,8 @@ } else { throw new exception('code point within a string may not be greater than 0xFFFFFFFF'); } - return '\\' + handle + common.repeat('0', length - string.length) + string; } - function State(options) { this.schema = options['schema'] || default_full; this.indent = Math.max(1, options['indent'] || 2); @@ -14411,20 +12797,18 @@ this.result = ''; this.duplicates = []; this.usedDuplicates = null; - } // Indents every line in a string. Empty lines (\n only) are not indented. - + } + // Indents every line in a string. Empty lines (\n only) are not indented. function indentString(string, spaces) { var ind = common.repeat(' ', spaces), - position = 0, - next = -1, - result = '', - line, - length = string.length; - + position = 0, + next = -1, + result = '', + line, + length = string.length; while (position < length) { next = string.indexOf('\n', position); - if (next === -1) { line = string.slice(position); position = length; @@ -14432,120 +12816,112 @@ line = string.slice(position, next + 1); position = next + 1; } - if (line.length && line !== '\n') result += ind; result += line; } - return result; } - function generateNextLine(state, level) { return '\n' + common.repeat(' ', state.indent * level); } - function testImplicitResolving(state, str) { var index, length, type; - for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { type = state.implicitTypes[index]; - if (type.resolve(str)) { return true; } } - return false; - } // [33] s-white ::= s-space | s-tab - + } + // [33] s-white ::= s-space | s-tab function isWhitespace(c) { return c === CHAR_SPACE || c === CHAR_TAB; - } // Returns true if the character can be printed without escaping. + } + + // Returns true if the character can be printed without escaping. // From YAML 1.2: "any allowed characters known to be non-printable // should also be escaped. [However,] This isn’t mandatory" // Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029. - - function isPrintable(c) { - return 0x00020 <= c && c <= 0x00007E || 0x000A1 <= c && c <= 0x00D7FF && c !== 0x2028 && c !== 0x2029 || 0x0E000 <= c && c <= 0x00FFFD && c !== 0xFEFF - /* BOM */ - || 0x10000 <= c && c <= 0x10FFFF; - } // [34] ns-char ::= nb-char - s-white + return 0x00020 <= c && c <= 0x00007E || 0x000A1 <= c && c <= 0x00D7FF && c !== 0x2028 && c !== 0x2029 || 0x0E000 <= c && c <= 0x00FFFD && c !== 0xFEFF /* BOM */ || 0x10000 <= c && c <= 0x10FFFF; + } + + // [34] ns-char ::= nb-char - s-white // [27] nb-char ::= c-printable - b-char - c-byte-order-mark // [26] b-char ::= b-line-feed | b-carriage-return // [24] b-line-feed ::= #xA /* LF */ // [25] b-carriage-return ::= #xD /* CR */ // [3] c-byte-order-mark ::= #xFEFF - - function isNsChar(c) { - return isPrintable(c) && !isWhitespace(c) // byte-order-mark - && c !== 0xFEFF // b-char + return isPrintable(c) && !isWhitespace(c) + // byte-order-mark + && c !== 0xFEFF + // b-char && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED; - } // Simplified test for values allowed after the first character in plain style. - + } + // Simplified test for values allowed after the first character in plain style. function isPlainSafe(c, prev) { // Uses a subset of nb-char - c-flow-indicator - ":" - "#" // where nb-char ::= c-printable - b-char - c-byte-order-mark. - return isPrintable(c) && c !== 0xFEFF // - c-flow-indicator - && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET // - ":" - "#" + return isPrintable(c) && c !== 0xFEFF + // - c-flow-indicator + && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET + // - ":" - "#" // /* An ns-char preceding */ "#" && c !== CHAR_COLON && (c !== CHAR_SHARP || prev && isNsChar(prev)); - } // Simplified test for values allowed as the first character in plain style. - + } + // Simplified test for values allowed as the first character in plain style. function isPlainSafeFirst(c) { // Uses a subset of ns-char - c-indicator // where ns-char = nb-char - s-white. return isPrintable(c) && c !== 0xFEFF && !isWhitespace(c) // - s-white // - (c-indicator ::= // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}” - && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"” - && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE // | “%” | “@” | “`”) + && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET + // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"” + && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE + // | “%” | “@” | “`”) && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT; - } // Determines whether block indentation indicator is required. - + } + // Determines whether block indentation indicator is required. function needIndentIndicator(string) { var leadingSpaceRe = /^\n* /; return leadingSpaceRe.test(string); } - var STYLE_PLAIN = 1, - STYLE_SINGLE = 2, - STYLE_LITERAL = 3, - STYLE_FOLDED = 4, - STYLE_DOUBLE = 5; // Determines which scalar styles are possible and returns the preferred style. + STYLE_SINGLE = 2, + STYLE_LITERAL = 3, + STYLE_FOLDED = 4, + STYLE_DOUBLE = 5; + + // Determines which scalar styles are possible and returns the preferred style. // lineWidth = -1 => no limit. // Pre-conditions: str.length > 0. // Post-conditions: // STYLE_PLAIN or STYLE_SINGLE => no \n are in the string. // STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1). // STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1). - function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) { var i; var char, prev_char; var hasLineBreak = false; var hasFoldableLine = false; // only checked if shouldTrackWidth - var shouldTrackWidth = lineWidth !== -1; var previousLineBreak = -1; // count the first line correctly - var plain = isPlainSafeFirst(string.charCodeAt(0)) && !isWhitespace(string.charCodeAt(string.length - 1)); - if (singleLineOnly) { // Case: no block styles. // Check for disallowed characters to rule out plain and single. for (i = 0; i < string.length; i++) { char = string.charCodeAt(i); - if (!isPrintable(char)) { return STYLE_DOUBLE; } - prev_char = i > 0 ? string.charCodeAt(i - 1) : null; plain = plain && isPlainSafe(char, prev_char); } @@ -14553,62 +12929,55 @@ // Case: block styles permitted. for (i = 0; i < string.length; i++) { char = string.charCodeAt(i); - if (char === CHAR_LINE_FEED) { - hasLineBreak = true; // Check if any line can be folded. - + hasLineBreak = true; + // Check if any line can be folded. if (shouldTrackWidth) { - hasFoldableLine = hasFoldableLine || // Foldable line = too long, and not more-indented. + hasFoldableLine = hasFoldableLine || + // Foldable line = too long, and not more-indented. i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' '; previousLineBreak = i; } } else if (!isPrintable(char)) { return STYLE_DOUBLE; } - prev_char = i > 0 ? string.charCodeAt(i - 1) : null; plain = plain && isPlainSafe(char, prev_char); - } // in case the end is missing a \n - - + } + // in case the end is missing a \n hasFoldableLine = hasFoldableLine || shouldTrackWidth && i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== ' '; - } // Although every style can represent \n without escaping, prefer block styles + } + // Although every style can represent \n without escaping, prefer block styles // for multiline, since they're more readable and they don't add empty lines. // Also prefer folding a super-long line. - - if (!hasLineBreak && !hasFoldableLine) { // Strings interpretable as another type have to be quoted; // e.g. the string 'true' vs. the boolean true. return plain && !testAmbiguousType(string) ? STYLE_PLAIN : STYLE_SINGLE; - } // Edge case: block indentation indicator can only have one digit. - - + } + // Edge case: block indentation indicator can only have one digit. if (indentPerLevel > 9 && needIndentIndicator(string)) { return STYLE_DOUBLE; - } // At this point we know block styles are valid. + } + // At this point we know block styles are valid. // Prefer literal style unless we want to fold. - - return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; - } // Note: line breaking/folding is implemented for only the folded style. + } + + // Note: line breaking/folding is implemented for only the folded style. // NB. We drop the last trailing newline (if any) of a returned block scalar // since the dumper adds its own newline. This always works: // • No ending newline => unaffected; already using strip "-" chomping. // • Ending newline => removed then restored. // Importantly, this keeps the "+" chomp indicator from gaining an extra line. - - function writeScalar(state, string, level, iskey) { state.dump = function () { if (string.length === 0) { return "''"; } - if (!state.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) { return "'" + string + "'"; } - var indent = state.indent * Math.max(1, level); // no 0-indent scalars // As indentation gets deeper, let the width decrease monotonically // to the lower bound min(state.lineWidth, 40). @@ -14617,171 +12986,154 @@ // state.lineWidth > 40 + state.indent: width decreases until the lower bound. // This behaves better than a constant minimum width which disallows narrower options, // or an indent threshold which causes the width to suddenly increase. + var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); - var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); // Without knowing if keys are implicit/explicit, assume implicit for safety. - - var singleLineOnly = iskey // No block styles in flow mode. + // Without knowing if keys are implicit/explicit, assume implicit for safety. + var singleLineOnly = iskey + // No block styles in flow mode. || state.flowLevel > -1 && level >= state.flowLevel; - function testAmbiguity(string) { return testImplicitResolving(state, string); } - switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) { case STYLE_PLAIN: return string; - case STYLE_SINGLE: return "'" + string.replace(/'/g, "''") + "'"; - case STYLE_LITERAL: return '|' + blockHeader(string, state.indent) + dropEndingNewline(indentString(string, indent)); - case STYLE_FOLDED: return '>' + blockHeader(string, state.indent) + dropEndingNewline(indentString(foldString(string, lineWidth), indent)); - case STYLE_DOUBLE: return '"' + escapeString(string) + '"'; - default: throw new exception('impossible error: invalid scalar style'); } }(); - } // Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9. - + } + // Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9. function blockHeader(string, indentPerLevel) { - var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ''; // note the special case: the string '\n' counts as a "trailing" empty line. + var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ''; + // note the special case: the string '\n' counts as a "trailing" empty line. var clip = string[string.length - 1] === '\n'; var keep = clip && (string[string.length - 2] === '\n' || string === '\n'); var chomp = keep ? '+' : clip ? '' : '-'; return indentIndicator + chomp + '\n'; - } // (See the note for writeScalar.) - + } + // (See the note for writeScalar.) function dropEndingNewline(string) { return string[string.length - 1] === '\n' ? string.slice(0, -1) : string; - } // Note: a long line without a suitable break point will exceed the width limit. - // Pre-conditions: every char in str isPrintable, str.length > 0, width > 0. - + } + // Note: a long line without a suitable break point will exceed the width limit. + // Pre-conditions: every char in str isPrintable, str.length > 0, width > 0. function foldString(string, width) { // In folded style, $k$ consecutive newlines output as $k+1$ newlines— // unless they're before or after a more-indented line, or at the very // beginning or end, in which case $k$ maps to $k$. // Therefore, parse each chunk as newline(s) followed by a content line. - var lineRe = /(\n+)([^\n]*)/g; // first line (possibly an empty line) + var lineRe = /(\n+)([^\n]*)/g; + // first line (possibly an empty line) var result = function () { var nextLF = string.indexOf('\n'); nextLF = nextLF !== -1 ? nextLF : string.length; lineRe.lastIndex = nextLF; return foldLine(string.slice(0, nextLF), width); - }(); // If we haven't reached the first content line yet, don't add an extra \n. - - + }(); + // If we haven't reached the first content line yet, don't add an extra \n. var prevMoreIndented = string[0] === '\n' || string[0] === ' '; - var moreIndented; // rest of the lines + var moreIndented; + // rest of the lines var match; - while (match = lineRe.exec(string)) { var prefix = match[1], - line = match[2]; + line = match[2]; moreIndented = line[0] === ' '; result += prefix + (!prevMoreIndented && !moreIndented && line !== '' ? '\n' : '') + foldLine(line, width); prevMoreIndented = moreIndented; } - return result; - } // Greedy line breaking. + } + + // Greedy line breaking. // Picks the longest line under the limit each time, // otherwise settles for the shortest line over the limit. // NB. More-indented lines *cannot* be folded, as that would add an extra \n. - - function foldLine(line, width) { - if (line === '' || line[0] === ' ') return line; // Since a more-indented line adds a \n, breaks can't be followed by a space. + if (line === '' || line[0] === ' ') return line; + // Since a more-indented line adds a \n, breaks can't be followed by a space. var breakRe = / [^ ]/g; // note: the match index will always be <= length-2. - - var match; // start is an inclusive index. end, curr, and next are exclusive. - + var match; + // start is an inclusive index. end, curr, and next are exclusive. var start = 0, - end, - curr = 0, - next = 0; - var result = ''; // Invariants: 0 <= start <= length-1. + end, + curr = 0, + next = 0; + var result = ''; + + // Invariants: 0 <= start <= length-1. // 0 <= curr <= next <= max(0, length-2). curr - start <= width. // Inside the loop: // A match implies length >= 2, so curr and next are <= length-2. - while (match = breakRe.exec(line)) { - next = match.index; // maintain invariant: curr - start <= width - + next = match.index; + // maintain invariant: curr - start <= width if (next - start > width) { end = curr > start ? curr : next; // derive end <= length-2 - - result += '\n' + line.slice(start, end); // skip the space that was output as \n - + result += '\n' + line.slice(start, end); + // skip the space that was output as \n start = end + 1; // derive start <= length-1 } curr = next; - } // By the invariants, start <= length-1, so there is something left over. - // It is either the whole string or a part starting from non-whitespace. - - - result += '\n'; // Insert a break if the remainder is too long and there is a break available. + } + // By the invariants, start <= length-1, so there is something left over. + // It is either the whole string or a part starting from non-whitespace. + result += '\n'; + // Insert a break if the remainder is too long and there is a break available. if (line.length - start > width && curr > start) { result += line.slice(start, curr) + '\n' + line.slice(curr + 1); } else { result += line.slice(start); } - return result.slice(1); // drop extra \n joiner - } // Escapes a double-quoted string. - + } + // Escapes a double-quoted string. function escapeString(string) { var result = ''; var char, nextChar; var escapeSeq; - for (var i = 0; i < string.length; i++) { - char = string.charCodeAt(i); // Check for surrogate pairs (reference Unicode 3.0 section "3.7 Surrogates"). - - if (char >= 0xD800 && char <= 0xDBFF - /* high surrogate */ - ) { - nextChar = string.charCodeAt(i + 1); - - if (nextChar >= 0xDC00 && nextChar <= 0xDFFF - /* low surrogate */ - ) { - // Combine the surrogate pair and store it escaped. - result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000); // Advance index one extra since we already used that char here. - - i++; - continue; - } + char = string.charCodeAt(i); + // Check for surrogate pairs (reference Unicode 3.0 section "3.7 Surrogates"). + if (char >= 0xD800 && char <= 0xDBFF /* high surrogate */) { + nextChar = string.charCodeAt(i + 1); + if (nextChar >= 0xDC00 && nextChar <= 0xDFFF /* low surrogate */) { + // Combine the surrogate pair and store it escaped. + result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000); + // Advance index one extra since we already used that char here. + i++; + continue; } - + } escapeSeq = ESCAPE_SEQUENCES[char]; result += !escapeSeq && isPrintable(char) ? string[i] : escapeSeq || encodeHex(char); } - return result; } - function writeFlowSequence(state, level, object) { var _result = '', - _tag = state.tag, - index, - length; - + _tag = state.tag, + index, + length; for (index = 0, length = object.length; index < length; index += 1) { // Write only valid elements. if (writeNode(state, level, object[index], false, false)) { @@ -14789,86 +13141,77 @@ _result += state.dump; } } - state.tag = _tag; state.dump = '[' + _result + ']'; } - function writeBlockSequence(state, level, object, compact) { var _result = '', - _tag = state.tag, - index, - length; - + _tag = state.tag, + index, + length; for (index = 0, length = object.length; index < length; index += 1) { // Write only valid elements. if (writeNode(state, level + 1, object[index], true, true)) { if (!compact || index !== 0) { _result += generateNextLine(state, level); } - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { _result += '-'; } else { _result += '- '; } - _result += state.dump; } } - state.tag = _tag; state.dump = _result || '[]'; // Empty sequence if no valid values. } function writeFlowMapping(state, level, object) { var _result = '', - _tag = state.tag, - objectKeyList = Object.keys(object), - index, - length, - objectKey, - objectValue, - pairBuffer; - + _tag = state.tag, + objectKeyList = Object.keys(object), + index, + length, + objectKey, + objectValue, + pairBuffer; for (index = 0, length = objectKeyList.length; index < length; index += 1) { pairBuffer = ''; if (index !== 0) pairBuffer += ', '; if (state.condenseFlow) pairBuffer += '"'; objectKey = objectKeyList[index]; objectValue = object[objectKey]; - if (!writeNode(state, level, objectKey, false, false)) { continue; // Skip this pair because of invalid key; } if (state.dump.length > 1024) pairBuffer += '? '; pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' '); - if (!writeNode(state, level, objectValue, false, false)) { continue; // Skip this pair because of invalid value. } - pairBuffer += state.dump; // Both key and value are valid. + pairBuffer += state.dump; + // Both key and value are valid. _result += pairBuffer; } - state.tag = _tag; state.dump = '{' + _result + '}'; } - function writeBlockMapping(state, level, object, compact) { var _result = '', - _tag = state.tag, - objectKeyList = Object.keys(object), - index, - length, - objectKey, - objectValue, - explicitPair, - pairBuffer; // Allow sorting keys so that the output file is deterministic - + _tag = state.tag, + objectKeyList = Object.keys(object), + index, + length, + objectKey, + objectValue, + explicitPair, + pairBuffer; + + // Allow sorting keys so that the output file is deterministic if (state.sortKeys === true) { // Default sorting objectKeyList.sort(); @@ -14879,23 +13222,18 @@ // Something is wrong throw new exception('sortKeys must be a boolean or a function'); } - for (index = 0, length = objectKeyList.length; index < length; index += 1) { pairBuffer = ''; - if (!compact || index !== 0) { pairBuffer += generateNextLine(state, level); } - objectKey = objectKeyList[index]; objectValue = object[objectKey]; - if (!writeNode(state, level + 1, objectKey, true, true, true)) { continue; // Skip this pair because of invalid key. } explicitPair = state.tag !== null && state.tag !== '?' || state.dump && state.dump.length > 1024; - if (explicitPair) { if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { pairBuffer += '?'; @@ -14903,13 +13241,10 @@ pairBuffer += '? '; } } - pairBuffer += state.dump; - if (explicitPair) { pairBuffer += generateNextLine(state, level); } - if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { continue; // Skip this pair because of invalid value. } @@ -14919,30 +13254,24 @@ } else { pairBuffer += ': '; } + pairBuffer += state.dump; - pairBuffer += state.dump; // Both key and value are valid. - + // Both key and value are valid. _result += pairBuffer; } - state.tag = _tag; state.dump = _result || '{}'; // Empty mapping if no valid pairs. } function detectType(state, object, explicit) { var _result, typeList, index, length, type, style; - typeList = explicit ? state.explicitTypes : state.implicitTypes; - for (index = 0, length = typeList.length; index < length; index += 1) { type = typeList[index]; - if ((type.instanceOf || type.predicate) && (!type.instanceOf || typeof object === 'object' && object instanceof type.instanceOf) && (!type.predicate || type.predicate(object))) { state.tag = explicit ? type.tag : '?'; - if (type.represent) { style = state.styleMap[type.tag] || type.defaultStyle; - if (_toString.call(type.represent) === '[object Function]') { _result = type.represent(object, style); } else if (_hasOwnProperty.call(type.represent, style)) { @@ -14950,80 +13279,64 @@ } else { throw new exception('!<' + type.tag + '> tag resolver accepts not "' + style + '" style'); } - state.dump = _result; } - return true; } } - return false; - } // Serializes `object` and writes it to global `result`. + } + + // Serializes `object` and writes it to global `result`. // Returns true on success, or false on invalid object. // - - function writeNode(state, level, object, block, compact, iskey) { state.tag = null; state.dump = object; - if (!detectType(state, object, false)) { detectType(state, object, true); } - var type = _toString.call(state.dump); - if (block) { block = state.flowLevel < 0 || state.flowLevel > level; } - var objectOrArray = type === '[object Object]' || type === '[object Array]', - duplicateIndex, - duplicate; - + duplicateIndex, + duplicate; if (objectOrArray) { duplicateIndex = state.duplicates.indexOf(object); duplicate = duplicateIndex !== -1; } - if (state.tag !== null && state.tag !== '?' || duplicate || state.indent !== 2 && level > 0) { compact = false; } - if (duplicate && state.usedDuplicates[duplicateIndex]) { state.dump = '*ref_' + duplicateIndex; } else { if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { state.usedDuplicates[duplicateIndex] = true; } - if (type === '[object Object]') { if (block && Object.keys(state.dump).length !== 0) { writeBlockMapping(state, level, state.dump, compact); - if (duplicate) { state.dump = '&ref_' + duplicateIndex + state.dump; } } else { writeFlowMapping(state, level, state.dump); - if (duplicate) { state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; } } } else if (type === '[object Array]') { var arrayLevel = state.noArrayIndent && level > 0 ? level - 1 : level; - if (block && state.dump.length !== 0) { writeBlockSequence(state, arrayLevel, state.dump, compact); - if (duplicate) { state.dump = '&ref_' + duplicateIndex + state.dump; } } else { writeFlowSequence(state, arrayLevel, state.dump); - if (duplicate) { state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; } @@ -15036,49 +13349,39 @@ if (state.skipInvalid) return false; throw new exception('unacceptable kind of an object to dump ' + type); } - if (state.tag !== null && state.tag !== '?') { state.dump = '!<' + state.tag + '> ' + state.dump; } } - return true; } - function getDuplicateReferences(object, state) { var objects = [], - duplicatesIndexes = [], - index, - length; + duplicatesIndexes = [], + index, + length; inspectNode(object, objects, duplicatesIndexes); - for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { state.duplicates.push(objects[duplicatesIndexes[index]]); } - state.usedDuplicates = new Array(length); } - function inspectNode(object, objects, duplicatesIndexes) { var objectKeyList, index, length; - if (object !== null && typeof object === 'object') { index = objects.indexOf(object); - if (index !== -1) { if (duplicatesIndexes.indexOf(index) === -1) { duplicatesIndexes.push(index); } } else { objects.push(object); - if (Array.isArray(object)) { for (index = 0, length = object.length; index < length; index += 1) { inspectNode(object[index], objects, duplicatesIndexes); } } else { objectKeyList = Object.keys(object); - for (index = 0, length = objectKeyList.length; index < length; index += 1) { inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); } @@ -15086,7 +13389,6 @@ } } } - function dump$1(input, options) { options = options || {}; var state = new State(options); @@ -15094,13 +13396,11 @@ if (writeNode(state, 0, input, true, true)) return state.dump + '\n'; return ''; } - function safeDump$1(input, options) { return dump$1(input, common.extend({ schema: default_safe }, options)); } - var dump_1 = dump$1; var safeDump_1 = safeDump$1; var dumper = { @@ -15113,7 +13413,6 @@ throw new Error('Function ' + name + ' is deprecated and cannot be used.'); }; } - var Type = type; var Schema = schema; var FAILSAFE_SCHEMA = failsafe; @@ -15127,12 +13426,14 @@ var safeLoadAll = loader.safeLoadAll; var dump = dumper.dump; var safeDump = dumper.safeDump; - var YAMLException = exception; // Deprecated schema names from JS-YAML 2.0.x + var YAMLException = exception; + // Deprecated schema names from JS-YAML 2.0.x var MINIMAL_SCHEMA = failsafe; var SAFE_SCHEMA = default_safe; - var DEFAULT_SCHEMA = default_full; // Deprecated functions from JS-YAML 1.x.x + var DEFAULT_SCHEMA = default_full; + // Deprecated functions from JS-YAML 1.x.x var scan = deprecated('scan'); var parse = deprecated('parse'); var compose = deprecated('compose'); @@ -15163,9 +13464,9 @@ var jsYaml = jsYaml$1; - function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } + function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } /** * Redirect - object used to redirect some requests * e.g. @@ -15183,7 +13484,6 @@ * @property {boolean} [isBlocking] * @property {string} [sha] */ - var Redirects = /*#__PURE__*/function () { /** * Converts rawYaml into JS object with sources titles used as keys @@ -15193,7 +13493,6 @@ */ function Redirects(rawYaml) { classCallCheck(this, Redirects); - try { var arrOfRedirects = jsYaml.safeLoad(rawYaml); this.redirects = arrOfRedirects.reduce(function (acc, redirect) { @@ -15205,38 +13504,33 @@ throw e; } } + /** * Returns redirect source object * @param {string} title * @return {Redirect} */ - - createClass(Redirects, [{ key: "getRedirect", value: function getRedirect(title) { var _this = this; - if (Object.prototype.hasOwnProperty.call(this.redirects, title)) { return this.redirects[title]; - } // look title among aliases - + } + // look title among aliases var values = Object.keys(this.redirects).map(function (key) { return _this.redirects[key]; }); return values.find(function (redirect) { var aliases = redirect.aliases; - if (!aliases) { return false; } - return aliases.indexOf(title) > -1; }); } }]); - return Redirects; }(); @@ -15323,12 +13617,6 @@ "prebid-ads.js": "prebid-ads.js", prebid: "prebid.js", "prevent-bab": "prevent-bab.js", - "nobab.js": "prevent-bab.js", - "ubo-nobab.js": "prevent-bab.js", - "bab-defuser.js": "prevent-bab.js", - "ubo-bab-defuser.js": "prevent-bab.js", - "ubo-nobab": "prevent-bab.js", - "ubo-bab-defuser": "prevent-bab.js", "prevent-bab2": "prevent-bab2.js", "nobab2.js": "prevent-bab2.js", "prevent-fab-3.2.0": "prevent-fab-3.2.0.js", @@ -15354,7 +13642,6 @@ * Finds redirect resource by it's name * @param {string} name - redirect name */ - var getRedirectByName = function getRedirectByName(name) { var redirects = Object.keys(redirectsList).map(function (key) { return redirectsList[key]; @@ -15363,6 +13650,7 @@ return r.names && r.names.indexOf(name) > -1; }); }; + /** * @typedef {Object} Source - redirect properties * @property {string} name redirect name @@ -15377,22 +13665,19 @@ * @param {Source} source * @returns {string} redirect code */ - - var getRedirectCode = function getRedirectCode(source) { var redirect = getRedirectByName(source.name); var result = attachDependencies(redirect); - result = addCall(redirect, result); // redirect code for different sources is checked in tests - // so it should be just a code without any source and props passed + result = addCall(redirect, result); + // redirect code for different sources is checked in tests + // so it should be just a code without any source and props passed result = source.engine === 'test' ? wrapInNonameFunc(result) : passSourceAndProps(source, result, true); return result; }; - var getRedirectFilename = function getRedirectFilename(name) { return redirectsMap[name]; }; - var redirects = { Redirects: Redirects, getRedirectFilename: getRedirectFilename, @@ -15413,49 +13698,38 @@ var searchRegexp = toRegExp(search); var rid = randomId(); var SRC_DATA_MARKER = "data:text/javascript;base64,"; - var getCurrentScript = function getCurrentScript() { if ("currentScript" in document) { return document.currentScript; } - var scripts = document.getElementsByTagName("script"); return scripts[scripts.length - 1]; }; - var ourScript = getCurrentScript(); - var abort = function abort() { var scriptEl = getCurrentScript(); - if (!scriptEl) { return; } - var content = scriptEl.textContent; - try { var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, "textContent").get; content = textContentGetter.call(scriptEl); } catch (e) {} - if (content.length === 0 && typeof scriptEl.src !== "undefined" && startsWith(scriptEl.src, SRC_DATA_MARKER)) { var encodedContent = scriptEl.src.slice(SRC_DATA_MARKER.length); content = window.atob(encodedContent); } - if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { hit(source); throw new ReferenceError(rid); } }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (base instanceof Object === false && base === null) { var props = property.split("."); var propIndex = props.indexOf(prop); @@ -15464,16 +13738,13 @@ logMessage(source, message); return; } - if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -15482,33 +13753,27 @@ }); return; } - var currentValue = base[prop]; var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); - if (origDescriptor instanceof Object === false || origDescriptor.get instanceof Function === false) { currentValue = base[prop]; origDescriptor = undefined; } - var descriptorWrapper = Object.assign(getDescriptorAddon(), { currentValue: currentValue, get: function get() { if (!this.isAbortingSuspended) { this.isolateCallback(abort); } - if (origDescriptor instanceof Object) { return origDescriptor.get.call(base); } - return this.currentValue; }, set: function set(newValue) { if (!this.isAbortingSuspended) { this.isolateCallback(abort); } - if (origDescriptor instanceof Object) { origDescriptor.set.call(base, newValue); } else { @@ -15525,38 +13790,29 @@ } }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - function randomId() { return Math.random().toString(36).substr(2, 9); } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -15564,10 +13820,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -15575,7 +13829,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -15583,11 +13836,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -15597,119 +13848,85 @@ chain: chain }; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function startsWith(str, prefix) { return !!str && str.indexOf(prefix) === 0; } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getDescriptorAddon() { return { isAbortingSuspended: false, isolateCallback: function isolateCallback(cb) { this.isAbortingSuspended = true; - try { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - var result = cb.apply(void 0, args); this.isAbortingSuspended = false; return result; @@ -15721,44 +13938,35 @@ } }; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { abortCurrentInlineScript.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function abortOnPropertyRead(source, args) { function abortOnPropertyRead(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -15767,44 +13975,34 @@ }); return; } - setPropertyAccess(base, prop, { get: abort, set: function set() {} }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - function randomId() { return Math.random().toString(36).substr(2, 9); } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -15812,10 +14010,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -15823,7 +14019,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -15831,11 +14026,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -15845,116 +14038,83 @@ chain: chain }; } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { abortOnPropertyRead.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function abortOnPropertyWrite(source, args) { function abortOnPropertyWrite(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -15963,43 +14123,33 @@ }); return; } - setPropertyAccess(base, prop, { set: abort }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - function randomId() { return Math.random().toString(36).substr(2, 9); } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -16007,10 +14157,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -16018,7 +14166,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -16026,11 +14173,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -16040,116 +14185,83 @@ chain: chain }; } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { abortOnPropertyWrite.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function abortOnStackTrace(source, args) { function abortOnStackTrace(source, property, stack) { if (!property || !stack) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); throw new ReferenceError(rid); }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -16158,26 +14270,22 @@ }); return; } - if (!stack.match(/^(inlineScript|injectedScript)$/) && !isValidStrPattern(stack)) { logMessage(source, "Invalid parameter: ".concat(stack)); return; } - var descriptorWrapper = Object.assign(getDescriptorAddon(), { value: base[prop], get: function get() { if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { abort(); } - return this.value; }, set: function set(newValue) { if (!this.isAbortingSuspended && this.isolateCallback(matchStackTrace, stack, new Error().stack)) { abort(); } - this.value = newValue; } }); @@ -16190,38 +14298,29 @@ } }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - function randomId() { return Math.random().toString(36).substr(2, 9); } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -16229,10 +14328,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -16240,7 +14337,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -16248,11 +14344,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -16262,126 +14356,91 @@ chain: chain }; } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function matchStackTrace(stackMatch, stackTrace) { if (!stackMatch || stackMatch === "") { return true; } - if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { return true; } - var stackRegexp = toRegExp(stackMatch); var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { return line.trim(); }).join("\n"); return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); } - function getDescriptorAddon() { return { isAbortingSuspended: false, isolateCallback: function isolateCallback(cb) { this.isAbortingSuspended = true; - try { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - var result = cb.apply(void 0, args); this.isAbortingSuspended = false; return result; @@ -16393,90 +14452,69 @@ } }; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getNativeRegexpTest() { return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; } - function startsWith(str, prefix) { return !!str && str.indexOf(prefix) === 0; } - function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { var INLINE_SCRIPT_STRING = "inlineScript"; var INJECTED_SCRIPT_STRING = "injectedScript"; var INJECTED_SCRIPT_MARKER = ""; - var isInlineScript = function isInlineScript(stackMatch) { return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; }; - var isInjectedScript = function isInjectedScript(stackMatch) { return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; }; - if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { return false; } - var documentURL = window.location.href; var pos = documentURL.indexOf("#"); - if (pos !== -1) { documentURL = documentURL.slice(0, pos); } - var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { return line.trim(); }); var stackLines = stackSteps.map(function (line) { var stack; var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); - if (getStackTraceURL) { var stackURL = getStackTraceURL[2]; - if (startsWith(stackURL, "(")) { stackURL = stackURL.slice(1); } - if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { stackURL = INJECTED_SCRIPT_STRING; var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); - if (startsWith(stackFunction, "at")) { stackFunction = stackFunction.slice(2).trim(); } - stack = "".concat(stackFunction, " ").concat(stackURL).trim(); } else { stack = stackURL; @@ -16484,39 +14522,31 @@ } else { stack = line; } - return stack; }); - if (stackLines) { for (var index = 0; index < stackLines.length; index += 1) { if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { return true; } - if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { return true; } } } - return false; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { abortOnStackTrace.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function adjustSetInterval(source, args) { function adjustSetInterval(source, matchCallback, matchDelay, boost) { var nativeSetInterval = window.setInterval; var matchRegexp = toRegExp(matchCallback); - var intervalWrapper = function intervalWrapper(callback, delay) { if (!isValidCallback(callback)) { var message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'."); @@ -16525,152 +14555,110 @@ delay *= getBoostMultiplier(boost); hit(source); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeSetInterval.apply(window, [callback, delay].concat(args)); }; - window.setInterval = intervalWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function isValidCallback(callback) { return callback instanceof Function || typeof callback === "string"; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function getBoostMultiplier(boost) { var DEFAULT_MULTIPLIER = .05; var MIN_MULTIPLIER = .02; var MAX_MULTIPLIER = 50; var parsedBoost = parseFloat(boost); var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost; - if (boostMultiplier < MIN_MULTIPLIER) { boostMultiplier = MIN_MULTIPLIER; } - if (boostMultiplier > MAX_MULTIPLIER) { boostMultiplier = MAX_MULTIPLIER; } - return boostMultiplier; } - function isDelayMatched(inputDelay, realDelay) { return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function nativeIsFinite(num) { var native = Number.isFinite || window.isFinite; return native(num); } - function getMatchDelay(delay) { var DEFAULT_DELAY = 1e3; var parsedDelay = parseInt(delay, 10); var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay; return delayMatch; } - function shouldMatchAnyDelay(delay) { return delay === "*"; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { adjustSetInterval.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function adjustSetTimeout(source, args) { function adjustSetTimeout(source, matchCallback, matchDelay, boost) { var nativeSetTimeout = window.setTimeout; var matchRegexp = toRegExp(matchCallback); - var timeoutWrapper = function timeoutWrapper(callback, delay) { if (!isValidCallback(callback)) { var message = "Scriptlet can't be applied because of invalid callback: '".concat(String(callback), "'."); @@ -16679,189 +14667,138 @@ delay *= getBoostMultiplier(boost); hit(source); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeSetTimeout.apply(window, [callback, delay].concat(args)); }; - window.setTimeout = timeoutWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function isValidCallback(callback) { return callback instanceof Function || typeof callback === "string"; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function getBoostMultiplier(boost) { var DEFAULT_MULTIPLIER = .05; var MIN_MULTIPLIER = .02; var MAX_MULTIPLIER = 50; var parsedBoost = parseFloat(boost); var boostMultiplier = nativeIsNaN(parsedBoost) || !nativeIsFinite(parsedBoost) ? DEFAULT_MULTIPLIER : parsedBoost; - if (boostMultiplier < MIN_MULTIPLIER) { boostMultiplier = MIN_MULTIPLIER; } - if (boostMultiplier > MAX_MULTIPLIER) { boostMultiplier = MAX_MULTIPLIER; } - return boostMultiplier; } - function isDelayMatched(inputDelay, realDelay) { return shouldMatchAnyDelay(inputDelay) || realDelay === getMatchDelay(inputDelay); } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function nativeIsFinite(num) { var native = Number.isFinite || window.isFinite; return native(num); } - function getMatchDelay(delay) { var DEFAULT_DELAY = 1e3; var parsedDelay = parseInt(delay, 10); var delayMatch = nativeIsNaN(parsedDelay) ? DEFAULT_DELAY : parsedDelay; return delayMatch; } - function shouldMatchAnyDelay(delay) { return delay === "*"; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { adjustSetTimeout.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function debugCurrentInlineScript(source, args) { function debugCurrentInlineScript(source, property, search) { var searchRegexp = toRegExp(search); var rid = randomId(); - var getCurrentScript = function getCurrentScript() { if ("currentScript" in document) { return document.currentScript; } - var scripts = document.getElementsByTagName("script"); return scripts[scripts.length - 1]; }; - var ourScript = getCurrentScript(); - var abort = function abort() { var scriptEl = getCurrentScript(); - if (!scriptEl) { return; } - var content = scriptEl.textContent; - try { var textContentGetter = Object.getOwnPropertyDescriptor(Node.prototype, "textContent").get; content = textContentGetter.call(scriptEl); } catch (e) {} - if (scriptEl instanceof HTMLScriptElement && content.length > 0 && scriptEl !== ourScript && searchRegexp.test(content)) { hit(source); debugger; } }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (base instanceof Object === false && base === null) { var props = property.split("."); var propIndex = props.indexOf(prop); @@ -16870,16 +14807,13 @@ logMessage(message, source.verbose); return; } - if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -16888,7 +14822,6 @@ }); return; } - var currentValue = base[prop]; setPropertyAccess(base, prop, { set: function set(value) { @@ -16901,38 +14834,29 @@ } }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - function randomId() { return Math.random().toString(36).substr(2, 9); } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -16940,10 +14864,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -16951,7 +14873,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -16959,11 +14880,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -16973,141 +14892,102 @@ chain: chain }; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { debugCurrentInlineScript.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function debugOnPropertyRead(source, args) { function debugOnPropertyRead(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); debugger; }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -17116,44 +14996,34 @@ }); return; } - setPropertyAccess(base, prop, { get: abort, set: noopFunc }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - function randomId() { return Math.random().toString(36).substr(2, 9); } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -17161,10 +15031,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -17172,7 +15040,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -17180,11 +15047,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -17194,118 +15059,84 @@ chain: chain }; } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function noopFunc() {} - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { debugOnPropertyRead.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function debugOnPropertyWrite(source, args) { function debugOnPropertyWrite(source, property) { if (!property) { return; } - var rid = randomId(); - var abort = function abort() { hit(source); debugger; }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -17314,43 +15145,33 @@ }); return; } - setPropertyAccess(base, prop, { set: abort }); }; - setChainPropAccess(window, property); window.onerror = createOnErrorHandler(rid).bind(); } - function randomId() { return Math.random().toString(36).substr(2, 9); } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -17358,10 +15179,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -17369,7 +15188,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -17377,11 +15195,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -17391,174 +15207,114 @@ chain: chain }; } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { debugOnPropertyWrite.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function dirString(source, args) { function dirString(source, times) { var _console = console, - dir = _console.dir; - times = parseInt(times, 10); - + dir = _console.dir; function dirWrapper(object) { - var temp; - - for (var i = 0; i < times; i += 1) { - temp = "".concat(object); - } - if (typeof dir === "function") { dir.call(this, object); } - - hit(source, temp); + hit(source); } - console.dir = dirWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { dirString.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function disableNewtabLinks(source, args) { function disableNewtabLinks(source) { document.addEventListener("click", function (ev) { var target = ev.target; - while (target !== null) { if (target.localName === "a" && target.hasAttribute("target")) { ev.stopPropagation(); @@ -17566,79 +15322,55 @@ hit(source); break; } - target = target.parentNode; } }); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { disableNewtabLinks.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function forceWindowClose(source, args) { function forceWindowClose(source) { var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; - if (typeof window.close !== "function") { var message = "window.close() is not a function so 'close-window' scriptlet is unavailable"; logMessage(source, message); + return; } - var closeImmediately = function closeImmediately() { try { hit(source); @@ -17647,12 +15379,10 @@ logMessage(source, e); } }; - var closeByExtension = function closeByExtension() { var extCall = function extCall() { dispatchEvent(new Event("adguard:scriptlet-close-window")); }; - window.addEventListener("adguard:subscribed-to-close-window", extCall, { once: true }); @@ -17662,202 +15392,141 @@ }); }, 5e3); }; - var shouldClose = function shouldClose() { if (path === "") { return true; } - var pathRegexp = toRegExp(path); var currentPath = "".concat(window.location.pathname).concat(window.location.search); return pathRegexp.test(currentPath); }; - if (shouldClose()) { closeImmediately(); - if (navigator.userAgent.indexOf("Chrome") > -1) { closeByExtension(); } } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { forceWindowClose.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function hideInShadowDom(source, args) { function hideInShadowDom(source, selector, baseSelector) { if (!Element.prototype.attachShadow) { return; } - var hideElement = function hideElement(targetElement) { var DISPLAY_NONE_CSS = "display:none!important;"; targetElement.style.cssText = DISPLAY_NONE_CSS; }; - var hideHandler = function hideHandler() { var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); - while (hostElements.length !== 0) { var isHidden = false; - var _pierceShadowDom = pierceShadowDom(selector, hostElements), - targets = _pierceShadowDom.targets, - innerHosts = _pierceShadowDom.innerHosts; - + targets = _pierceShadowDom.targets, + innerHosts = _pierceShadowDom.innerHosts; targets.forEach(function (targetEl) { hideElement(targetEl); isHidden = true; }); - if (isHidden) { hit(source); } - hostElements = innerHosts; } }; - hideHandler(); observeDOMChanges(hideHandler, true); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function observeDOMChanges(callback) { var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; var THROTTLE_DELAY_MS = 20; var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { @@ -17874,20 +15543,16 @@ }); } }; - var disconnect = function disconnect() { observer.disconnect(); }; - function callbackWrapper() { disconnect(); callback(); connect(); } - connect(); } - function findHostElements(rootElement) { var hosts = []; var domElems = rootElement.querySelectorAll("*"); @@ -17898,7 +15563,6 @@ }); return hosts; } - function pierceShadowDom(selector, hostElements) { var targets = []; var innerHostsAcc = []; @@ -17916,17 +15580,14 @@ innerHosts: innerHosts }; } - function flatten(input) { var stack = []; input.forEach(function (el) { return stack.push(el); }); var res = []; - while (stack.length) { var next = stack.pop(); - if (Array.isArray(next)) { next.forEach(function (el) { return stack.push(el); @@ -17935,83 +15596,66 @@ res.push(next); } } - return res.reverse(); } - function throttle(cb, delay) { var wait = false; var savedArgs; - var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - if (wait) { savedArgs = args; return; } - cb.apply(void 0, args); wait = true; setTimeout(function () { wait = false; - if (savedArgs) { wrapper(savedArgs); savedArgs = null; } }, delay); }; - return wrapper; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { hideInShadowDom.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function jsonPrune(source, args) { function jsonPrune(source, propsToRemove, requiredInitialProps, stack) { if (!!stack && !matchStackTrace(stack, new Error().stack)) { return; } - var prunePaths = propsToRemove !== undefined && propsToRemove !== "" ? propsToRemove.split(/ +/) : []; var requiredPaths = requiredInitialProps !== undefined && requiredInitialProps !== "" ? requiredInitialProps.split(/ +/) : []; - function isPruningNeeded(root) { if (!root) { return false; } - var shouldProcess; - if (prunePaths.length === 0 && requiredPaths.length > 0) { var rootString = JSON.stringify(root); var matchRegex = toRegExp(requiredPaths.join("")); var shouldLog = matchRegex.test(rootString); - if (shouldLog) { - logMessage(source, "".concat(window.location.hostname, " ").concat(root), true); + logMessage(source, "".concat(window.location.hostname, " ").concat(objectToString(root)), true); shouldProcess = false; return shouldProcess; } } - for (var i = 0; i < requiredPaths.length; i += 1) { var requiredPath = requiredPaths[i]; var lastNestedPropName = requiredPath.split(".").pop(); var hasWildcard = requiredPath.indexOf(".*.") > -1 || requiredPath.indexOf("*.") > -1 || requiredPath.indexOf(".*") > -1 || requiredPath.indexOf(".[].") > -1 || requiredPath.indexOf("[].") > -1 || requiredPath.indexOf(".[]") > -1; var details = getWildcardPropertyInChain(root, requiredPath, hasWildcard); shouldProcess = !hasWildcard; - for (var _i = 0; _i < details.length; _i += 1) { if (hasWildcard) { shouldProcess = !(details[_i].base[lastNestedPropName] === undefined) || shouldProcess; @@ -18020,21 +15664,17 @@ } } } - return shouldProcess; } - var jsonPruner = function jsonPruner(root) { if (prunePaths.length === 0 && requiredPaths.length === 0) { - logMessage(source, "".concat(window.location.hostname, " ").concat(root), true); + logMessage(source, "".concat(window.location.hostname, " ").concat(objectToString(root)), true); return root; } - try { if (isPruningNeeded(root) === false) { return root; } - prunePaths.forEach(function (path) { var ownerObjArr = getWildcardPropertyInChain(root, path, true); ownerObjArr.forEach(function (ownerObj) { @@ -18047,109 +15687,77 @@ } catch (e) { logMessage(source, e); } - return root; }; - var nativeJSONParse = JSON.parse; - var jsonParseWrapper = function jsonParseWrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - var root = nativeJSONParse.apply(JSON, args); return jsonPruner(root); }; - jsonParseWrapper.toString = nativeJSONParse.toString.bind(nativeJSONParse); JSON.parse = jsonParseWrapper; var nativeResponseJson = Response.prototype.json; - var responseJsonWrapper = function responseJsonWrapper() { var promise = nativeResponseJson.apply(this); return promise.then(function (obj) { return jsonPruner(obj); }); }; - if (typeof Response === "undefined") { return; } - Response.prototype.json = responseJsonWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function matchStackTrace(stackMatch, stackTrace) { if (!stackMatch || stackMatch === "") { return true; } - if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { return true; } - var stackRegexp = toRegExp(stackMatch); var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { return line.trim(); }).join("\n"); return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); } - function getWildcardPropertyInChain(base, chain) { var lookThrough = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var output = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; var pos = chain.indexOf("."); - if (pos === -1) { if (chain === "*" || chain === "[]") { for (var key in base) { @@ -18166,13 +15774,10 @@ prop: chain }); } - return output; } - var prop = chain.slice(0, pos); var shouldLookThrough = prop === "[]" && Array.isArray(base) || prop === "*" && base instanceof Object; - if (shouldLookThrough) { var nextProp = chain.slice(pos + 1); var baseKeys = Object.keys(base); @@ -18181,95 +15786,150 @@ getWildcardPropertyInChain(item, nextProp, lookThrough, output); }); } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if (nextBase !== undefined) { getWildcardPropertyInChain(nextBase, chain, lookThrough, output); } - return output; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - + function objectToString(obj) { + return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { + var key = pair[0]; + var value = pair[1]; + var recordValueStr = value; + if (value instanceof Object) { + recordValueStr = "{ ".concat(objectToString(value), " }"); + } + return "".concat(key, ':"').concat(recordValueStr, '"'); + }).join(" "); + } function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - return new RegExp(escaped); - } - - function getNativeRegexpTest() { - return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; + var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return new RegExp(escaped); + } + function isEmptyObject(obj) { + return Object.keys(obj).length === 0; + } + function getObjectEntries(object) { + var keys = Object.keys(object); + var entries = []; + keys.forEach(function (key) { + return entries.push([key, object[key]]); + }); + return entries; + } + function getNativeRegexpTest() { + return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; + } + function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var INLINE_SCRIPT_STRING = "inlineScript"; + var INJECTED_SCRIPT_STRING = "injectedScript"; + var INJECTED_SCRIPT_MARKER = ""; + var isInlineScript = function isInlineScript(stackMatch) { + return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; + }; + var isInjectedScript = function isInjectedScript(stackMatch) { + return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; + }; + if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { + return false; + } + var documentURL = window.location.href; + var pos = documentURL.indexOf("#"); + if (pos !== -1) { + documentURL = documentURL.slice(0, pos); + } + var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }); + var stackLines = stackSteps.map(function (line) { + var stack; + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + if (getStackTraceURL) { + var stackURL = getStackTraceURL[2]; + if (startsWith(stackURL, "(")) { + stackURL = stackURL.slice(1); + } + if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { + stackURL = INJECTED_SCRIPT_STRING; + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if (startsWith(stackFunction, "at")) { + stackFunction = stackFunction.slice(2).trim(); + } + stack = "".concat(stackFunction, " ").concat(stackURL).trim(); + } else { + stack = stackURL; + } + } else { + stack = line; + } + return stack; + }); + if (stackLines) { + for (var index = 0; index < stackLines.length; index += 1) { + if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { + return true; + } + if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { + return true; + } + } + } + return false; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { jsonPrune.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function log(source, args) { function log() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - console.log(args); } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { log.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function logAddEventListener(source, args) { function logAddEventListener(source) { var nativeAddEventListener = window.EventTarget.prototype.addEventListener; - function addEventListenerWrapper(type, listener) { if (validateType(type) && validateListener(listener)) { var _message = 'addEventListener("'.concat(type, '", ').concat(listenerToString(listener), ")"); - logMessage(source, _message, true); hit(source); } - var message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); logMessage(source, message, true); - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); } - var descriptor = { configurable: true, set: function set() {}, @@ -18281,71 +15941,47 @@ Object.defineProperty(window, "addEventListener", descriptor); Object.defineProperty(document, "addEventListener", descriptor); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function validateType(type) { return typeof type !== "undefined"; } - function validateListener(listener) { return typeof listener !== "undefined" && (typeof listener === "function" || typeof listener === "object" && listener !== null && typeof listener.handleEvent === "function"); } - function listenerToString(listener) { return typeof listener === "function" ? listener.toString() : listener.handleEvent.toString(); } - function convertTypeToString(value) { var output; - if (typeof value === "undefined") { output = "undefined"; } else if (typeof value === "object") { @@ -18357,36 +15993,28 @@ } else { output = value.toString(); } - return output; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function objectToString(obj) { return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { var key = pair[0]; var value = pair[1]; var recordValueStr = value; - if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } - return "".concat(key, ':"').concat(recordValueStr, '"'); }).join(" "); } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getObjectEntries(object) { var keys = Object.keys(object); var entries = []; @@ -18395,117 +16023,83 @@ }); return entries; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { logAddEventListener.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function logEval(source, args) { function logEval(source) { var nativeEval = window.eval; - function evalWrapper(str) { hit(source); logMessage(source, 'eval("'.concat(str, '")'), true); return nativeEval(str); } - window.eval = evalWrapper; var nativeFunction = window.Function; - function FunctionWrapper() { hit(source); - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - logMessage(source, "new Function(".concat(args.join(", "), ")"), true); return nativeFunction.apply(this, [].concat(args)); } - FunctionWrapper.prototype = Object.create(nativeFunction.prototype); FunctionWrapper.prototype.constructor = FunctionWrapper; window.Function = FunctionWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { logEval.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function logOnStacktrace(source, args) { function logOnStacktrace(source, property) { if (!property) { return; } - var refineStackTrace = function refineStackTrace(stackString) { var stackSteps = stackString.split("\n").slice(2).map(function (line) { return line.replace(/ {4}at /, ""); @@ -18515,7 +16109,6 @@ var funcFullPath; var reg = /\(([^\)]+)\)/; var regFirefox = /(.*?@)(\S+)(:\d+):\d+\)?$/; - if (line.match(reg)) { funcName = line.split(" ").slice(0, -1).join(" "); funcFullPath = line.match(reg)[1]; @@ -18526,7 +16119,6 @@ funcName = "function name is not available"; funcFullPath = line; } - return [funcName, funcFullPath]; }); var logInfoObject = {}; @@ -18535,22 +16127,18 @@ }); return logInfoObject; }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; - + chain = chainInfo.chain; if (chain) { var setter = function setter(a) { base = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } }; - Object.defineProperty(owner, prop, { get: function get() { return base; @@ -18559,7 +16147,6 @@ }); return; } - var value = base[prop]; setPropertyAccess(base, prop, { get: function get() { @@ -18576,22 +16163,17 @@ } }); }; - setChainPropAccess(window, property); } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -18599,10 +16181,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -18610,7 +16190,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -18618,11 +16197,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -18632,165 +16209,111 @@ chain: chain }; } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { logOnStacktrace.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function noTopics(source, args) { function noTopics(source) { var TOPICS_PROPERTY_NAME = "browsingTopics"; - if (Document instanceof Object === false) { return; } - if (!Object.prototype.hasOwnProperty.call(Document.prototype, TOPICS_PROPERTY_NAME) || Document.prototype[TOPICS_PROPERTY_NAME] instanceof Function === false) { return; } - Document.prototype[TOPICS_PROPERTY_NAME] = function () { return noopPromiseResolve("[]"); }; - hit(source); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function noopPromiseResolve() { var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; - if (typeof Response === "undefined") { return; } - var response = new Response(responseBody, { status: 200, statusText: "OK" @@ -18805,101 +16328,79 @@ }); return Promise.resolve(response); } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { noTopics.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function noeval(source, args) { function noeval(source) { window.eval = function evalWrapper(s) { - hit(source, "AdGuard has prevented eval:\n".concat(s)); + hit(source); + logMessage(source, "AdGuard has prevented eval:\n".concat(s), true); }.bind(); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - + function logMessage(source, message) { + var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + if (forced || source.verbose) { + console.log("".concat(source.name, ": ").concat(message)); + } + } var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { noeval.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function nowebrtc(source, args) { function nowebrtc(source) { var propertyName = ""; - if (window.RTCPeerConnection) { propertyName = "RTCPeerConnection"; } else if (window.webkitRTCPeerConnection) { propertyName = "webkitRTCPeerConnection"; } - if (propertyName === "") { return; } - var rtcReplacement = function rtcReplacement(config) { var message = "Document tried to create an RTCPeerConnection: ".concat(convertRtcConfigToString(config)); logMessage(source, message); hit(source); }; - rtcReplacement.prototype = { close: noopFunc, createDataChannel: noopFunc, @@ -18908,7 +16409,6 @@ }; var rtc = window[propertyName]; window[propertyName] = rtcReplacement; - if (rtc.prototype) { rtc.prototype.createDataChannel = function (a, b) { return { @@ -18918,118 +16418,83 @@ }.bind(null); } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function noopFunc() {} - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function convertRtcConfigToString(config) { var UNDEF_STR = "undefined"; var str = UNDEF_STR; - if (config === null) { str = "null"; } else if (config instanceof Object) { var SERVERS_PROP_NAME = "iceServers"; var URLS_PROP_NAME = "urls"; - if (Object.prototype.hasOwnProperty.call(config, SERVERS_PROP_NAME) && Object.prototype.hasOwnProperty.call(config[SERVERS_PROP_NAME][0], URLS_PROP_NAME) && !!config[SERVERS_PROP_NAME][0][URLS_PROP_NAME]) { str = config[SERVERS_PROP_NAME][0][URLS_PROP_NAME].toString(); } } - return str; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { nowebrtc.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventAddEventListener(source, args) { function preventAddEventListener(source, typeSearch, listenerSearch) { var typeSearchRegexp = toRegExp(typeSearch); var listenerSearchRegexp = toRegExp(listenerSearch); var nativeAddEventListener = window.EventTarget.prototype.addEventListener; - function addEventListenerWrapper(type, listener) { var shouldPrevent = false; - if (validateType(type) && validateListener(listener)) { shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); } - if (shouldPrevent) { hit(source); return undefined; } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); } - var descriptor = { configurable: true, set: function set() {}, @@ -19041,104 +16506,73 @@ Object.defineProperty(window, "addEventListener", descriptor); Object.defineProperty(document, "addEventListener", descriptor); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function validateType(type) { return typeof type !== "undefined"; } - function validateListener(listener) { return typeof listener !== "undefined" && (typeof listener === "function" || typeof listener === "object" && listener !== null && typeof listener.handleEvent === "function"); } - function listenerToString(listener) { return typeof listener === "function" ? listener.toString() : listener.handleEvent.toString(); } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventAddEventListener.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventAdfly(source, args) { function preventAdfly(source) { var isDigit = function isDigit(data) { return /^\d$/.test(data); }; - var handler = function handler(encodedURL) { var evenChars = ""; var oddChars = ""; - for (var i = 0; i < encodedURL.length; i += 1) { if (i % 2 === 0) { evenChars += encodedURL.charAt(i); @@ -19146,37 +16580,29 @@ oddChars = encodedURL.charAt(i) + oddChars; } } - var data = (evenChars + oddChars).split(""); - for (var _i = 0; _i < data.length; _i += 1) { if (isDigit(data[_i])) { for (var ii = _i + 1; ii < data.length; ii += 1) { if (isDigit(data[ii])) { var temp = parseInt(data[_i], 10) ^ parseInt(data[ii], 10); - if (temp < 10) { data[_i] = temp.toString(); } - _i = ii; break; } } } } - data = data.join(""); var decodedURL = window.atob(data).slice(16, -16); - if (window.stop) { window.stop(); } - window.onbeforeunload = null; window.location.href = decodedURL; }; - var val; var applyHandler = true; var result = setPropertyAccess(window, "ysmm", { @@ -19184,246 +16610,175 @@ set: function set(value) { if (applyHandler) { applyHandler = false; - try { if (typeof value === "string") { handler(value); } } catch (err) {} } - val = value; }, get: function get() { return val; } }); - if (result) { hit(source); } else { logMessage(source, "Failed to set up prevent-adfly scriptlet"); } } - function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); - if (currentDescriptor && !currentDescriptor.configurable) { return false; } - Object.defineProperty(object, property, descriptor); return true; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventAdfly.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventBab(source, args) { function preventBab(source) { var nativeSetTimeout = window.setTimeout; var babRegex = /\.bab_elementid.$/; - var timeoutWrapper = function timeoutWrapper(callback) { if (typeof callback !== "string" || !babRegex.test(callback)) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeSetTimeout.apply(window, [callback].concat(args)); } - hit(source); }; - window.setTimeout = timeoutWrapper; var signatures = [["blockadblock"], ["babasbm"], [/getItem\('babn'\)/], ["getElementById", "String.fromCharCode", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "charAt", "DOMContentLoaded", "AdBlock", "addEventListener", "doScroll", "fromCharCode", "<<2|r>>4", "sessionStorage", "clientWidth", "localStorage", "Math", "random"]]; - var check = function check(str) { if (typeof str !== "string") { return false; } - for (var i = 0; i < signatures.length; i += 1) { var tokens = signatures[i]; var match = 0; - for (var j = 0; j < tokens.length; j += 1) { var token = tokens[j]; var found = token instanceof RegExp ? token.test(str) : str.indexOf(token) > -1; - if (found) { match += 1; } } - if (match / tokens.length >= .8) { return true; } } - return false; }; - var nativeEval = window.eval; - var evalWrapper = function evalWrapper(str) { if (!check(str)) { return nativeEval(str); } - hit(source); var bodyEl = document.body; - if (bodyEl) { bodyEl.style.removeProperty("visibility"); } - var el = document.getElementById("babasbmsgx"); - if (el) { el.parentNode.removeChild(el); } }; - window.eval = evalWrapper.bind(window); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventBab.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventElementSrcLoading(source, args) { function preventElementSrcLoading(source, tagName, match) { if (typeof Proxy === "undefined" || typeof Reflect === "undefined") { return; } - var srcMockData = { script: "data:text/javascript;base64,KCk9Pnt9", img: "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", iframe: "data:text/html;base64, PGRpdj48L2Rpdj4=" }; var instance; - if (tagName === "script") { instance = HTMLScriptElement; } else if (tagName === "img") { @@ -19433,10 +16788,8 @@ } else { return; } - var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === "function"; var policy; - if (hasTrustedTypes) { policy = window.trustedTypes.createPolicy("mock", { createScriptURL: function createScriptURL(arg) { @@ -19444,44 +16797,35 @@ } }); } - var SOURCE_PROPERTY_NAME = "src"; var ONERROR_PROPERTY_NAME = "onerror"; var searchRegexp = toRegExp(match); - var setMatchedAttribute = function setMatchedAttribute(elem) { return elem.setAttribute(source.name, "matched"); }; - var setAttributeWrapper = function setAttributeWrapper(target, thisArg, args) { if (!args[0] || !args[1]) { return Reflect.apply(target, thisArg, args); } - var nodeName = thisArg.nodeName.toLowerCase(); var attrName = args[0].toLowerCase(); var attrValue = args[1]; var isMatched = attrName === SOURCE_PROPERTY_NAME && tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(attrValue); - if (!isMatched) { return Reflect.apply(target, thisArg, args); } - hit(source); setMatchedAttribute(thisArg); return Reflect.apply(target, thisArg, [attrName, srcMockData[nodeName]]); }; - var setAttributeHandler = { apply: setAttributeWrapper }; instance.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, setAttributeHandler); var origSrcDescriptor = safeGetDescriptor(instance.prototype, SOURCE_PROPERTY_NAME); - if (!origSrcDescriptor) { return; } - Object.defineProperty(instance.prototype, SOURCE_PROPERTY_NAME, { enumerable: true, configurable: true, @@ -19491,30 +16835,25 @@ set: function set(urlValue) { var nodeName = this.nodeName.toLowerCase(); var isMatched = tagName.toLowerCase() === nodeName && srcMockData[nodeName] && searchRegexp.test(urlValue); - if (!isMatched) { origSrcDescriptor.set.call(this, urlValue); return true; } - if (policy && urlValue instanceof TrustedScriptURL) { var trustedSrc = policy.createScriptURL(urlValue); origSrcDescriptor.set.call(this, trustedSrc); hit(source); return; } - setMatchedAttribute(this); origSrcDescriptor.set.call(this, srcMockData[nodeName]); hit(source); } }); var origOnerrorDescriptor = safeGetDescriptor(HTMLElement.prototype, ONERROR_PROPERTY_NAME); - if (!origOnerrorDescriptor) { return; } - Object.defineProperty(HTMLElement.prototype, ONERROR_PROPERTY_NAME, { enumerable: true, configurable: true, @@ -19523,240 +16862,168 @@ }, set: function set(cb) { var isMatched = this.getAttribute(source.name) === "matched"; - if (!isMatched) { origOnerrorDescriptor.set.call(this, cb); return true; } - origOnerrorDescriptor.set.call(this, noopFunc); return true; } }); - var addEventListenerWrapper = function addEventListenerWrapper(target, thisArg, args) { if (!args[0] || !args[1]) { return Reflect.apply(target, thisArg, args); } - var eventName = args[0]; var isMatched = thisArg.getAttribute(source.name) === "matched" && eventName === "error"; - if (isMatched) { return Reflect.apply(target, thisArg, [eventName, noopFunc]); } - return Reflect.apply(target, thisArg, args); }; - var addEventListenerHandler = { apply: addEventListenerWrapper }; EventTarget.prototype.addEventListener = new Proxy(EventTarget.prototype.addEventListener, addEventListenerHandler); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function safeGetDescriptor(obj, prop) { var descriptor = Object.getOwnPropertyDescriptor(obj, prop); - if (descriptor && descriptor.configurable) { return descriptor; } - return null; } - function noopFunc() {} - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventElementSrcLoading.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventEvalIf(source, args) { function preventEvalIf(source, search) { var searchRegexp = toRegExp(search); var nativeEval = window.eval; - window.eval = function (payload) { if (!searchRegexp.test(payload.toString())) { return nativeEval.call(window, payload); } - - hit(source, payload); + hit(source); return undefined; }.bind(window); } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventEvalIf.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventFab(source, args) { function preventFab(source) { hit(source); - var Fab = function Fab() {}; - Fab.prototype.check = noopFunc; Fab.prototype.clearEvent = noopFunc; Fab.prototype.emitEvent = noopFunc; - Fab.prototype.on = function (a, b) { if (!a) { b(); } - return this; }; - Fab.prototype.onDetected = noopThis; - Fab.prototype.onNotDetected = function (a) { a(); return this; }; - Fab.prototype.setOption = noopFunc; Fab.prototype.options = { set: noopFunc, @@ -19775,212 +17042,151 @@ }, set: function set() {} }; - if (Object.prototype.hasOwnProperty.call(window, "FuckAdBlock")) { window.FuckAdBlock = Fab; } else { Object.defineProperty(window, "FuckAdBlock", getSetFab); } - if (Object.prototype.hasOwnProperty.call(window, "BlockAdBlock")) { window.BlockAdBlock = Fab; } else { Object.defineProperty(window, "BlockAdBlock", getSetFab); } - if (Object.prototype.hasOwnProperty.call(window, "SniffAdBlock")) { window.SniffAdBlock = Fab; } else { Object.defineProperty(window, "SniffAdBlock", getSetFab); } - if (Object.prototype.hasOwnProperty.call(window, "fuckAdBlock")) { window.fuckAdBlock = fab; } else { Object.defineProperty(window, "fuckAdBlock", getsetfab); } - if (Object.prototype.hasOwnProperty.call(window, "blockAdBlock")) { window.blockAdBlock = fab; } else { Object.defineProperty(window, "blockAdBlock", getsetfab); } - if (Object.prototype.hasOwnProperty.call(window, "sniffAdBlock")) { window.sniffAdBlock = fab; } else { Object.defineProperty(window, "sniffAdBlock", getsetfab); } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function noopFunc() {} - function noopThis() { return this; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventFab.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventFetch(source, args) { function preventFetch(source, propsToMatch) { var responseBody = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "emptyObj"; var responseType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "default"; - if (typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { return; } - var strResponseBody; - - if (responseBody === "emptyObj") { + if (responseBody === "" || responseBody === "emptyObj") { strResponseBody = "{}"; } else if (responseBody === "emptyArr") { strResponseBody = "[]"; } else { return; } - if (!(responseType === "default" || responseType === "opaque")) { logMessage(source, "Invalid parameter: ".concat(responseType)); return; } - var handlerWrapper = function handlerWrapper(target, thisArg, args) { var shouldPrevent = false; var fetchData = getFetchData(args); - if (typeof propsToMatch === "undefined") { logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); hit(source); return Reflect.apply(target, thisArg, args); } - shouldPrevent = matchRequestProps(source, propsToMatch, fetchData); - if (shouldPrevent) { hit(source); return noopPromiseResolve(strResponseBody, fetchData.url, responseType); } - return Reflect.apply(target, thisArg, args); }; - var fetchHandler = { apply: handlerWrapper }; fetch = new Proxy(fetch, fetchHandler); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function getFetchData(args) { var fetchPropsObj = {}; var fetchUrl; var fetchInit; - if (args[0] instanceof Request) { var requestData = getRequestData(args[0]); fetchUrl = requestData.url; @@ -19989,41 +17195,32 @@ fetchUrl = args[0]; fetchInit = args[1]; } - fetchPropsObj.url = fetchUrl; - if (fetchInit instanceof Object) { Object.keys(fetchInit).forEach(function (prop) { fetchPropsObj[prop] = fetchInit[prop]; }); } - return fetchPropsObj; } - function objectToString(obj) { return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { var key = pair[0]; var value = pair[1]; var recordValueStr = value; - if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } - return "".concat(key, ':"').concat(recordValueStr, '"'); }).join(" "); } - function noopPromiseResolve() { var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; - if (typeof Response === "undefined") { return; } - var response = new Response(responseBody, { status: 200, statusText: "OK" @@ -20038,15 +17235,12 @@ }); return Promise.resolve(response); } - function matchRequestProps(source, propsToMatch, requestData) { if (propsToMatch === "" || propsToMatch === "*") { return true; } - var isMatched; var parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { logMessage(source, "Invalid parameter: ".concat(propsToMatch)); isMatched = false; @@ -20057,63 +17251,48 @@ return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); }); } - return isMatched; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getRequestData(request) { var requestInitOptions = getRequestProps(); var entries = requestInitOptions.map(function (key) { @@ -20122,11 +17301,9 @@ }); return getObjectFromEntries(entries); } - function getRequestProps() { return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; } - function getObjectEntries(object) { var keys = Object.keys(object); var entries = []; @@ -20135,7 +17312,6 @@ }); return entries; } - function getObjectFromEntries(entries) { var output = entries.reduce(function (acc, el) { var key = el[0]; @@ -20145,7 +17321,6 @@ }, {}); return output; } - function parseMatchProps(propsToMatchStr) { var PROPS_DIVIDER = " "; var PAIRS_MARKER = ":"; @@ -20156,7 +17331,6 @@ var dividerInd = prop.indexOf(PAIRS_MARKER); var key = prop.slice(0, dividerInd); var hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { var value = prop.slice(dividerInd + 1); propsObj[key] = value; @@ -20166,13 +17340,11 @@ }); return propsObj; } - function validateParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); }); } - function getMatchPropsData(data) { var matchData = {}; Object.keys(data).forEach(function (key) { @@ -20180,24 +17352,19 @@ }); return matchData; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventFetch.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventPopadsNet(source, args) { function preventPopadsNet(source) { var rid = randomId(); - var throwError = function throwError() { throw new ReferenceError(rid); }; - delete window.PopAds; delete window.popns; Object.defineProperties(window, { @@ -20211,93 +17378,65 @@ window.onerror = createOnErrorHandler(rid).bind(); hit(source); } - function createOnErrorHandler(rid) { var nativeOnError = window.onerror; return function onError(error) { if (typeof error === "string" && error.indexOf(rid) !== -1) { return true; } - if (nativeOnError instanceof Function) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeOnError.apply(this, [error].concat(args)); } - return false; }; } - function randomId() { return Math.random().toString(36).substr(2, 9); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventPopadsNet.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventRefresh(source, args) { function preventRefresh(source, delaySec) { var getMetaElements = function getMetaElements() { var metaNodes = []; - try { metaNodes = document.querySelectorAll('meta[http-equiv="refresh" i][content]'); } catch (e) { @@ -20307,67 +17446,52 @@ logMessage(source, e); } } - return Array.from(metaNodes); }; - var getMetaContentDelay = function getMetaContentDelay(metaElements) { var delays = metaElements.map(function (meta) { var contentString = meta.getAttribute("content"); - if (contentString.length === 0) { return null; } - var contentDelay; var limiterIndex = contentString.indexOf(";"); - if (limiterIndex !== -1) { var delaySubstring = contentString.substring(0, limiterIndex); contentDelay = getNumberFromString(delaySubstring); } else { contentDelay = getNumberFromString(contentString); } - return contentDelay; }).filter(function (delay) { return delay !== null; }); - if (!delays.length) { return null; } - var minDelay = delays.reduce(function (a, b) { return Math.min(a, b); }); return minDelay; }; - var stop = function stop() { var metaElements = getMetaElements(); - if (metaElements.length === 0) { return; } - var secondsToRun = getNumberFromString(delaySec); - if (secondsToRun === null) { secondsToRun = getMetaContentDelay(metaElements); } - if (secondsToRun === null) { return; } - var delayMs = secondsToRun * 1e3; setTimeout(function () { window.stop(); hit(source); }, delayMs); }; - if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", stop, { once: true @@ -20376,169 +17500,115 @@ stop(); } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function getNumberFromString(rawString) { var parsedDelay = parseInt(rawString, 10); var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; return validDelay; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventRefresh.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventRequestAnimationFrame(source, args) { function preventRequestAnimationFrame(source, match) { var nativeRequestAnimationFrame = window.requestAnimationFrame; var shouldLog = typeof match === "undefined"; - var _parseMatchArg = parseMatchArg(match), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; var rafWrapper = function rafWrapper(callback) { var shouldPrevent = false; - if (shouldLog) { hit(source); logMessage(source, "requestAnimationFrame(".concat(String(callback), ")"), true); } else if (isValidCallback(callback) && isValidStrPattern(match)) { shouldPrevent = matchRegexp.test(callback.toString()) !== isInvertedMatch; } - if (shouldPrevent) { hit(source); return nativeRequestAnimationFrame(noopFunc); } - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - return nativeRequestAnimationFrame.apply(window, [callback].concat(args)); }; - window.requestAnimationFrame = rafWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function noopFunc() {} - function parseMatchArg(match) { var INVERT_MARKER = "!"; var isInvertedMatch = startsWith(match, INVERT_MARKER); @@ -20549,82 +17619,63 @@ matchRegexp: matchRegexp }; } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function isValidCallback(callback) { return callback instanceof Function || typeof callback === "string"; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function startsWith(str, prefix) { return !!str && str.indexOf(prefix) === 0; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventRequestAnimationFrame.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventSetInterval(source, args) { function preventSetInterval(source, matchCallback, matchDelay) { var isProxySupported = typeof Proxy !== "undefined"; var nativeInterval = window.setInterval; var shouldLog = typeof matchCallback === "undefined" && typeof matchDelay === "undefined"; - var legacyIntervalWrapper = function legacyIntervalWrapper(callback, delay) { var shouldPrevent = false; - if (shouldLog) { hit(source); logMessage(source, "setInterval(".concat(String(callback), ", ").concat(delay, ")"), true); @@ -20636,24 +17687,19 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); return nativeInterval(noopFunc, delay); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeInterval.apply(window, [callback, delay].concat(args)); }; - var handlerWrapper = function handlerWrapper(target, thisArg, args) { var callback = args[0]; var delay = args[1]; var shouldPrevent = false; - if (shouldLog) { hit(source); logMessage(source, "setInterval(".concat(String(callback), ", ").concat(delay, ")"), true); @@ -20665,97 +17711,67 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); args[0] = noopFunc; } - return target.apply(thisArg, args); }; - var setIntervalHandler = { apply: handlerWrapper }; window.setInterval = isProxySupported ? new Proxy(window.setInterval, setIntervalHandler) : legacyIntervalWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function noopFunc() {} - function isPreventionNeeded(_ref) { var callback = _ref.callback, - delay = _ref.delay, - matchCallback = _ref.matchCallback, - matchDelay = _ref.matchDelay; - + delay = _ref.delay, + matchCallback = _ref.matchCallback, + matchDelay = _ref.matchDelay; if (!isValidCallback(callback)) { return false; } - if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { return false; } - var _parseMatchArg = parseMatchArg(matchCallback), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; var _parseDelayArg = parseDelayArg(matchDelay), - isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, - delayMatch = _parseDelayArg.delayMatch; - + isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, + delayMatch = _parseDelayArg.delayMatch; var shouldPrevent = false; var callbackStr = String(callback); - if (delayMatch === null) { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; } else if (!matchCallback) { @@ -20763,44 +17779,34 @@ } else { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && delay === delayMatch !== isInvertedDelayMatch; } - return shouldPrevent; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function startsWith(str, prefix) { return !!str && str.indexOf(prefix) === 0; } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function parseMatchArg(match) { var INVERT_MARKER = "!"; var isInvertedMatch = startsWith(match, INVERT_MARKER); @@ -20811,7 +17817,6 @@ matchRegexp: matchRegexp }; } - function parseDelayArg(delay) { var INVERT_MARKER = "!"; var isInvertedDelayMatch = startsWith(delay, INVERT_MARKER); @@ -20823,81 +17828,62 @@ delayMatch: delayMatch }; } - function isValidCallback(callback) { return callback instanceof Function || typeof callback === "string"; } - function isValidMatchStr(match) { var INVERT_MARKER = "!"; var str = match; - if (startsWith(match, INVERT_MARKER)) { str = match.slice(1); } - return isValidStrPattern(str); } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function nativeIsFinite(num) { var native = Number.isFinite || window.isFinite; return native(num); } - function isValidMatchNumber(match) { var INVERT_MARKER = "!"; var str = match; - if (startsWith(match, INVERT_MARKER)) { str = match.slice(1); } - var num = parseFloat(str); return !nativeIsNaN(num) && nativeIsFinite(num); } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventSetInterval.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventSetTimeout(source, args) { function preventSetTimeout(source, matchCallback, matchDelay) { var isProxySupported = typeof Proxy !== "undefined"; var nativeTimeout = window.setTimeout; var shouldLog = typeof matchCallback === "undefined" && typeof matchDelay === "undefined"; - var legacyTimeoutWrapper = function legacyTimeoutWrapper(callback, delay) { var shouldPrevent = false; - if (shouldLog) { hit(source); logMessage(source, "setTimeout(".concat(String(callback), ", ").concat(delay, ")"), true); @@ -20909,24 +17895,19 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); return nativeTimeout(noopFunc, delay); } - for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeTimeout.apply(window, [callback, delay].concat(args)); }; - var handlerWrapper = function handlerWrapper(target, thisArg, args) { var callback = args[0]; var delay = args[1]; var shouldPrevent = false; - if (shouldLog) { hit(source); logMessage(source, "setTimeout(".concat(String(callback), ", ").concat(delay, ")"), true); @@ -20938,97 +17919,67 @@ matchDelay: matchDelay }); } - if (shouldPrevent) { hit(source); args[0] = noopFunc; } - return target.apply(thisArg, args); }; - var setTimeoutHandler = { apply: handlerWrapper }; window.setTimeout = isProxySupported ? new Proxy(window.setTimeout, setTimeoutHandler) : legacyTimeoutWrapper; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function noopFunc() {} - function isPreventionNeeded(_ref) { var callback = _ref.callback, - delay = _ref.delay, - matchCallback = _ref.matchCallback, - matchDelay = _ref.matchDelay; - + delay = _ref.delay, + matchCallback = _ref.matchCallback, + matchDelay = _ref.matchDelay; if (!isValidCallback(callback)) { return false; } - if (!isValidMatchStr(matchCallback) || matchDelay && !isValidMatchNumber(matchDelay)) { return false; } - var _parseMatchArg = parseMatchArg(matchCallback), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; var _parseDelayArg = parseDelayArg(matchDelay), - isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, - delayMatch = _parseDelayArg.delayMatch; - + isInvertedDelayMatch = _parseDelayArg.isInvertedDelayMatch, + delayMatch = _parseDelayArg.delayMatch; var shouldPrevent = false; var callbackStr = String(callback); - if (delayMatch === null) { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; } else if (!matchCallback) { @@ -21036,18 +17987,14 @@ } else { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch && delay === delayMatch !== isInvertedDelayMatch; } - return shouldPrevent; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function parseMatchArg(match) { var INVERT_MARKER = "!"; var isInvertedMatch = startsWith(match, INVERT_MARKER); @@ -21058,7 +18005,6 @@ matchRegexp: matchRegexp }; } - function parseDelayArg(delay) { var INVERT_MARKER = "!"; var isInvertedDelayMatch = startsWith(delay, INVERT_MARKER); @@ -21070,98 +18016,75 @@ delayMatch: delayMatch }; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function startsWith(str, prefix) { return !!str && str.indexOf(prefix) === 0; } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function isValidCallback(callback) { return callback instanceof Function || typeof callback === "string"; } - function isValidMatchStr(match) { var INVERT_MARKER = "!"; var str = match; - if (startsWith(match, INVERT_MARKER)) { str = match.slice(1); } - return isValidStrPattern(str); } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function nativeIsFinite(num) { var native = Number.isFinite || window.isFinite; return native(num); } - function isValidMatchNumber(match) { var INVERT_MARKER = "!"; var str = match; - if (startsWith(match, INVERT_MARKER)) { str = match.slice(1); } - var num = parseFloat(str); return !nativeIsNaN(num) && nativeIsFinite(num); } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventSetTimeout.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventWindowOpen(source, args) { function preventWindowOpen(source) { var match = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "*"; @@ -21169,62 +18092,48 @@ var replacement = arguments.length > 3 ? arguments[3] : undefined; var nativeOpen = window.open; var isNewSyntax = match !== "0" && match !== "1"; - var oldOpenWrapper = function oldOpenWrapper(str) { match = Number(match) > 0; - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } - if (!isValidStrPattern(delay)) { logMessage(source, "Invalid parameter: ".concat(delay)); return nativeOpen.apply(window, [str].concat(args)); } - var searchRegexp = toRegExp(delay); - if (match !== searchRegexp.test(str)) { return nativeOpen.apply(window, [str].concat(args)); } - hit(source); return handleOldReplacement(replacement); }; - var newOpenWrapper = function newOpenWrapper(url) { var shouldLog = replacement && replacement.indexOf("log") > -1; - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } - if (shouldLog) { var argsStr = args && args.length > 0 ? ", ".concat(args.join(", ")) : ""; - var message = "window-open: ".concat(url).concat(argsStr); + var message = "".concat(url).concat(argsStr); logMessage(source, message, true); hit(source); } - var shouldPrevent = false; - if (match === "*") { shouldPrevent = true; } else if (isValidMatchStr(match)) { var _parseMatchArg = parseMatchArg(match), - isInvertedMatch = _parseMatchArg.isInvertedMatch, - matchRegexp = _parseMatchArg.matchRegexp; - + isInvertedMatch = _parseMatchArg.isInvertedMatch, + matchRegexp = _parseMatchArg.matchRegexp; shouldPrevent = matchRegexp.test(url) !== isInvertedMatch; } else { logMessage(source, "Invalid parameter: ".concat(match)); shouldPrevent = false; } - if (shouldPrevent) { var parsedDelay = parseInt(delay, 10); var result; - if (nativeIsNaN(parsedDelay)) { result = noopNull(); } else { @@ -21235,7 +18144,6 @@ }; var decoy = createDecoy(decoyArgs); var popup = decoy.contentWindow; - if (typeof popup === "object" && popup !== null) { Object.defineProperty(popup, "closed", { value: false @@ -21253,127 +18161,89 @@ }); popup = decoy.contentWindow; } - result = popup; } - hit(source); return result; } - return nativeOpen.apply(window, [url].concat(args)); }; - window.open = isNewSyntax ? newOpenWrapper : oldOpenWrapper; window.open.toString = nativeOpen.toString.bind(nativeOpen); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function isValidMatchStr(match) { var INVERT_MARKER = "!"; var str = match; - if (startsWith(match, INVERT_MARKER)) { str = match.slice(1); } - return isValidStrPattern(str); } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function parseMatchArg(match) { var INVERT_MARKER = "!"; var isInvertedMatch = startsWith(match, INVERT_MARKER); @@ -21384,43 +18254,36 @@ matchRegexp: matchRegexp }; } - function handleOldReplacement(replacement) { var result; - if (!replacement) { result = noopFunc; } else if (replacement === "trueFunc") { result = trueFunc; } else if (replacement.indexOf("=") > -1) { var isProp = startsWith(replacement, "{") && endsWith(replacement, "}"); - if (isProp) { var propertyPart = replacement.slice(1, -1); var propertyName = substringBefore(propertyPart, "="); var propertyValue = substringAfter(propertyPart, "="); - if (propertyValue === "noopFunc") { result = {}; result[propertyName] = noopFunc; } } } - return result; } - function createDecoy(args) { var OBJECT_TAG_NAME = "object"; var OBJECT_URL_PROP_NAME = "data"; var IFRAME_TAG_NAME = "iframe"; var IFRAME_URL_PROP_NAME = "src"; var replacement = args.replacement, - url = args.url, - delay = args.delay; + url = args.url, + delay = args.delay; var tag; var urlProp; - if (replacement === "obj") { tag = OBJECT_TAG_NAME; urlProp = OBJECT_URL_PROP_NAME; @@ -21428,7 +18291,6 @@ tag = IFRAME_TAG_NAME; urlProp = IFRAME_URL_PROP_NAME; } - var decoy = document.createElement(tag); decoy[urlProp] = url; decoy.style.setProperty("height", "1px", "important"); @@ -21441,127 +18303,99 @@ }, delay * 1e3); return decoy; } - function getPreventGetter(nativeGetter) { var preventGetter = function preventGetter(target, prop) { if (prop && prop === "closed") { return false; } - if (typeof nativeGetter === "function") { return noopFunc; } - return prop && target[prop]; }; - return preventGetter; } - function noopNull() { return null; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function noopFunc() {} - function trueFunc() { return true; } - function startsWith(str, prefix) { return !!str && str.indexOf(prefix) === 0; } - function endsWith(str, ending) { return !!str && str.lastIndexOf(ending) === str.length - ending.length; } - function substringBefore(str, separator) { if (!str || !separator) { return str; } - var index = str.indexOf(separator); return index < 0 ? str : str.substring(0, index); } - function substringAfter(str, separator) { if (!str) { return str; } - var index = str.indexOf(separator); return index < 0 ? "" : str.substring(index + separator.length); } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventWindowOpen.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function preventXHR(source, args) { function preventXHR(source, propsToMatch, customResponseText) { if (typeof Proxy === "undefined") { return; } - var shouldPrevent = false; var response = ""; var responseText = ""; var responseUrl; - var openWrapper = function openWrapper(target, thisArg, args) { var xhrData = { method: args[0], url: args[1] }; responseUrl = xhrData.url; - if (typeof propsToMatch === "undefined") { logMessage(source, "xhr( ".concat(objectToString(xhrData), " )"), true); hit(source); } else { shouldPrevent = matchRequestProps(source, propsToMatch, xhrData); } - return Reflect.apply(target, thisArg, args); }; - var sendWrapper = function sendWrapper(target, thisArg, args) { if (!shouldPrevent) { return Reflect.apply(target, thisArg, args); } - if (thisArg.responseType === "blob") { response = new Blob(); } - if (thisArg.responseType === "arraybuffer") { response = new ArrayBuffer(); } - if (customResponseText) { var randomText = generateRandomResponse(customResponseText); - if (randomText) { responseText = randomText; } else { logMessage(source, "Invalid range: ".concat(customResponseText)); } } - Object.defineProperties(thisArg, { readyState: { value: 4, @@ -21603,7 +18437,6 @@ hit(source); return undefined; }; - var openHandler = { apply: openWrapper }; @@ -21613,86 +18446,59 @@ XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function objectToString(obj) { return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { var key = pair[0]; var value = pair[1]; var recordValueStr = value; - if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } - return "".concat(key, ':"').concat(recordValueStr, '"'); }).join(" "); } - function matchRequestProps(source, propsToMatch, requestData) { if (propsToMatch === "" || propsToMatch === "*") { return true; } - var isMatched; var parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { logMessage(source, "Invalid parameter: ".concat(propsToMatch)); isMatched = false; @@ -21703,94 +18509,71 @@ return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); }); } - return isMatched; } - function generateRandomResponse(customResponseText) { var customResponse = customResponseText; - if (customResponse === "true") { customResponse = Math.random().toString(36).slice(-10); return customResponse; } - customResponse = customResponse.replace("length:", ""); var rangeRegex = /^\d+-\d+$/; - if (!rangeRegex.test(customResponse)) { return null; } - var rangeMin = getNumberFromString(customResponse.split("-")[0]); var rangeMax = getNumberFromString(customResponse.split("-")[1]); - if (!nativeIsFinite(rangeMin) || !nativeIsFinite(rangeMax)) { return null; } - if (rangeMin > rangeMax) { var temp = rangeMin; rangeMin = rangeMax; rangeMax = temp; } - var LENGTH_RANGE_LIMIT = 500 * 1e3; - if (rangeMax > LENGTH_RANGE_LIMIT) { return null; } - var length = getRandomIntInclusive(rangeMin, rangeMax); customResponse = getRandomStrByLength(length); return customResponse; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getObjectEntries(object) { var keys = Object.keys(object); var entries = []; @@ -21799,23 +18582,19 @@ }); return entries; } - function getNumberFromString(rawString) { var parsedDelay = parseInt(rawString, 10); var validDelay = nativeIsNaN(parsedDelay) ? null : parsedDelay; return validDelay; } - function nativeIsFinite(num) { var native = Number.isFinite || window.isFinite; return native(num); } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function parseMatchProps(propsToMatchStr) { var PROPS_DIVIDER = " "; var PAIRS_MARKER = ":"; @@ -21826,7 +18605,6 @@ var dividerInd = prop.indexOf(PAIRS_MARKER); var key = prop.slice(0, dividerInd); var hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { var value = prop.slice(dividerInd + 1); propsObj[key] = value; @@ -21836,13 +18614,11 @@ }); return propsObj; } - function validateParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); }); } - function getMatchPropsData(data) { var matchData = {}; Object.keys(data).forEach(function (key) { @@ -21850,61 +18626,47 @@ }); return matchData; } - function getRequestProps() { return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; } - function getRandomIntInclusive(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1) + min); } - function getRandomStrByLength(length) { var result = ""; var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~"; var charactersLength = characters.length; - for (var i = 0; i < length; i += 1) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } - return result; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { preventXHR.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function removeAttr(source, args) { function removeAttr(source, attrs, selector) { var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "asap stay"; - if (!attrs) { return; } - attrs = attrs.split(/\s*\|\s*/); - if (!selector) { selector = "[".concat(attrs.join("],["), "]"); } - var rmattr = function rmattr() { var nodes = []; - try { nodes = [].slice.call(document.querySelectorAll(selector)); } catch (e) { logMessage(source, "Invalid selector arg: '".concat(selector, "'")); } - var removed = false; nodes.forEach(function (node) { attrs.forEach(function (attr) { @@ -21912,24 +18674,18 @@ removed = true; }); }); - if (removed) { hit(source); } }; - var flags = parseFlags(applying); - var run = function run() { rmattr(); - if (!flags.hasFlag(flags.STAY)) { return; } - observeDOMChanges(rmattr, true); }; - if (flags.hasFlag(flags.ASAP)) { if (document.readyState === "loading") { window.addEventListener("DOMContentLoaded", rmattr, { @@ -21939,7 +18695,6 @@ rmattr(); } } - if (document.readyState !== "complete" && flags.hasFlag(flags.COMPLETE)) { window.addEventListener("load", run, { once: true @@ -21948,66 +18703,44 @@ if (!applying.indexOf(" ") !== -1) { rmattr(); } - observeDOMChanges(rmattr, true); } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function observeDOMChanges(callback) { var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; var THROTTLE_DELAY_MS = 20; var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { @@ -22024,20 +18757,16 @@ }); } }; - var disconnect = function disconnect() { observer.disconnect(); }; - function callbackWrapper() { disconnect(); callback(); connect(); } - connect(); } - function parseFlags(flags) { var FLAGS_DIVIDER = " "; var ASAP_FLAG = "asap"; @@ -22056,96 +18785,76 @@ } }; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function throttle(cb, delay) { var wait = false; var savedArgs; - var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - if (wait) { savedArgs = args; return; } - cb.apply(void 0, args); wait = true; setTimeout(function () { wait = false; - if (savedArgs) { wrapper(savedArgs); savedArgs = null; } }, delay); }; - return wrapper; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { removeAttr.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function removeClass(source, args) { function removeClass(source, classNames, selector) { var applying = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "asap stay"; - if (!classNames) { return; } - classNames = classNames.split(/\s*\|\s*/); var selectors = []; - if (!selector) { selectors = classNames.map(function (className) { return ".".concat(className); }); } - var removeClassHandler = function removeClassHandler() { var nodes = new Set(); - if (selector) { var foundNodes = []; - try { foundNodes = [].slice.call(document.querySelectorAll(selector)); } catch (e) { logMessage(source, "Invalid selector arg: '".concat(selector, "'")); } - foundNodes.forEach(function (n) { return nodes.add(n); }); } else if (selectors.length > 0) { selectors.forEach(function (s) { var elements = document.querySelectorAll(s); - for (var i = 0; i < elements.length; i += 1) { var element = elements[i]; nodes.add(element); } }); } - var removed = false; nodes.forEach(function (node) { classNames.forEach(function (className) { @@ -22155,25 +18864,19 @@ } }); }); - if (removed) { hit(source); } }; - var CLASS_ATTR_NAME = ["class"]; var flags = parseFlags(applying); - var run = function run() { removeClassHandler(); - if (!flags.hasFlag(flags.STAY)) { return; } - observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); }; - if (flags.hasFlag(flags.ASAP)) { if (document.readyState === "loading") { window.addEventListener("DOMContentLoaded", removeClassHandler, { @@ -22183,7 +18886,6 @@ removeClassHandler(); } } - if (document.readyState !== "complete" && flags.hasFlag(flags.COMPLETE)) { window.addEventListener("load", run, { once: true @@ -22192,74 +18894,50 @@ if (!applying.indexOf(" ") !== -1) { removeClassHandler(); } - observeDOMChanges(removeClassHandler, true, CLASS_ATTR_NAME); } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function observeDOMChanges(callback) { var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; var THROTTLE_DELAY_MS = 20; var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { @@ -22276,20 +18954,16 @@ }); } }; - var disconnect = function disconnect() { observer.disconnect(); }; - function callbackWrapper() { disconnect(); callback(); connect(); } - connect(); } - function parseFlags(flags) { var FLAGS_DIVIDER = " "; var ASAP_FLAG = "asap"; @@ -22308,49 +18982,39 @@ } }; } - function throttle(cb, delay) { var wait = false; var savedArgs; - var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - if (wait) { savedArgs = args; return; } - cb.apply(void 0, args); wait = true; setTimeout(function () { wait = false; - if (savedArgs) { wrapper(savedArgs); savedArgs = null; } }, delay); }; - return wrapper; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { removeClass.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function removeCookie(source, args) { function removeCookie(source, match) { var matchRegexp = toRegExp(match); - var removeCookieFromHost = function removeCookieFromHost(cookieName, hostName) { var cookieSpec = "".concat(cookieName, "="); var domain1 = "; domain=".concat(hostName); @@ -22365,204 +19029,141 @@ document.cookie = cookieSpec + domain2 + path + expiration; hit(source); }; - var rmCookie = function rmCookie() { document.cookie.split(";").forEach(function (cookieStr) { var pos = cookieStr.indexOf("="); - if (pos === -1) { return; } - var cookieName = cookieStr.slice(0, pos).trim(); - if (!matchRegexp.test(cookieName)) { return; } - var hostParts = document.location.hostname.split("."); - for (var i = 0; i <= hostParts.length - 1; i += 1) { var hostName = hostParts.slice(i).join("."); - if (hostName) { removeCookieFromHost(cookieName, hostName); } } }); }; - rmCookie(); window.addEventListener("beforeunload", rmCookie); } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { removeCookie.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function removeInShadowDom(source, args) { function removeInShadowDom(source, selector, baseSelector) { if (!Element.prototype.attachShadow) { return; } - var removeElement = function removeElement(targetElement) { targetElement.remove(); }; - var removeHandler = function removeHandler() { var hostElements = !baseSelector ? findHostElements(document.documentElement) : document.querySelectorAll(baseSelector); - while (hostElements.length !== 0) { var isRemoved = false; - var _pierceShadowDom = pierceShadowDom(selector, hostElements), - targets = _pierceShadowDom.targets, - innerHosts = _pierceShadowDom.innerHosts; - + targets = _pierceShadowDom.targets, + innerHosts = _pierceShadowDom.innerHosts; targets.forEach(function (targetEl) { removeElement(targetEl); isRemoved = true; }); - if (isRemoved) { hit(source); } - hostElements = innerHosts; } }; - removeHandler(); observeDOMChanges(removeHandler, true); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function observeDOMChanges(callback) { var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; var THROTTLE_DELAY_MS = 20; var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { @@ -22579,20 +19180,16 @@ }); } }; - var disconnect = function disconnect() { observer.disconnect(); }; - function callbackWrapper() { disconnect(); callback(); connect(); } - connect(); } - function findHostElements(rootElement) { var hosts = []; var domElems = rootElement.querySelectorAll("*"); @@ -22603,7 +19200,6 @@ }); return hosts; } - function pierceShadowDom(selector, hostElements) { var targets = []; var innerHostsAcc = []; @@ -22621,17 +19217,14 @@ innerHosts: innerHosts }; } - function flatten(input) { var stack = []; input.forEach(function (el) { return stack.push(el); }); var res = []; - while (stack.length) { var next = stack.pop(); - if (Array.isArray(next)) { next.forEach(function (el) { return stack.push(el); @@ -22640,60 +19233,47 @@ res.push(next); } } - return res.reverse(); } - function throttle(cb, delay) { var wait = false; var savedArgs; - var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - if (wait) { savedArgs = args; return; } - cb.apply(void 0, args); wait = true; setTimeout(function () { wait = false; - if (savedArgs) { wrapper(savedArgs); savedArgs = null; } }, delay); }; - return wrapper; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { removeInShadowDom.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setAttr(source, args) { function setAttr(source, selector, attr) { var value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - if (!selector || !attr) { return; } - if (value.length !== 0 && (nativeIsNaN(parseInt(value, 10)) || parseInt(value, 10) < 0 || parseInt(value, 10) > 32767)) { return; } - var setAttr = function setAttr() { var nodes = [].slice.call(document.querySelectorAll(selector)); var set = false; @@ -22701,71 +19281,48 @@ node.setAttribute(attr, value); set = true; }); - if (set) { hit(source); } }; - setAttr(); observeDOMChanges(setAttr, true); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function observeDOMChanges(callback) { var observeAttrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var attrsToObserve = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; var THROTTLE_DELAY_MS = 20; var observer = new MutationObserver(throttle(callbackWrapper, THROTTLE_DELAY_MS)); - var connect = function connect() { if (attrsToObserve.length > 0) { observer.observe(document.documentElement, { @@ -22782,73 +19339,58 @@ }); } }; - var disconnect = function disconnect() { observer.disconnect(); }; - function callbackWrapper() { disconnect(); callback(); connect(); } - connect(); } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function throttle(cb, delay) { var wait = false; var savedArgs; - var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - if (wait) { savedArgs = args; return; } - cb.apply(void 0, args); wait = true; setTimeout(function () { wait = false; - if (savedArgs) { wrapper(savedArgs); savedArgs = null; } }, delay); }; - return wrapper; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { setAttr.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setConstant(source, args) { function setConstant(source, property, value, stack) { if (!property || !matchStackTrace(stack, new Error().stack)) { return; } - var emptyArr = noopArray(); var emptyObj = noopObject(); var constantValue; - if (value === "undefined") { constantValue = undefined; } else if (value === "false") { @@ -22873,11 +19415,9 @@ constantValue = noopPromiseReject; } else if (/^\d+$/.test(value)) { constantValue = parseFloat(value); - if (nativeIsNaN(constantValue)) { return; } - if (Math.abs(constantValue) > 32767) { return; } @@ -22892,40 +19432,31 @@ } else { return; } - var canceled = false; - var mustCancel = function mustCancel(value) { if (canceled) { return canceled; } - canceled = value !== undefined && constantValue !== undefined && typeof value !== typeof constantValue && value !== null; return canceled; }; - var trapProp = function trapProp(base, prop, configurable, handler) { if (!handler.init(base[prop])) { return false; } - var origDescriptor = Object.getOwnPropertyDescriptor(base, prop); var prevSetter; - if (origDescriptor instanceof Object) { if (!origDescriptor.configurable) { var message = "Property '".concat(prop, "' is not configurable"); logMessage(source, message); return false; } - base[prop] = constantValue; - if (origDescriptor.set instanceof Function) { prevSetter = origDescriptor.set; } } - Object.defineProperty(base, prop, { configurable: configurable, get: function get() { @@ -22935,18 +19466,16 @@ if (prevSetter !== undefined) { prevSetter(a); } - handler.set(a); } }); return true; }; - var setChainPropAccess = function setChainPropAccess(owner, property) { var chainInfo = getPropertyInChain(owner, property); var base = chainInfo.base; var prop = chainInfo.prop, - chain = chainInfo.chain; + chain = chainInfo.chain; var inChainPropHandler = { factValue: undefined, init: function init(a) { @@ -22960,9 +19489,7 @@ if (this.factValue === a) { return; } - this.factValue = a; - if (a instanceof Object) { setChainPropAccess(a, chain); } @@ -22973,7 +19500,6 @@ if (mustCancel(a)) { return false; } - return true; }, get: function get() { @@ -22983,130 +19509,90 @@ if (!mustCancel(a)) { return; } - constantValue = a; } }; - if (!chain) { var isTrapped = trapProp(base, prop, false, endPropHandler); - if (isTrapped) { hit(source); } - return; } - if (base !== undefined && base[prop] === null) { trapProp(base, prop, true, inChainPropHandler); return; } - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { trapProp(base, prop, true, inChainPropHandler); } - var propValue = owner[prop]; - if (propValue instanceof Object || typeof propValue === "object" && propValue !== null) { setChainPropAccess(propValue, chain); } - trapProp(base, prop, true, inChainPropHandler); }; - setChainPropAccess(window, property); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function noopArray() { return []; } - function noopObject() { return {}; } - function noopFunc() {} - function trueFunc() { return true; } - function falseFunc() { return false; } - function noopPromiseReject() { return Promise.reject(); } - function noopPromiseResolve() { var responseBody = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "{}"; var responseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var responseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "default"; - if (typeof Response === "undefined") { return; } - var response = new Response(responseBody, { status: 200, statusText: "OK" @@ -23121,19 +19607,15 @@ }); return Promise.resolve(response); } - function getPropertyInChain(base, chain) { var pos = chain.indexOf("."); - if (pos === -1) { return { base: base, prop: chain }; } - var prop = chain.slice(0, pos); - if (base === null) { return { base: base, @@ -23141,10 +19623,8 @@ chain: chain }; } - var nextBase = base[prop]; chain = chain.slice(pos + 1); - if ((base instanceof Object || typeof base === "object") && isEmptyObject(base)) { return { base: base, @@ -23152,7 +19632,6 @@ chain: chain }; } - if (nextBase === null) { return { base: base, @@ -23160,11 +19639,9 @@ chain: chain }; } - if (nextBase !== undefined) { return getPropertyInChain(nextBase, chain); } - Object.defineProperty(base, prop, { configurable: true }); @@ -23174,156 +19651,169 @@ chain: chain }; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function matchStackTrace(stackMatch, stackTrace) { if (!stackMatch || stackMatch === "") { return true; } - if (shouldAbortInlineOrInjectedScript(stackMatch, stackTrace)) { return true; } - var stackRegexp = toRegExp(stackMatch); var refinedStackTrace = stackTrace.split("\n").slice(2).map(function (line) { return line.trim(); }).join("\n"); return getNativeRegexpTest().call(stackRegexp, refinedStackTrace); } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getNativeRegexpTest() { return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; } - + function shouldAbortInlineOrInjectedScript(stackMatch, stackTrace) { + var INLINE_SCRIPT_STRING = "inlineScript"; + var INJECTED_SCRIPT_STRING = "injectedScript"; + var INJECTED_SCRIPT_MARKER = ""; + var isInlineScript = function isInlineScript(stackMatch) { + return stackMatch.indexOf(INLINE_SCRIPT_STRING) > -1; + }; + var isInjectedScript = function isInjectedScript(stackMatch) { + return stackMatch.indexOf(INJECTED_SCRIPT_STRING) > -1; + }; + if (!(isInlineScript(stackMatch) || isInjectedScript(stackMatch))) { + return false; + } + var documentURL = window.location.href; + var pos = documentURL.indexOf("#"); + if (pos !== -1) { + documentURL = documentURL.slice(0, pos); + } + var stackSteps = stackTrace.split("\n").slice(2).map(function (line) { + return line.trim(); + }); + var stackLines = stackSteps.map(function (line) { + var stack; + var getStackTraceURL = /(.*?@)?(\S+)(:\d+):\d+\)?$/.exec(line); + if (getStackTraceURL) { + var stackURL = getStackTraceURL[2]; + if (startsWith(stackURL, "(")) { + stackURL = stackURL.slice(1); + } + if (startsWith(stackURL, INJECTED_SCRIPT_MARKER)) { + stackURL = INJECTED_SCRIPT_STRING; + var stackFunction = getStackTraceURL[1] !== undefined ? getStackTraceURL[1].slice(0, -1) : line.slice(0, getStackTraceURL.index).trim(); + if (startsWith(stackFunction, "at")) { + stackFunction = stackFunction.slice(2).trim(); + } + stack = "".concat(stackFunction, " ").concat(stackURL).trim(); + } else { + stack = stackURL; + } + } else { + stack = line; + } + return stack; + }); + if (stackLines) { + for (var index = 0; index < stackLines.length; index += 1) { + if (isInlineScript(stackMatch) && documentURL === stackLines[index]) { + return true; + } + if (isInjectedScript(stackMatch) && startsWith(stackLines[index], INJECTED_SCRIPT_STRING)) { + return true; + } + } + } + return false; + } var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { setConstant.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setCookie(source, args) { function setCookie(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; var validValue = getLimitedCookieValue(value); - if (validValue === null) { logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); return; } - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (!cookieToSet) { return; } - hit(source); document.cookie = cookieToSet; } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function getLimitedCookieValue(value) { if (!value) { return null; } - var validValue; - if (value === "true") { validValue = "true"; } else if (value === "True") { @@ -23346,163 +19836,117 @@ validValue = "OK"; } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { return null; } - if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { return null; } } else { return null; } - return validValue; } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); } - function isValidCookiePath(rawPath) { return rawPath === "/" || rawPath === "none"; } - function getCookiePath(rawPath) { if (rawPath === "/") { return "path=/"; } - return ""; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { setCookie.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setCookieReload(source, args) { function setCookieReload(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; - if (isCookieSetWithValue(name, value)) { return; } - var validValue = getLimitedCookieValue(value); - if (validValue === null) { logMessage(source, "Invalid cookie value: '".concat(value, "'")); return; } - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, validValue, path); - if (!cookieToSet) { return; } - document.cookie = cookieToSet; hit(source); - if (isCookieSetWithValue(document.cookie, name, value)) { window.location.reload(); } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function isCookieSetWithValue(cookieString, name, value) { return cookieString.split(";").some(function (cookieStr) { var pos = cookieStr.indexOf("="); - if (pos === -1) { return false; } - var cookieName = cookieStr.slice(0, pos).trim(); var cookieValue = cookieStr.slice(pos + 1).trim(); return name === cookieName && value === cookieValue; }); } - function getLimitedCookieValue(value) { if (!value) { return null; } - var validValue; - if (value === "true") { validValue = "true"; } else if (value === "True") { @@ -23525,128 +19969,94 @@ validValue = "OK"; } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { return null; } - if (Math.abs(validValue) < 0 || Math.abs(validValue) > 15) { return null; } } else { return null; } - return validValue; } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); } - function isValidCookiePath(rawPath) { return rawPath === "/" || rawPath === "none"; } - function getCookiePath(rawPath) { if (rawPath === "/") { return "path=/"; } - return ""; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { setCookieReload.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setLocalStorageItem(source, args) { function setLocalStorageItem(source, key, value) { if (typeof key === "undefined") { logMessage(source, "Item key should be specified."); return; } - - var validValue = getLimitedStorageItemValue(source, value); - - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + var validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch (_unused) { + logMessage(source, "Invalid storage item value: '".concat(value, "'")); return; } - var _window = window, - localStorage = _window.localStorage; + localStorage = _window.localStorage; setStorageItem(source, localStorage, key, validValue); hit(source); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function setStorageItem(source, storage, key, value) { try { storage.setItem(key, value); @@ -23655,14 +20065,11 @@ logMessage(source, message); } } - - function getLimitedStorageItemValue(source, value) { - if (!value) { - return null; + function getLimitedStorageItemValue(value) { + if (typeof value !== "string") { + throw new Error("Invalid value"); } - var validValue; - if (value === "undefined") { validValue = undefined; } else if (value === "false") { @@ -23679,36 +20086,28 @@ validValue = ""; } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return null; + throw new Error("Invalid value"); } - if (Math.abs(validValue) > 32767) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return null; + throw new Error("Invalid value"); } } else if (value === "yes") { validValue = "yes"; } else if (value === "no") { validValue = "no"; } else { - return null; + throw new Error("Invalid value"); } - return validValue; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { setLocalStorageItem.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setPopadsDummy(source, args) { function setPopadsDummy(source) { delete window.PopAds; @@ -23728,97 +20127,101 @@ } }); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { setPopadsDummy.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function setSessionStorageItem(source, args) { function setSessionStorageItem(source, key, value) { if (typeof key === "undefined") { logMessage(source, "Item key should be specified."); return; } - - var validValue = getLimitedStorageItemValue(source, value); - - if (validValue === null) { - logMessage(source, "Invalid cookie value: '".concat(validValue, "'")); + var validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch (_unused) { + logMessage(source, "Invalid storage item value: '".concat(value, "'")); return; } - var _window = window, - sessionStorage = _window.sessionStorage; + sessionStorage = _window.sessionStorage; setStorageItem(source, sessionStorage, key, validValue); + hit(source); + } + function hit(source) { + if (source.verbose !== true) { + return; + } + try { + var log = console.log.bind(console); + var trace = console.trace.bind(console); + var prefix = source.ruleText || ""; + if (source.domainName) { + var AG_SCRIPTLET_MARKER = "#%#//"; + var UBO_SCRIPTLET_MARKER = "##+js"; + var ruleStartIndex; + if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { + ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); + } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { + ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); + } + var rulePart = source.ruleText.slice(ruleStartIndex); + prefix = "".concat(source.domainName).concat(rulePart); + } + log("".concat(prefix, " trace start")); + if (trace) { + trace(); + } + log("".concat(prefix, " trace end")); + } catch (e) {} + if (typeof window.__debug === "function") { + window.__debug(source); + } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function nativeIsNaN(num) { var native = Number.isNaN || window.isNaN; return native(num); } - function setStorageItem(source, storage, key, value) { try { storage.setItem(key, value); @@ -23827,14 +20230,11 @@ logMessage(source, message); } } - - function getLimitedStorageItemValue(source, value) { - if (!value) { - return null; + function getLimitedStorageItemValue(value) { + if (typeof value !== "string") { + throw new Error("Invalid value"); } - var validValue; - if (value === "undefined") { validValue = undefined; } else if (value === "false") { @@ -23851,45 +20251,35 @@ validValue = ""; } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); - if (nativeIsNaN(validValue)) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return null; + throw new Error("Invalid value"); } - if (Math.abs(validValue) > 32767) { - logMessage(source, "Invalid storage item value: '".concat(value, "'")); - return null; + throw new Error("Invalid value"); } } else if (value === "yes") { validValue = "yes"; } else if (value === "no") { validValue = "no"; } else { - return null; + throw new Error("Invalid value"); } - return validValue; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { setSessionStorageItem.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedClickElement(source, args) { function trustedClickElement(source, selectors) { var extraMatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; var delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : NaN; - if (!selectors) { return; } - var OBSERVER_TIMEOUT_MS = 1e4; var THROTTLE_DELAY_MS = 20; var COOKIE_MATCH_MARKER = "cookie:"; @@ -23898,22 +20288,18 @@ var COOKIE_STRING_DELIMITER = ";"; var EXTRA_MATCH_DELIMITER = /(,\s*){1}(?=cookie:|localStorage:)/; var parsedDelay; - if (delay) { parsedDelay = parseInt(delay, 10); var isValidDelay = !Number.isNaN(parsedDelay) || parsedDelay < OBSERVER_TIMEOUT_MS; - if (!isValidDelay) { var message = "Passed delay '".concat(delay, "' is invalid or bigger than ").concat(OBSERVER_TIMEOUT_MS, " ms"); logMessage(source, message); return; } } - var canClick = !parsedDelay; var cookieMatches = []; var localStorageMatches = []; - if (extraMatch) { var parsedExtraMatch = extraMatch.split(EXTRA_MATCH_DELIMITER).map(function (matchStr) { return matchStr.trim(); @@ -23923,115 +20309,91 @@ var cookieMatch = matchStr.replace(COOKIE_MATCH_MARKER, ""); cookieMatches.push(cookieMatch); } - if (matchStr.indexOf(LOCAL_STORAGE_MATCH_MARKER) > -1) { var localStorageMatch = matchStr.replace(LOCAL_STORAGE_MATCH_MARKER, ""); localStorageMatches.push(localStorageMatch); } }); } - if (cookieMatches.length > 0) { var parsedCookieMatches = parseCookieString(cookieMatches.join(COOKIE_STRING_DELIMITER)); var parsedCookies = parseCookieString(document.cookie); var cookieKeys = Object.keys(parsedCookies); - if (cookieKeys.length === 0) { return; } - var cookiesMatched = Object.keys(parsedCookieMatches).every(function (key) { var valueMatch = parsedCookieMatches[key] ? toRegExp(parsedCookieMatches[key]) : null; var keyMatch = toRegExp(key); return cookieKeys.some(function (key) { var keysMatched = keyMatch.test(key); - if (!keysMatched) { return false; } - if (!valueMatch) { return true; } - return valueMatch.test(parsedCookies[key]); }); }); - if (!cookiesMatched) { return; } } - if (localStorageMatches.length > 0) { var localStorageMatched = localStorageMatches.every(function (str) { var itemValue = window.localStorage.getItem(str); return itemValue || itemValue === ""; }); - if (!localStorageMatched) { return; } } - var selectorsSequence = selectors.split(SELECTORS_DELIMITER).map(function (selector) { return selector.trim(); }); - var createElementObj = function createElementObj(element) { return { element: element || null, clicked: false }; }; - var elementsSequence = Array(selectorsSequence.length).fill(createElementObj()); - var clickElementsBySequence = function clickElementsBySequence() { for (var i = 0; i < elementsSequence.length; i += 1) { var elementObj = elementsSequence[i]; - if (!elementObj.element) { break; } - if (!elementObj.clicked) { elementObj.element.click(); elementObj.clicked = true; } } - var allElementsClicked = elementsSequence.every(function (elementObj) { return elementObj.clicked === true; }); - if (allElementsClicked) { hit(source); } }; - var handleElement = function handleElement(element, i) { var elementObj = createElementObj(element); elementsSequence[i] = elementObj; - if (canClick) { clickElementsBySequence(); } }; - var findElements = function findElements(mutations, observer) { var fulfilledSelectors = []; selectorsSequence.forEach(function (selector, i) { if (!selector) { return; } - var element = document.querySelector(selector); - if (!element) { return; } - handleElement(element, i); fulfilledSelectors.push(selector); }); @@ -24041,97 +20403,69 @@ var allSelectorsFulfilled = selectorsSequence.every(function (selector) { return selector === null; }); - if (allSelectorsFulfilled) { observer.disconnect(); } }; - var observer = new MutationObserver(throttle(findElements, THROTTLE_DELAY_MS)); observer.observe(document.documentElement, { attributes: true, childList: true, subtree: true }); - if (parsedDelay) { setTimeout(function () { clickElementsBySequence(); canClick = true; }, parsedDelay); } - setTimeout(function () { return observer.disconnect(); }, OBSERVER_TIMEOUT_MS); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function parseCookieString(cookieString) { var COOKIE_DELIMITER = "="; var COOKIE_PAIRS_DELIMITER = ";"; @@ -24141,109 +20475,88 @@ var cookieKey; var cookieValue; var delimiterIndex = singleCookie.indexOf(COOKIE_DELIMITER); - if (delimiterIndex === -1) { cookieKey = singleCookie.trim(); } else { cookieKey = singleCookie.slice(0, delimiterIndex).trim(); cookieValue = singleCookie.slice(delimiterIndex + 1); } - cookieData[cookieKey] = cookieValue || null; }); return cookieData; } - function throttle(cb, delay) { var wait = false; var savedArgs; - var wrapper = function wrapper() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } - if (wait) { savedArgs = args; return; } - cb.apply(void 0, args); wait = true; setTimeout(function () { wait = false; - if (savedArgs) { wrapper(savedArgs); savedArgs = null; } }, delay); }; - return wrapper; } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { trustedClickElement.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedReplaceFetchResponse(source, args) { function trustedReplaceFetchResponse(source) { var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - if (typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { return; } - if (pattern === "" && replacement !== "") { logMessage(source, "Pattern argument should not be empty string."); return; } - var shouldLog = pattern === "" && replacement === ""; var nativeFetch = fetch; var shouldReplace = false; var fetchData; - var handlerWrapper = function handlerWrapper(target, thisArg, args) { fetchData = getFetchData(args); - if (shouldLog) { logMessage(source, "fetch( ".concat(objectToString(fetchData), " )"), true); hit(source); return Reflect.apply(target, thisArg, args); } - shouldReplace = matchRequestProps(source, propsToMatch, fetchData); - if (!shouldReplace) { return Reflect.apply(target, thisArg, args); } - var forgeResponse = function forgeResponse(response, textContent) { var bodyUsed = response.bodyUsed, - headers = response.headers, - ok = response.ok, - redirected = response.redirected, - status = response.status, - statusText = response.statusText, - type = response.type, - url = response.url; + headers = response.headers, + ok = response.ok, + redirected = response.redirected, + status = response.status, + statusText = response.statusText, + type = response.type, + url = response.url; var forgedResponse = new Response(textContent, { status: status, statusText: statusText, @@ -24268,10 +20581,9 @@ }); return forgedResponse; }; - - return nativeFetch.apply(void 0, toConsumableArray(args)).then(function (response) { + return nativeFetch.apply(null, args).then(function (response) { return response.text().then(function (bodyText) { - var patternRegexp = pattern === "*" ? toRegExp() : toRegExp(pattern); + var patternRegexp = pattern === "*" ? /(\n|.)*/ : toRegExp(pattern); var modifiedTextContent = bodyText.replace(patternRegexp, replacement); var forgedResponse = forgeResponse(response, modifiedTextContent); hit(source); @@ -24286,75 +20598,51 @@ return Reflect.apply(target, thisArg, args); }); }; - var fetchHandler = { apply: handlerWrapper }; fetch = new Proxy(fetch, fetchHandler); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function getFetchData(args) { var fetchPropsObj = {}; var fetchUrl; var fetchInit; - if (args[0] instanceof Request) { var requestData = getRequestData(args[0]); fetchUrl = requestData.url; @@ -24363,40 +20651,31 @@ fetchUrl = args[0]; fetchInit = args[1]; } - fetchPropsObj.url = fetchUrl; - if (fetchInit instanceof Object) { Object.keys(fetchInit).forEach(function (prop) { fetchPropsObj[prop] = fetchInit[prop]; }); } - return fetchPropsObj; } - function objectToString(obj) { return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { var key = pair[0]; var value = pair[1]; var recordValueStr = value; - if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } - return "".concat(key, ':"').concat(recordValueStr, '"'); }).join(" "); } - function matchRequestProps(source, propsToMatch, requestData) { if (propsToMatch === "" || propsToMatch === "*") { return true; } - var isMatched; var parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { logMessage(source, "Invalid parameter: ".concat(propsToMatch)); isMatched = false; @@ -24407,55 +20686,42 @@ return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); }); } - return isMatched; } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getRequestData(request) { var requestInitOptions = getRequestProps(); var entries = requestInitOptions.map(function (key) { @@ -24464,11 +20730,9 @@ }); return getObjectFromEntries(entries); } - function getRequestProps() { return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; } - function getObjectEntries(object) { var keys = Object.keys(object); var entries = []; @@ -24477,7 +20741,6 @@ }); return entries; } - function getObjectFromEntries(entries) { var output = entries.reduce(function (acc, el) { var key = el[0]; @@ -24487,7 +20750,6 @@ }, {}); return output; } - function parseMatchProps(propsToMatchStr) { var PROPS_DIVIDER = " "; var PAIRS_MARKER = ":"; @@ -24498,7 +20760,6 @@ var dividerInd = prop.indexOf(PAIRS_MARKER); var key = prop.slice(0, dividerInd); var hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { var value = prop.slice(dividerInd + 1); propsObj[key] = value; @@ -24508,13 +20769,11 @@ }); return propsObj; } - function validateParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); }); } - function getMatchPropsData(data) { var matchData = {}; Object.keys(data).forEach(function (key) { @@ -24522,92 +20781,74 @@ }); return matchData; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { trustedReplaceFetchResponse.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedReplaceXhrResponse(source, args) { function trustedReplaceXhrResponse(source) { var pattern = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var replacement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; var propsToMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; - if (typeof Proxy === "undefined") { return; } - if (pattern === "" && replacement !== "") { var message = "Pattern argument should not be empty string."; logMessage(source, message); return; } - var shouldLog = pattern === "" && replacement === ""; var nativeOpen = window.XMLHttpRequest.prototype.open; var nativeSend = window.XMLHttpRequest.prototype.send; var shouldReplace = false; var xhrData; var requestHeaders = []; - var openWrapper = function openWrapper(target, thisArg, args) { xhrData = getXhrData.apply(null, args); - if (shouldLog) { var _message = "xhr( ".concat(objectToString(xhrData), " )"); - logMessage(source, _message, true); hit(source); return Reflect.apply(target, thisArg, args); } - shouldReplace = matchRequestProps(source, propsToMatch, xhrData); - if (shouldReplace) { var setRequestHeaderWrapper = function setRequestHeaderWrapper(target, thisArg, args) { requestHeaders.push(args); return Reflect.apply(target, thisArg, args); }; - var setRequestHeaderHandler = { apply: setRequestHeaderWrapper }; thisArg.setRequestHeader = new Proxy(thisArg.setRequestHeader, setRequestHeaderHandler); } - return Reflect.apply(target, thisArg, args); }; - var sendWrapper = function sendWrapper(target, thisArg, args) { if (!shouldReplace) { return Reflect.apply(target, thisArg, args); } - var forgedRequest = new XMLHttpRequest(); forgedRequest.addEventListener("readystatechange", function () { if (forgedRequest.readyState !== 4) { return; } - var readyState = forgedRequest.readyState, - response = forgedRequest.response, - responseText = forgedRequest.responseText, - responseURL = forgedRequest.responseURL, - responseXML = forgedRequest.responseXML, - status = forgedRequest.status, - statusText = forgedRequest.statusText; + response = forgedRequest.response, + responseText = forgedRequest.responseText, + responseURL = forgedRequest.responseURL, + responseXML = forgedRequest.responseXML, + status = forgedRequest.status, + statusText = forgedRequest.statusText; var content = responseText || response; - if (typeof content !== "string") { return; } - - var patternRegexp = pattern === "*" ? toRegExp() : toRegExp(pattern); + var patternRegexp = pattern === "*" ? /(\n|.)*/ : toRegExp(pattern); var modifiedContent = content.replace(patternRegexp, replacement); Object.defineProperties(thisArg, { readyState: { @@ -24649,16 +20890,13 @@ forgedRequest.setRequestHeader(name, value); }); requestHeaders = []; - try { nativeSend.call(forgedRequest, args); } catch (_unused) { return Reflect.apply(target, thisArg, args); } - return undefined; }; - var openHandler = { apply: openWrapper }; @@ -24668,103 +20906,72 @@ XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, openHandler); XMLHttpRequest.prototype.send = new Proxy(XMLHttpRequest.prototype.send, sendHandler); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function objectToString(obj) { return isEmptyObject(obj) ? "{}" : getObjectEntries(obj).map(function (pair) { var key = pair[0]; var value = pair[1]; var recordValueStr = value; - if (value instanceof Object) { recordValueStr = "{ ".concat(objectToString(value), " }"); } - return "".concat(key, ':"').concat(recordValueStr, '"'); }).join(" "); } - function matchRequestProps(source, propsToMatch, requestData) { if (propsToMatch === "" || propsToMatch === "*") { return true; } - var isMatched; var parsedData = parseMatchProps(propsToMatch); - if (!validateParsedData(parsedData)) { logMessage(source, "Invalid parameter: ".concat(propsToMatch)); isMatched = false; @@ -24775,10 +20982,8 @@ return Object.prototype.hasOwnProperty.call(requestData, matchKey) && matchValue.test(requestData[matchKey]); }); } - return isMatched; } - function getXhrData(method, url, async, user, password) { return { method: method, @@ -24788,7 +20993,6 @@ password: password }; } - function getMatchPropsData(data) { var matchData = {}; Object.keys(data).forEach(function (key) { @@ -24796,17 +21000,14 @@ }); return matchData; } - function getRequestProps() { return ["url", "method", "headers", "body", "mode", "credentials", "cache", "redirect", "referrer", "referrerPolicy", "integrity", "keepalive", "signal"]; } - function validateParsedData(data) { return Object.values(data).every(function (value) { return isValidStrPattern(value); }); } - function parseMatchProps(propsToMatchStr) { var PROPS_DIVIDER = " "; var PAIRS_MARKER = ":"; @@ -24817,7 +21018,6 @@ var dividerInd = prop.indexOf(PAIRS_MARKER); var key = prop.slice(0, dividerInd); var hasLegalMatchProp = LEGAL_MATCH_PROPS.indexOf(key) !== -1; - if (hasLegalMatchProp) { var value = prop.slice(dividerInd + 1); propsObj[key] = value; @@ -24827,35 +21027,27 @@ }); return propsObj; } - function isValidStrPattern(input) { var FORWARD_SLASH = "/"; var str = escapeRegExp(input); - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { str = input.slice(1, -1); } - var isValid; - try { isValid = new RegExp(str); isValid = true; } catch (e) { isValid = false; } - return isValid; } - function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function isEmptyObject(obj) { return Object.keys(obj).length === 0; } - function getObjectEntries(object) { var keys = Object.keys(object); var entries = []; @@ -24864,442 +21056,318 @@ }); return entries; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { trustedReplaceXhrResponse.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedSetCookie(source, args) { function trustedSetCookie(source, name, value) { var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; - if (typeof name === "undefined") { logMessage(source, "Cookie name should be specified."); return; } - if (typeof value === "undefined") { logMessage(source, "Cookie value should be specified."); return; } - var parsedValue = parseKeywordValue(value); - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (!cookieToSet) { return; } - - var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); - - if (!parsedOffsetMs) { - logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); - return; + if (offsetExpiresSec) { + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); } - - var expires = Date.now() + parsedOffsetMs; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); document.cookie = cookieToSet; hit(source); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); } - function isValidCookiePath(rawPath) { return rawPath === "/" || rawPath === "none"; } - function getTrustedCookieOffsetMs(offsetExpiresSec) { - if (!offsetExpiresSec) { - return null; - } - var ONE_YEAR_EXPIRATION_KEYWORD = "1year"; var ONE_DAY_EXPIRATION_KEYWORD = "1day"; var MS_IN_SEC = 1e3; var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; var SECONDS_IN_DAY = 24 * 60 * 60; var parsedSec; - if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { parsedSec = SECONDS_IN_YEAR; } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { parsedSec = SECONDS_IN_DAY; } else { parsedSec = Number.parseInt(offsetExpiresSec, 10); - if (Number.isNaN(parsedSec)) { return null; } } - return parsedSec * MS_IN_SEC; } - function parseKeywordValue(rawValue) { var NOW_VALUE_KEYWORD = "$now$"; var CURRENT_DATE_KEYWORD = "$currentDate$"; var parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { parsedValue = Date.now().toString(); } else if (rawValue === CURRENT_DATE_KEYWORD) { parsedValue = Date(); } - return parsedValue; } - function getCookiePath(rawPath) { if (rawPath === "/") { return "path=/"; } - return ""; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { trustedSetCookie.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedSetCookieReload(source, args) { function trustedSetCookieReload(source, name, value) { var offsetExpiresSec = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; var path = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "/"; - if (typeof name === "undefined") { logMessage(source, "Cookie name should be specified."); return; } - if (typeof value === "undefined") { logMessage(source, "Cookie value should be specified."); return; } - if (isCookieSetWithValue(document.cookie, name, value)) { return; } - var parsedValue = parseKeywordValue(value); - if (!isValidCookiePath(path)) { logMessage(source, "Invalid cookie path: '".concat(path, "'")); return; } - var cookieToSet = concatCookieNameValuePath(name, parsedValue, path); - if (!cookieToSet) { return; } - - var parsedOffsetExpiresMs = getTrustedCookieOffsetMs(offsetExpiresSec); - - if (!parsedOffsetExpiresMs) { - logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); - return; + if (offsetExpiresSec) { + var parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + if (!parsedOffsetMs) { + logMessage(source, "Invalid offsetExpiresSec value: ".concat(offsetExpiresSec)); + return; + } + var expires = Date.now() + parsedOffsetMs; + cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); } - - var expires = Date.now() + parsedOffsetExpiresMs; - cookieToSet += " expires=".concat(new Date(expires).toUTCString(), ";"); document.cookie = cookieToSet; hit(source); - if (isCookieSetWithValue(document.cookie, name, value)) { window.location.reload(); } } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function isCookieSetWithValue(cookieString, name, value) { return cookieString.split(";").some(function (cookieStr) { var pos = cookieStr.indexOf("="); - if (pos === -1) { return false; } - var cookieName = cookieStr.slice(0, pos).trim(); var cookieValue = cookieStr.slice(pos + 1).trim(); return name === cookieName && value === cookieValue; }); } - function concatCookieNameValuePath(rawName, rawValue, rawPath) { return "".concat(encodeURIComponent(rawName), "=").concat(encodeURIComponent(rawValue), "; ").concat(getCookiePath(rawPath), ";"); } - function isValidCookiePath(rawPath) { return rawPath === "/" || rawPath === "none"; } - function getTrustedCookieOffsetMs(offsetExpiresSec) { - if (!offsetExpiresSec) { - return null; - } - var ONE_YEAR_EXPIRATION_KEYWORD = "1year"; var ONE_DAY_EXPIRATION_KEYWORD = "1day"; var MS_IN_SEC = 1e3; var SECONDS_IN_YEAR = 365 * 24 * 60 * 60; var SECONDS_IN_DAY = 24 * 60 * 60; var parsedSec; - if (offsetExpiresSec === ONE_YEAR_EXPIRATION_KEYWORD) { parsedSec = SECONDS_IN_YEAR; } else if (offsetExpiresSec === ONE_DAY_EXPIRATION_KEYWORD) { parsedSec = SECONDS_IN_DAY; } else { parsedSec = Number.parseInt(offsetExpiresSec, 10); - if (Number.isNaN(parsedSec)) { return null; } } - return parsedSec * MS_IN_SEC; } - function parseKeywordValue(rawValue) { var NOW_VALUE_KEYWORD = "$now$"; var CURRENT_DATE_KEYWORD = "$currentDate$"; var parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { parsedValue = Date.now().toString(); } else if (rawValue === CURRENT_DATE_KEYWORD) { parsedValue = Date(); } - return parsedValue; } - function getCookiePath(rawPath) { if (rawPath === "/") { return "path=/"; } - return ""; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { trustedSetCookieReload.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function trustedSetLocalStorageItem(source, args) { function trustedSetLocalStorageItem(source, key, value) { if (typeof key === "undefined") { logMessage(source, "Item key should be specified."); return; } - if (typeof value === "undefined") { logMessage(source, "Item value should be specified."); return; } - var parsedValue = parseKeywordValue(value); var _window = window, - localStorage = _window.localStorage; + localStorage = _window.localStorage; setStorageItem(source, localStorage, key, parsedValue); hit(source); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function setStorageItem(source, storage, key, value) { try { storage.setItem(key, value); @@ -25308,85 +21376,64 @@ logMessage(source, message); } } - function parseKeywordValue(rawValue) { var NOW_VALUE_KEYWORD = "$now$"; var CURRENT_DATE_KEYWORD = "$currentDate$"; var parsedValue = rawValue; - if (rawValue === NOW_VALUE_KEYWORD) { parsedValue = Date.now().toString(); } else if (rawValue === CURRENT_DATE_KEYWORD) { parsedValue = Date(); } - return parsedValue; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { trustedSetLocalStorageItem.apply(this, updatedArgs); } catch (e) { console.log(e); } } - function xmlPrune(source, args) { function xmlPrune(source, propsToRemove) { var _this = this; - var optionalProp = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; var urlToMatch = arguments.length > 3 ? arguments[3] : undefined; - if (typeof Reflect === "undefined" || typeof fetch === "undefined" || typeof Proxy === "undefined" || typeof Response === "undefined") { return; } - var shouldPruneResponse = true; - if (!propsToRemove) { shouldPruneResponse = false; } - var urlMatchRegexp = toRegExp(urlToMatch); - var isXML = function isXML(text) { var trimedText = text.trim(); - if (startsWith(trimedText, "<") && endsWith(trimedText, ">")) { return true; } - return false; }; - var pruneXML = function pruneXML(text) { if (!isXML(text)) { shouldPruneResponse = false; return text; } - var xmlParser = new DOMParser(); var xmlDoc = xmlParser.parseFromString(text, "text/xml"); var errorNode = xmlDoc.querySelector("parsererror"); - if (errorNode) { return text; } - if (optionalProp !== "" && xmlDoc.querySelector(optionalProp) === null) { shouldPruneResponse = false; return text; } - var elems = xmlDoc.querySelectorAll(propsToRemove); - if (!elems.length) { shouldPruneResponse = false; return text; } - elems.forEach(function (elem) { elem.remove(); }); @@ -25394,20 +21441,16 @@ text = serializer.serializeToString(xmlDoc); return text; }; - var xhrWrapper = function xhrWrapper(target, thisArg, args) { var xhrURL = args[1]; - if (typeof xhrURL !== "string" || xhrURL.length === 0) { return Reflect.apply(target, thisArg, args); } - if (urlMatchRegexp.test(xhrURL)) { thisArg.addEventListener("readystatechange", function pruneResponse() { if (thisArg.readyState === 4) { var response = thisArg.response; thisArg.removeEventListener("readystatechange", pruneResponse); - if (!shouldPruneResponse) { if (isXML(response)) { var message = "XMLHttpRequest.open() URL: ".concat(xhrURL, "\nresponse: ").concat(response); @@ -25415,7 +21458,6 @@ } } else { var prunedResponseContent = pruneXML(response); - if (shouldPruneResponse) { Object.defineProperty(thisArg, "response", { value: prunedResponseContent @@ -25425,29 +21467,23 @@ }); hit(source); } - shouldPruneResponse = true; } } }); } - return Reflect.apply(target, thisArg, args); }; - var xhrHandler = { apply: xhrWrapper }; window.XMLHttpRequest.prototype.open = new Proxy(window.XMLHttpRequest.prototype.open, xhrHandler); var nativeFetch = window.fetch; - var fetchWrapper = function fetchWrapper(target, thisArg, args) { var fetchURL = args[0]; - if (typeof fetchURL !== "string" || fetchURL.length === 0) { return Reflect.apply(target, thisArg, args); } - if (urlMatchRegexp.test(fetchURL)) { return nativeFetch.apply(_this, args).then(function (response) { return response.text().then(function (text) { @@ -25455,12 +21491,9 @@ if (isXML(text)) { logMessage("fetch URL: ".concat(fetchURL, "\nresponse text: ").concat(text)); } - return Reflect.apply(target, thisArg, args); } - var prunedText = pruneXML(text); - if (shouldPruneResponse) { hit(source); return new Response(prunedText, { @@ -25469,113 +21502,80 @@ headers: response.headers }); } - shouldPruneResponse = true; return Reflect.apply(target, thisArg, args); }); }); } - return Reflect.apply(target, thisArg, args); }; - var fetchHandler = { apply: fetchWrapper }; window.fetch = new Proxy(window.fetch, fetchHandler); } - - function hit(source, message) { + function hit(source) { if (source.verbose !== true) { return; } - try { var log = console.log.bind(console); var trace = console.trace.bind(console); var prefix = source.ruleText || ""; - if (source.domainName) { var AG_SCRIPTLET_MARKER = "#%#//"; var UBO_SCRIPTLET_MARKER = "##+js"; var ruleStartIndex; - if (source.ruleText.indexOf(AG_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(AG_SCRIPTLET_MARKER); } else if (source.ruleText.indexOf(UBO_SCRIPTLET_MARKER) > -1) { ruleStartIndex = source.ruleText.indexOf(UBO_SCRIPTLET_MARKER); } - var rulePart = source.ruleText.slice(ruleStartIndex); prefix = "".concat(source.domainName).concat(rulePart); } - - var LOG_MARKER = "log: "; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log("".concat(prefix, " message:\n").concat(message)); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log("".concat(prefix, " trace start")); - if (trace) { trace(); } - log("".concat(prefix, " trace end")); } catch (e) {} - if (typeof window.__debug === "function") { window.__debug(source); } } - function logMessage(source, message) { var forced = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - if (forced || source.verbose) { console.log("".concat(source.name, ": ").concat(message)); } } - function toRegExp() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ""; var DEFAULT_VALUE = ".?"; var FORWARD_SLASH = "/"; - if (input === "") { return new RegExp(DEFAULT_VALUE); } - if (input[0] === FORWARD_SLASH && input[input.length - 1] === FORWARD_SLASH) { return new RegExp(input.slice(1, -1)); } - var escaped = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return new RegExp(escaped); } - function startsWith(str, prefix) { return !!str && str.indexOf(prefix) === 0; } - function endsWith(str, ending) { return !!str && str.lastIndexOf(ending) === str.length - ending.length; } - var updatedArgs = args ? [].concat(source).concat(args) : [source]; - try { xmlPrune.apply(this, updatedArgs); } catch (e) { console.log(e); } } - var scriptletsMap = { "abort-current-inline-script": abortCurrentInlineScript, "abort-current-script.js": abortCurrentInlineScript, @@ -25803,7 +21803,6 @@ "ubo-xml-prune.js": xmlPrune, "ubo-xml-prune": xmlPrune }; - var getScriptletFunction = function getScriptletFunction(name) { return scriptletsMap[name]; }; @@ -25825,16 +21824,15 @@ * @param {Source} source * @returns {string|null} scriptlet code */ - function getScriptletCode(source) { if (!validator.isValidScriptletName(source.name)) { return null; } - var scriptletFunction = getScriptletFunction(source.name).toString(); var result = source.engine === 'corelibs' || source.engine === 'test' ? wrapInNonameFunc(scriptletFunction) : passSourceAndProps(source, scriptletFunction); return result; } + /** * Scriptlets variable * @@ -25842,8 +21840,6 @@ * `invoke` method receives one argument with `Source` type * `validate` method receives one argument with `String` type */ - - var scriptletsObject = function () { return { invoke: getScriptletCode, @@ -25864,7 +21860,6 @@ /** * Add module exports to be used as node package */ - module.exports = scriptletsObject; })); diff --git a/package.json b/package.json index 2df789f8..c6fe4632 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ }, "devDependencies": { "@babel/cli": "^7.8.4", - "@babel/core": "^7.9.0", + "@babel/core": "^7.20.5", "@babel/eslint-parser": "^7.16.5", "@babel/node": "^7.8.7", "@babel/plugin-proposal-class-properties": "^7.16.5", @@ -62,7 +62,7 @@ "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^8.1.0", "@rollup/plugin-replace": "^4.0.0", - "axios": "^0.21.1", + "axios": "^1.2.0", "browserstack-local": "^1.4.9", "chalk": "^4.1.2", "commander": "^9.2.0", @@ -79,7 +79,7 @@ "js-reporters": "^2.1.0", "kleur": "^4.1.4", "lint-staged": "^12.1.2", - "node-qunit-puppeteer": "^2.0.3", + "node-qunit-puppeteer": "2.1.1", "qunit": "^2.9.3", "rollup": "^2.70.2", "rollup-plugin-cleanup": "^3.1.1", @@ -87,7 +87,7 @@ "rollup-plugin-generate-html": "^0.2.0", "selenium-webdriver": "^4.1.1", "sinon": "^7.5.0", - "terser": "^5.13.0" + "terser": "^5.16.1" }, "files": [ "dist" diff --git a/src/helpers/cookie-utils.js b/src/helpers/cookie-utils.js index 7fe1954f..eaec3446 100644 --- a/src/helpers/cookie-utils.js +++ b/src/helpers/cookie-utils.js @@ -150,10 +150,6 @@ export const isCookieSetWithValue = (cookieString, name, value) => { * @returns {number|null} number is milliseconds OR null */ export const getTrustedCookieOffsetMs = (offsetExpiresSec) => { - if (!offsetExpiresSec) { - return null; - } - const ONE_YEAR_EXPIRATION_KEYWORD = '1year'; const ONE_DAY_EXPIRATION_KEYWORD = '1day'; diff --git a/src/helpers/hit.js b/src/helpers/hit.js index c7e8da1b..810216ef 100644 --- a/src/helpers/hit.js +++ b/src/helpers/hit.js @@ -2,11 +2,10 @@ /** * Hit used only for debug purposes now * @param {Source} source - * @param {string} [message] - optional message; * use LOG_MARKER = 'log: ' at the start of a message * for logging scriptlets */ -export const hit = (source, message) => { +export const hit = (source) => { if (source.verbose !== true) { return; } @@ -32,17 +31,6 @@ export const hit = (source, message) => { prefix = `${source.domainName}${rulePart}`; } - // Used to check if scriptlet uses 'hit' function for logging - const LOG_MARKER = 'log: '; - - if (message) { - if (message.indexOf(LOG_MARKER) === -1) { - log(`${prefix} message:\n${message}`); - } else { - log(message.slice(LOG_MARKER.length)); - } - } - log(`${prefix} trace start`); if (trace) { trace(); diff --git a/src/helpers/storage-utils.js b/src/helpers/storage-utils.js index 5769b3b7..9865a635 100644 --- a/src/helpers/storage-utils.js +++ b/src/helpers/storage-utils.js @@ -25,14 +25,12 @@ export const setStorageItem = (source, storage, key, value) => { /** * Gets supported storage item value - * @param {Source} source * @param {string} value input item value - * @param {boolean} verbose if logging invalid values is required * @returns {string|null|undefined|boolean} valid item value if ok OR null if not */ -export const getLimitedStorageItemValue = (source, value) => { - if (!value) { - return null; +export const getLimitedStorageItemValue = (value) => { + if (typeof value !== 'string') { + throw new Error('Invalid value'); } let validValue; @@ -53,19 +51,17 @@ export const getLimitedStorageItemValue = (source, value) => { } else if (/^\d+$/.test(value)) { validValue = parseFloat(value); if (nativeIsNaN(validValue)) { - logMessage(source, `Invalid storage item value: '${value}'`); - return null; + throw new Error('Invalid value'); } if (Math.abs(validValue) > 0x7FFF) { - logMessage(source, `Invalid storage item value: '${value}'`); - return null; + throw new Error('Invalid value'); } } else if (value === 'yes') { validValue = 'yes'; } else if (value === 'no') { validValue = 'no'; } else { - return null; + throw new Error('Invalid value'); } return validValue; diff --git a/src/redirects/prevent-bab.js b/src/redirects/prevent-bab.js index eaf18271..5dafce92 100644 --- a/src/redirects/prevent-bab.js +++ b/src/redirects/prevent-bab.js @@ -1,4 +1,4 @@ -import { preventBab } from '../scriptlets/prevent-bab'; +import { preventBab as preventBabScriptlet } from '../scriptlets/prevent-bab'; /** * @redirect prevent-bab @@ -17,4 +17,10 @@ import { preventBab } from '../scriptlets/prevent-bab'; * /blockadblock.$script,redirect=prevent-bab * ``` */ +const preventBab = preventBabScriptlet; +preventBab.names = [ + 'prevent-bab', + // list of prevent-bab redirect aliases +]; + export { preventBab }; diff --git a/src/scriptlets/close-window.js b/src/scriptlets/close-window.js index 7083565d..e730fed9 100644 --- a/src/scriptlets/close-window.js +++ b/src/scriptlets/close-window.js @@ -11,7 +11,7 @@ import { * Closes the browser tab immediately. * * > `window.close()` usage is restricted in Chrome. In this case - * tab will only be closed if using AdGuard browser extension. + * tab will only be closed when using AdGuard browser extension. * * **Syntax** * ``` @@ -36,6 +36,7 @@ export function forceWindowClose(source, path = '') { if (typeof window.close !== 'function') { const message = 'window.close() is not a function so \'close-window\' scriptlet is unavailable'; logMessage(source, message); + return; } const closeImmediately = () => { diff --git a/src/scriptlets/json-prune.js b/src/scriptlets/json-prune.js index cea27aa7..4ecec253 100644 --- a/src/scriptlets/json-prune.js +++ b/src/scriptlets/json-prune.js @@ -3,9 +3,13 @@ import { matchStackTrace, getWildcardPropertyInChain, logMessage, + objectToString, // following helpers are needed for helpers above toRegExp, + isEmptyObject, + getObjectEntries, getNativeRegexpTest, + shouldAbortInlineOrInjectedScript, } from '../helpers/index'; /* eslint-disable max-len */ @@ -110,7 +114,7 @@ export function jsonPrune(source, propsToRemove, requiredInitialProps, stack) { const matchRegex = toRegExp(requiredPaths.join('')); const shouldLog = matchRegex.test(rootString); if (shouldLog) { - logMessage(source, `${window.location.hostname} ${root}`, true); + logMessage(source, `${window.location.hostname} ${objectToString(root)}`, true); shouldProcess = false; return shouldProcess; } @@ -156,7 +160,7 @@ export function jsonPrune(source, propsToRemove, requiredInitialProps, stack) { */ const jsonPruner = (root) => { if (prunePaths.length === 0 && requiredPaths.length === 0) { - logMessage(source, `${window.location.hostname} ${root}`, true); + logMessage(source, `${window.location.hostname} ${objectToString(root)}`, true); return root; } @@ -229,6 +233,11 @@ jsonPrune.injections = [ matchStackTrace, getWildcardPropertyInChain, logMessage, + objectToString, + // following helpers are needed for helpers above toRegExp, + isEmptyObject, + getObjectEntries, getNativeRegexpTest, + shouldAbortInlineOrInjectedScript, ]; diff --git a/src/scriptlets/noeval.js b/src/scriptlets/noeval.js index f0021992..bd06cd0a 100644 --- a/src/scriptlets/noeval.js +++ b/src/scriptlets/noeval.js @@ -1,5 +1,5 @@ /* eslint-disable no-eval, no-extra-bind */ -import { hit } from '../helpers/index'; +import { hit, logMessage } from '../helpers/index'; /** * @scriptlet noeval @@ -21,7 +21,8 @@ import { hit } from '../helpers/index'; */ export function noeval(source) { window.eval = function evalWrapper(s) { - hit(source, `AdGuard has prevented eval:\n${s}`); + hit(source); + logMessage(source, `AdGuard has prevented eval:\n${s}`, true); }.bind(); } @@ -36,4 +37,4 @@ noeval.names = [ 'ubo-silent-noeval', ]; -noeval.injections = [hit]; +noeval.injections = [hit, logMessage]; diff --git a/src/scriptlets/prevent-bab.js b/src/scriptlets/prevent-bab.js index 303cd6a9..6967f674 100644 --- a/src/scriptlets/prevent-bab.js +++ b/src/scriptlets/prevent-bab.js @@ -34,7 +34,23 @@ export function preventBab(source) { ['blockadblock'], ['babasbm'], [/getItem\('babn'\)/], - ['getElementById', 'String.fromCharCode', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'charAt', 'DOMContentLoaded', 'AdBlock', 'addEventListener', 'doScroll', 'fromCharCode', '<<2|r>>4', 'sessionStorage', 'clientWidth', 'localStorage', 'Math', 'random'], + [ + 'getElementById', + 'String.fromCharCode', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', + 'charAt', + 'DOMContentLoaded', + 'AdBlock', + 'addEventListener', + 'doScroll', + 'fromCharCode', + '<<2|r>>4', + 'sessionStorage', + 'clientWidth', + 'localStorage', + 'Math', + 'random', + ], ]; const check = (str) => { if (typeof str !== 'string') { diff --git a/src/scriptlets/prevent-fetch.js b/src/scriptlets/prevent-fetch.js index 6e4ac590..69db792f 100644 --- a/src/scriptlets/prevent-fetch.js +++ b/src/scriptlets/prevent-fetch.js @@ -86,6 +86,11 @@ import { * ! Specify response body for all fetch calls * example.org#%#//scriptlet('prevent-fetch', '', 'emptyArr') * ``` + * + * 7. Prevent all fetch calls and specify response type value + * ``` + * example.org#%#//scriptlet('prevent-fetch', '*', '', 'opaque') + * ``` */ /* eslint-enable max-len */ export function preventFetch(source, propsToMatch, responseBody = 'emptyObj', responseType = 'default') { @@ -99,7 +104,7 @@ export function preventFetch(source, propsToMatch, responseBody = 'emptyObj', re } let strResponseBody; - if (responseBody === 'emptyObj') { + if (responseBody === '' || responseBody === 'emptyObj') { strResponseBody = '{}'; } else if (responseBody === 'emptyArr') { strResponseBody = '[]'; diff --git a/src/scriptlets/prevent-window-open.js b/src/scriptlets/prevent-window-open.js index 9787f9e0..154a039f 100644 --- a/src/scriptlets/prevent-window-open.js +++ b/src/scriptlets/prevent-window-open.js @@ -109,7 +109,7 @@ export function preventWindowOpen(source, match = '*', delay, replacement) { const argsStr = args && args.length > 0 ? `, ${args.join(', ')}` : ''; - const message = `window-open: ${url}${argsStr}`; + const message = `${url}${argsStr}`; logMessage(source, message, true); hit(source); } diff --git a/src/scriptlets/set-constant.js b/src/scriptlets/set-constant.js index f671e91c..64bf1103 100644 --- a/src/scriptlets/set-constant.js +++ b/src/scriptlets/set-constant.js @@ -15,6 +15,9 @@ import { nativeIsNaN, isEmptyObject, getNativeRegexpTest, + // following helpers should be imported and injected + // because they are used by helpers above + shouldAbortInlineOrInjectedScript, } from '../helpers/index'; /* eslint-disable max-len */ @@ -291,4 +294,7 @@ setConstant.injections = [ nativeIsNaN, isEmptyObject, getNativeRegexpTest, + // following helpers should be imported and injected + // because they are used by helpers above + shouldAbortInlineOrInjectedScript, ]; diff --git a/src/scriptlets/set-local-storage-item.js b/src/scriptlets/set-local-storage-item.js index 9211cef8..a857a81e 100644 --- a/src/scriptlets/set-local-storage-item.js +++ b/src/scriptlets/set-local-storage-item.js @@ -48,9 +48,11 @@ export function setLocalStorageItem(source, key, value) { return; } - const validValue = getLimitedStorageItemValue(source, value); - if (validValue === null) { - logMessage(source, `Invalid cookie value: '${validValue}'`); + let validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch { + logMessage(source, `Invalid storage item value: '${value}'`); return; } diff --git a/src/scriptlets/set-session-storage-item.js b/src/scriptlets/set-session-storage-item.js index d2bc0e26..5a0bb290 100644 --- a/src/scriptlets/set-session-storage-item.js +++ b/src/scriptlets/set-session-storage-item.js @@ -48,14 +48,17 @@ export function setSessionStorageItem(source, key, value) { return; } - const validValue = getLimitedStorageItemValue(source, value); - if (validValue === null) { - logMessage(source, `Invalid cookie value: '${validValue}'`); + let validValue; + try { + validValue = getLimitedStorageItemValue(value); + } catch { + logMessage(source, `Invalid storage item value: '${value}'`); return; } const { sessionStorage } = window; setStorageItem(source, sessionStorage, key, validValue); + hit(source); } setSessionStorageItem.names = [ diff --git a/src/scriptlets/trusted-replace-fetch-response.js b/src/scriptlets/trusted-replace-fetch-response.js index 7ccf28bf..27b8039d 100644 --- a/src/scriptlets/trusted-replace-fetch-response.js +++ b/src/scriptlets/trusted-replace-fetch-response.js @@ -152,12 +152,13 @@ export function trustedReplaceFetchResponse(source, pattern = '', replacement = return forgedResponse; }; - return nativeFetch(...args) + // eslint-disable-next-line prefer-spread + return nativeFetch.apply(null, args) .then((response) => { return response.text() .then((bodyText) => { const patternRegexp = pattern === '*' - ? toRegExp() + ? /(\n|.)*/ : toRegExp(pattern); const modifiedTextContent = bodyText.replace(patternRegexp, replacement); diff --git a/src/scriptlets/trusted-replace-xhr-response.js b/src/scriptlets/trusted-replace-xhr-response.js index ca6d6754..5279cead 100644 --- a/src/scriptlets/trusted-replace-xhr-response.js +++ b/src/scriptlets/trusted-replace-xhr-response.js @@ -161,7 +161,7 @@ export function trustedReplaceXhrResponse(source, pattern = '', replacement = '' } const patternRegexp = pattern === '*' - ? toRegExp() + ? /(\n|.)*/ : toRegExp(pattern); const modifiedContent = content.replace(patternRegexp, replacement); diff --git a/src/scriptlets/trusted-set-cookie-reload.js b/src/scriptlets/trusted-set-cookie-reload.js index 49506bcd..0155088f 100644 --- a/src/scriptlets/trusted-set-cookie-reload.js +++ b/src/scriptlets/trusted-set-cookie-reload.js @@ -98,13 +98,17 @@ export function trustedSetCookieReload(source, name, value, offsetExpiresSec = ' return; } - const parsedOffsetExpiresMs = getTrustedCookieOffsetMs(offsetExpiresSec); - if (!parsedOffsetExpiresMs) { - logMessage(source, `Invalid offsetExpiresSec value: ${offsetExpiresSec}`); - return; + if (offsetExpiresSec) { + const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + + if (!parsedOffsetMs) { + logMessage(source, `Invalid offsetExpiresSec value: ${offsetExpiresSec}`); + return; + } + + const expires = Date.now() + parsedOffsetMs; + cookieToSet += ` expires=${new Date(expires).toUTCString()};`; } - const expires = Date.now() + parsedOffsetExpiresMs; - cookieToSet += ` expires=${new Date(expires).toUTCString()};`; document.cookie = cookieToSet; hit(source); diff --git a/src/scriptlets/trusted-set-cookie.js b/src/scriptlets/trusted-set-cookie.js index deb64383..cc62efe3 100644 --- a/src/scriptlets/trusted-set-cookie.js +++ b/src/scriptlets/trusted-set-cookie.js @@ -91,13 +91,17 @@ export function trustedSetCookie(source, name, value, offsetExpiresSec = '', pat return; } - const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); - if (!parsedOffsetMs) { - logMessage(source, `Invalid offsetExpiresSec value: ${offsetExpiresSec}`); - return; + if (offsetExpiresSec) { + const parsedOffsetMs = getTrustedCookieOffsetMs(offsetExpiresSec); + + if (!parsedOffsetMs) { + logMessage(source, `Invalid offsetExpiresSec value: ${offsetExpiresSec}`); + return; + } + + const expires = Date.now() + parsedOffsetMs; + cookieToSet += ` expires=${new Date(expires).toUTCString()};`; } - const expires = Date.now() + parsedOffsetMs; - cookieToSet += ` expires=${new Date(expires).toUTCString()};`; document.cookie = cookieToSet; hit(source); diff --git a/tests/index.js b/tests/index.js index 95fd965b..5681f2b3 100644 --- a/tests/index.js +++ b/tests/index.js @@ -14,7 +14,11 @@ const TESTS_DIST = './dist'; const TEST_FILE_NAME_MARKER = '.html'; const testServer = server.init(); - +/** + * Returns false if test failed and true if test passed + * @param indexFile + * @returns {Promise} + */ const runQunit = async (indexFile) => { const qunitArgs = { targetUrl: `http://localhost:${port}/${indexFile}?test`, @@ -28,7 +32,9 @@ const runQunit = async (indexFile) => { printResultSummary(result, console); if (result.stats.failed > 0) { printFailedTests(result, console); + return false; } + return true; }; (async () => { @@ -39,6 +45,7 @@ const runQunit = async (indexFile) => { .filter((el) => el.includes(TEST_FILE_NAME_MARKER)); let errorOccurred = false; + let testsPassed = true; try { console.log('Running tests..'); @@ -48,7 +55,8 @@ const runQunit = async (indexFile) => { // \n is needed to divide logging console.log(`\nTesting ${fileName}:`); // eslint-disable-next-line no-await-in-loop - await runQunit(fileName); + const testPassed = await runQunit(fileName); + testsPassed = testsPassed && testPassed; } } catch (e) { console.log(e); @@ -57,7 +65,7 @@ const runQunit = async (indexFile) => { errorOccurred = true; } - if (errorOccurred) { + if (errorOccurred || !testsPassed) { process.exit(1); } diff --git a/tests/redirects/noeval.test.js b/tests/redirects/noeval.test.js index ca1976d8..bb28d562 100644 --- a/tests/redirects/noeval.test.js +++ b/tests/redirects/noeval.test.js @@ -51,7 +51,7 @@ test('AG noeval alias', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.ok(input.includes('AdGuard has prevented eval:'), 'console.hit should print info'); + assert.ok(input.includes(`${name}: AdGuard has prevented eval:`), 'console.hit should print info'); }; const evalWrapper = eval; diff --git a/tests/scriptlets/abort-current-inline-script.test.js b/tests/scriptlets/abort-current-inline-script.test.js index 44158c17..1247724b 100644 --- a/tests/scriptlets/abort-current-inline-script.test.js +++ b/tests/scriptlets/abort-current-inline-script.test.js @@ -90,6 +90,7 @@ test('works with chained properties', (assert) => { `); assert.strictEqual(window.hit, 'FIRED', 'hit fired'); + clearGlobalProps('aaa'); }); test('Works with an empty object in chain', (assert) => { @@ -100,10 +101,10 @@ test('Works with an empty object in chain', (assert) => { runScriptlet(name, scriptletArgs); - window.aaa.bbb = 1; addAndRemoveInlineScript('window.aaa.bbb = 4'); assert.strictEqual(window.hit, 'FIRED', 'hit fired'); + clearGlobalProps('aaa'); }); test('should not work if chained properties are undefined', (assert) => { diff --git a/tests/scriptlets/abort-on-property-write.test.js b/tests/scriptlets/abort-on-property-write.test.js index c6d9dfca..66cfde9a 100644 --- a/tests/scriptlets/abort-on-property-write.test.js +++ b/tests/scriptlets/abort-on-property-write.test.js @@ -99,11 +99,9 @@ test('Works with an empty object in chain', (assert) => { window.aaa = {}; runScriptlet(name, scriptletArgs); - window.aaa.bbb = 'value'; - assert.throws( () => { - window.aaa.bbb = 'new value'; + window.aaa.bbb = 'value'; }, /ReferenceError/, `should throw Reference error when try to access property ${CHAIN_PROPERTY}`, diff --git a/tests/scriptlets/abort-on-stack-trace.test.js b/tests/scriptlets/abort-on-stack-trace.test.js index 3702392b..9a5835d0 100644 --- a/tests/scriptlets/abort-on-stack-trace.test.js +++ b/tests/scriptlets/abort-on-stack-trace.test.js @@ -67,12 +67,13 @@ test('simple, matches stack', (assert) => { test('simple, matches stack with an empty object in chain', (assert) => { const PROPERTY = 'window.aaa.bbb'; - window.aaa = {}; - const scriptletArgs = [PROPERTY]; + const stackArg = 'abort-on-stack-trace'; + window.aaa = { + bbb: 'value', + }; + const scriptletArgs = [PROPERTY, stackArg]; runScriptlet(name, scriptletArgs); - window.aaa.bbb = 'value'; - assert.throws( () => window.aaa.bbb, /ReferenceError/, @@ -307,6 +308,7 @@ test('abort Math.random, injected script', (assert) => { const scriptElement = document.createElement('script'); scriptElement.type = 'text/javascript'; // set window.testPassed to true if script is aborted + // eslint-disable-next-line max-len scriptElement.innerText = 'try { Math.random(); } catch(error) { window.testPassed = true; console.log("Script aborted:", error); }'; document.body.appendChild(scriptElement); scriptElement.parentNode.removeChild(scriptElement); @@ -360,6 +362,7 @@ test('abort Math.max in injected script, but not abort inline script', (assert) const scriptElement = document.createElement('script'); scriptElement.type = 'text/javascript'; // set window.testPassed to true if script is aborted + // eslint-disable-next-line max-len scriptElement.innerText = 'try { debugger; Math.max(10, 20); } catch(error) { window.testPassed = true; console.log("Script aborted:", error); }'; document.body.appendChild(scriptElement); scriptElement.parentNode.removeChild(scriptElement); diff --git a/tests/scriptlets/adjust-setInterval.test.js b/tests/scriptlets/adjust-setInterval.test.js index 3cbbd378..90379025 100644 --- a/tests/scriptlets/adjust-setInterval.test.js +++ b/tests/scriptlets/adjust-setInterval.test.js @@ -288,7 +288,7 @@ test('no match -- invalid callback - undefined', (assert) => { assert.strictEqual(window.hit, undefined, 'hit should not fire'); assert.strictEqual( loggedMessage, - `Scriptlet adjust-setInterval can not be applied because of invalid callback: '${String(callback)}'.`, // eslint-disable-line max-len + `${name}: Scriptlet can't be applied because of invalid callback: '${String(callback)}'.`, // eslint-disable-line max-len 'console.logged warning ok', ); clearInterval(testInterval); diff --git a/tests/scriptlets/adjust-setTimeout.test.js b/tests/scriptlets/adjust-setTimeout.test.js index e143d82a..999ce1ed 100644 --- a/tests/scriptlets/adjust-setTimeout.test.js +++ b/tests/scriptlets/adjust-setTimeout.test.js @@ -288,7 +288,7 @@ test('no match -- invalid callback - undefined', (assert) => { assert.strictEqual(window.hit, undefined, 'hit should not fire'); assert.strictEqual( loggedMessage, - `Scriptlet adjust-setTimeout can not be applied because of invalid callback: '${String(callback)}'.`, // eslint-disable-line max-len + `${name}: Scriptlet can't be applied because of invalid callback: '${String(callback)}'.`, // eslint-disable-line max-len 'console.logged warning ok', ); clearTimeout(testTimeout); diff --git a/tests/scriptlets/debug-current-inline-script.test.js b/tests/scriptlets/debug-current-inline-script.test.js index 770c0845..12354702 100644 --- a/tests/scriptlets/debug-current-inline-script.test.js +++ b/tests/scriptlets/debug-current-inline-script.test.js @@ -43,20 +43,7 @@ test('works', (assert) => { addAndRemoveInlineScript('window.___aaa;'); assert.strictEqual(window.hit, 'FIRED', 'hit fired'); -}); - -test('works with an empty object in chain', (assert) => { - window.onerror = onError(assert); - const property = 'window.aaa.bbb'; - const scriptletArgs = [property]; - - window.aaa = {}; - runScriptlet(name, scriptletArgs); - window.aaa.bbb = 'value'; - - addAndRemoveInlineScript('window.aaa.bbb;'); - - assert.strictEqual(window.hit, 'FIRED', 'hit fired'); + clearGlobalProps('___aaa'); }); test('works with chained properties', (assert) => { @@ -72,9 +59,25 @@ test('works with chained properties', (assert) => { `); assert.strictEqual(window.hit, 'FIRED', 'hit fired'); + clearGlobalProps('aaa'); +}); + +test('works with an empty object in chain', (assert) => { + window.onerror = onError(assert); + const property = 'window.aaa.bbb'; + const scriptletArgs = [property]; + + window.aaa = {}; + runScriptlet(name, scriptletArgs); + window.aaa.bbb = 'value'; + + addAndRemoveInlineScript('window.aaa.bbb;'); + + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); + clearGlobalProps('aaa'); }); -test('doesnt aborts script which is not specified by search', (assert) => { +test('does not abort script which is not specified by search', (assert) => { const property = '___aaa'; const search = 'some search'; const scriptletArgs = [property, search]; @@ -83,6 +86,7 @@ test('doesnt aborts script which is not specified by search', (assert) => { addAndRemoveInlineScript(`window.${property};`); assert.strictEqual(window.hit, 'FIRED', 'hit fired'); + clearGlobalProps('___aaa'); }); test('searches script by regexp', (assert) => { @@ -95,6 +99,7 @@ test('searches script by regexp', (assert) => { addAndRemoveInlineScript(`window.${property};`); assert.strictEqual(window.hit, 'FIRED', 'hit fired'); + clearGlobalProps('___aaa'); }); test('Patched textContent', (assert) => { @@ -112,6 +117,7 @@ test('Patched textContent', (assert) => { `); assert.strictEqual(window.hit, 'FIRED', 'hit fired'); + clearGlobalProps('___aaa5'); }); test('does not abort script -- invalid regexp pattern', (assert) => { @@ -124,4 +130,5 @@ test('does not abort script -- invalid regexp pattern', (assert) => { addAndRemoveInlineScript(`window.${property};`); assert.strictEqual(window.hit, undefined, 'should not hit'); + clearGlobalProps('___aaa6'); }); diff --git a/tests/scriptlets/index.test.js b/tests/scriptlets/index.test.js index 34e89d7c..5f77855f 100644 --- a/tests/scriptlets/index.test.js +++ b/tests/scriptlets/index.test.js @@ -30,7 +30,6 @@ import './dir-string.test'; import './json-prune.test'; import './prevent-requestAnimationFrame.test'; import './set-cookie.test'; -import './set-cookie-reload.test'; import './remove-cookie.test'; import './hide-in-shadow-dom.test'; import './remove-in-shadow-dom.test'; @@ -48,6 +47,5 @@ import './trusted-replace-xhr-response.test'; import './xml-prune.test'; import './trusted-click-element.test'; import './trusted-set-cookie.test'; -import './trusted-set-cookie-reload.test'; import './trusted-replace-fetch-response.test'; import './trusted-set-local-storage-item.test'; diff --git a/tests/scriptlets/json-prune.test.js b/tests/scriptlets/json-prune.test.js index ca7fba7a..79981f48 100644 --- a/tests/scriptlets/json-prune.test.js +++ b/tests/scriptlets/json-prune.test.js @@ -312,9 +312,9 @@ test('can NOT remove propsToRemove if nested requiredInitialProps has wildcard b }); test('does NOT remove propsToRemove if invoked without parameter propsToRemove and return hostname', (assert) => { - console.log = (host, params) => { - assert.strictEqual(host, window.location.hostname, 'should log hostname in console'); - assert.deepEqual(params, { a: 1, b: 2 }, 'should log parameters in console'); + console.log = (message) => { + assert.ok(message.includes(window.location.hostname), 'should log hostname in console'); + assert.ok(message.includes('a:"1" b:"2"'), 'should log parameters in console'); }; runScriptlet('json-prune'); JSON.parse('{"a":1, "b":2}'); @@ -322,9 +322,9 @@ test('does NOT remove propsToRemove if invoked without parameter propsToRemove a test('logs matched object and hostname if invoked with only second arg', (assert) => { assert.expect(2); - console.log = (host, params) => { - assert.strictEqual(host, window.location.hostname, 'should log hostname in console'); - assert.deepEqual(params, { a: 1 }, 'should log parameters in console'); + console.log = (message) => { + assert.ok(message.includes(window.location.hostname), 'should log hostname in console'); + assert.ok(message.includes('a:"1"'), 'should log parameters in console'); }; runScriptlet('json-prune', '', '"a":1'); JSON.parse('{"a":1}'); diff --git a/tests/scriptlets/log-addEventListener.test.js b/tests/scriptlets/log-addEventListener.test.js index 93fc3cbe..639064c7 100644 --- a/tests/scriptlets/log-addEventListener.test.js +++ b/tests/scriptlets/log-addEventListener.test.js @@ -58,7 +58,8 @@ test('logs events to console', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, `addEventListener("${eventName}", ${callback.toString()})`, 'console.hit input should be equal'); + assert.ok(input.includes(eventName), 'console.hit input should be equal'); + assert.ok(input.includes(callback.toString()), 'console.hit input should be equal'); }; runScriptlet(name); diff --git a/tests/scriptlets/log-eval.test.js b/tests/scriptlets/log-eval.test.js index bff6dda3..b12a6beb 100644 --- a/tests/scriptlets/log-eval.test.js +++ b/tests/scriptlets/log-eval.test.js @@ -32,7 +32,7 @@ test('logs eval calls', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, `eval("${evalStr}")`, 'console.hit input should be equal'); + assert.strictEqual(input, `${name}: eval("${evalStr}")`, 'console.hit input should be equal'); }; runScriptlet(name); const evalWrap = eval; @@ -52,7 +52,7 @@ test('logs new Function() calls', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, `new Function(${args.join(', ')})`, 'console.hit input should be equal'); + assert.strictEqual(input, `${name}: new Function(${args.join(', ')})`, 'console.hit input should be equal'); }; runScriptlet(name); diff --git a/tests/scriptlets/no-topics.test.js b/tests/scriptlets/no-topics.test.js index 00c350ce..d6e91a9f 100644 --- a/tests/scriptlets/no-topics.test.js +++ b/tests/scriptlets/no-topics.test.js @@ -28,13 +28,16 @@ const afterEach = () => { module(name, { beforeEach, afterEach }); test('no-topics - works', async (assert) => { + Document.prototype[TOPICS_PROPERTY_NAME] = () => ['value1', 'value2']; + const mockedDocument = new Document(); + const done = assert.async(); runScriptlet(name); - const response = await document[TOPICS_PROPERTY_NAME](); + const response = await mockedDocument[TOPICS_PROPERTY_NAME](); const body = await response.json(); - assert.ok(Array.isArray(body), 'mocked browsingTopics() returns []'); + assert.ok(Array.isArray(body) && body.length === 0, 'mocked browsingTopics() returns []'); assert.strictEqual(window.hit, 'FIRED', 'hit function should fire'); done(); diff --git a/tests/scriptlets/noeval.test.js b/tests/scriptlets/noeval.test.js index f6092afc..724810cb 100644 --- a/tests/scriptlets/noeval.test.js +++ b/tests/scriptlets/noeval.test.js @@ -51,7 +51,7 @@ test('AG noeval alias', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.ok(input.includes('AdGuard has prevented eval:'), 'console.hit should print info'); + assert.ok(input.includes(`${name}: AdGuard has prevented eval:`), 'console.hit should print info'); }; const evalWrapper = eval; diff --git a/tests/scriptlets/nowebrtc.test.js b/tests/scriptlets/nowebrtc.test.js index 3500c95d..5e13b273 100644 --- a/tests/scriptlets/nowebrtc.test.js +++ b/tests/scriptlets/nowebrtc.test.js @@ -87,7 +87,7 @@ if (!isSupported) { return; } // eslint-disable-next-line max-len - const EXPECTED_LOG_STR = `Document tried to create an RTCPeerConnection: ${TEST_URL_VALUE}`; + const EXPECTED_LOG_STR = `${name}: Document tried to create an RTCPeerConnection: ${TEST_URL_VALUE}`; assert.ok(endsWith(input, EXPECTED_LOG_STR), 'console.hit input'); }; diff --git a/tests/scriptlets/prevent-bab.test.js b/tests/scriptlets/prevent-bab.test.js index 0080bde4..9ac2d827 100644 --- a/tests/scriptlets/prevent-bab.test.js +++ b/tests/scriptlets/prevent-bab.test.js @@ -18,24 +18,6 @@ const afterEach = () => { module(name, { beforeEach, afterEach }); -test('Checking if alias name works', (assert) => { - const adgParams = { - name, - engine: 'test', - verbose: true, - }; - const uboParams = { - name: 'nobab', - engine: 'test', - verbose: true, - }; - - const codeByAdgParams = window.scriptlets.invoke(adgParams); - const codeByUboParams = window.scriptlets.invoke(uboParams); - - assert.strictEqual(codeByAdgParams, codeByUboParams, 'ubo name - ok'); -}); - test('works eval with AdblockBlock', (assert) => { runScriptlet(name); diff --git a/tests/scriptlets/prevent-fetch.test.js b/tests/scriptlets/prevent-fetch.test.js index 4233d71d..47bc68e0 100644 --- a/tests/scriptlets/prevent-fetch.test.js +++ b/tests/scriptlets/prevent-fetch.test.js @@ -28,6 +28,7 @@ module(name, { beforeEach, afterEach }); const isSupported = typeof fetch !== 'undefined' && typeof Proxy !== 'undefined' && typeof Response !== 'undefined'; +// TODO: add testcases with POST requests if (!isSupported) { test('unsupported', (assert) => { assert.ok(true, 'Browser does not support it'); @@ -53,7 +54,7 @@ if (!isSupported) { test('simple fetch - no args - logging', async (assert) => { const INPUT_JSON_PATH = `${FETCH_OBJECTS_PATH}/test01.json`; - const TEST_METHOD = 'POST'; + const TEST_METHOD = 'GET'; const init = { method: TEST_METHOD, }; @@ -70,7 +71,7 @@ if (!isSupported) { return; } // eslint-disable-next-line max-len - const EXPECTED_LOG_STR_START = `fetch( url:"${INPUT_JSON_PATH}" method:"${TEST_METHOD}"`; + const EXPECTED_LOG_STR_START = `${name}: fetch( url:"${INPUT_JSON_PATH}" method:"${TEST_METHOD}"`; assert.ok(startsWith(input, EXPECTED_LOG_STR_START), 'console.hit input'); }; @@ -85,33 +86,26 @@ if (!isSupported) { done(); }); - test('fetch request - no args - logging', async (assert) => { + test('simple fetch - no match props - no prevent', async (assert) => { const INPUT_JSON_PATH = `${FETCH_OBJECTS_PATH}/test01.json`; - const inputRequest = new Request(INPUT_JSON_PATH); + const init = { + method: 'GET', + }; const expectedJson = { a1: 1, b2: 'test', c3: 3, }; - const done = assert.async(); - - // mock console.log function for log checking - console.log = function log(input) { - if (input.indexOf('trace') > -1) { - return; - } - const strToCheck = INPUT_JSON_PATH.slice(1); - assert.ok(input.indexOf(strToCheck) > -1, 'console.hit input'); - }; - // no args -> just logging, no preventing - runScriptlet(name); + // no url match + runScriptlet(name, ['/test06/ method:POST']); + const done = assert.async(); - const response = await fetch(inputRequest); + const response = await fetch(INPUT_JSON_PATH, init); const actualJson = await response.json(); - assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); assert.deepEqual(actualJson, expectedJson); + assert.strictEqual(window.hit, undefined, 'hit should not fire'); done(); }); @@ -199,29 +193,6 @@ if (!isSupported) { done(); }); - test('simple fetch - no match props - no prevent', async (assert) => { - const INPUT_JSON_PATH = `${FETCH_OBJECTS_PATH}/test01.json`; - const init = { - method: 'POST', - }; - const expectedJson = { - a1: 1, - b2: 'test', - c3: 3, - }; - - // no url match - runScriptlet(name, ['/test06/ method:POST']); - const done = assert.async(); - - const response = await fetch(INPUT_JSON_PATH, init); - const actualJson = await response.json(); - - assert.deepEqual(actualJson, expectedJson); - assert.strictEqual(window.hit, undefined, 'hit should not fire'); - done(); - }); - test('fetch request - no match at all', async (assert) => { const INPUT_JSON_PATH = `${FETCH_OBJECTS_PATH}/test01.json`; const init = { diff --git a/tests/scriptlets/prevent-requestAnimationFrame.test.js b/tests/scriptlets/prevent-requestAnimationFrame.test.js index 9f3710ac..1cf65991 100644 --- a/tests/scriptlets/prevent-requestAnimationFrame.test.js +++ b/tests/scriptlets/prevent-requestAnimationFrame.test.js @@ -62,7 +62,7 @@ test('prevent-requestAnimationFrame: no args -- logging', (assert) => { // do test checking after scriptlet's execution end setTimeout(() => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); - assert.strictEqual(loggedMessage, `requestAnimationFrame(${testFunction.toString()})`, 'console.hit input'); + assert.strictEqual(loggedMessage, `prevent-requestAnimationFrame: requestAnimationFrame(${testFunction.toString()})`, 'console.hit input'); assert.strictEqual(window[logProperty], 'changed', 'property changed'); clearGlobalProps(logProperty); done(); diff --git a/tests/scriptlets/prevent-setInterval.test.js b/tests/scriptlets/prevent-setInterval.test.js index 8a816cc9..c8136450 100644 --- a/tests/scriptlets/prevent-setInterval.test.js +++ b/tests/scriptlets/prevent-setInterval.test.js @@ -67,7 +67,7 @@ test('no args -- logging', (assert) => { // We need to run our assertion after all timeouts setTimeout(() => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); - assert.strictEqual(loggedMessage, `setInterval(${callback.toString()}, ${timeout})`, 'console.hit input ok'); + assert.strictEqual(loggedMessage, `prevent-setInterval: setInterval(${callback.toString()}, ${timeout})`, 'console.hit input ok'); assert.strictEqual(window[agLogSetInterval], 'changed', 'property changed'); clearGlobalProps(agLogSetInterval); done(); diff --git a/tests/scriptlets/prevent-setTimeout.test.js b/tests/scriptlets/prevent-setTimeout.test.js index 8cc6aba2..b1454f54 100644 --- a/tests/scriptlets/prevent-setTimeout.test.js +++ b/tests/scriptlets/prevent-setTimeout.test.js @@ -67,7 +67,11 @@ test('no args -- logging', (assert) => { // We need to run our assertion after all timeouts nativeSetTimeout(() => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); - assert.strictEqual(loggedMessage, `setTimeout(${callback.toString()}, ${timeout})`, 'console.hit input ok'); + assert.strictEqual( + loggedMessage, + `prevent-setTimeout: setTimeout(${callback.toString()}, ${timeout})`, + 'console.hit input ok', + ); assert.strictEqual(window[agLogSetTimeout], 'changed', 'property changed'); clearGlobalProps(agLogSetTimeout); done(); diff --git a/tests/scriptlets/prevent-window-open.test.js b/tests/scriptlets/prevent-window-open.test.js index 38d1fcd2..89e804d0 100644 --- a/tests/scriptlets/prevent-window-open.test.js +++ b/tests/scriptlets/prevent-window-open.test.js @@ -184,7 +184,7 @@ test('new syntax: log checking - only url', (assert) => { if (input.indexOf('trace') > -1) { return; } - const EXPECTED_LOG_STR = `window-open: ${testUrl}`; + const EXPECTED_LOG_STR = `${name}: ${testUrl}`; assert.strictEqual(input, EXPECTED_LOG_STR, 'console.hit input'); }; @@ -208,7 +208,7 @@ test('new syntax: log checking - url + args', (assert) => { return; } // eslint-disable-next-line max-len - const EXPECTED_LOG_STR = `window-open: ${testUrl}, ${testWindowName}, ${testWindowFeatures}`; + const EXPECTED_LOG_STR = `${name}: ${testUrl}, ${testWindowName}, ${testWindowFeatures}`; assert.strictEqual(input, EXPECTED_LOG_STR, 'console.hit input'); }; diff --git a/tests/scriptlets/prevent-xhr.test.js b/tests/scriptlets/prevent-xhr.test.js index ccfae921..3672ad50 100644 --- a/tests/scriptlets/prevent-xhr.test.js +++ b/tests/scriptlets/prevent-xhr.test.js @@ -57,7 +57,7 @@ if (isSupported) { if (input.indexOf('trace') > -1) { return; } - const EXPECTED_LOG_STR = `xhr( method:"${METHOD}" url:"${URL}" )`; + const EXPECTED_LOG_STR = `${name}: xhr( method:"${METHOD}" url:"${URL}" )`; assert.ok(startsWith(input, EXPECTED_LOG_STR), 'console.hit input'); }; diff --git a/tests/scriptlets/remove-attr.test.js b/tests/scriptlets/remove-attr.test.js index 4eb76da6..22e9c7b0 100644 --- a/tests/scriptlets/remove-attr.test.js +++ b/tests/scriptlets/remove-attr.test.js @@ -109,8 +109,14 @@ test('no selector + multiple attrs for different elements', (assert) => { // clean up test element elem0.remove(); elem1.remove(); - done(); }, 150); + + setTimeout(() => { + // clean up test element + elem0.remove(); + elem1.remove(); + done(); + }, 250); }); test('single attr + single selector', (assert) => { @@ -294,17 +300,17 @@ test('invalid selector — no match', (assert) => { const attrs = ['testAttr']; const selector = '..test'; const scriptletArgs = [attrs.join('|'), `${selector}`]; - runScriptlet(name, scriptletArgs); // eslint-disable-next-line no-console console.log = function log(input) { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, `Invalid remove-attr selector arg: '${selector}'`, 'logged error for invalid remove-attr selector'); + assert.strictEqual(input, `${name}: Invalid selector arg: '${selector}'`, 'logged error for invalid remove-attr selector'); }; - assert.strictEqual(window.hit, undefined, 'hit SHOULD NOT fire'); + runScriptlet(name, scriptletArgs); + assert.strictEqual(window.hit, undefined, 'hit SHOULD NOT fire'); clearGlobalProps('hit'); }); diff --git a/tests/scriptlets/remove-class.test.js b/tests/scriptlets/remove-class.test.js index 1822e5dc..e3b11ba9 100644 --- a/tests/scriptlets/remove-class.test.js +++ b/tests/scriptlets/remove-class.test.js @@ -276,7 +276,7 @@ test('invalid selector — no match', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, `Invalid remove-class selector arg: '${selectors}'`, 'logged error for invalid remove-class selector'); + assert.strictEqual(input, `${name}: Invalid selector arg: '${selectors}'`, 'logged error for invalid remove-class selector'); }; assert.strictEqual(window.hit, undefined, 'hit SHOULD NOT fire'); diff --git a/tests/scriptlets/set-constant.test.js b/tests/scriptlets/set-constant.test.js index 38baf59f..b766991c 100644 --- a/tests/scriptlets/set-constant.test.js +++ b/tests/scriptlets/set-constant.test.js @@ -79,10 +79,10 @@ if (!isSupported) { clearGlobalProps(undefinedProp); // setting constant to null; - const nullProp = 'nullProp'; - runScriptletFromTag(nullProp, 'null'); - assert.strictEqual(window[nullProp], null); - clearGlobalProps(nullProp); + const nullProp1 = 'nullProp1'; + runScriptletFromTag(nullProp1, 'null'); + assert.strictEqual(window[nullProp1], null); + clearGlobalProps(nullProp1); // setting constant to empty array const emptyArr = 'emptyArr'; @@ -185,10 +185,10 @@ if (!isSupported) { test('set value on null prop', (assert) => { // end prop is null - window.nullProp = null; - runScriptletFromTag('nullProp', 15); - assert.strictEqual(window.nullProp, 15, 'null end prop changed'); - clearGlobalProps('nullProp'); + window.nullProp2 = null; + runScriptletFromTag('nullProp2', 15); + assert.strictEqual(window.nullProp2, 15, 'null end prop changed'); + clearGlobalProps('nullProp2'); }); test('set value through chain with empty object', (assert) => { @@ -261,7 +261,6 @@ if (!isSupported) { test('sets values correctly + stack match', (assert) => { const stackMatch = 'set-constant'; - const trueProp = 'trueProp02'; runScriptletFromTag(trueProp, 'true', stackMatch); assert.strictEqual(window[trueProp], true, 'stack match: trueProp - ok'); diff --git a/tests/scriptlets/set-cookie-reload.test.js b/tests/scriptlets/set-cookie-reload.test.js deleted file mode 100644 index 6075424d..00000000 --- a/tests/scriptlets/set-cookie-reload.test.js +++ /dev/null @@ -1,88 +0,0 @@ -/* eslint-disable no-underscore-dangle */ -import { - runScriptlet, - clearGlobalProps, - clearCookie, -} from '../helpers'; - -const { test, module } = QUnit; -const name = 'set-cookie-reload'; - -const beforeEach = () => { - window.__debug = () => { - window.hit = 'FIRED'; - }; -}; - -const afterEach = () => { - clearGlobalProps('hit', '__debug'); -}; - -module(name, { beforeEach, afterEach }); - -test('Set cookie with valid value', (assert) => { - let cName = '__test-cookie_OK'; - let cValue = 'OK'; - runScriptlet(name, [cName, cValue]); - assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); - assert.strictEqual(document.cookie.includes(cName) && document.cookie.includes(cValue), true, 'Cookie has been set'); - clearCookie(cName); - - cName = '__test-cookie_true'; - cValue = 'true'; - runScriptlet(name, [cName, cValue]); - assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); - assert.strictEqual(document.cookie.includes(cName) && document.cookie.includes(cValue), true, 'Cookie has been set'); - clearCookie(cName); - - cName = '__test-cookie_false'; - cValue = 'false'; - runScriptlet(name, [cName, cValue]); - assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); - assert.strictEqual(document.cookie.includes(cName) && document.cookie.includes(cValue), true, 'Cookie has been set'); - clearCookie(cName); - - cName = '__test-cookie_no'; - cValue = 'no'; - runScriptlet(name, [cName, cValue]); - assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); - assert.strictEqual(document.cookie.includes(cName) && document.cookie.includes(cValue), true, 'Cookie has been set'); - clearCookie(cName); - - cName = '__test-cookie_0'; - cValue = '0'; - runScriptlet(name, [cName, cValue]); - assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); - assert.strictEqual(document.cookie.includes(cName) && document.cookie.includes(cValue), true, 'Cookie has been set'); - clearCookie(cName); - - cName = '__test-cookie_1'; - cValue = '1'; - runScriptlet(name, [cName, cValue]); - assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); - assert.strictEqual(document.cookie.includes(cName) && document.cookie.includes(cValue), true, 'Cookie has been set'); - clearCookie(cName); -}); - -test('Set cookie with invalid value', (assert) => { - let cName = '__test2-cookie_approved'; - let cValue = 'approved'; - runScriptlet(name, [cName, cValue]); - assert.strictEqual(window.hit, undefined, 'Hit was not fired'); - assert.strictEqual(document.cookie.includes(cName), false, 'Cookie has not been set'); - assert.strictEqual(document.cookie.includes(cValue), false, 'Cookie has not been set'); - - cName = '__test2-cookie_dismiss'; - cValue = 'dismiss'; - runScriptlet(name, [cName, cValue]); - assert.strictEqual(window.hit, undefined, 'Hit was not fired'); - assert.strictEqual(document.cookie.includes(cName), false, 'Cookie has not been set'); - assert.strictEqual(document.cookie.includes(cValue), false, 'Cookie has not been set'); - - cName = '__test2-cookie_pcbc'; - cValue = '_pcbc'; - runScriptlet(name, [cName, cValue]); - assert.strictEqual(window.hit, undefined, 'Hit was not fired'); - assert.strictEqual(document.cookie.includes(cName), false, 'Cookie has not been set'); - assert.strictEqual(document.cookie.includes(cValue), false, 'Cookie has not been set'); -}); diff --git a/tests/scriptlets/trusted-replace-fetch-response.test.js b/tests/scriptlets/trusted-replace-fetch-response.test.js index 6133c8f6..6ce2dd85 100644 --- a/tests/scriptlets/trusted-replace-fetch-response.test.js +++ b/tests/scriptlets/trusted-replace-fetch-response.test.js @@ -51,7 +51,7 @@ if (!isSupported) { return; } // eslint-disable-next-line max-len - const EXPECTED_LOG_STR_START = `fetch( url:"${INPUT_JSON_PATH}" method:"${TEST_METHOD}"`; + const EXPECTED_LOG_STR_START = `${name}: fetch( url:"${INPUT_JSON_PATH}" method:"${TEST_METHOD}"`; assert.ok(startsWith(input, EXPECTED_LOG_STR_START), 'console.hit input'); }; @@ -99,7 +99,7 @@ if (!isSupported) { const done = assert.async(); - const PATTERN = /test/; + const PATTERN = '/test/'; const REPLACEMENT = 'new content'; runScriptlet(name, [PATTERN, REPLACEMENT]); @@ -109,11 +109,32 @@ if (!isSupported) { const textContent = JSON.stringify(actualJson); assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); - assert.notOk(PATTERN.test(textContent), 'Pattern is removed'); + assert.notOk(textContent.includes(PATTERN), 'Pattern is removed'); assert.ok(textContent.includes(REPLACEMENT), 'New content is set'); done(); }); + test('Match all requests, replace multiline content', async (assert) => { + const INPUT_JSON_PATH = `${FETCH_OBJECTS_PATH}/empty.html`; + const TEST_METHOD = 'GET'; + const init = { + method: TEST_METHOD, + }; + + const done = assert.async(); + + const PATTERN = '*'; + const REPLACEMENT = ''; + runScriptlet(name, [PATTERN, REPLACEMENT]); + + const response = await fetch(INPUT_JSON_PATH, init); + const textContent = await response.text(); + + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + assert.ok(textContent === '', 'Multiline content is removed'); + done(); + }); + test('Match request by url and method, remove all text content', async (assert) => { const INPUT_JSON_PATH = `${FETCH_OBJECTS_PATH}/test01.json`; const TEST_METHOD = 'GET'; @@ -123,7 +144,7 @@ if (!isSupported) { const done = assert.async(); - const PATTERN = ''; + const PATTERN = '*'; const REPLACEMENT = ''; const PROPS_TO_MATCH = 'test01 method:GET'; runScriptlet(name, [PATTERN, REPLACEMENT, PROPS_TO_MATCH]); @@ -172,7 +193,7 @@ if (!isSupported) { const done = assert.async(); - const PATTERN = ''; + const PATTERN = '*'; const REPLACEMENT = ''; const PROPS_TO_MATCH = 'test01 method:GET'; @@ -185,19 +206,15 @@ if (!isSupported) { assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); const { - bodyUsedExpected, - headersExpected, - okExpected, - redirectedExpected, - statusExpected, - statusTextExpected, - typeExpected, - urlExpected, + ok: okExpected, + redirected: redirectedExpected, + status: statusExpected, + statusText: statusTextExpected, + type: typeExpected, + url: urlExpected, } = expectedResponse; const { - bodyUsed, - headers, ok, redirected, status, @@ -206,8 +223,6 @@ if (!isSupported) { url, } = actualResponse; - assert.strictEqual(bodyUsed, bodyUsedExpected, 'response prop is copied'); - assert.strictEqual(headers, headersExpected, 'response prop is copied'); assert.strictEqual(ok, okExpected, 'response prop is copied'); assert.strictEqual(redirected, redirectedExpected, 'response prop is copied'); assert.strictEqual(status, statusExpected, 'response prop is copied'); diff --git a/tests/scriptlets/trusted-replace-xhr-response.test.js b/tests/scriptlets/trusted-replace-xhr-response.test.js index efc5b55c..47ebdb38 100644 --- a/tests/scriptlets/trusted-replace-xhr-response.test.js +++ b/tests/scriptlets/trusted-replace-xhr-response.test.js @@ -65,9 +65,9 @@ if (isSupported) { test('Matched, string pattern', async (assert) => { const METHOD = 'GET'; const URL = `${FETCH_OBJECTS_PATH}/test01.json`; - const PATTERN = /[-0-9]+/; - const REPLACEMENT = 'a'; - const MATCH_DATA = [`${PATTERN}`, REPLACEMENT, `${URL} method:${METHOD}`]; + const PATTERN = 'a1'; + const REPLACEMENT = 'z9'; + const MATCH_DATA = [PATTERN, REPLACEMENT, `${URL} method:${METHOD}`]; runScriptlet(name, MATCH_DATA); @@ -77,8 +77,8 @@ if (isSupported) { xhr.open(METHOD, URL); xhr.onload = () => { assert.strictEqual(xhr.readyState, 4, 'Response done'); - assert.ok(!PATTERN.test(xhr.response), 'Response has been modified'); - assert.ok(!PATTERN.test(xhr.responseText), 'Response text has been modified'); + assert.notOk(xhr.response.includes(PATTERN), 'Response has been modified'); + assert.ok(xhr.response.includes(REPLACEMENT), 'Response text has been modified'); assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); done(); @@ -103,7 +103,35 @@ if (isSupported) { xhr.onload = () => { assert.strictEqual(xhr.readyState, 4, 'Response done'); assert.ok(xhr.response.includes(REPLACEMENT) && !PATTERN.test(xhr.response), 'Response has been modified'); - assert.ok(xhr.responseText.includes(REPLACEMENT) && !PATTERN.test(xhr.responseText), 'Response text has been modified'); + assert.ok( + xhr.responseText.includes(REPLACEMENT) && !PATTERN.test(xhr.responseText), + 'Response text has been modified', + ); + + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done(); + }; + xhr.send(); + }); + + test('Matched, replaces multiline content', async (assert) => { + const METHOD = 'GET'; + const URL = `${FETCH_OBJECTS_PATH}/empty.html`; + + const PATTERN = '*'; + const REPLACEMENT = ''; + const MATCH_DATA = [`${PATTERN}`, REPLACEMENT, '*']; + + runScriptlet(name, MATCH_DATA); + + const done = assert.async(); + + const xhr = new XMLHttpRequest(); + xhr.open(METHOD, URL); + xhr.onload = () => { + assert.strictEqual(xhr.readyState, 4, 'Response done'); + assert.ok(xhr.response === '', 'Response has been modified'); + assert.ok(xhr.responseText === '', 'Response text has been modified'); assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); done(); @@ -133,7 +161,7 @@ if (isSupported) { assert.notOk(xhr.response.includes(REPLACEMENT), 'Response is intact'); assert.notOk(xhr.responseText.includes(REPLACEMENT), 'Response text is intact'); - assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + assert.strictEqual(window.hit, undefined, 'hit function fired'); done(); }; xhr.send(); diff --git a/tests/scriptlets/trusted-set-cookie-reload.test.js b/tests/scriptlets/trusted-set-cookie-reload.test.js deleted file mode 100644 index c030016a..00000000 --- a/tests/scriptlets/trusted-set-cookie-reload.test.js +++ /dev/null @@ -1,116 +0,0 @@ -/* eslint-disable no-underscore-dangle */ -import { - runScriptlet, - clearGlobalProps, - clearCookie, -} from '../helpers'; - -const { test, module } = QUnit; -const name = 'trusted-set-cookie-reload'; - -const beforeEach = () => { - window.__debug = () => { - window.hit = 'FIRED'; - }; -}; - -const afterEach = () => { - clearGlobalProps('hit', '__debug'); -}; - -module(name, { beforeEach, afterEach }); - -test('Set cookie string', (assert) => { - let cName = '__test-cookie-reload_OK'; - let cValue = 'OK'; - runScriptlet(name, [cName, cValue]); - assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); - assert.strictEqual(document.cookie.includes(cName), true, 'Cookie name has been set'); - assert.strictEqual(document.cookie.includes(cValue), true, 'Cookie value has been set'); - clearCookie(cName); - - cName = '__test-cookie-reload_0'; - cValue = 0; - runScriptlet(name, [cName, cValue, '', '']); - assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); - assert.strictEqual(document.cookie.includes(cName), true, 'Cookie name has been set'); - assert.strictEqual(document.cookie.includes(cValue), true, 'Cookie value has been set'); - clearCookie(cName); - - cName = 'trackingSettings'; - cValue = '{%22ads%22:false%2C%22performance%22:false}'; - runScriptlet(name, [cName, cValue]); - - assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); - assert.strictEqual(document.cookie.includes(cName), true, 'Cookie name has been set'); - assert.strictEqual(document.cookie.includes(encodeURIComponent(cValue)), true, 'Cookie value has been set'); - clearCookie(cName); -}); - -test('Set cookie with current time value', (assert) => { - const cName = '__test-cookie-reload_OK'; - const cValue = '$now$'; - - runScriptlet(name, [cName, cValue]); - - assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); - assert.strictEqual(document.cookie.includes(cName), true, 'Cookie name has been set'); - - // Some time will pass between calling scriptlet - // and qunit running assertion - const tolerance = 20; - const cookieValue = document.cookie.split('=')[1]; - const currentTime = new Date().getTime(); - const timeDiff = currentTime - cookieValue; - - assert.ok(timeDiff < tolerance, 'Cookie value has been set to current time'); - - clearCookie(cName); -}); - -test('Set cookie with expires', (assert) => { - const cName = '__test-cookie-reload_expires'; - const cValue = 'expires'; - const expiresSec = 2; - - runScriptlet(name, [cName, cValue, `${expiresSec}`]); - - assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); - assert.strictEqual(document.cookie.includes(cName), true, 'Cookie name has been set'); - assert.strictEqual(document.cookie.includes(cValue), true, 'Cookie value has been set'); - - const done = assert.async(); - - setTimeout(() => { - assert.strictEqual(document.cookie.includes(cName), false, 'Cookie name has been deleted'); - assert.strictEqual(document.cookie.includes(cValue), false, 'Cookie value has been deleted'); - clearCookie(cName); - done(); - }, expiresSec * 1000); -}); - -test('Set cookie with negative expires', (assert) => { - const cName = '__test-cookie-reload_expires_negative'; - const cValue = 'expires'; - const expiresSec = -2; - - runScriptlet(name, [cName, cValue, `${expiresSec}`]); - - assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); - assert.strictEqual(document.cookie.includes(cName), false, 'Cookie name has not been set'); - assert.strictEqual(document.cookie.includes(cValue), false, 'Cookie value has not been set'); - clearCookie(cName); -}); - -test('Set cookie with invalid expires', (assert) => { - const cName = '__test-cookie-reload_expires_invalid'; - const cValue = 'expires'; - const expiresSec = 'invalid_value'; - - runScriptlet(name, [cName, cValue, `${expiresSec}`]); - - assert.strictEqual(window.hit, undefined, 'Hit was not fired'); - assert.strictEqual(document.cookie.includes(cName), false, 'Cookie name has not been set'); - assert.strictEqual(document.cookie.includes(cValue), false, 'Cookie value has not been set'); - clearCookie(cName); -}); diff --git a/tests/scriptlets/trusted-set-cookie.test.js b/tests/scriptlets/trusted-set-cookie.test.js index 3fecbf39..5949809e 100644 --- a/tests/scriptlets/trusted-set-cookie.test.js +++ b/tests/scriptlets/trusted-set-cookie.test.js @@ -1,4 +1,5 @@ /* eslint-disable no-underscore-dangle */ +import { parseCookieString } from '../../src/helpers'; import { runScriptlet, clearGlobalProps, @@ -31,7 +32,7 @@ test('Set cookie string', (assert) => { cName = '__test-cookie_0'; cValue = 0; - runScriptlet(name, [cName, cValue, '', '']); + runScriptlet(name, [cName, cValue]); assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); assert.strictEqual(document.cookie.includes(cName), true, 'Cookie name has been set'); assert.strictEqual(document.cookie.includes(cValue), true, 'Cookie value has been set'); @@ -48,7 +49,7 @@ test('Set cookie string', (assert) => { }); test('Set cookie with current time value', (assert) => { - const cName = '__test-cookie_OK'; + const cName = '__test-cookie_current_time'; const cValue = '$now$'; runScriptlet(name, [cName, cValue]); @@ -59,12 +60,11 @@ test('Set cookie with current time value', (assert) => { // Some time will pass between calling scriptlet // and qunit running assertion const tolerance = 20; - const cookieValue = document.cookie.split('=')[1]; + const cookieValue = parseCookieString(document.cookie)[cName]; const currentTime = new Date().getTime(); const timeDiff = currentTime - cookieValue; assert.ok(timeDiff < tolerance, 'Cookie value has been set to current time'); - clearCookie(cName); }); @@ -106,7 +106,16 @@ test('Set cookie with invalid expires', (assert) => { const cName = '__test-cookie_expires_invalid'; const cValue = 'expires'; const expiresSec = 'invalid_value'; - + assert.expect(4); + // eslint-disable-next-line no-console + console.log = function log(input) { + if (input.indexOf('trace') > -1) { + return; + } + assert.strictEqual(input, + `${name}: Invalid offsetExpiresSec value: ${expiresSec}`, + 'logs correctly on invalid offsetExpiresSec'); + }; runScriptlet(name, [cName, cValue, `${expiresSec}`]); assert.strictEqual(window.hit, undefined, 'Hit was not fired'); diff --git a/tests/scriptlets/trusted-set-local-storage-item.test.js b/tests/scriptlets/trusted-set-local-storage-item.test.js index 80503eb2..e6c67aa7 100644 --- a/tests/scriptlets/trusted-set-local-storage-item.test.js +++ b/tests/scriptlets/trusted-set-local-storage-item.test.js @@ -124,14 +124,16 @@ if (isSafariBrowser()) { assert.strictEqual(window.hit, 'FIRED', 'Hit was fired'); const value = localStorage.getItem(iName); - const dateObj = new Date(); - const year = dateObj.getFullYear(); - const month = dateObj.getMonth(); - const hours = dateObj.getHours(); - - assert.ok(value.includes(year), 'Years matched'); - assert.ok(value.includes(month), 'Month matched'); - assert.ok(value.includes(hours), 'Hours matched'); + const currentDate = new Date(); + const currentYear = currentDate.getFullYear(); + const currentMonth = currentDate.getMonth(); + const currentHour = currentDate.getHours(); + + const currentValue = new Date(value); + + assert.strictEqual(currentValue.getFullYear(), currentYear, 'Years matched'); + assert.strictEqual(currentValue.getMonth(), currentMonth, 'Years matched'); + assert.strictEqual(currentValue.getHours(), currentHour, 'Years matched'); clearStorageItem(iName); }); diff --git a/yarn.lock b/yarn.lock index d96700cd..a9b31b33 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,14 @@ # yarn lockfile v1 +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@babel/cli@^7.8.4": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.12.10.tgz#67a1015b1cd505bde1696196febf910c4c339a48" @@ -33,31 +41,43 @@ dependencies: "@babel/highlight" "^7.16.0" +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + "@babel/compat-data@^7.12.5", "@babel/compat-data@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41" integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw== -"@babel/core@^7.9.0": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" - integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.10" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.10" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.10" - "@babel/types" "^7.12.10" +"@babel/compat-data@^7.20.0": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" + integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== + +"@babel/core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" + integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-module-transforms" "^7.20.2" + "@babel/helpers" "^7.20.5" + "@babel/parser" "^7.20.5" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - semver "^5.4.1" - source-map "^0.5.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" "@babel/eslint-parser@^7.16.5": version "7.16.5" @@ -68,7 +88,7 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.12.10", "@babel/generator@^7.12.11": +"@babel/generator@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== @@ -86,6 +106,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" + integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== + dependencies: + "@babel/types" "^7.20.5" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.10.4": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d" @@ -118,6 +147,16 @@ browserslist "^4.14.5" semver "^5.5.0" +"@babel/helper-compilation-targets@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" + integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== + dependencies: + "@babel/compat-data" "^7.20.0" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" @@ -166,6 +205,11 @@ dependencies: "@babel/types" "^7.16.0" +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + "@babel/helper-explode-assignable-expression@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz#8006a466695c4ad86a2a5f2fb15b5f2c31ad5633" @@ -191,6 +235,14 @@ "@babel/template" "^7.16.0" "@babel/types" "^7.16.0" +"@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + "@babel/helper-get-function-arity@^7.12.10": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz#b158817a3165b5faa2047825dfa61970ddcc16cf" @@ -219,6 +271,13 @@ dependencies: "@babel/types" "^7.16.0" +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-member-expression-to-functions@^7.12.1", "@babel/helper-member-expression-to-functions@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855" @@ -240,6 +299,13 @@ dependencies: "@babel/types" "^7.12.5" +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-module-transforms@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" @@ -255,6 +321,20 @@ "@babel/types" "^7.12.1" lodash "^4.17.19" +"@babel/helper-module-transforms@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" + integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" + "@babel/helper-optimise-call-expression@^7.10.4", "@babel/helper-optimise-call-expression@^7.12.10": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d" @@ -316,6 +396,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -337,6 +424,18 @@ dependencies: "@babel/types" "^7.16.0" +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + "@babel/helper-validator-identifier@^7.10.4", "@babel/helper-validator-identifier@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" @@ -347,11 +446,21 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + "@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz#d66cb8b7a3e7fe4c6962b32020a131ecf0847f4f" integrity sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw== +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + "@babel/helper-wrap-function@^7.10.4": version "7.12.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" @@ -362,14 +471,14 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helpers@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" - integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== +"@babel/helpers@^7.20.5": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" + integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.5" - "@babel/types" "^7.12.5" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" "@babel/highlight@^7.10.4": version "7.10.4" @@ -389,6 +498,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/node@^7.8.7": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.12.10.tgz#2a78e1a3a98f08e0d5e8adbaba783bed5efb09ae" @@ -402,7 +520,7 @@ regenerator-runtime "^0.13.4" v8flags "^3.1.1" -"@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7": +"@babel/parser@^7.12.11", "@babel/parser@^7.12.7": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79" integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg== @@ -412,6 +530,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.5.tgz#beb3af702e54d24796341ab9420fb329131ad658" integrity sha512-+Ce7T5iPNWzfu9C1aB5tN3Lyafs5xb3Ic7vBWyZL2KXT3QSdD1dD3CvgOzPmQKoNNRt6uauc0XwNJTQtXC2/Mw== +"@babel/parser@^7.18.10", "@babel/parser@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" + integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== + "@babel/plugin-proposal-async-generator-functions@^7.12.1": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz#04b8f24fd4532008ab4e79f788468fd5a8476566" @@ -996,7 +1119,16 @@ "@babel/parser" "^7.16.0" "@babel/types" "^7.16.0" -"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5": +"@babel/template@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376" integrity sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w== @@ -1027,6 +1159,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" + integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.5" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.5" + "@babel/types" "^7.20.5" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.4.4": version "7.12.12" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" @@ -1044,6 +1192,15 @@ "@babel/helper-validator-identifier" "^7.15.7" to-fast-properties "^2.0.0" +"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" + integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@eslint/eslintrc@^0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" @@ -1059,6 +1216,54 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@mdn/browser-compat-data@^2.0.7": version "2.0.7" resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-2.0.7.tgz#72ec37b9c1e00ce0b4e0309d753be18e2da12ee3" @@ -1221,11 +1426,6 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/mime-types@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.0.tgz#9ca52cda363f699c69466c2a6ccdaad913ea7a73" - integrity sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM= - "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -1241,6 +1441,11 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -1248,6 +1453,13 @@ dependencies: "@types/node" "*" +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1273,6 +1485,13 @@ agent-base@5: resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -1435,22 +1654,24 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -axios@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== +axios@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.0.tgz#1cb65bd75162c70e9f8d118a905126c4a201d383" + integrity sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw== dependencies: - follow-redirects "^1.10.0" + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" @@ -1464,6 +1685,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -1487,6 +1713,15 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1529,6 +1764,16 @@ browserslist@^4.12.2, browserslist@^4.14.5, browserslist@^4.16.0: escalade "^3.1.1" node-releases "^1.1.69" +browserslist@^4.21.3: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + dependencies: + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" + browserstack-local@^1.4.9: version "1.4.9" resolved "https://registry.yarnpkg.com/browserstack-local/-/browserstack-local-1.4.9.tgz#5d3e405d425ee5a3ec5cba853c9a078242d944db" @@ -1549,6 +1794,14 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer@^5.2.1, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + builtin-modules@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" @@ -1606,6 +1859,11 @@ caniuse-lite@^1.0.30001166, caniuse-lite@^1.0.30001173: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001366.tgz" integrity sha512-yy7XLWCubDobokgzudpkKux8e0UOOnLHE6mlNJBzT3lZJz6s5atSEzjoL+fsCPkI0G8MP5uVdDx1ur/fXEWkZA== +caniuse-lite@^1.0.30001400: + version "1.0.30001435" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001435.tgz#502c93dbd2f493bee73a408fe98e98fb1dad10b2" + integrity sha512-kdCkUTjR+v4YAJelyiDTqiu82BDr4W4CP5sgTA0ZBmqn30XfS2ZghPLMowik9TPhS+psWJiUNxsqLyurDbmutA== + chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -1646,6 +1904,11 @@ chokidar@^3.4.0: optionalDependencies: fsevents "~2.3.1" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -1736,6 +1999,13 @@ colors@^1.4.0: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" @@ -1783,16 +2053,6 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - config-chain@^1.1.12: version "1.1.13" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" @@ -1841,6 +2101,17 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cosmiconfig@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + cosmiconfig@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" @@ -1858,6 +2129,13 @@ cross-env@^7.0.3: dependencies: cross-spawn "^7.0.1" +cross-fetch@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -1890,6 +2168,13 @@ debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "2.1.2" +debug@4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1953,6 +2238,16 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +devtools-protocol@0.0.1056733: + version "0.0.1056733" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1056733.tgz#55bb1d56761014cc221131cca5e6bad94eefb2b9" + integrity sha512-CmTu6SQx2g3TbZzDCAV58+LTxVdKplS7xip0g5oDXpZ+isr0rv5dDP8ToyVRywzPHkCCPKgKgScEcwz4uPWDIA== + diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -2047,6 +2342,11 @@ electron-to-chromium@^1.3.634: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.641.tgz#03f14efd70a7971eff2efc947b3c1d0f717c82b9" integrity sha512-b0DLhsHSHESC1I+Nx6n4w4Lr61chMd3m/av1rZQhS2IXTzaS5BMM5N+ldWdMIlni9CITMRM09m8He4+YV/92TA== +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -2057,7 +2357,7 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -2404,15 +2704,16 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@^1.6.6: - version "1.7.0" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" - integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== dependencies: - concat-stream "^1.6.2" - debug "^2.6.9" - mkdirp "^0.5.4" + debug "^4.1.1" + get-stream "^5.1.0" yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" fast-deep-equal@^3.1.1: version "3.1.3" @@ -2523,16 +2824,25 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== -follow-redirects@^1.10.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" - integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== +follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -2545,6 +2855,11 @@ from@~0: resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8" @@ -2593,7 +2908,7 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gensync@^1.0.0-beta.1: +gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -2619,6 +2934,13 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -2798,6 +3120,14 @@ htmlparser2@^3.9.2: inherits "^2.0.1" readable-stream "^3.1.1" +https-proxy-agent@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + https-proxy-agent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" @@ -2828,6 +3158,11 @@ husky@^3.1.0: run-node "^1.0.0" slash "^3.0.0" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -2877,7 +3212,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3218,12 +3553,10 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== - dependencies: - minimist "^1.2.5" +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== jsonfile@^4.0.0: version "4.0.0" @@ -3399,11 +3732,6 @@ lodash.memoize@4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" @@ -3554,22 +3882,17 @@ micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" -mime-db@1.45.0: - version "1.45.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" - integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.25: - version "2.1.28" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" - integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.45.0" - -mime@^2.0.3: - version "2.5.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.0.tgz#2b4af934401779806ee98026bb42e8c1ae1876b1" - integrity sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag== + mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" @@ -3583,7 +3906,7 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.2.0: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -3596,12 +3919,10 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.4: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== ms@2.0.0: version "2.0.0" @@ -3659,24 +3980,36 @@ node-environment-flags@^1.0.5: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + node-modules-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= -node-qunit-puppeteer@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/node-qunit-puppeteer/-/node-qunit-puppeteer-2.0.3.tgz#62a66ad07f4d94b9a408274738683e98b375e7a9" - integrity sha512-G4mWn3RBQ+JPzCNWzFQ4r6RUUZqj52D5E3Z7wxqRi5b4daph0Alk/mgBpAQqZq7TVR1oV2emnN0Bk0EgYz/4gw== +node-qunit-puppeteer@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/node-qunit-puppeteer/-/node-qunit-puppeteer-2.1.1.tgz#91c2fe85ffe600289fb3c47683600de8c35d43c6" + integrity sha512-B8arR129Y7ZCmeoJddNC/8CLNum5pDselC6j1ALzG9MchEJsu0KHojdfeHKyiO051xm7IGxlfzK/avwZyzXFOA== dependencies: colors "^1.4.0" - puppeteer "^2.1.0" + puppeteer "^19.3.0" node-releases@^1.1.69: version "1.1.69" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.69.tgz#3149dbde53b781610cd8b486d62d86e26c3725f6" integrity sha512-DGIjo79VDEyAnRlfSqYTsy+yoHd2IOjJiKUozD2MV2D85Vso6Bug56mb9tT/fY5Urt0iqk01H7x+llAruDR2zA== +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + node-watch@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.1.tgz#0caaa6a6833b0d533487f953c52a6c787769ba7c" @@ -4008,6 +4341,11 @@ perf-regexes@^1.0.1: resolved "https://registry.yarnpkg.com/perf-regexes/-/perf-regexes-1.0.1.tgz#6da1d62f5a94bf9353a0451bccacf69068b75d0b" integrity sha512-L7MXxUDtqr4PUaLFCDCXBfGV/6KLIuSEccizDI7JxT+c9x1G1v04BQ4+4oag84SHaCdrBgQAIs/Cqn+flwFPng== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" @@ -4120,7 +4458,7 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@^2.0.0, progress@^2.0.1: +progress@2.0.3, progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -4130,7 +4468,7 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= -proxy-from-env@^1.0.0: +proxy-from-env@1.1.0, proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -4160,21 +4498,33 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -puppeteer@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-2.1.1.tgz#ccde47c2a688f131883b50f2d697bd25189da27e" - integrity sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg== - dependencies: - "@types/mime-types" "^2.1.0" - debug "^4.1.0" - extract-zip "^1.6.6" - https-proxy-agent "^4.0.0" - mime "^2.0.3" - mime-types "^2.1.25" - progress "^2.0.1" - proxy-from-env "^1.0.0" - rimraf "^2.6.1" - ws "^6.1.0" +puppeteer-core@19.3.0: + version "19.3.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-19.3.0.tgz#deba854f3dd3f74a04db200274827a67e200f39e" + integrity sha512-P8VAAOBnBJo/7DKJnj1b0K9kZBF2D8lkdL94CjJ+DZKCp182LQqYemPI9omUSZkh4bgykzXjZhaVR1qtddTTQg== + dependencies: + cross-fetch "3.1.5" + debug "4.3.4" + devtools-protocol "0.0.1056733" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + proxy-from-env "1.1.0" + rimraf "3.0.2" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + ws "8.10.0" + +puppeteer@^19.3.0: + version "19.3.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.3.0.tgz#defa8b6a6401b23cdc4f634c441b55d61f6b3d65" + integrity sha512-WJbi/ULaeuFOz7cfMgJlJCBAZiyqIFeQ6os4h5ex3PVTt2qosXgwI9eruFZqFAwJRv8x5pOuMhWR0aSRgyDqEg== + dependencies: + cosmiconfig "7.0.1" + devtools-protocol "0.0.1056733" + https-proxy-agent "5.0.1" + progress "2.0.3" + proxy-from-env "1.1.0" + puppeteer-core "19.3.0" qunit@^2.9.3: version "2.14.0" @@ -4213,7 +4563,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.6: +readable-stream@^2.0.2, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -4226,7 +4576,7 @@ readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.1.1: +readable-stream@^3.1.1, readable-stream@^3.4.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -4378,14 +4728,7 @@ rfdc@^1.3.0: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.6.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -4490,7 +4833,7 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -4697,13 +5040,6 @@ source-map@^0.6.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.8.0-beta.0: - version "0.8.0-beta.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" - integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== - dependencies: - whatwg-url "^7.0.0" - sourcemap-codec@^1.4.4: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" @@ -4888,6 +5224,27 @@ table@^6.0.4: string-width "^4.2.0" strip-ansi "^6.0.0" +tar-fs@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + temp-fs@^0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/temp-fs/-/temp-fs-0.9.9.tgz#8071730437870720e9431532fe2814364f8803d7" @@ -4895,14 +5252,14 @@ temp-fs@^0.9.9: dependencies: rimraf "~2.5.2" -terser@^5.13.0: - version "5.13.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.13.0.tgz#d43fd71861df1b4df743980caa257c6fa03acc44" - integrity sha512-sgQ99P+fRBM1jAYzN9RTnD/xEWx/7LZgYTCRgmYriSq1wxxqiQPJgXkkLBBuwySDWJ2PP0PnVQyuf4xLUuH4Ng== +terser@^5.16.1: + version "5.16.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" + integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== dependencies: + "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" commander "^2.20.0" - source-map "~0.8.0-beta.0" source-map-support "~0.5.20" text-table@^0.2.0: @@ -4967,12 +5324,10 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== tsconfig-paths@^3.9.0: version "3.9.0" @@ -5021,16 +5376,19 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - uc.micro@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== +unbzip2-stream@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -5087,6 +5445,14 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -5129,19 +5495,18 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" + tr46 "~0.0.3" + webidl-conversions "^3.0.0" which@^1.2.9: version "1.3.1" @@ -5185,18 +5550,16 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +ws@8.10.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.10.0.tgz#00a28c09dfb76eae4eb45c3b565f771d6951aa51" + integrity sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw== + ws@>=7.4.6: version "8.5.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== -ws@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" - integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== - dependencies: - async-limiter "~1.0.0" - yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -5207,7 +5570,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.2: +yaml@^1.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== From 23211c82d47a13f6b3470f2c5684f10be8d53e35 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 6 Dec 2022 16:51:21 +0300 Subject: [PATCH 07/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c6fe4632..80fc5897 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.6", + "version": "1.7.7", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From bb4c80171e2bd446ee2ba937be8cdd42afe28a89 Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Tue, 6 Dec 2022 17:06:18 +0300 Subject: [PATCH 08/70] fix infinite reloads at set-cookie-reload #265 AG-18045 Merge in ADGUARD-FILTERS/scriptlets from fix/AG-18045 to master Squashed commit of the following: commit 5254a6af79cd133397facde6172ac923c4676b9e Merge: 0dd4204 23211c8 Author: Stanislav A Date: Tue Dec 6 16:58:18 2022 +0300 Merge branch 'master' into fix/AG-18045 commit 0dd4204be140e341b90f3a6c8916d1e133ab23a0 Author: Stanislav A Date: Tue Dec 6 16:49:23 2022 +0300 fix infinite reloads at set-cookie-reload --- src/scriptlets/set-cookie-reload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scriptlets/set-cookie-reload.js b/src/scriptlets/set-cookie-reload.js index f3290c82..fec8223d 100644 --- a/src/scriptlets/set-cookie-reload.js +++ b/src/scriptlets/set-cookie-reload.js @@ -47,7 +47,7 @@ import { * ``` */ export function setCookieReload(source, name, value, path = '/') { - if (isCookieSetWithValue(name, value)) { + if (isCookieSetWithValue(document.cookie, name, value)) { return; } From 5e74b91e3c57f945f9cb35521843bda9a575527b Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 6 Dec 2022 17:06:29 +0300 Subject: [PATCH 09/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 80fc5897..5cbfcb59 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.7", + "version": "1.7.8", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From 5d423a1c6f29fc2a1865b352ca989a5ab1c67039 Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Tue, 6 Dec 2022 17:20:46 +0300 Subject: [PATCH 10/70] fix prevent-element-src-loading thisArg.getAttribute TypeError #264 AG-18039 Merge in ADGUARD-FILTERS/scriptlets from fix/AG-18039 to master Squashed commit of the following: commit 96727f7f46c4345d493949e8d5f09a2e56c65116 Merge: c95c2eb 5e74b91 Author: Stanislav A Date: Tue Dec 6 17:13:56 2022 +0300 Merge branch 'master' into fix/AG-18039 commit c95c2eb639f2e2df19ae917a0adb350161932dc0 Merge: 30649fd bb4c801 Author: Stanislav A Date: Tue Dec 6 17:06:33 2022 +0300 Merge branch 'master' into fix/AG-18039 commit 30649fd5c856caab96616ea49b4465369f43b5ff Merge: abb1f95 c98787f Author: Stanislav A Date: Tue Dec 6 16:51:24 2022 +0300 Merge branch 'master' into fix/AG-18039 commit abb1f95489661c3b4261db9a956bb6e1106e8e8b Author: Stanislav A Date: Tue Dec 6 16:05:28 2022 +0300 fix prevent-element-src-loading thisArg.getAttribute TypeError --- src/scriptlets/prevent-element-src-loading.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scriptlets/prevent-element-src-loading.js b/src/scriptlets/prevent-element-src-loading.js index d191a1c6..ea5b1a6c 100644 --- a/src/scriptlets/prevent-element-src-loading.js +++ b/src/scriptlets/prevent-element-src-loading.js @@ -170,7 +170,8 @@ export function preventElementSrcLoading(source, tagName, match) { } const eventName = args[0]; - const isMatched = thisArg.getAttribute(source.name) === 'matched' + const isMatched = typeof thisArg.getAttribute === 'function' + && thisArg.getAttribute(source.name) === 'matched' && eventName === 'error'; if (isMatched) { From e7c13e0de3d9976908b26f416b8ecfe6a8ddbb65 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 6 Dec 2022 17:21:09 +0300 Subject: [PATCH 11/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5cbfcb59..216edf5b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.8", + "version": "1.7.9", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From dc4e12530f4add36a50fb70a59e98e1b8d311a8a Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Tue, 6 Dec 2022 18:29:34 +0300 Subject: [PATCH 12/70] fix prevent-bab aliases and update changelog for 1.7.10 AG-13369 Merge in ADGUARD-FILTERS/scriptlets from fix/AG-13369_03 to master Squashed commit of the following: commit cb30a8dbb1882e6ba5692f52514d97155f91007f Author: Stanislav A Date: Tue Dec 6 18:20:29 2022 +0300 fix changelog commit 597b4630bcf1582d1f943c11cf34e79eca582292 Author: Stanislav A Date: Tue Dec 6 18:07:17 2022 +0300 fix prevent-bab aliases and update changelog for 1.7.10 --- CHANGELOG.md | 4 +++- src/redirects/prevent-bab.js | 6 ++++++ src/scriptlets/prevent-bab.js | 8 +------- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 367cab62..fe5c7d26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Scriptlets and Redirect Resources Changelog -## v1.7.6 +## v1.7.10 ### Added @@ -8,6 +8,8 @@ ### Fixed +* `set-cookie-reload` infinite page reloading +* breakage of `prevent-element-src-loading` due to `window` getting into `apply` wrapper * spread of args bug at getXhrData call for `trusted-replace-xhr-response` * request properties array not being served to `getRequestData` and `parseMatchProps` helpers diff --git a/src/redirects/prevent-bab.js b/src/redirects/prevent-bab.js index 5dafce92..56f36928 100644 --- a/src/redirects/prevent-bab.js +++ b/src/redirects/prevent-bab.js @@ -21,6 +21,12 @@ const preventBab = preventBabScriptlet; preventBab.names = [ 'prevent-bab', // list of prevent-bab redirect aliases + 'nobab.js', + 'ubo-nobab.js', + 'bab-defuser.js', + 'ubo-bab-defuser.js', + 'ubo-nobab', + 'ubo-bab-defuser', ]; export { preventBab }; diff --git a/src/scriptlets/prevent-bab.js b/src/scriptlets/prevent-bab.js index 6967f674..4282073a 100644 --- a/src/scriptlets/prevent-bab.js +++ b/src/scriptlets/prevent-bab.js @@ -94,13 +94,7 @@ export function preventBab(source) { preventBab.names = [ 'prevent-bab', - // aliases are needed for matching the related scriptlet converted into our syntax - 'nobab.js', - 'ubo-nobab.js', - 'bab-defuser.js', - 'ubo-bab-defuser.js', - 'ubo-nobab', - 'ubo-bab-defuser', + // there is no aliases for this scriptlet ]; preventBab.injections = [hit]; From 58d4865c0adaa409e69abd34ee8f152df977aea6 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 6 Dec 2022 18:29:53 +0300 Subject: [PATCH 13/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 216edf5b..d061b312 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.9", + "version": "1.7.10", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From ab294286d2b63014311d0babdb9d1cba6851b36e Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 6 Dec 2022 19:06:44 +0300 Subject: [PATCH 14/70] deploy: update dist v1.7.10 --- dist/build.txt | 2 +- dist/redirects.json | 9 ++++++++- dist/redirects.yml | 10 ++++++++-- dist/scriptlets.corelibs.json | 14 ++++++++++---- dist/scriptlets.js | 33 +++++++++++++++++---------------- dist/umd/scriptlets.umd.js | 33 +++++++++++++++++---------------- wiki/about-scriptlets.md | 7 ++++++- 7 files changed, 67 insertions(+), 41 deletions(-) diff --git a/dist/build.txt b/dist/build.txt index f38eda9d..f8ffb358 100644 --- a/dist/build.txt +++ b/dist/build.txt @@ -1 +1 @@ -version=1.7.6 \ No newline at end of file +version=1.7.10 \ No newline at end of file diff --git a/dist/redirects.json b/dist/redirects.json index 2c799de2..0f177f90 100644 --- a/dist/redirects.json +++ b/dist/redirects.json @@ -319,7 +319,14 @@ }, { "title": "prevent-bab", - "aliases": [], + "aliases": [ + "nobab.js", + "ubo-nobab.js", + "bab-defuser.js", + "ubo-bab-defuser.js", + "ubo-nobab", + "ubo-bab-defuser" + ], "isBlocking": false, "contentType": "application/javascript;base64", "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBoaXQoc291cmNlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4O3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKCIjJSMvLyIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKCIjJSMvLyIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKCIjIytqcyIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoIiMjK2pzIikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX1jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIG5hdGl2ZVNldFRpbWVvdXQ9d2luZG93LnNldFRpbWVvdXQsYmFiUmVnZXg9L1wuYmFiX2VsZW1lbnRpZC4kLzt3aW5kb3cuc2V0VGltZW91dD1mdW5jdGlvbihjYWxsYmFjayl7aWYoInN0cmluZyIhPXR5cGVvZiBjYWxsYmFja3x8IWJhYlJlZ2V4LnRlc3QoY2FsbGJhY2spKXtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPW5ldyBBcnJheShfbGVuPjE/X2xlbi0xOjApLF9rZXk9MTtfa2V5PF9sZW47X2tleSsrKWFyZ3NbX2tleS0xXT1hcmd1bWVudHNbX2tleV07cmV0dXJuIG5hdGl2ZVNldFRpbWVvdXQuYXBwbHkod2luZG93LFtjYWxsYmFja10uY29uY2F0KGFyZ3MpKX1oaXQoc291cmNlKX07dmFyIHNpZ25hdHVyZXM9W1siYmxvY2thZGJsb2NrIl0sWyJiYWJhc2JtIl0sWy9nZXRJdGVtXCgnYmFibidcKS9dLFsiZ2V0RWxlbWVudEJ5SWQiLCJTdHJpbmcuZnJvbUNoYXJDb2RlIiwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLCJjaGFyQXQiLCJET01Db250ZW50TG9hZGVkIiwiQWRCbG9jayIsImFkZEV2ZW50TGlzdGVuZXIiLCJkb1Njcm9sbCIsImZyb21DaGFyQ29kZSIsIjw8MnxyPj40Iiwic2Vzc2lvblN0b3JhZ2UiLCJjbGllbnRXaWR0aCIsImxvY2FsU3RvcmFnZSIsIk1hdGgiLCJyYW5kb20iXV0sbmF0aXZlRXZhbD13aW5kb3cuZXZhbDt3aW5kb3cuZXZhbD1mdW5jdGlvbihzdHIpe2lmKCFmdW5jdGlvbihzdHIpe2lmKCJzdHJpbmciIT10eXBlb2Ygc3RyKXJldHVybiExO2Zvcih2YXIgaT0wO2k8c2lnbmF0dXJlcy5sZW5ndGg7aSs9MSl7Zm9yKHZhciB0b2tlbnM9c2lnbmF0dXJlc1tpXSxtYXRjaD0wLGo9MDtqPHRva2Vucy5sZW5ndGg7ais9MSl7dmFyIHRva2VuPXRva2Vuc1tqXTsodG9rZW4gaW5zdGFuY2VvZiBSZWdFeHA/dG9rZW4udGVzdChzdHIpOnN0ci5pbmRleE9mKHRva2VuKT4tMSkmJihtYXRjaCs9MSl9aWYobWF0Y2gvdG9rZW5zLmxlbmd0aD49LjgpcmV0dXJuITB9cmV0dXJuITF9KHN0cikpcmV0dXJuIG5hdGl2ZUV2YWwoc3RyKTtoaXQoc291cmNlKTt2YXIgYm9keUVsPWRvY3VtZW50LmJvZHk7Ym9keUVsJiZib2R5RWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoInZpc2liaWxpdHkiKTt2YXIgZWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJhYmFzYm1zZ3giKTtlbCYmZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCl9LmJpbmQod2luZG93KX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6InByZXZlbnQtYmFiIixhcmdzOltdfSxbXSk7" diff --git a/dist/redirects.yml b/dist/redirects.yml index 386fdbb9..d5034c12 100644 --- a/dist/redirects.yml +++ b/dist/redirects.yml @@ -1,6 +1,6 @@ # # AdGuard Scriptlets (Redirects Source) -# Version 1.7.6 +# Version 1.7.10 # - title: 1x1-transparent.gif description: |- @@ -3050,7 +3050,13 @@ - title: prevent-bab comment: Prevents BlockAdblock script from detecting an ad blocker. - aliases: [] + aliases: + - nobab.js + - ubo-nobab.js + - bab-defuser.js + - ubo-bab-defuser.js + - ubo-nobab + - ubo-bab-defuser contentType: application/javascript content: |- (function(source, args) { diff --git a/dist/scriptlets.corelibs.json b/dist/scriptlets.corelibs.json index dab8dfa1..87db1b9c 100644 --- a/dist/scriptlets.corelibs.json +++ b/dist/scriptlets.corelibs.json @@ -1,5 +1,5 @@ { - "version": "1.7.6", + "version": "1.7.10", "scriptlets": [ { "names": [ @@ -136,7 +136,13 @@ }, { "names": [ - "prevent-bab" + "prevent-bab", + "nobab.js", + "ubo-nobab.js", + "bab-defuser.js", + "ubo-bab-defuser.js", + "ubo-nobab", + "ubo-bab-defuser" ], "scriptlet": "function preventBab(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var nativeSetTimeout=window.setTimeout,babRegex=/\\.bab_elementid.$/;window.setTimeout=function(callback){if(\"string\"!=typeof callback||!babRegex.test(callback)){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeSetTimeout.apply(window,[callback].concat(args))}hit(source)};var signatures=[[\"blockadblock\"],[\"babasbm\"],[/getItem\\('babn'\\)/],[\"getElementById\",\"String.fromCharCode\",\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",\"charAt\",\"DOMContentLoaded\",\"AdBlock\",\"addEventListener\",\"doScroll\",\"fromCharCode\",\"<<2|r>>4\",\"sessionStorage\",\"clientWidth\",\"localStorage\",\"Math\",\"random\"]],nativeEval=window.eval;window.eval=function(str){if(!function(str){if(\"string\"!=typeof str)return!1;for(var i=0;i-1)&&(match+=1)}if(match/tokens.length>=.8)return!0}return!1}(str))return nativeEval(str);hit(source);var bodyEl=document.body;bodyEl&&bodyEl.style.removeProperty(\"visibility\");var el=document.getElementById(\"babasbmsgx\");el&&el.parentNode.removeChild(el)}.bind(window)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, @@ -352,7 +358,7 @@ "names": [ "set-cookie-reload" ], - "scriptlet": "function setCookieReload(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function isCookieSetWithValue(cookieString,name,value){return cookieString.split(\";\").some((function(cookieStr){var pos=cookieStr.indexOf(\"=\");if(-1===pos)return!1;var cookieName=cookieStr.slice(0,pos).trim(),cookieValue=cookieStr.slice(pos+1).trim();return name===cookieName&&value===cookieValue}))}function getLimitedCookieValue(value){if(!value)return null;var validValue,num;if(\"true\"===value)validValue=\"true\";else if(\"True\"===value)validValue=\"True\";else if(\"false\"===value)validValue=\"false\";else if(\"False\"===value)validValue=\"False\";else if(\"yes\"===value)validValue=\"yes\";else if(\"Yes\"===value)validValue=\"Yes\";else if(\"Y\"===value)validValue=\"Y\";else if(\"no\"===value)validValue=\"no\";else if(\"ok\"===value)validValue=\"ok\";else if(\"OK\"===value)validValue=\"OK\";else{if(!/^\\d+$/.test(value))return null;if(validValue=parseFloat(value),num=validValue,(Number.isNaN||window.isNaN)(num))return null;if(Math.abs(validValue)<0||Math.abs(validValue)>15)return null}return validValue}function concatCookieNameValuePath(rawName,rawValue,rawPath){return\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath),\";\")}function isValidCookiePath(rawPath){return\"/\"===rawPath||\"none\"===rawPath}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var path=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"/\";if(!isCookieSetWithValue(name,value)){var validValue=getLimitedCookieValue(value);if(null!==validValue)if(isValidCookiePath(path)){var cookieToSet=concatCookieNameValuePath(name,validValue,path);cookieToSet&&(document.cookie=cookieToSet,hit(source),isCookieSetWithValue(document.cookie,name,value)&&window.location.reload())}else logMessage(source,\"Invalid cookie path: '\".concat(path,\"'\"));else logMessage(source,\"Invalid cookie value: '\".concat(value,\"'\"))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function setCookieReload(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function isCookieSetWithValue(cookieString,name,value){return cookieString.split(\";\").some((function(cookieStr){var pos=cookieStr.indexOf(\"=\");if(-1===pos)return!1;var cookieName=cookieStr.slice(0,pos).trim(),cookieValue=cookieStr.slice(pos+1).trim();return name===cookieName&&value===cookieValue}))}function getLimitedCookieValue(value){if(!value)return null;var validValue,num;if(\"true\"===value)validValue=\"true\";else if(\"True\"===value)validValue=\"True\";else if(\"false\"===value)validValue=\"false\";else if(\"False\"===value)validValue=\"False\";else if(\"yes\"===value)validValue=\"yes\";else if(\"Yes\"===value)validValue=\"Yes\";else if(\"Y\"===value)validValue=\"Y\";else if(\"no\"===value)validValue=\"no\";else if(\"ok\"===value)validValue=\"ok\";else if(\"OK\"===value)validValue=\"OK\";else{if(!/^\\d+$/.test(value))return null;if(validValue=parseFloat(value),num=validValue,(Number.isNaN||window.isNaN)(num))return null;if(Math.abs(validValue)<0||Math.abs(validValue)>15)return null}return validValue}function concatCookieNameValuePath(rawName,rawValue,rawPath){return\"\".concat(encodeURIComponent(rawName),\"=\").concat(encodeURIComponent(rawValue),\"; \").concat(function(rawPath){if(\"/\"===rawPath)return\"path=/\";return\"\"}(rawPath),\";\")}function isValidCookiePath(rawPath){return\"/\"===rawPath||\"none\"===rawPath}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,name,value){var path=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"/\";if(!isCookieSetWithValue(document.cookie,name,value)){var validValue=getLimitedCookieValue(value);if(null!==validValue)if(isValidCookiePath(path)){var cookieToSet=concatCookieNameValuePath(name,validValue,path);cookieToSet&&(document.cookie=cookieToSet,hit(source),isCookieSetWithValue(document.cookie,name,value)&&window.location.reload())}else logMessage(source,\"Invalid cookie path: '\".concat(path,\"'\"));else logMessage(source,\"Invalid cookie value: '\".concat(value,\"'\"))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -438,7 +444,7 @@ "names": [ "prevent-element-src-loading" ], - "scriptlet": "function preventElementSrcLoading(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function safeGetDescriptor(obj,prop){var descriptor=Object.getOwnPropertyDescriptor(obj,prop);return descriptor&&descriptor.configurable?descriptor:null}function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,tagName,match){if(\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Reflect){var instance,policy,srcMockData={script:\"data:text/javascript;base64,KCk9Pnt9\",img:\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",iframe:\"data:text/html;base64, PGRpdj48L2Rpdj4=\"};if(\"script\"===tagName)instance=HTMLScriptElement;else if(\"img\"===tagName)instance=HTMLImageElement;else{if(\"iframe\"!==tagName)return;instance=HTMLIFrameElement}window.trustedTypes&&\"function\"==typeof window.trustedTypes.createPolicy&&(policy=window.trustedTypes.createPolicy(\"mock\",{createScriptURL:function(arg){return arg}}));var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(match),setMatchedAttribute=function(elem){return elem.setAttribute(source.name,\"matched\")},setAttributeHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var nodeName=thisArg.nodeName.toLowerCase(),attrName=args[0].toLowerCase(),attrValue=args[1];return\"src\"===attrName&&tagName.toLowerCase()===nodeName&&srcMockData[nodeName]&&searchRegexp.test(attrValue)?(hit(source),setMatchedAttribute(thisArg),Reflect.apply(target,thisArg,[attrName,srcMockData[nodeName]])):Reflect.apply(target,thisArg,args)}};instance.prototype.setAttribute=new Proxy(Element.prototype.setAttribute,setAttributeHandler);var origSrcDescriptor=safeGetDescriptor(instance.prototype,\"src\");if(origSrcDescriptor){Object.defineProperty(instance.prototype,\"src\",{enumerable:!0,configurable:!0,get:function(){return origSrcDescriptor.get.call(this)},set:function(urlValue){var nodeName=this.nodeName.toLowerCase();if(tagName.toLowerCase()!==nodeName||!srcMockData[nodeName]||!searchRegexp.test(urlValue))return origSrcDescriptor.set.call(this,urlValue),!0;if(policy&&urlValue instanceof TrustedScriptURL){var trustedSrc=policy.createScriptURL(urlValue);return origSrcDescriptor.set.call(this,trustedSrc),void hit(source)}setMatchedAttribute(this),origSrcDescriptor.set.call(this,srcMockData[nodeName]),hit(source)}});var origOnerrorDescriptor=safeGetDescriptor(HTMLElement.prototype,\"onerror\");if(origOnerrorDescriptor){Object.defineProperty(HTMLElement.prototype,\"onerror\",{enumerable:!0,configurable:!0,get:function(){return origOnerrorDescriptor.get.call(this)},set:function(cb){return\"matched\"===this.getAttribute(source.name)?(origOnerrorDescriptor.set.call(this,noopFunc),!0):(origOnerrorDescriptor.set.call(this,cb),!0)}});var addEventListenerHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var eventName=args[0];return\"matched\"===thisArg.getAttribute(source.name)&&\"error\"===eventName?Reflect.apply(target,thisArg,[eventName,noopFunc]):Reflect.apply(target,thisArg,args)}};EventTarget.prototype.addEventListener=new Proxy(EventTarget.prototype.addEventListener,addEventListenerHandler)}}}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventElementSrcLoading(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function safeGetDescriptor(obj,prop){var descriptor=Object.getOwnPropertyDescriptor(obj,prop);return descriptor&&descriptor.configurable?descriptor:null}function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,tagName,match){if(\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Reflect){var instance,policy,srcMockData={script:\"data:text/javascript;base64,KCk9Pnt9\",img:\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",iframe:\"data:text/html;base64, PGRpdj48L2Rpdj4=\"};if(\"script\"===tagName)instance=HTMLScriptElement;else if(\"img\"===tagName)instance=HTMLImageElement;else{if(\"iframe\"!==tagName)return;instance=HTMLIFrameElement}window.trustedTypes&&\"function\"==typeof window.trustedTypes.createPolicy&&(policy=window.trustedTypes.createPolicy(\"mock\",{createScriptURL:function(arg){return arg}}));var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(match),setMatchedAttribute=function(elem){return elem.setAttribute(source.name,\"matched\")},setAttributeHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var nodeName=thisArg.nodeName.toLowerCase(),attrName=args[0].toLowerCase(),attrValue=args[1];return\"src\"===attrName&&tagName.toLowerCase()===nodeName&&srcMockData[nodeName]&&searchRegexp.test(attrValue)?(hit(source),setMatchedAttribute(thisArg),Reflect.apply(target,thisArg,[attrName,srcMockData[nodeName]])):Reflect.apply(target,thisArg,args)}};instance.prototype.setAttribute=new Proxy(Element.prototype.setAttribute,setAttributeHandler);var origSrcDescriptor=safeGetDescriptor(instance.prototype,\"src\");if(origSrcDescriptor){Object.defineProperty(instance.prototype,\"src\",{enumerable:!0,configurable:!0,get:function(){return origSrcDescriptor.get.call(this)},set:function(urlValue){var nodeName=this.nodeName.toLowerCase();if(tagName.toLowerCase()!==nodeName||!srcMockData[nodeName]||!searchRegexp.test(urlValue))return origSrcDescriptor.set.call(this,urlValue),!0;if(policy&&urlValue instanceof TrustedScriptURL){var trustedSrc=policy.createScriptURL(urlValue);return origSrcDescriptor.set.call(this,trustedSrc),void hit(source)}setMatchedAttribute(this),origSrcDescriptor.set.call(this,srcMockData[nodeName]),hit(source)}});var origOnerrorDescriptor=safeGetDescriptor(HTMLElement.prototype,\"onerror\");if(origOnerrorDescriptor){Object.defineProperty(HTMLElement.prototype,\"onerror\",{enumerable:!0,configurable:!0,get:function(){return origOnerrorDescriptor.get.call(this)},set:function(cb){return\"matched\"===this.getAttribute(source.name)?(origOnerrorDescriptor.set.call(this,noopFunc),!0):(origOnerrorDescriptor.set.call(this,cb),!0)}});var addEventListenerHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var eventName=args[0];return\"function\"==typeof thisArg.getAttribute&&\"matched\"===thisArg.getAttribute(source.name)&&\"error\"===eventName?Reflect.apply(target,thisArg,[eventName,noopFunc]):Reflect.apply(target,thisArg,args)}};EventTarget.prototype.addEventListener=new Proxy(EventTarget.prototype.addEventListener,addEventListenerHandler)}}}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ diff --git a/dist/scriptlets.js b/dist/scriptlets.js index f9224197..60a95a88 100644 --- a/dist/scriptlets.js +++ b/dist/scriptlets.js @@ -1,7 +1,7 @@ /** * AdGuard Scriptlets - * Version 1.7.6 + * Version 1.7.10 */ (function () { @@ -3540,9 +3540,10 @@ }; window.eval = evalWrapper.bind(window); } - preventBab$2.names = ['prevent-bab', - // aliases are needed for matching the related scriptlet converted into our syntax - 'nobab.js', 'ubo-nobab.js', 'bab-defuser.js', 'ubo-bab-defuser.js', 'ubo-nobab', 'ubo-bab-defuser']; + preventBab$2.names = ['prevent-bab' + // there is no aliases for this scriptlet + ]; + preventBab$2.injections = [hit]; /* eslint-disable no-unused-vars, no-extra-bind, func-names */ @@ -5236,7 +5237,7 @@ */ function setCookieReload$1(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; - if (isCookieSetWithValue(name, value)) { + if (isCookieSetWithValue(document.cookie, name, value)) { return; } var validValue = getLimitedCookieValue(value); @@ -6360,7 +6361,7 @@ return Reflect.apply(target, thisArg, args); } var eventName = args[0]; - var isMatched = thisArg.getAttribute(source.name) === 'matched' && eventName === 'error'; + var isMatched = typeof thisArg.getAttribute === 'function' && thisArg.getAttribute(source.name) === 'matched' && eventName === 'error'; if (isMatched) { return Reflect.apply(target, thisArg, [eventName, noopFunc]); } @@ -9132,9 +9133,9 @@ * ``` */ var preventBab$1 = preventBab$2; - preventBab$1.names = ['prevent-bab' + preventBab$1.names = ['prevent-bab', // list of prevent-bab redirect aliases - ]; + 'nobab.js', 'ubo-nobab.js', 'bab-defuser.js', 'ubo-bab-defuser.js', 'ubo-nobab', 'ubo-bab-defuser']; /** * @redirect amazon-apstag @@ -13615,6 +13616,12 @@ "prebid-ads.js": "prebid-ads.js", prebid: "prebid.js", "prevent-bab": "prevent-bab.js", + "nobab.js": "prevent-bab.js", + "ubo-nobab.js": "prevent-bab.js", + "bab-defuser.js": "prevent-bab.js", + "ubo-bab-defuser.js": "prevent-bab.js", + "ubo-nobab": "prevent-bab.js", + "ubo-bab-defuser": "prevent-bab.js", "prevent-bab2": "prevent-bab2.js", "nobab2.js": "prevent-bab2.js", "prevent-fab-3.2.0": "prevent-fab-3.2.0.js", @@ -16873,7 +16880,7 @@ return Reflect.apply(target, thisArg, args); } var eventName = args[0]; - var isMatched = thisArg.getAttribute(source.name) === "matched" && eventName === "error"; + var isMatched = typeof thisArg.getAttribute === "function" && thisArg.getAttribute(source.name) === "matched" && eventName === "error"; if (isMatched) { return Reflect.apply(target, thisArg, [eventName, noopFunc]); } @@ -19867,7 +19874,7 @@ function setCookieReload(source, args) { function setCookieReload(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; - if (isCookieSetWithValue(name, value)) { + if (isCookieSetWithValue(document.cookie, name, value)) { return; } var validValue = getLimitedCookieValue(value); @@ -21680,12 +21687,6 @@ "ubo-adfly-defuser.js": preventAdfly, "ubo-adfly-defuser": preventAdfly, "prevent-bab": preventBab, - "nobab.js": preventBab, - "ubo-nobab.js": preventBab, - "bab-defuser.js": preventBab, - "ubo-bab-defuser.js": preventBab, - "ubo-nobab": preventBab, - "ubo-bab-defuser": preventBab, "prevent-element-src-loading": preventElementSrcLoading, "prevent-eval-if": preventEvalIf, "noeval-if.js": preventEvalIf, diff --git a/dist/umd/scriptlets.umd.js b/dist/umd/scriptlets.umd.js index 54f2b356..bbdb310a 100644 --- a/dist/umd/scriptlets.umd.js +++ b/dist/umd/scriptlets.umd.js @@ -1,7 +1,7 @@ /** * AdGuard Scriptlets - * Version 1.7.6 + * Version 1.7.10 */ (function (factory) { @@ -3542,9 +3542,10 @@ }; window.eval = evalWrapper.bind(window); } - preventBab$2.names = ['prevent-bab', - // aliases are needed for matching the related scriptlet converted into our syntax - 'nobab.js', 'ubo-nobab.js', 'bab-defuser.js', 'ubo-bab-defuser.js', 'ubo-nobab', 'ubo-bab-defuser']; + preventBab$2.names = ['prevent-bab' + // there is no aliases for this scriptlet + ]; + preventBab$2.injections = [hit]; /* eslint-disable no-unused-vars, no-extra-bind, func-names */ @@ -5238,7 +5239,7 @@ */ function setCookieReload$1(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/'; - if (isCookieSetWithValue(name, value)) { + if (isCookieSetWithValue(document.cookie, name, value)) { return; } var validValue = getLimitedCookieValue(value); @@ -6362,7 +6363,7 @@ return Reflect.apply(target, thisArg, args); } var eventName = args[0]; - var isMatched = thisArg.getAttribute(source.name) === 'matched' && eventName === 'error'; + var isMatched = typeof thisArg.getAttribute === 'function' && thisArg.getAttribute(source.name) === 'matched' && eventName === 'error'; if (isMatched) { return Reflect.apply(target, thisArg, [eventName, noopFunc]); } @@ -9134,9 +9135,9 @@ * ``` */ var preventBab$1 = preventBab$2; - preventBab$1.names = ['prevent-bab' + preventBab$1.names = ['prevent-bab', // list of prevent-bab redirect aliases - ]; + 'nobab.js', 'ubo-nobab.js', 'bab-defuser.js', 'ubo-bab-defuser.js', 'ubo-nobab', 'ubo-bab-defuser']; /** * @redirect amazon-apstag @@ -13617,6 +13618,12 @@ "prebid-ads.js": "prebid-ads.js", prebid: "prebid.js", "prevent-bab": "prevent-bab.js", + "nobab.js": "prevent-bab.js", + "ubo-nobab.js": "prevent-bab.js", + "bab-defuser.js": "prevent-bab.js", + "ubo-bab-defuser.js": "prevent-bab.js", + "ubo-nobab": "prevent-bab.js", + "ubo-bab-defuser": "prevent-bab.js", "prevent-bab2": "prevent-bab2.js", "nobab2.js": "prevent-bab2.js", "prevent-fab-3.2.0": "prevent-fab-3.2.0.js", @@ -16875,7 +16882,7 @@ return Reflect.apply(target, thisArg, args); } var eventName = args[0]; - var isMatched = thisArg.getAttribute(source.name) === "matched" && eventName === "error"; + var isMatched = typeof thisArg.getAttribute === "function" && thisArg.getAttribute(source.name) === "matched" && eventName === "error"; if (isMatched) { return Reflect.apply(target, thisArg, [eventName, noopFunc]); } @@ -19869,7 +19876,7 @@ function setCookieReload(source, args) { function setCookieReload(source, name, value) { var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "/"; - if (isCookieSetWithValue(name, value)) { + if (isCookieSetWithValue(document.cookie, name, value)) { return; } var validValue = getLimitedCookieValue(value); @@ -21682,12 +21689,6 @@ "ubo-adfly-defuser.js": preventAdfly, "ubo-adfly-defuser": preventAdfly, "prevent-bab": preventBab, - "nobab.js": preventBab, - "ubo-nobab.js": preventBab, - "bab-defuser.js": preventBab, - "ubo-bab-defuser.js": preventBab, - "ubo-nobab": preventBab, - "ubo-bab-defuser": preventBab, "prevent-element-src-loading": preventElementSrcLoading, "prevent-eval-if": preventEvalIf, "noeval-if.js": preventEvalIf, diff --git a/wiki/about-scriptlets.md b/wiki/about-scriptlets.md index 860ce899..a69de64d 100644 --- a/wiki/about-scriptlets.md +++ b/wiki/about-scriptlets.md @@ -308,7 +308,7 @@ defaults to match all callbacks; invalid regular expression will cause exit and Closes the browser tab immediately. > `window.close()` usage is restricted in Chrome. In this case -tab will only be closed if using AdGuard browser extension. +tab will only be closed when using AdGuard browser extension. **Syntax** ``` @@ -826,6 +826,11 @@ which is useful for debugging but not permitted for production filter lists. example.org#%#//scriptlet('prevent-fetch', '', 'emptyArr') ``` +7. Prevent all fetch calls and specify response type value + ``` + example.org#%#//scriptlet('prevent-fetch', '*', '', 'opaque') + ``` + [Scriptlet source](../src/scriptlets/prevent-fetch.js) * * * From f530ee1f7679b8fe0542059d5fcc6cdb1b14b232 Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Wed, 7 Dec 2022 14:47:51 +0300 Subject: [PATCH 15/70] add issue links to some of the 1.7.10 entries Merge in ADGUARD-FILTERS/scriptlets from improve_changelog to master Squashed commit of the following: commit df537710cc2719c2da75eee59c4fe8490e370827 Author: Stanislav A Date: Wed Dec 7 14:27:43 2022 +0300 add issue links to some of the entries --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe5c7d26..f8487501 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,9 @@ ### Fixed -* `set-cookie-reload` infinite page reloading -* breakage of `prevent-element-src-loading` due to `window` getting into `apply` wrapper -* spread of args bug at getXhrData call for `trusted-replace-xhr-response` +* `set-cookie-reload` infinite page reloading [#265](https://github.com/AdguardTeam/Scriptlets/issues/265) +* breakage of `prevent-element-src-loading` due to `window` getting into `apply` wrapper [#264](https://github.com/AdguardTeam/Scriptlets/issues/264) +* spread of args bug at `getXhrData` call for `trusted-replace-xhr-response` * request properties array not being served to `getRequestData` and `parseMatchProps` helpers ## v1.7.3 From 50c90ce4e880106f10d5b35cdc5edb16b9c08a2e Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Wed, 7 Dec 2022 14:51:12 +0300 Subject: [PATCH 16/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d061b312..ebc2c9fa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.10", + "version": "1.7.11", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From 0b98a348e3700c0e8c2ccdc6736fb250b98ce9b3 Mon Sep 17 00:00:00 2001 From: Stanislav A Date: Mon, 12 Dec 2022 14:15:45 +0300 Subject: [PATCH 17/70] init branch, bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ebc2c9fa..ca33ab34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.11", + "version": "1.8.0", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From 281eeea26f01c33058e7b96753f1517062e58ba4 Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Tue, 13 Dec 2022 13:45:29 +0300 Subject: [PATCH 18/70] AG-18239 update husky ver and add tests to pre-commit hook Merge in ADGUARD-FILTERS/scriptlets from feature/AG-18239 to release/v1.8 Squashed commit of the following: commit faf22856f02af507b0239c4120d1c62434f95700 Author: Stanislav A Date: Mon Dec 12 15:36:01 2022 +0300 update husky ver and add tests to pre-commit hook --- .husky/pre-commit | 5 + package.json | 7 +- yarn.lock | 232 ++-------------------------------------------- 3 files changed, 13 insertions(+), 231 deletions(-) create mode 100755 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000..be358538 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,5 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +yarn lint-staged +yarn test diff --git a/package.json b/package.json index ca33ab34..de2a235a 100644 --- a/package.json +++ b/package.json @@ -20,11 +20,6 @@ "eslint" ] }, - "husky": { - "hooks": { - "pre-commit": "lint-staged" - } - }, "author": "AdGuard", "license": "GPL-3.0", "repository": { @@ -75,7 +70,7 @@ "eslint-plugin-compat": "^3.9.0", "eslint-plugin-import": "^2.22.1", "fs-extra": "^10.0.1", - "husky": "^3.1.0", + "husky": "~8.0.2", "js-reporters": "^2.1.0", "kleur": "^4.1.4", "lint-staged": "^12.1.2", diff --git a/yarn.lock b/yarn.lock index a9b31b33..d68dc9c0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1436,11 +1436,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.21.tgz#d934aacc22424fe9622ebf6857370c052eae464e" integrity sha512-cHYfKsnwllYhjOzuC5q1VpguABBeecUp24yFluHpn/BQaVxB1CuQ1FSRZCzrPxrkIfWISXV2LbeoBthLWg0+0A== -"@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== - "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -1830,25 +1825,6 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1864,7 +1840,7 @@ caniuse-lite@^1.0.30001400: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001435.tgz#502c93dbd2f493bee73a408fe98e98fb1dad10b2" integrity sha512-kdCkUTjR+v4YAJelyiDTqiu82BDr4W4CP5sgTA0ZBmqn30XfS2ZghPLMowik9TPhS+psWJiUNxsqLyurDbmutA== -chalk@^2.0.0, chalk@^2.4.2: +chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1909,11 +1885,6 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -2112,16 +2083,6 @@ cosmiconfig@7.0.1: path-type "^4.0.0" yaml "^1.10.0" -cosmiconfig@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - cross-env@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" @@ -2136,17 +2097,6 @@ cross-fetch@3.1.5: dependencies: node-fetch "2.6.7" -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -2629,19 +2579,6 @@ event-stream@=3.3.4: stream-combiner "~0.0.4" through "~2.3.1" -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -2803,7 +2740,7 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^4.0.0, find-up@^4.1.0: +find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -2922,18 +2859,6 @@ get-intrinsic@^1.0.1, get-intrinsic@^1.0.2: has "^1.0.3" has-symbols "^1.0.1" -get-stdin@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" - integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -3141,22 +3066,10 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -husky@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/husky/-/husky-3.1.0.tgz#5faad520ab860582ed94f0c1a77f0f04c90b57c0" - integrity sha512-FJkPoHHB+6s4a+jwPqBudBDvYZsoQW5/HBuMSehC8qDiCe50kpcxeqFoDSlow+9I6wg47YxBoT3WxaURlrDIIQ== - dependencies: - chalk "^2.4.2" - ci-info "^2.0.0" - cosmiconfig "^5.2.1" - execa "^1.0.0" - get-stdin "^7.0.0" - opencollective-postinstall "^2.0.2" - pkg-dir "^4.2.0" - please-upgrade-node "^3.2.0" - read-pkg "^5.2.0" - run-node "^1.0.0" - slash "^3.0.0" +husky@~8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.2.tgz#5816a60db02650f1f22c8b69b928fd6bcd77a236" + integrity sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg== ieee754@^1.1.13: version "1.2.1" @@ -3178,14 +3091,6 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -3309,11 +3214,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -3408,11 +3308,6 @@ is-running@^2.1.0: resolved "https://registry.yarnpkg.com/is-running/-/is-running-2.1.0.tgz#30a73ff5cc3854e4fc25490809e9f5abf8de09e0" integrity sha1-MKc/9cw4VOT8JUkICen1q/jeCeA= -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -3521,11 +3416,6 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -3956,11 +3846,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - nise@^1.5.2: version "1.5.3" resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.3.tgz#9d2cfe37d44f57317766c6e9408a359c5d3ac1f7" @@ -4022,7 +3907,7 @@ nopt@^5.0.0: dependencies: abbrev "1" -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: +normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -4044,13 +3929,6 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -4149,11 +4027,6 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -opencollective-postinstall@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" - integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== - optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -4166,11 +4039,6 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -4242,14 +4110,6 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - parse-json@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -4290,11 +4150,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -4387,20 +4242,6 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -please-upgrade-node@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" - integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== - dependencies: - semver-compare "^1.0.0" - posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -4553,16 +4394,6 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - readable-stream@^2.0.2, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -4682,11 +4513,6 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -4785,11 +4611,6 @@ rollup@^2.70.2: optionalDependencies: fsevents "~2.3.2" -run-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" - integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== - run-parallel@^1.1.9: version "1.1.10" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" @@ -4828,11 +4649,6 @@ selenium-webdriver@^4.1.1: tmp "^0.2.1" ws ">=7.4.6" -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - "semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -4875,13 +4691,6 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -4889,11 +4698,6 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" @@ -4904,11 +4708,6 @@ sigmund@^1.0.1: resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= -signal-exit@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.6" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" @@ -5177,11 +4976,6 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -5366,11 +5160,6 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -5508,13 +5297,6 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" From 3539d16daad37dc5c2e8a8b3e2b223d426e96377 Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Tue, 13 Dec 2022 14:19:10 +0300 Subject: [PATCH 19/70] AG-13369 fix typo in trusteds descr Merge in ADGUARD-FILTERS/scriptlets from fix/AG-13369_04 to master Squashed commit of the following: commit adcf4f7890e06bf7c2adb356d62892bbc8ac986b Author: Stanislav A Date: Tue Dec 13 13:57:17 2022 +0300 fix typo in trusteds descr --- src/scriptlets/trusted-click-element.js | 2 +- wiki/about-trusted-scriptlets.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scriptlets/trusted-click-element.js b/src/scriptlets/trusted-click-element.js index 871b5712..927fddf5 100644 --- a/src/scriptlets/trusted-click-element.js +++ b/src/scriptlets/trusted-click-element.js @@ -38,7 +38,7 @@ import { * * 3. Click multiple elements by selector with a delay * ``` - * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], button[name='check"], input[type="submit"][value="akkoord"]', '', '500') + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], button[name="check"], input[type="submit"][value="akkoord"]', '', '500') * ``` * * 4. Match cookies by keys using regex and string diff --git a/wiki/about-trusted-scriptlets.md b/wiki/about-trusted-scriptlets.md index 57e27097..6747fc54 100644 --- a/wiki/about-trusted-scriptlets.md +++ b/wiki/about-trusted-scriptlets.md @@ -35,7 +35,7 @@ example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"]', '', ' 3. Click multiple elements by selector with a delay ``` -example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], button[name='check"], input[type="submit"][value="akkoord"]', '', '500') +example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], button[name="check"], input[type="submit"][value="akkoord"]', '', '500') ``` 4. Match cookies by keys using regex and string From d85c7760eb6be3dd1417885f3b9cc8123ec19746 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 13 Dec 2022 14:19:25 +0300 Subject: [PATCH 20/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ebc2c9fa..fc6b89ff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.11", + "version": "1.7.12", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From c33826b136dbf090b9b8ba8b75c442d58fb14bf8 Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Tue, 13 Dec 2022 20:55:27 +0300 Subject: [PATCH 21/70] AG-18170 improve isEmptyObject - should not be function #268 Merge in ADGUARD-FILTERS/scriptlets from fix/AG-18170 to master Squashed commit of the following: commit 039005235914c9d535f5eff1738cb0e5292491f2 Merge: 180e595 d85c776 Author: Stanislav A Date: Tue Dec 13 20:46:10 2022 +0300 Merge branch 'master' into fix/AG-18170 commit 180e59584b99fd650525e2ae9a3576e7296741df Author: Stanislav A Date: Tue Dec 13 18:05:41 2022 +0300 fix version commit 2febad39d1ad53046e49b6a8dc8265b040da2bd5 Author: Stanislav A Date: Tue Dec 13 16:51:14 2022 +0300 update changelog commit 19c6c8523b09fa735b0db036da62805dbc119552 Author: Stanislav A Date: Tue Dec 13 15:47:46 2022 +0300 improve helper commit f52e9a190229bbd93aa7501eff5614e908e14f7d Author: Stanislav A Date: Tue Dec 13 15:47:04 2022 +0300 improve helper and add tests commit 817493aafa88a5d2994c2a830c1be407ea8738ac Author: Stanislav A Date: Tue Dec 13 14:50:36 2022 +0300 improve isEmptyObject - should not be function --- CHANGELOG.md | 6 ++++++ src/helpers/object-utils.js | 2 +- tests/helpers/index.test.js | 1 + tests/helpers/object-utils.test.js | 26 ++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 tests/helpers/object-utils.test.js diff --git a/CHANGELOG.md b/CHANGELOG.md index f8487501..251e3eb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Scriptlets and Redirect Resources Changelog +## v1.7.13 + +### Fixed + +* `isEmptyObject` helper not counting `prototype` as an object property + ## v1.7.10 ### Added diff --git a/src/helpers/object-utils.js b/src/helpers/object-utils.js index 847afe3a..89a7a9b7 100644 --- a/src/helpers/object-utils.js +++ b/src/helpers/object-utils.js @@ -35,7 +35,7 @@ export const getObjectFromEntries = (entries) => { * @param {Object} obj * @returns {boolean} */ -export const isEmptyObject = (obj) => Object.keys(obj).length === 0; +export const isEmptyObject = (obj) => Object.keys(obj).length === 0 && !obj.prototype; /** * Checks whether the obj is an empty object diff --git a/tests/helpers/index.test.js b/tests/helpers/index.test.js index d5adb43a..dc518e42 100644 --- a/tests/helpers/index.test.js +++ b/tests/helpers/index.test.js @@ -3,3 +3,4 @@ import './match-stack.test'; import './noop.test'; import './number-utils.test'; import './string-utils.test'; +import './object-utils.test'; diff --git a/tests/helpers/object-utils.test.js b/tests/helpers/object-utils.test.js new file mode 100644 index 00000000..441ae062 --- /dev/null +++ b/tests/helpers/object-utils.test.js @@ -0,0 +1,26 @@ +import { isEmptyObject } from '../../src/helpers'; + +const { test, module } = QUnit; +const name = 'scriptlets-redirects helpers'; + +module(name); + +test('Test isEmptyObject works for different inputs', async (assert) => { + const emptyObj = {}; + const obj = { a: 1 }; + const emptyArr = []; + const arr = [1, 2, 3]; + function func() {} + + assert.ok(isEmptyObject(emptyObj), 'empty object returns true'); + assert.ok(isEmptyObject(emptyArr), 'empty array returns true'); + + assert.notOk(isEmptyObject(obj), 'non-empty object returns false'); + assert.notOk(isEmptyObject(arr), 'non-empty array returns false'); + + assert.notOk(isEmptyObject(EventTarget)); + assert.notOk(isEmptyObject(Array)); + assert.notOk(isEmptyObject(Object)); + assert.notOk(isEmptyObject(Function)); + assert.notOk(isEmptyObject(func)); +}); From 72508b82ccd276ec43c2013ba51ff3729c245c92 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 13 Dec 2022 20:55:39 +0300 Subject: [PATCH 22/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fc6b89ff..407b9aba 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.12", + "version": "1.7.13", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From a9d916c663acbb2314f9d8a9f1a405e03aecd9f8 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 13 Dec 2022 21:03:48 +0300 Subject: [PATCH 23/70] deploy: update dist v1.7.13 --- dist/build.txt | 2 +- dist/redirects.yml | 2 +- dist/scriptlets.corelibs.json | 32 +++++++++++++++---------------- dist/scriptlets.js | 36 +++++++++++++++++------------------ dist/umd/scriptlets.umd.js | 36 +++++++++++++++++------------------ 5 files changed, 54 insertions(+), 54 deletions(-) diff --git a/dist/build.txt b/dist/build.txt index f8ffb358..c50d1ee6 100644 --- a/dist/build.txt +++ b/dist/build.txt @@ -1 +1 @@ -version=1.7.10 \ No newline at end of file +version=1.7.13 \ No newline at end of file diff --git a/dist/redirects.yml b/dist/redirects.yml index d5034c12..3e329807 100644 --- a/dist/redirects.yml +++ b/dist/redirects.yml @@ -1,6 +1,6 @@ # # AdGuard Scriptlets (Redirects Source) -# Version 1.7.10 +# Version 1.7.13 # - title: 1x1-transparent.gif description: |- diff --git a/dist/scriptlets.corelibs.json b/dist/scriptlets.corelibs.json index 87db1b9c..de69658a 100644 --- a/dist/scriptlets.corelibs.json +++ b/dist/scriptlets.corelibs.json @@ -1,5 +1,5 @@ { - "version": "1.7.10", + "version": "1.7.13", "scriptlets": [ { "names": [ @@ -18,7 +18,7 @@ "ubo-aopr", "abp-abort-on-property-read" ], - "scriptlet": "function abortOnPropertyRead(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:abort,set:function(){}})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function abortOnPropertyRead(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:abort,set:function(){}})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -31,7 +31,7 @@ "ubo-aopw", "abp-abort-on-property-write" ], - "scriptlet": "function abortOnPropertyWrite(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:abort})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function abortOnPropertyWrite(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:abort})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -98,7 +98,7 @@ "ubo-acis", "abp-abort-current-inline-script" ], - "scriptlet": "function abortCurrentInlineScript(source,args){function randomId(){return Math.random().toString(36).substr(2,9)}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,search){var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(search),rid=randomId(),getCurrentScript=function(){if(\"currentScript\"in document)return document.currentScript;var scripts=document.getElementsByTagName(\"script\");return scripts[scripts.length-1]},ourScript=getCurrentScript(),abort=function(){var scriptEl=getCurrentScript();if(scriptEl){var str,prefix,content=scriptEl.textContent;try{content=Object.getOwnPropertyDescriptor(Node.prototype,\"textContent\").get.call(scriptEl)}catch(e){}if(0===content.length&&void 0!==scriptEl.src&&(prefix=\"data:text/javascript;base64,\",(str=scriptEl.src)&&0===str.indexOf(prefix))){var encodedContent=scriptEl.src.slice(\"data:text/javascript;base64,\".length);content=window.atob(encodedContent)}if(scriptEl instanceof HTMLScriptElement&&content.length>0&&scriptEl!==ourScript&&searchRegexp.test(content))throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)}};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(base instanceof Object!=0||null!==base)if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var currentValue=base[prop],origDescriptor=Object.getOwnPropertyDescriptor(base,prop);origDescriptor instanceof Object!=0&&origDescriptor.get instanceof Function!=0||(currentValue=base[prop],origDescriptor=void 0);var descriptorWrapper=Object.assign({isAbortingSuspended:!1,isolateCallback:function(cb){this.isAbortingSuspended=!0;try{for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var result=cb.apply(void 0,args);return this.isAbortingSuspended=!1,result}catch(_unused){var rid=randomId();throw this.isAbortingSuspended=!1,new ReferenceError(rid)}}},{currentValue:currentValue,get:function(){return this.isAbortingSuspended||this.isolateCallback(abort),origDescriptor instanceof Object?origDescriptor.get.call(base):this.currentValue},set:function(newValue){this.isAbortingSuspended||this.isolateCallback(abort),origDescriptor instanceof Object?origDescriptor.set.call(base,newValue):this.currentValue=newValue}});!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return descriptorWrapper.get.call(descriptorWrapper)},set:function(newValue){descriptorWrapper.set.call(descriptorWrapper,newValue)}})}else{var props=property.split(\".\"),propIndex=props.indexOf(prop),baseName=props[propIndex-1],message=\"The scriptlet had been executed before the \".concat(baseName,\" was loaded.\");!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,message)}}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function abortCurrentInlineScript(source,args){function randomId(){return Math.random().toString(36).substr(2,9)}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,search){var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(search),rid=randomId(),getCurrentScript=function(){if(\"currentScript\"in document)return document.currentScript;var scripts=document.getElementsByTagName(\"script\");return scripts[scripts.length-1]},ourScript=getCurrentScript(),abort=function(){var scriptEl=getCurrentScript();if(scriptEl){var str,prefix,content=scriptEl.textContent;try{content=Object.getOwnPropertyDescriptor(Node.prototype,\"textContent\").get.call(scriptEl)}catch(e){}if(0===content.length&&void 0!==scriptEl.src&&(prefix=\"data:text/javascript;base64,\",(str=scriptEl.src)&&0===str.indexOf(prefix))){var encodedContent=scriptEl.src.slice(\"data:text/javascript;base64,\".length);content=window.atob(encodedContent)}if(scriptEl instanceof HTMLScriptElement&&content.length>0&&scriptEl!==ourScript&&searchRegexp.test(content))throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)}};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(base instanceof Object!=0||null!==base)if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var currentValue=base[prop],origDescriptor=Object.getOwnPropertyDescriptor(base,prop);origDescriptor instanceof Object!=0&&origDescriptor.get instanceof Function!=0||(currentValue=base[prop],origDescriptor=void 0);var descriptorWrapper=Object.assign({isAbortingSuspended:!1,isolateCallback:function(cb){this.isAbortingSuspended=!0;try{for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var result=cb.apply(void 0,args);return this.isAbortingSuspended=!1,result}catch(_unused){var rid=randomId();throw this.isAbortingSuspended=!1,new ReferenceError(rid)}}},{currentValue:currentValue,get:function(){return this.isAbortingSuspended||this.isolateCallback(abort),origDescriptor instanceof Object?origDescriptor.get.call(base):this.currentValue},set:function(newValue){this.isAbortingSuspended||this.isolateCallback(abort),origDescriptor instanceof Object?origDescriptor.set.call(base,newValue):this.currentValue=newValue}});!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return descriptorWrapper.get.call(descriptorWrapper)},set:function(newValue){descriptorWrapper.set.call(descriptorWrapper,newValue)}})}else{var props=property.split(\".\"),propIndex=props.indexOf(prop),baseName=props[propIndex-1],message=\"The scriptlet had been executed before the \".concat(baseName,\" was loaded.\");!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,message)}}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -111,7 +111,7 @@ "ubo-set", "abp-override-property-read" ], - "scriptlet": "function setConstant(source,args){function noopFunc(){}function trueFunc(){return!0}function falseFunc(){return!1}function noopPromiseReject(){return Promise.reject()}function noopPromiseResolve(){var responseBody=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"{}\",responseUrl=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",responseType=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"default\";if(\"undefined\"!=typeof Response){var response=new Response(responseBody,{status:200,statusText:\"OK\"});return Object.defineProperties(response,{url:{value:responseUrl},type:{value:responseType}}),Promise.resolve(response)}}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&isEmptyObject(base)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function isEmptyObject(obj){return 0===Object.keys(obj).length}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,value,stack){if(property&&function(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(function(stackMatch,stackTrace){var INLINE_SCRIPT_STRING=\"inlineScript\",INJECTED_SCRIPT_STRING=\"injectedScript\",INJECTED_SCRIPT_MARKER=\"\",isInlineScript=function(stackMatch){return stackMatch.indexOf(INLINE_SCRIPT_STRING)>-1},isInjectedScript=function(stackMatch){return stackMatch.indexOf(INJECTED_SCRIPT_STRING)>-1};if(!isInlineScript(stackMatch)&&!isInjectedScript(stackMatch))return!1;var documentURL=window.location.href,pos=documentURL.indexOf(\"#\");-1!==pos&&(documentURL=documentURL.slice(0,pos));var stackLines=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).map((function(line){var stack,getStackTraceURL=/(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);if(getStackTraceURL){var stackURL=getStackTraceURL[2];if(startsWith(stackURL,\"(\")&&(stackURL=stackURL.slice(1)),startsWith(stackURL,INJECTED_SCRIPT_MARKER)){stackURL=INJECTED_SCRIPT_STRING;var stackFunction=void 0!==getStackTraceURL[1]?getStackTraceURL[1].slice(0,-1):line.slice(0,getStackTraceURL.index).trim();startsWith(stackFunction,\"at\")&&(stackFunction=stackFunction.slice(2).trim()),stack=\"\".concat(stackFunction,\" \").concat(stackURL).trim()}else stack=stackURL}else stack=line;return stack}));if(stackLines)for(var index=0;index0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(stackMatch),refinedStackTrace=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).join(\"\\n\");return Object.getOwnPropertyDescriptor(RegExp.prototype,\"test\").value.call(stackRegexp,refinedStackTrace)}(stack,(new Error).stack)){var constantValue,num;if(\"undefined\"===value)constantValue=void 0;else if(\"false\"===value)constantValue=!1;else if(\"true\"===value)constantValue=!0;else if(\"null\"===value)constantValue=null;else if(\"emptyArr\"===value)constantValue=[];else if(\"emptyObj\"===value)constantValue={};else if(\"noopFunc\"===value)constantValue=noopFunc;else if(\"trueFunc\"===value)constantValue=trueFunc;else if(\"falseFunc\"===value)constantValue=falseFunc;else if(\"noopPromiseResolve\"===value)constantValue=noopPromiseResolve;else if(\"noopPromiseReject\"===value)constantValue=noopPromiseReject;else if(/^\\d+$/.test(value)){if(num=constantValue=parseFloat(value),(Number.isNaN||window.isNaN)(num))return;if(Math.abs(constantValue)>32767)return}else if(\"-1\"===value)constantValue=-1;else if(\"\"===value)constantValue=\"\";else if(\"yes\"===value)constantValue=\"yes\";else{if(\"no\"!==value)return;constantValue=\"no\"}var canceled=!1,mustCancel=function(value){return canceled||(canceled=void 0!==value&&void 0!==constantValue&&typeof value!=typeof constantValue&&null!==value)},trapProp=function(base,prop,configurable,handler){if(!handler.init(base[prop]))return!1;var prevSetter,origDescriptor=Object.getOwnPropertyDescriptor(base,prop);if(origDescriptor instanceof Object){if(!origDescriptor.configurable){var message=\"Property '\".concat(prop,\"' is not configurable\");return function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,message),!1}base[prop]=constantValue,origDescriptor.set instanceof Function&&(prevSetter=origDescriptor.set)}return Object.defineProperty(base,prop,{configurable:configurable,get:function(){return handler.get()},set:function(a){void 0!==prevSetter&&prevSetter(a),handler.set(a)}}),!0};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain,inChainPropHandler={factValue:void 0,init:function(a){return this.factValue=a,!0},get:function(){return this.factValue},set:function(a){this.factValue!==a&&(this.factValue=a,a instanceof Object&&setChainPropAccess(a,chain))}},endPropHandler={init:function(a){return!mustCancel(a)},get:function(){return constantValue},set:function(a){mustCancel(a)&&(constantValue=a)}};if(chain)if(void 0===base||null!==base[prop]){(base instanceof Object||\"object\"==typeof base)&&isEmptyObject(base)&&trapProp(base,prop,!0,inChainPropHandler);var propValue=owner[prop];(propValue instanceof Object||\"object\"==typeof propValue&&null!==propValue)&&setChainPropAccess(propValue,chain),trapProp(base,prop,!0,inChainPropHandler)}else trapProp(base,prop,!0,inChainPropHandler);else trapProp(base,prop,!1,endPropHandler)&&function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}(window,property)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function setConstant(source,args){function noopFunc(){}function trueFunc(){return!0}function falseFunc(){return!1}function noopPromiseReject(){return Promise.reject()}function noopPromiseResolve(){var responseBody=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"{}\",responseUrl=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",responseType=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"default\";if(\"undefined\"!=typeof Response){var response=new Response(responseBody,{status:200,statusText:\"OK\"});return Object.defineProperties(response,{url:{value:responseUrl},type:{value:responseType}}),Promise.resolve(response)}}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&isEmptyObject(base)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function isEmptyObject(obj){return 0===Object.keys(obj).length&&!obj.prototype}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,value,stack){if(property&&function(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(function(stackMatch,stackTrace){var INLINE_SCRIPT_STRING=\"inlineScript\",INJECTED_SCRIPT_STRING=\"injectedScript\",INJECTED_SCRIPT_MARKER=\"\",isInlineScript=function(stackMatch){return stackMatch.indexOf(INLINE_SCRIPT_STRING)>-1},isInjectedScript=function(stackMatch){return stackMatch.indexOf(INJECTED_SCRIPT_STRING)>-1};if(!isInlineScript(stackMatch)&&!isInjectedScript(stackMatch))return!1;var documentURL=window.location.href,pos=documentURL.indexOf(\"#\");-1!==pos&&(documentURL=documentURL.slice(0,pos));var stackLines=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).map((function(line){var stack,getStackTraceURL=/(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);if(getStackTraceURL){var stackURL=getStackTraceURL[2];if(startsWith(stackURL,\"(\")&&(stackURL=stackURL.slice(1)),startsWith(stackURL,INJECTED_SCRIPT_MARKER)){stackURL=INJECTED_SCRIPT_STRING;var stackFunction=void 0!==getStackTraceURL[1]?getStackTraceURL[1].slice(0,-1):line.slice(0,getStackTraceURL.index).trim();startsWith(stackFunction,\"at\")&&(stackFunction=stackFunction.slice(2).trim()),stack=\"\".concat(stackFunction,\" \").concat(stackURL).trim()}else stack=stackURL}else stack=line;return stack}));if(stackLines)for(var index=0;index0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(stackMatch),refinedStackTrace=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).join(\"\\n\");return Object.getOwnPropertyDescriptor(RegExp.prototype,\"test\").value.call(stackRegexp,refinedStackTrace)}(stack,(new Error).stack)){var constantValue,num;if(\"undefined\"===value)constantValue=void 0;else if(\"false\"===value)constantValue=!1;else if(\"true\"===value)constantValue=!0;else if(\"null\"===value)constantValue=null;else if(\"emptyArr\"===value)constantValue=[];else if(\"emptyObj\"===value)constantValue={};else if(\"noopFunc\"===value)constantValue=noopFunc;else if(\"trueFunc\"===value)constantValue=trueFunc;else if(\"falseFunc\"===value)constantValue=falseFunc;else if(\"noopPromiseResolve\"===value)constantValue=noopPromiseResolve;else if(\"noopPromiseReject\"===value)constantValue=noopPromiseReject;else if(/^\\d+$/.test(value)){if(num=constantValue=parseFloat(value),(Number.isNaN||window.isNaN)(num))return;if(Math.abs(constantValue)>32767)return}else if(\"-1\"===value)constantValue=-1;else if(\"\"===value)constantValue=\"\";else if(\"yes\"===value)constantValue=\"yes\";else{if(\"no\"!==value)return;constantValue=\"no\"}var canceled=!1,mustCancel=function(value){return canceled||(canceled=void 0!==value&&void 0!==constantValue&&typeof value!=typeof constantValue&&null!==value)},trapProp=function(base,prop,configurable,handler){if(!handler.init(base[prop]))return!1;var prevSetter,origDescriptor=Object.getOwnPropertyDescriptor(base,prop);if(origDescriptor instanceof Object){if(!origDescriptor.configurable){var message=\"Property '\".concat(prop,\"' is not configurable\");return function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,message),!1}base[prop]=constantValue,origDescriptor.set instanceof Function&&(prevSetter=origDescriptor.set)}return Object.defineProperty(base,prop,{configurable:configurable,get:function(){return handler.get()},set:function(a){void 0!==prevSetter&&prevSetter(a),handler.set(a)}}),!0};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain,inChainPropHandler={factValue:void 0,init:function(a){return this.factValue=a,!0},get:function(){return this.factValue},set:function(a){this.factValue!==a&&(this.factValue=a,a instanceof Object&&setChainPropAccess(a,chain))}},endPropHandler={init:function(a){return!mustCancel(a)},get:function(){return constantValue},set:function(a){mustCancel(a)&&(constantValue=a)}};if(chain)if(void 0===base||null!==base[prop]){(base instanceof Object||\"object\"==typeof base)&&isEmptyObject(base)&&trapProp(base,prop,!0,inChainPropHandler);var propValue=owner[prop];(propValue instanceof Object||\"object\"==typeof propValue&&null!==propValue)&&setChainPropAccess(propValue,chain),trapProp(base,prop,!0,inChainPropHandler)}else trapProp(base,prop,!0,inChainPropHandler);else trapProp(base,prop,!1,endPropHandler)&&function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}(window,property)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -165,7 +165,7 @@ "ubo-addEventListener-logger", "ubo-aell" ], - "scriptlet": "function logAddEventListener(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function validateType(type){return void 0!==type}function validateListener(listener){return void 0!==listener&&(\"function\"==typeof listener||\"object\"==typeof listener&&null!==listener&&\"function\"==typeof listener.handleEvent)}function listenerToString(listener){return\"function\"==typeof listener?listener.toString():listener.handleEvent.toString()}function convertTypeToString(value){return void 0===value?\"undefined\":\"object\"==typeof value?null===value?\"null\":objectToString(value):value.toString()}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var nativeAddEventListener=window.EventTarget.prototype.addEventListener;function addEventListenerWrapper(type,listener){if(validateType(type)&&validateListener(listener)){var _message='addEventListener(\"'.concat(type,'\", ').concat(listenerToString(listener),\")\");logMessage(source,_message,!0),hit(source)}var message=\"Invalid event type or listener passed to addEventListener:\\ntype: \".concat(convertTypeToString(type),\"\\nlistener: \").concat(convertTypeToString(listener));logMessage(source,message,!0);for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeAddEventListener.apply(this,[type,listener].concat(args))}var descriptor={configurable:!0,set:function(){},get:function(){return addEventListenerWrapper}};Object.defineProperty(window.EventTarget.prototype,\"addEventListener\",descriptor),Object.defineProperty(window,\"addEventListener\",descriptor),Object.defineProperty(document,\"addEventListener\",descriptor)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function logAddEventListener(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function validateType(type){return void 0!==type}function validateListener(listener){return void 0!==listener&&(\"function\"==typeof listener||\"object\"==typeof listener&&null!==listener&&\"function\"==typeof listener.handleEvent)}function listenerToString(listener){return\"function\"==typeof listener?listener.toString():listener.handleEvent.toString()}function convertTypeToString(value){return void 0===value?\"undefined\":\"object\"==typeof value?null===value?\"null\":objectToString(value):value.toString()}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length&&!obj.prototype}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var nativeAddEventListener=window.EventTarget.prototype.addEventListener;function addEventListenerWrapper(type,listener){if(validateType(type)&&validateListener(listener)){var _message='addEventListener(\"'.concat(type,'\", ').concat(listenerToString(listener),\")\");logMessage(source,_message,!0),hit(source)}var message=\"Invalid event type or listener passed to addEventListener:\\ntype: \".concat(convertTypeToString(type),\"\\nlistener: \").concat(convertTypeToString(listener));logMessage(source,message,!0);for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeAddEventListener.apply(this,[type,listener].concat(args))}var descriptor={configurable:!0,set:function(){},get:function(){return addEventListenerWrapper}};Object.defineProperty(window.EventTarget.prototype,\"addEventListener\",descriptor),Object.defineProperty(window,\"addEventListener\",descriptor),Object.defineProperty(document,\"addEventListener\",descriptor)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -242,19 +242,19 @@ "names": [ "debug-on-property-read" ], - "scriptlet": "function debugOnPropertyRead(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:abort,set:noopFunc})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function debugOnPropertyRead(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:abort,set:noopFunc})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "debug-on-property-write" ], - "scriptlet": "function debugOnPropertyWrite(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:abort})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function debugOnPropertyWrite(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:abort})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "debug-current-inline-script" ], - "scriptlet": "function debugCurrentInlineScript(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,search){var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(search),rid=Math.random().toString(36).substr(2,9),getCurrentScript=function(){if(\"currentScript\"in document)return document.currentScript;var scripts=document.getElementsByTagName(\"script\");return scripts[scripts.length-1]},ourScript=getCurrentScript(),abort=function(){var scriptEl=getCurrentScript();if(scriptEl){var content=scriptEl.textContent;try{content=Object.getOwnPropertyDescriptor(Node.prototype,\"textContent\").get.call(scriptEl)}catch(e){}if(scriptEl instanceof HTMLScriptElement&&content.length>0&&scriptEl!==ourScript&&searchRegexp.test(content)){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger}}};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(base instanceof Object!=0||null!==base)if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var currentValue=base[prop];!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:function(value){abort(),currentValue=value},get:function(){return abort(),currentValue}})}else{var props=property.split(\".\"),propIndex=props.indexOf(prop),baseName=props[propIndex-1];!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(\"The scriptlet had been executed before the \".concat(baseName,\" was loaded.\"),source.verbose)}}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function debugCurrentInlineScript(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,search){var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(search),rid=Math.random().toString(36).substr(2,9),getCurrentScript=function(){if(\"currentScript\"in document)return document.currentScript;var scripts=document.getElementsByTagName(\"script\");return scripts[scripts.length-1]},ourScript=getCurrentScript(),abort=function(){var scriptEl=getCurrentScript();if(scriptEl){var content=scriptEl.textContent;try{content=Object.getOwnPropertyDescriptor(Node.prototype,\"textContent\").get.call(scriptEl)}catch(e){}if(scriptEl instanceof HTMLScriptElement&&content.length>0&&scriptEl!==ourScript&&searchRegexp.test(content)){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger}}};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(base instanceof Object!=0||null!==base)if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var currentValue=base[prop];!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:function(value){abort(),currentValue=value},get:function(){return abort(),currentValue}})}else{var props=property.split(\".\"),propIndex=props.indexOf(prop),baseName=props[propIndex-1];!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(\"The scriptlet had been executed before the \".concat(baseName,\" was loaded.\"),source.verbose)}}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -334,7 +334,7 @@ "ubo-json-prune", "abp-json-prune" ], - "scriptlet": "function jsonPrune(source,args){function getWildcardPropertyInChain(base,chain){var lookThrough=arguments.length>2&&void 0!==arguments[2]&&arguments[2],output=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],pos=chain.indexOf(\".\");if(-1===pos){if(\"*\"===chain||\"[]\"===chain)for(var key in base)Object.prototype.hasOwnProperty.call(base,key)&&output.push({base:base,prop:key});else output.push({base:base,prop:chain});return output}var prop=chain.slice(0,pos),shouldLookThrough=\"[]\"===prop&&Array.isArray(base)||\"*\"===prop&&base instanceof Object;if(shouldLookThrough){var nextProp=chain.slice(pos+1),baseKeys=Object.keys(base);baseKeys.forEach((function(key){getWildcardPropertyInChain(base[key],nextProp,lookThrough,output)}))}var nextBase=base[prop];return chain=chain.slice(pos+1),void 0!==nextBase&&getWildcardPropertyInChain(nextBase,chain,lookThrough,output),output}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToRemove,requiredInitialProps,stack){if(!stack||function(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(function(stackMatch,stackTrace){var INLINE_SCRIPT_STRING=\"inlineScript\",INJECTED_SCRIPT_STRING=\"injectedScript\",INJECTED_SCRIPT_MARKER=\"\",isInlineScript=function(stackMatch){return stackMatch.indexOf(INLINE_SCRIPT_STRING)>-1},isInjectedScript=function(stackMatch){return stackMatch.indexOf(INJECTED_SCRIPT_STRING)>-1};if(!isInlineScript(stackMatch)&&!isInjectedScript(stackMatch))return!1;var documentURL=window.location.href,pos=documentURL.indexOf(\"#\");-1!==pos&&(documentURL=documentURL.slice(0,pos));var stackLines=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).map((function(line){var stack,getStackTraceURL=/(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);if(getStackTraceURL){var stackURL=getStackTraceURL[2];if(startsWith(stackURL,\"(\")&&(stackURL=stackURL.slice(1)),startsWith(stackURL,INJECTED_SCRIPT_MARKER)){stackURL=INJECTED_SCRIPT_STRING;var stackFunction=void 0!==getStackTraceURL[1]?getStackTraceURL[1].slice(0,-1):line.slice(0,getStackTraceURL.index).trim();startsWith(stackFunction,\"at\")&&(stackFunction=stackFunction.slice(2).trim()),stack=\"\".concat(stackFunction,\" \").concat(stackURL).trim()}else stack=stackURL}else stack=line;return stack}));if(stackLines)for(var index=0;index0){var rootString=JSON.stringify(root);if(toRegExp(requiredPaths.join(\"\")).test(rootString))return logMessage(source,\"\".concat(window.location.hostname,\" \").concat(objectToString(root)),!0),!1}for(var i=0;i-1||requiredPath.indexOf(\"*.\")>-1||requiredPath.indexOf(\".*\")>-1||requiredPath.indexOf(\".[].\")>-1||requiredPath.indexOf(\"[].\")>-1||requiredPath.indexOf(\".[]\")>-1,details=getWildcardPropertyInChain(root,requiredPath,hasWildcard);shouldProcess=!hasWildcard;for(var _i=0;_i-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source))}))}))}catch(e){logMessage(source,e)}return root},nativeJSONParse=JSON.parse,jsonParseWrapper=function(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];var root=nativeJSONParse.apply(JSON,args);return jsonPruner(root)};jsonParseWrapper.toString=nativeJSONParse.toString.bind(nativeJSONParse),JSON.parse=jsonParseWrapper;var nativeResponseJson=Response.prototype.json;\"undefined\"!=typeof Response&&(Response.prototype.json=function(){return nativeResponseJson.apply(this).then((function(obj){return jsonPruner(obj)}))})}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function jsonPrune(source,args){function getWildcardPropertyInChain(base,chain){var lookThrough=arguments.length>2&&void 0!==arguments[2]&&arguments[2],output=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],pos=chain.indexOf(\".\");if(-1===pos){if(\"*\"===chain||\"[]\"===chain)for(var key in base)Object.prototype.hasOwnProperty.call(base,key)&&output.push({base:base,prop:key});else output.push({base:base,prop:chain});return output}var prop=chain.slice(0,pos),shouldLookThrough=\"[]\"===prop&&Array.isArray(base)||\"*\"===prop&&base instanceof Object;if(shouldLookThrough){var nextProp=chain.slice(pos+1),baseKeys=Object.keys(base);baseKeys.forEach((function(key){getWildcardPropertyInChain(base[key],nextProp,lookThrough,output)}))}var nextBase=base[prop];return chain=chain.slice(pos+1),void 0!==nextBase&&getWildcardPropertyInChain(nextBase,chain,lookThrough,output),output}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length&&!obj.prototype}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToRemove,requiredInitialProps,stack){if(!stack||function(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(function(stackMatch,stackTrace){var INLINE_SCRIPT_STRING=\"inlineScript\",INJECTED_SCRIPT_STRING=\"injectedScript\",INJECTED_SCRIPT_MARKER=\"\",isInlineScript=function(stackMatch){return stackMatch.indexOf(INLINE_SCRIPT_STRING)>-1},isInjectedScript=function(stackMatch){return stackMatch.indexOf(INJECTED_SCRIPT_STRING)>-1};if(!isInlineScript(stackMatch)&&!isInjectedScript(stackMatch))return!1;var documentURL=window.location.href,pos=documentURL.indexOf(\"#\");-1!==pos&&(documentURL=documentURL.slice(0,pos));var stackLines=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).map((function(line){var stack,getStackTraceURL=/(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);if(getStackTraceURL){var stackURL=getStackTraceURL[2];if(startsWith(stackURL,\"(\")&&(stackURL=stackURL.slice(1)),startsWith(stackURL,INJECTED_SCRIPT_MARKER)){stackURL=INJECTED_SCRIPT_STRING;var stackFunction=void 0!==getStackTraceURL[1]?getStackTraceURL[1].slice(0,-1):line.slice(0,getStackTraceURL.index).trim();startsWith(stackFunction,\"at\")&&(stackFunction=stackFunction.slice(2).trim()),stack=\"\".concat(stackFunction,\" \").concat(stackURL).trim()}else stack=stackURL}else stack=line;return stack}));if(stackLines)for(var index=0;index0){var rootString=JSON.stringify(root);if(toRegExp(requiredPaths.join(\"\")).test(rootString))return logMessage(source,\"\".concat(window.location.hostname,\" \").concat(objectToString(root)),!0),!1}for(var i=0;i-1||requiredPath.indexOf(\"*.\")>-1||requiredPath.indexOf(\".*\")>-1||requiredPath.indexOf(\".[].\")>-1||requiredPath.indexOf(\"[].\")>-1||requiredPath.indexOf(\".[]\")>-1,details=getWildcardPropertyInChain(root,requiredPath,hasWildcard);shouldProcess=!hasWildcard;for(var _i=0;_i-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source))}))}))}catch(e){logMessage(source,e)}return root},nativeJSONParse=JSON.parse,jsonParseWrapper=function(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];var root=nativeJSONParse.apply(JSON,args);return jsonPruner(root)};jsonParseWrapper.toString=nativeJSONParse.toString.bind(nativeJSONParse),JSON.parse=jsonParseWrapper;var nativeResponseJson=Response.prototype.json;\"undefined\"!=typeof Response&&(Response.prototype.json=function(){return nativeResponseJson.apply(this).then((function(obj){return jsonPruner(obj)}))})}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -379,7 +379,7 @@ "ubo-no-fetch-if.js", "ubo-no-fetch-if" ], - "scriptlet": "function preventFetch(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function getFetchData(args){var fetchUrl,fetchInit,entries,request,fetchPropsObj={};if(args[0]instanceof Request){var requestData=(request=args[0],entries=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"].map((function(key){return[key,request[key]]})),entries.reduce((function(acc,el){var key=el[0],value=el[1];return acc[key]=value,acc}),{}));fetchUrl=requestData.url,fetchInit=requestData}else fetchUrl=args[0],fetchInit=args[1];return fetchPropsObj.url=fetchUrl,fetchInit instanceof Object&&Object.keys(fetchInit).forEach((function(prop){fetchPropsObj[prop]=fetchInit[prop]})),fetchPropsObj}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function noopPromiseResolve(){var responseBody=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"{}\",responseUrl=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",responseType=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"default\";if(\"undefined\"!=typeof Response){var response=new Response(responseBody,{status:200,statusText:\"OK\"});return Object.defineProperties(response,{url:{value:responseUrl},type:{value:responseType}}),Promise.resolve(response)}}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToMatch){var responseBody=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"emptyObj\",responseType=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"default\";if(\"undefined\"!=typeof fetch&&\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Response){var strResponseBody;if(\"\"===responseBody||\"emptyObj\"===responseBody)strResponseBody=\"{}\";else{if(\"emptyArr\"!==responseBody)return;strResponseBody=\"[]\"}if(\"default\"===responseType||\"opaque\"===responseType){var handlerWrapper=function(target,thisArg,args){var fetchData=getFetchData(args);return void 0===propsToMatch?(logMessage(source,\"fetch( \".concat(objectToString(fetchData),\" )\"),!0),hit(source),Reflect.apply(target,thisArg,args)):matchRequestProps(source,propsToMatch,fetchData)?(hit(source),noopPromiseResolve(strResponseBody,fetchData.url,responseType)):Reflect.apply(target,thisArg,args)};fetch=new Proxy(fetch,{apply:handlerWrapper})}else logMessage(source,\"Invalid parameter: \".concat(responseType))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventFetch(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function getFetchData(args){var fetchUrl,fetchInit,entries,request,fetchPropsObj={};if(args[0]instanceof Request){var requestData=(request=args[0],entries=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"].map((function(key){return[key,request[key]]})),entries.reduce((function(acc,el){var key=el[0],value=el[1];return acc[key]=value,acc}),{}));fetchUrl=requestData.url,fetchInit=requestData}else fetchUrl=args[0],fetchInit=args[1];return fetchPropsObj.url=fetchUrl,fetchInit instanceof Object&&Object.keys(fetchInit).forEach((function(prop){fetchPropsObj[prop]=fetchInit[prop]})),fetchPropsObj}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length&&!obj.prototype}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function noopPromiseResolve(){var responseBody=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"{}\",responseUrl=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",responseType=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"default\";if(\"undefined\"!=typeof Response){var response=new Response(responseBody,{status:200,statusText:\"OK\"});return Object.defineProperties(response,{url:{value:responseUrl},type:{value:responseType}}),Promise.resolve(response)}}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToMatch){var responseBody=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"emptyObj\",responseType=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"default\";if(\"undefined\"!=typeof fetch&&\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Response){var strResponseBody;if(\"\"===responseBody||\"emptyObj\"===responseBody)strResponseBody=\"{}\";else{if(\"emptyArr\"!==responseBody)return;strResponseBody=\"[]\"}if(\"default\"===responseType||\"opaque\"===responseType){var handlerWrapper=function(target,thisArg,args){var fetchData=getFetchData(args);return void 0===propsToMatch?(logMessage(source,\"fetch( \".concat(objectToString(fetchData),\" )\"),!0),hit(source),Reflect.apply(target,thisArg,args)):matchRequestProps(source,propsToMatch,fetchData)?(hit(source),noopPromiseResolve(strResponseBody,fetchData.url,responseType)):Reflect.apply(target,thisArg,args)};fetch=new Proxy(fetch,{apply:handlerWrapper})}else logMessage(source,\"Invalid parameter: \".concat(responseType))}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -404,13 +404,13 @@ "ubo-aost", "abp-abort-on-stack-trace" ], - "scriptlet": "function abortOnStackTrace(source,args){function randomId(){return Math.random().toString(36).substr(2,9)}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function matchStackTrace(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(function(stackMatch,stackTrace){var INLINE_SCRIPT_STRING=\"inlineScript\",INJECTED_SCRIPT_STRING=\"injectedScript\",INJECTED_SCRIPT_MARKER=\"\",isInlineScript=function(stackMatch){return stackMatch.indexOf(INLINE_SCRIPT_STRING)>-1},isInjectedScript=function(stackMatch){return stackMatch.indexOf(INJECTED_SCRIPT_STRING)>-1};if(!isInlineScript(stackMatch)&&!isInjectedScript(stackMatch))return!1;var documentURL=window.location.href,pos=documentURL.indexOf(\"#\");-1!==pos&&(documentURL=documentURL.slice(0,pos));var stackSteps=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})),stackLines=stackSteps.map((function(line){var stack,getStackTraceURL=/(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);if(getStackTraceURL){var stackURL=getStackTraceURL[2];if(startsWith(stackURL,\"(\")&&(stackURL=stackURL.slice(1)),startsWith(stackURL,INJECTED_SCRIPT_MARKER)){stackURL=INJECTED_SCRIPT_STRING;var stackFunction=void 0!==getStackTraceURL[1]?getStackTraceURL[1].slice(0,-1):line.slice(0,getStackTraceURL.index).trim();startsWith(stackFunction,\"at\")&&(stackFunction=stackFunction.slice(2).trim()),stack=\"\".concat(stackFunction,\" \").concat(stackURL).trim()}else stack=stackURL}else stack=line;return stack}));if(stackLines)for(var index=0;index0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(stackMatch),refinedStackTrace=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).join(\"\\n\");return Object.getOwnPropertyDescriptor(RegExp.prototype,\"test\").value.call(stackRegexp,refinedStackTrace)}function startsWith(str,prefix){return!!str&&0===str.indexOf(prefix)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,stack){if(property&&stack){var rid=randomId(),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else if(stack.match(/^(inlineScript|injectedScript)$/)||function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(stack)){var descriptorWrapper=Object.assign({isAbortingSuspended:!1,isolateCallback:function(cb){this.isAbortingSuspended=!0;try{for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var result=cb.apply(void 0,args);return this.isAbortingSuspended=!1,result}catch(_unused){var rid=randomId();throw this.isAbortingSuspended=!1,new ReferenceError(rid)}}},{value:base[prop],get:function(){return!this.isAbortingSuspended&&this.isolateCallback(matchStackTrace,stack,(new Error).stack)&&abort(),this.value},set:function(newValue){!this.isAbortingSuspended&&this.isolateCallback(matchStackTrace,stack,(new Error).stack)&&abort(),this.value=newValue}});!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return descriptorWrapper.get.call(descriptorWrapper)},set:function(newValue){descriptorWrapper.set.call(descriptorWrapper,newValue)}})}else!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,\"Invalid parameter: \".concat(stack))}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function abortOnStackTrace(source,args){function randomId(){return Math.random().toString(36).substr(2,9)}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function matchStackTrace(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(function(stackMatch,stackTrace){var INLINE_SCRIPT_STRING=\"inlineScript\",INJECTED_SCRIPT_STRING=\"injectedScript\",INJECTED_SCRIPT_MARKER=\"\",isInlineScript=function(stackMatch){return stackMatch.indexOf(INLINE_SCRIPT_STRING)>-1},isInjectedScript=function(stackMatch){return stackMatch.indexOf(INJECTED_SCRIPT_STRING)>-1};if(!isInlineScript(stackMatch)&&!isInjectedScript(stackMatch))return!1;var documentURL=window.location.href,pos=documentURL.indexOf(\"#\");-1!==pos&&(documentURL=documentURL.slice(0,pos));var stackSteps=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})),stackLines=stackSteps.map((function(line){var stack,getStackTraceURL=/(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);if(getStackTraceURL){var stackURL=getStackTraceURL[2];if(startsWith(stackURL,\"(\")&&(stackURL=stackURL.slice(1)),startsWith(stackURL,INJECTED_SCRIPT_MARKER)){stackURL=INJECTED_SCRIPT_STRING;var stackFunction=void 0!==getStackTraceURL[1]?getStackTraceURL[1].slice(0,-1):line.slice(0,getStackTraceURL.index).trim();startsWith(stackFunction,\"at\")&&(stackFunction=stackFunction.slice(2).trim()),stack=\"\".concat(stackFunction,\" \").concat(stackURL).trim()}else stack=stackURL}else stack=line;return stack}));if(stackLines)for(var index=0;index0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(stackMatch),refinedStackTrace=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).join(\"\\n\");return Object.getOwnPropertyDescriptor(RegExp.prototype,\"test\").value.call(stackRegexp,refinedStackTrace)}function startsWith(str,prefix){return!!str&&0===str.indexOf(prefix)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,stack){if(property&&stack){var rid=randomId(),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else if(stack.match(/^(inlineScript|injectedScript)$/)||function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(stack)){var descriptorWrapper=Object.assign({isAbortingSuspended:!1,isolateCallback:function(cb){this.isAbortingSuspended=!0;try{for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var result=cb.apply(void 0,args);return this.isAbortingSuspended=!1,result}catch(_unused){var rid=randomId();throw this.isAbortingSuspended=!1,new ReferenceError(rid)}}},{value:base[prop],get:function(){return!this.isAbortingSuspended&&this.isolateCallback(matchStackTrace,stack,(new Error).stack)&&abort(),this.value},set:function(newValue){!this.isAbortingSuspended&&this.isolateCallback(matchStackTrace,stack,(new Error).stack)&&abort(),this.value=newValue}});!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return descriptorWrapper.get.call(descriptorWrapper)},set:function(newValue){descriptorWrapper.set.call(descriptorWrapper,newValue)}})}else!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,\"Invalid parameter: \".concat(stack))}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "log-on-stack-trace" ], - "scriptlet": "function logOnStacktrace(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var refineStackTrace=function(stackString){var logInfoArray=stackString.split(\"\\n\").slice(2).map((function(line){return line.replace(/ {4}at /,\"\")})).map((function(line){var funcName,funcFullPath,reg=/\\(([^\\)]+)\\)/,regFirefox=/(.*?@)(\\S+)(:\\d+):\\d+\\)?$/;return line.match(reg)?(funcName=line.split(\" \").slice(0,-1).join(\" \"),funcFullPath=line.match(reg)[1]):line.match(regFirefox)?(funcName=line.split(\"@\").slice(0,-1).join(\" \"),funcFullPath=line.match(regFirefox)[2]):(funcName=\"function name is not available\",funcFullPath=line),[funcName,funcFullPath]})),logInfoObject={};return logInfoArray.forEach((function(pair){logInfoObject[pair[0]]=pair[1]})),logInfoObject};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var value=base[prop];!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return hit(source),logMessage(source,\"Get \".concat(prop),!0),console.table(refineStackTrace((new Error).stack)),value},set:function(newValue){hit(source),logMessage(source,\"Set \".concat(prop),!0),console.table(refineStackTrace((new Error).stack)),value=newValue}})}}(window,property)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function logOnStacktrace(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var refineStackTrace=function(stackString){var logInfoArray=stackString.split(\"\\n\").slice(2).map((function(line){return line.replace(/ {4}at /,\"\")})).map((function(line){var funcName,funcFullPath,reg=/\\(([^\\)]+)\\)/,regFirefox=/(.*?@)(\\S+)(:\\d+):\\d+\\)?$/;return line.match(reg)?(funcName=line.split(\" \").slice(0,-1).join(\" \"),funcFullPath=line.match(reg)[1]):line.match(regFirefox)?(funcName=line.split(\"@\").slice(0,-1).join(\" \"),funcFullPath=line.match(regFirefox)[2]):(funcName=\"function name is not available\",funcFullPath=line),[funcName,funcFullPath]})),logInfoObject={};return logInfoArray.forEach((function(pair){logInfoObject[pair[0]]=pair[1]})),logInfoObject};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var value=base[prop];!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return hit(source),logMessage(source,\"Get \".concat(prop),!0),console.table(refineStackTrace((new Error).stack)),value},set:function(newValue){hit(source),logMessage(source,\"Set \".concat(prop),!0),console.table(refineStackTrace((new Error).stack)),value=newValue}})}}(window,property)}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -419,7 +419,7 @@ "ubo-no-xhr-if.js", "ubo-no-xhr-if" ], - "scriptlet": "function preventXHR(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function getNumberFromString(rawString){var num,parsedDelay=parseInt(rawString,10);return num=parsedDelay,(Number.isNaN||window.isNaN)(num)?null:parsedDelay}function nativeIsFinite(num){return(Number.isFinite||window.isFinite)(num)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToMatch,customResponseText){if(\"undefined\"!=typeof Proxy){var responseUrl,shouldPrevent=!1,response=\"\",responseText=\"\",openHandler={apply:function(target,thisArg,args){var xhrData={method:args[0],url:args[1]};return responseUrl=xhrData.url,void 0===propsToMatch?(logMessage(source,\"xhr( \".concat(objectToString(xhrData),\" )\"),!0),hit(source)):shouldPrevent=function(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}(source,propsToMatch,xhrData),Reflect.apply(target,thisArg,args)}},sendHandler={apply:function(target,thisArg,args){if(!shouldPrevent)return Reflect.apply(target,thisArg,args);if(\"blob\"===thisArg.responseType&&(response=new Blob),\"arraybuffer\"===thisArg.responseType&&(response=new ArrayBuffer),customResponseText){var randomText=function(customResponseText){var customResponse=customResponseText;if(\"true\"===customResponse)return Math.random().toString(36).slice(-10);if(customResponse=customResponse.replace(\"length:\",\"\"),!/^\\d+-\\d+$/.test(customResponse))return null;var min,max,rangeMin=getNumberFromString(customResponse.split(\"-\")[0]),rangeMax=getNumberFromString(customResponse.split(\"-\")[1]);if(!nativeIsFinite(rangeMin)||!nativeIsFinite(rangeMax))return null;if(rangeMin>rangeMax){var temp=rangeMin;rangeMin=rangeMax,rangeMax=temp}return rangeMax>5e5?null:function(length){for(var result=\"\",characters=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~\",charactersLength=characters.length,i=0;i-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length&&!obj.prototype}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function getNumberFromString(rawString){var num,parsedDelay=parseInt(rawString,10);return num=parsedDelay,(Number.isNaN||window.isNaN)(num)?null:parsedDelay}function nativeIsFinite(num){return(Number.isFinite||window.isFinite)(num)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,propsToMatch,customResponseText){if(\"undefined\"!=typeof Proxy){var responseUrl,shouldPrevent=!1,response=\"\",responseText=\"\",openHandler={apply:function(target,thisArg,args){var xhrData={method:args[0],url:args[1]};return responseUrl=xhrData.url,void 0===propsToMatch?(logMessage(source,\"xhr( \".concat(objectToString(xhrData),\" )\"),!0),hit(source)):shouldPrevent=function(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}(source,propsToMatch,xhrData),Reflect.apply(target,thisArg,args)}},sendHandler={apply:function(target,thisArg,args){if(!shouldPrevent)return Reflect.apply(target,thisArg,args);if(\"blob\"===thisArg.responseType&&(response=new Blob),\"arraybuffer\"===thisArg.responseType&&(response=new ArrayBuffer),customResponseText){var randomText=function(customResponseText){var customResponse=customResponseText;if(\"true\"===customResponse)return Math.random().toString(36).slice(-10);if(customResponse=customResponse.replace(\"length:\",\"\"),!/^\\d+-\\d+$/.test(customResponse))return null;var min,max,rangeMin=getNumberFromString(customResponse.split(\"-\")[0]),rangeMax=getNumberFromString(customResponse.split(\"-\")[1]);if(!nativeIsFinite(rangeMin)||!nativeIsFinite(rangeMax))return null;if(rangeMin>rangeMax){var temp=rangeMin;rangeMin=rangeMax,rangeMax=temp}return rangeMax>5e5?null:function(length){for(var result=\"\",characters=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+=~\",charactersLength=characters.length,i=0;i-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=toRegExp(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function getXhrData(method,url,async,user,password){return{method:method,url:url,async:async,user:user,password:password}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var pattern=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",replacement=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",propsToMatch=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\";if(\"undefined\"!=typeof Proxy)if(\"\"!==pattern||\"\"===replacement){var xhrData,shouldLog=\"\"===pattern&&\"\"===replacement,nativeOpen=window.XMLHttpRequest.prototype.open,nativeSend=window.XMLHttpRequest.prototype.send,shouldReplace=!1,requestHeaders=[],openWrapper=function(target,thisArg,args){if(xhrData=getXhrData.apply(null,args),shouldLog){var _message=\"xhr( \".concat(objectToString(xhrData),\" )\");return logMessage(source,_message,!0),hit(source),Reflect.apply(target,thisArg,args)}if(shouldReplace=matchRequestProps(source,propsToMatch,xhrData)){var setRequestHeaderHandler={apply:function(target,thisArg,args){return requestHeaders.push(args),Reflect.apply(target,thisArg,args)}};thisArg.setRequestHeader=new Proxy(thisArg.setRequestHeader,setRequestHeaderHandler)}return Reflect.apply(target,thisArg,args)},sendWrapper=function(target,thisArg,args){if(!shouldReplace)return Reflect.apply(target,thisArg,args);var forgedRequest=new XMLHttpRequest;forgedRequest.addEventListener(\"readystatechange\",(function(){if(4===forgedRequest.readyState){var readyState=forgedRequest.readyState,response=forgedRequest.response,responseText=forgedRequest.responseText,responseURL=forgedRequest.responseURL,responseXML=forgedRequest.responseXML,status=forgedRequest.status,statusText=forgedRequest.statusText,content=responseText||response;if(\"string\"==typeof content){var patternRegexp=\"*\"===pattern?/(\\n|.)*/:toRegExp(pattern),modifiedContent=content.replace(patternRegexp,replacement);Object.defineProperties(thisArg,{readyState:{value:readyState},response:{value:modifiedContent},responseText:{value:modifiedContent},responseURL:{value:responseURL},responseXML:{value:responseXML},status:{value:status},statusText:{value:statusText}}),setTimeout((function(){var stateEvent=new Event(\"readystatechange\");thisArg.dispatchEvent(stateEvent);var loadEvent=new Event(\"load\");thisArg.dispatchEvent(loadEvent);var loadEndEvent=new Event(\"loadend\");thisArg.dispatchEvent(loadEndEvent)}),1),hit(source)}}})),nativeOpen.apply(forgedRequest,[xhrData.method,xhrData.url]),requestHeaders.forEach((function(header){var name=header[0],value=header[1];forgedRequest.setRequestHeader(name,value)})),requestHeaders=[];try{nativeSend.call(forgedRequest,args)}catch(_unused){return Reflect.apply(target,thisArg,args)}},openHandler={apply:openWrapper},sendHandler={apply:sendWrapper};XMLHttpRequest.prototype.open=new Proxy(XMLHttpRequest.prototype.open,openHandler),XMLHttpRequest.prototype.send=new Proxy(XMLHttpRequest.prototype.send,sendHandler)}else{logMessage(source,\"Pattern argument should not be empty string.\")}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function trustedReplaceXhrResponse(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length&&!obj.prototype}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=toRegExp(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function getXhrData(method,url,async,user,password){return{method:method,url:url,async:async,user:user,password:password}}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var pattern=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",replacement=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",propsToMatch=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\";if(\"undefined\"!=typeof Proxy)if(\"\"!==pattern||\"\"===replacement){var xhrData,shouldLog=\"\"===pattern&&\"\"===replacement,nativeOpen=window.XMLHttpRequest.prototype.open,nativeSend=window.XMLHttpRequest.prototype.send,shouldReplace=!1,requestHeaders=[],openWrapper=function(target,thisArg,args){if(xhrData=getXhrData.apply(null,args),shouldLog){var _message=\"xhr( \".concat(objectToString(xhrData),\" )\");return logMessage(source,_message,!0),hit(source),Reflect.apply(target,thisArg,args)}if(shouldReplace=matchRequestProps(source,propsToMatch,xhrData)){var setRequestHeaderHandler={apply:function(target,thisArg,args){return requestHeaders.push(args),Reflect.apply(target,thisArg,args)}};thisArg.setRequestHeader=new Proxy(thisArg.setRequestHeader,setRequestHeaderHandler)}return Reflect.apply(target,thisArg,args)},sendWrapper=function(target,thisArg,args){if(!shouldReplace)return Reflect.apply(target,thisArg,args);var forgedRequest=new XMLHttpRequest;forgedRequest.addEventListener(\"readystatechange\",(function(){if(4===forgedRequest.readyState){var readyState=forgedRequest.readyState,response=forgedRequest.response,responseText=forgedRequest.responseText,responseURL=forgedRequest.responseURL,responseXML=forgedRequest.responseXML,status=forgedRequest.status,statusText=forgedRequest.statusText,content=responseText||response;if(\"string\"==typeof content){var patternRegexp=\"*\"===pattern?/(\\n|.)*/:toRegExp(pattern),modifiedContent=content.replace(patternRegexp,replacement);Object.defineProperties(thisArg,{readyState:{value:readyState},response:{value:modifiedContent},responseText:{value:modifiedContent},responseURL:{value:responseURL},responseXML:{value:responseXML},status:{value:status},statusText:{value:statusText}}),setTimeout((function(){var stateEvent=new Event(\"readystatechange\");thisArg.dispatchEvent(stateEvent);var loadEvent=new Event(\"load\");thisArg.dispatchEvent(loadEvent);var loadEndEvent=new Event(\"loadend\");thisArg.dispatchEvent(loadEndEvent)}),1),hit(source)}}})),nativeOpen.apply(forgedRequest,[xhrData.method,xhrData.url]),requestHeaders.forEach((function(header){var name=header[0],value=header[1];forgedRequest.setRequestHeader(name,value)})),requestHeaders=[];try{nativeSend.call(forgedRequest,args)}catch(_unused){return Reflect.apply(target,thisArg,args)}},openHandler={apply:openWrapper},sendHandler={apply:sendWrapper};XMLHttpRequest.prototype.open=new Proxy(XMLHttpRequest.prototype.open,openHandler),XMLHttpRequest.prototype.send=new Proxy(XMLHttpRequest.prototype.send,sendHandler)}else{logMessage(source,\"Pattern argument should not be empty string.\")}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -483,7 +483,7 @@ "names": [ "trusted-replace-fetch-response" ], - "scriptlet": "function trustedReplaceFetchResponse(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function getFetchData(args){var fetchUrl,fetchInit,entries,request,fetchPropsObj={};if(args[0]instanceof Request){var requestData=(request=args[0],entries=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"].map((function(key){return[key,request[key]]})),entries.reduce((function(acc,el){var key=el[0],value=el[1];return acc[key]=value,acc}),{}));fetchUrl=requestData.url,fetchInit=requestData}else fetchUrl=args[0],fetchInit=args[1];return fetchPropsObj.url=fetchUrl,fetchInit instanceof Object&&Object.keys(fetchInit).forEach((function(prop){fetchPropsObj[prop]=fetchInit[prop]})),fetchPropsObj}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=toRegExp(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var pattern=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",replacement=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",propsToMatch=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\";if(\"undefined\"!=typeof fetch&&\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Response)if(\"\"!==pattern||\"\"===replacement){var fetchData,shouldLog=\"\"===pattern&&\"\"===replacement,nativeFetch=fetch,handlerWrapper=function(target,thisArg,args){return fetchData=getFetchData(args),shouldLog?(logMessage(source,\"fetch( \".concat(objectToString(fetchData),\" )\"),!0),hit(source),Reflect.apply(target,thisArg,args)):matchRequestProps(source,propsToMatch,fetchData)?nativeFetch.apply(null,args).then((function(response){return response.text().then((function(bodyText){var patternRegexp=\"*\"===pattern?/(\\n|.)*/:toRegExp(pattern),modifiedTextContent=bodyText.replace(patternRegexp,replacement),forgedResponse=function(response,textContent){var bodyUsed=response.bodyUsed,headers=response.headers,ok=response.ok,redirected=response.redirected,status=response.status,statusText=response.statusText,type=response.type,url=response.url,forgedResponse=new Response(textContent,{status:status,statusText:statusText,headers:headers});return Object.defineProperties(forgedResponse,{url:{value:url},type:{value:type},ok:{value:ok},bodyUsed:{value:bodyUsed},redirected:{value:redirected}}),forgedResponse}(response,modifiedTextContent);return hit(source),forgedResponse})).catch((function(){var fetchDataStr=objectToString(fetchData),message=\"Response body can't be converted to text: \".concat(fetchDataStr);return logMessage(source,message),Reflect.apply(target,thisArg,args)}))})).catch((function(){return Reflect.apply(target,thisArg,args)})):Reflect.apply(target,thisArg,args)};fetch=new Proxy(fetch,{apply:handlerWrapper})}else logMessage(source,\"Pattern argument should not be empty string.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function trustedReplaceFetchResponse(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function getFetchData(args){var fetchUrl,fetchInit,entries,request,fetchPropsObj={};if(args[0]instanceof Request){var requestData=(request=args[0],entries=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"].map((function(key){return[key,request[key]]})),entries.reduce((function(acc,el){var key=el[0],value=el[1];return acc[key]=value,acc}),{}));fetchUrl=requestData.url,fetchInit=requestData}else fetchUrl=args[0],fetchInit=args[1];return fetchPropsObj.url=fetchUrl,fetchInit instanceof Object&&Object.keys(fetchInit).forEach((function(prop){fetchPropsObj[prop]=fetchInit[prop]})),fetchPropsObj}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length&&!obj.prototype}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}function matchRequestProps(source,propsToMatch,requestData){if(\"\"===propsToMatch||\"*\"===propsToMatch)return!0;var isMatched,PROPS_DIVIDER,PAIRS_MARKER,LEGAL_MATCH_PROPS,propsObj,data,parsedData=(PROPS_DIVIDER=\" \",PAIRS_MARKER=\":\",LEGAL_MATCH_PROPS=[\"url\",\"method\",\"headers\",\"body\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"referrer\",\"referrerPolicy\",\"integrity\",\"keepalive\",\"signal\"],propsObj={},propsToMatch.split(PROPS_DIVIDER).forEach((function(prop){var dividerInd=prop.indexOf(PAIRS_MARKER),key=prop.slice(0,dividerInd);if(-1!==LEGAL_MATCH_PROPS.indexOf(key)){var value=prop.slice(dividerInd+1);propsObj[key]=value}else propsObj.url=prop})),propsObj);if(data=parsedData,Object.values(data).every((function(value){return function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(value)}))){var matchData=function(data){var matchData={};return Object.keys(data).forEach((function(key){matchData[key]=toRegExp(data[key])})),matchData}(parsedData);isMatched=Object.keys(matchData).every((function(matchKey){var matchValue=matchData[matchKey];return Object.prototype.hasOwnProperty.call(requestData,matchKey)&&matchValue.test(requestData[matchKey])}))}else logMessage(source,\"Invalid parameter: \".concat(propsToMatch)),isMatched=!1;return isMatched}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var pattern=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",replacement=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",propsToMatch=arguments.length>3&&void 0!==arguments[3]?arguments[3]:\"\";if(\"undefined\"!=typeof fetch&&\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Response)if(\"\"!==pattern||\"\"===replacement){var fetchData,shouldLog=\"\"===pattern&&\"\"===replacement,nativeFetch=fetch,handlerWrapper=function(target,thisArg,args){return fetchData=getFetchData(args),shouldLog?(logMessage(source,\"fetch( \".concat(objectToString(fetchData),\" )\"),!0),hit(source),Reflect.apply(target,thisArg,args)):matchRequestProps(source,propsToMatch,fetchData)?nativeFetch.apply(null,args).then((function(response){return response.text().then((function(bodyText){var patternRegexp=\"*\"===pattern?/(\\n|.)*/:toRegExp(pattern),modifiedTextContent=bodyText.replace(patternRegexp,replacement),forgedResponse=function(response,textContent){var bodyUsed=response.bodyUsed,headers=response.headers,ok=response.ok,redirected=response.redirected,status=response.status,statusText=response.statusText,type=response.type,url=response.url,forgedResponse=new Response(textContent,{status:status,statusText:statusText,headers:headers});return Object.defineProperties(forgedResponse,{url:{value:url},type:{value:type},ok:{value:ok},bodyUsed:{value:bodyUsed},redirected:{value:redirected}}),forgedResponse}(response,modifiedTextContent);return hit(source),forgedResponse})).catch((function(){var fetchDataStr=objectToString(fetchData),message=\"Response body can't be converted to text: \".concat(fetchDataStr);return logMessage(source,message),Reflect.apply(target,thisArg,args)}))})).catch((function(){return Reflect.apply(target,thisArg,args)})):Reflect.apply(target,thisArg,args)};fetch=new Proxy(fetch,{apply:handlerWrapper})}else logMessage(source,\"Pattern argument should not be empty string.\")}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ diff --git a/dist/scriptlets.js b/dist/scriptlets.js index 60a95a88..7b315cc6 100644 --- a/dist/scriptlets.js +++ b/dist/scriptlets.js @@ -1,7 +1,7 @@ /** * AdGuard Scriptlets - * Version 1.7.10 + * Version 1.7.13 */ (function () { @@ -111,7 +111,7 @@ * @returns {boolean} */ var isEmptyObject = function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; }; /** @@ -2018,7 +2018,7 @@ * * 3. Click multiple elements by selector with a delay * ``` - * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], button[name='check"], input[type="submit"][value="akkoord"]', '', '500') + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], button[name="check"], input[type="submit"][value="akkoord"]', '', '500') * ``` * * 4. Match cookies by keys using regex and string @@ -13921,7 +13921,7 @@ } } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getDescriptorAddon() { return { @@ -14089,7 +14089,7 @@ } } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { @@ -14236,7 +14236,7 @@ } } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { @@ -14477,7 +14477,7 @@ return new RegExp(escaped); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getNativeRegexpTest() { return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; @@ -14962,7 +14962,7 @@ } } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { @@ -15111,7 +15111,7 @@ } function noopFunc() {} function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { @@ -15258,7 +15258,7 @@ } } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { @@ -15829,7 +15829,7 @@ return new RegExp(escaped); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getObjectEntries(object) { var keys = Object.keys(object); @@ -16018,7 +16018,7 @@ }).join(" "); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getObjectEntries(object) { var keys = Object.keys(object); @@ -16259,7 +16259,7 @@ } } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { @@ -17296,7 +17296,7 @@ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getRequestData(request) { var requestInitOptions = getRequestProps(); @@ -18577,7 +18577,7 @@ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getObjectEntries(object) { var keys = Object.keys(object); @@ -19687,7 +19687,7 @@ return native(num); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getNativeRegexpTest() { return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; @@ -20725,7 +20725,7 @@ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getRequestData(request) { var requestInitOptions = getRequestProps(); @@ -21051,7 +21051,7 @@ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getObjectEntries(object) { var keys = Object.keys(object); diff --git a/dist/umd/scriptlets.umd.js b/dist/umd/scriptlets.umd.js index bbdb310a..8348399f 100644 --- a/dist/umd/scriptlets.umd.js +++ b/dist/umd/scriptlets.umd.js @@ -1,7 +1,7 @@ /** * AdGuard Scriptlets - * Version 1.7.10 + * Version 1.7.13 */ (function (factory) { @@ -113,7 +113,7 @@ * @returns {boolean} */ var isEmptyObject = function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; }; /** @@ -2020,7 +2020,7 @@ * * 3. Click multiple elements by selector with a delay * ``` - * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], button[name='check"], input[type="submit"][value="akkoord"]', '', '500') + * example.com#%#//scriptlet('trusted-click-element', 'button[name="agree"], button[name="check"], input[type="submit"][value="akkoord"]', '', '500') * ``` * * 4. Match cookies by keys using regex and string @@ -13923,7 +13923,7 @@ } } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getDescriptorAddon() { return { @@ -14091,7 +14091,7 @@ } } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { @@ -14238,7 +14238,7 @@ } } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { @@ -14479,7 +14479,7 @@ return new RegExp(escaped); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getNativeRegexpTest() { return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; @@ -14964,7 +14964,7 @@ } } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { @@ -15113,7 +15113,7 @@ } function noopFunc() {} function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { @@ -15260,7 +15260,7 @@ } } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { @@ -15831,7 +15831,7 @@ return new RegExp(escaped); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getObjectEntries(object) { var keys = Object.keys(object); @@ -16020,7 +16020,7 @@ }).join(" "); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getObjectEntries(object) { var keys = Object.keys(object); @@ -16261,7 +16261,7 @@ } } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } var updatedArgs = args ? [].concat(source).concat(args) : [source]; try { @@ -17298,7 +17298,7 @@ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getRequestData(request) { var requestInitOptions = getRequestProps(); @@ -18579,7 +18579,7 @@ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getObjectEntries(object) { var keys = Object.keys(object); @@ -19689,7 +19689,7 @@ return native(num); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getNativeRegexpTest() { return Object.getOwnPropertyDescriptor(RegExp.prototype, "test").value; @@ -20727,7 +20727,7 @@ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getRequestData(request) { var requestInitOptions = getRequestProps(); @@ -21053,7 +21053,7 @@ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function isEmptyObject(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0 && !obj.prototype; } function getObjectEntries(object) { var keys = Object.keys(object); From 4a030ea30f0188068f1ca5e36cb45cf43b9d7a7a Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Thu, 15 Dec 2022 13:58:15 +0300 Subject: [PATCH 24/70] =?UTF-8?q?AG-17810=20improve=20googletagservices-gp?= =?UTF-8?q?t=20=E2=80=94=20recreateIframeForSlot()=20#259?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge in ADGUARD-FILTERS/scriptlets from fix/AG-17810 to release/v1.8 Squashed commit of the following: commit 7b6380a65ad7dd20c590e79fce7aa703a955f36a Author: Stanislav A Date: Thu Dec 15 13:27:07 2022 +0300 add ignoreUrls for max-len rule commit 7fe2698de55dfc316135edddce4ca036aed34e45 Author: Stanislav A Date: Wed Dec 14 20:52:19 2022 +0300 update tests for new defineSlot commit aaf62027030a0e5b427c36b40a1e97da451bd802 Author: Stanislav A Date: Wed Dec 14 20:29:29 2022 +0300 improve slot defining and add testcase commit 110f170fca543ca76edb3d62f39acbff946910e5 Author: Stanislav A Date: Wed Dec 14 19:19:02 2022 +0300 improve googletagservices-gpt — recreateIframeForSlot() --- .eslintrc | 3 +- src/redirects/googletagservices-gpt.js | 196 ++++++++++++++---- tests/redirects/googletagservices-gpt.test.js | 47 ++++- 3 files changed, 204 insertions(+), 42 deletions(-) diff --git a/.eslintrc b/.eslintrc index 4c108115..bc7d5b7b 100644 --- a/.eslintrc +++ b/.eslintrc @@ -14,7 +14,8 @@ "max-len": [ "error", { - "code": 120 + "code": 120, + "ignoreUrls": true } ], "indent": ["error", 4, { "SwitchCase": 1}], diff --git a/src/redirects/googletagservices-gpt.js b/src/redirects/googletagservices-gpt.js index d91dc177..6d04c10e 100644 --- a/src/redirects/googletagservices-gpt.js +++ b/src/redirects/googletagservices-gpt.js @@ -26,8 +26,12 @@ import { export function GoogleTagServicesGpt(source) { const slots = new Map(); const slotsById = new Map(); + const slotsPerPath = new Map(); + const slotCreatives = new Map(); const eventCallbacks = new Map(); + const gTargeting = new Map(); + const addEventListener = function (name, listener) { if (!eventCallbacks.has(name)) { eventCallbacks.set(name, new Set()); @@ -58,6 +62,32 @@ export function GoogleTagServicesGpt(source) { }); }; + const emptySlotElement = (slot) => { + const node = document.getElementById(slot.getSlotElementId()); + while (node?.lastChild) { + node.lastChild.remove(); + } + }; + + const recreateIframeForSlot = (slot) => { + const eid = `google_ads_iframe_${slot.getId()}`; + document.getElementById(eid)?.remove(); + const node = document.getElementById(slot.getSlotElementId()); + if (node) { + const f = document.createElement('iframe'); + f.id = eid; + f.srcdoc = ''; + f.style = 'position:absolute; width:0; height:0; left:0; right:0; z-index:-1; border:0'; + f.setAttribute('width', 0); + f.setAttribute('height', 0); + // https://github.com/AdguardTeam/Scriptlets/issues/259 + f.setAttribute('data-load-complete', true); + f.setAttribute('data-google-container-id', true); + f.setAttribute('sandbox', true); + node.appendChild(f); + } + }; + const displaySlot = (slot) => { if (!slot) { return; @@ -72,6 +102,8 @@ export function GoogleTagServicesGpt(source) { parent.appendChild(document.createElement('div')); } + emptySlotElement(slot); + recreateIframeForSlot(slot); fireSlotEvent('slotRenderEnded', slot); fireSlotEvent('slotRequested', slot); fireSlotEvent('slotResponseReceived', slot); @@ -105,42 +137,132 @@ export function GoogleTagServicesGpt(source) { SizeMappingBuilder.prototype.addSize = noopThis; SizeMappingBuilder.prototype.build = noopNull; - function Slot(adUnitPath, creatives, optDiv) { - this.adUnitPath = adUnitPath; - this.creatives = creatives; - this.optDiv = optDiv; + const getTargetingValue = (v) => { + if (typeof v === 'string') { + return [v]; + } + try { + return [Array.prototype.flat.call(v)[0]]; + } catch { + // do nothing + } + return []; + }; + + const updateTargeting = (targeting, map) => { + if (typeof map === 'object') { + const entries = Object.entries(map || {}); + for (const [k, v] of entries) { + targeting.set(k, getTargetingValue(v)); + } + } + }; + const defineSlot = (adUnitPath, creatives, optDiv) => { if (slotsById.has(optDiv)) { document.getElementById(optDiv)?.remove(); return slotsById.get(optDiv); } - slotsById.set(optDiv, this); - } // constructor - Slot.prototype.addService = noopThis; - Slot.prototype.clearCategoryExclusions = noopThis; - Slot.prototype.clearTargeting = noopThis; - Slot.prototype.defineSizeMapping = noopThis; - Slot.prototype.get = noopNull; - Slot.prototype.getAdUnitPath = function () { - return this.adUnitPath; - }; - Slot.prototype.getAttributeKeys = noopArray; - Slot.prototype.getCategoryExclusions = noopArray; - Slot.prototype.getDomId = function () { - return this.optDiv; - }; - Slot.prototype.getSlotElementId = function () { - return this.optDiv; + const attributes = new Map(); + const targeting = new Map(); + const exclusions = new Set(); + const response = { + advertiserId: undefined, + campaignId: undefined, + creativeId: undefined, + creativeTemplateId: undefined, + lineItemId: undefined, + }; + const sizes = [ + { + getHeight: () => 2, + getWidth: () => 2, + }, + ]; + const num = (slotsPerPath.get(adUnitPath) || 0) + 1; + slotsPerPath.set(adUnitPath, num); + const id = `${adUnitPath}_${num}`; + let clickUrl = ''; + let collapseEmptyDiv = null; + const services = new Set(); + const slot = { + addService(e) { + services.add(e); + return slot; + }, + clearCategoryExclusions: noopThis, + clearTargeting(k) { + if (k === undefined) { + targeting.clear(); + } else { + targeting.delete(k); + } + }, + defineSizeMapping(mapping) { + slotCreatives.set(optDiv, mapping); + return this; + }, + get: (k) => attributes.get(k), + getAdUnitPath: () => adUnitPath, + getAttributeKeys: () => Array.from(attributes.keys()), + getCategoryExclusions: () => Array.from(exclusions), + getClickUrl: () => clickUrl, + getCollapseEmptyDiv: () => collapseEmptyDiv, + getContentUrl: () => '', + getDivStartsCollapsed: () => null, + getDomId: () => optDiv, + getEscapedQemQueryId: () => '', + getFirstLook: () => 0, + getId: () => id, + getHtml: () => '', + getName: () => id, + getOutOfPage: () => false, + getResponseInformation: () => response, + getServices: () => Array.from(services), + getSizes: () => sizes, + getSlotElementId: () => optDiv, + getSlotId: () => slot, + getTargeting: (k) => targeting.get(k) || gTargeting.get(k) || [], + getTargetingKeys: () => Array.from( + new Set(Array.of(...gTargeting.keys(), ...targeting.keys())), + ), + getTargetingMap: () => Object.assign( + Object.fromEntries(gTargeting.entries()), + Object.fromEntries(targeting.entries()), + ), + set(k, v) { + attributes.set(k, v); + return slot; + }, + setCategoryExclusion(e) { + exclusions.add(e); + return slot; + }, + setClickUrl(u) { + clickUrl = u; + return slot; + }, + setCollapseEmptyDiv(v) { + collapseEmptyDiv = !!v; + return slot; + }, + setSafeFrameConfig: noopThis, + setTagForChildDirectedTreatment: noopThis, + setTargeting(k, v) { + targeting.set(k, getTargetingValue(v)); + return slot; + }, + toString: () => id, + updateTargetingFromMap(map) { + updateTargeting(targeting, map); + return slot; + }, + }; + slots.set(adUnitPath, slot); + slotsById.set(optDiv, slot); + slotCreatives.set(optDiv, creatives); + return slot; }; - Slot.prototype.getSlotId = noopThis; - Slot.prototype.getSizes = noopArray; - Slot.prototype.getTargeting = noopArray; - Slot.prototype.getTargetingKeys = noopArray; - Slot.prototype.set = noopThis; - Slot.prototype.setCategoryExclusion = noopThis; - Slot.prototype.setClickUrl = noopThis; - Slot.prototype.setCollapseEmptyDiv = noopThis; - Slot.prototype.setTargeting = noopThis; const pubAdsService = { addEventListener, @@ -148,7 +270,13 @@ export function GoogleTagServicesGpt(source) { clear: noopFunc, clearCategoryExclusions: noopThis, clearTagForChildDirectedTreatment: noopThis, - clearTargeting: noopThis, + clearTargeting(k) { + if (k === undefined) { + gTargeting.clear(); + } else { + gTargeting.delete(k); + } + }, collapseEmptyDivs: noopFunc, defineOutOfPagePassback() { return new PassbackSlot(); }, definePassback() { return new PassbackSlot(); }, @@ -181,8 +309,6 @@ export function GoogleTagServicesGpt(source) { updateCorrelator: noopFunc, }; - const getNewSlot = (adUnitPath, creatives, optDiv) => new Slot(adUnitPath, creatives, optDiv); - const { googletag = {} } = window; const { cmd = [] } = googletag; @@ -197,8 +323,8 @@ export function GoogleTagServicesGpt(source) { }; googletag.companionAds = () => companionAdsService; googletag.content = () => contentService; - googletag.defineOutOfPageSlot = getNewSlot; - googletag.defineSlot = getNewSlot; + googletag.defineOutOfPageSlot = defineSlot; + googletag.defineSlot = defineSlot; googletag.destroySlots = function () { slots.clear(); slotsById.clear(); diff --git a/tests/redirects/googletagservices-gpt.test.js b/tests/redirects/googletagservices-gpt.test.js index a18d23c3..b91e1494 100644 --- a/tests/redirects/googletagservices-gpt.test.js +++ b/tests/redirects/googletagservices-gpt.test.js @@ -4,7 +4,7 @@ import { runRedirect, clearGlobalProps } from '../helpers'; const { test, module } = QUnit; const name = 'googletagservices-gpt'; -const changingProps = ['hit', '__debug']; +const changingProps = ['hit', '__debug', 'googletag']; const beforeEach = () => { window.__debug = () => { @@ -73,14 +73,49 @@ test('Test Slot', (assert) => { assert.ok(window.googletag, 'window.googletag have been created'); assert.strictEqual(typeof window.googletag.defineSlot(), 'object', 'Slot has been mocked'); - const slot = window.googletag.defineSlot('1', 2, 3); + const optDiv = 3; + + const slot = window.googletag.defineSlot('1', 2, optDiv); assert.strictEqual(slot.getAdUnitPath(), '1', '.getAdUnitPath() has been mocked.'); - assert.strictEqual(slot.creatives, 2, 'constructor has been mocked.'); - assert.strictEqual(slot.optDiv, 3, 'constructor has been mocked.'); - assert.strictEqual(slot.get(), null, '.get() has been mocked.'); + assert.strictEqual(slot.getDomId(), optDiv, 'getDomId has been mocked.'); assert.strictEqual(slot.getAttributeKeys().length, 0, '.getAttributeKeys() has been mocked.'); - assert.strictEqual(slot.getSizes().length, 0, '.getSizes() has been mocked.'); + + const sizes = slot.getSizes()[0]; + assert.strictEqual(sizes.getHeight(), 2, '.getSizes() has been mocked.'); + assert.strictEqual(sizes.getWidth(), 2, '.getSizes() has been mocked.'); + assert.strictEqual(typeof slot.addService(), 'object', '.addService() has been mocked.'); assert.strictEqual(window.hit, 'FIRED', 'hit function was executed'); }); + +test('Test recreateIframeForSlot', (assert) => { + runRedirect(name); + assert.ok(window.googletag, 'window.googletag have been created'); + assert.strictEqual(typeof window.googletag.defineSlot(), 'object', 'Slot has been mocked'); + + const slotId = 'slotId'; + const container = document.createElement('div'); + container.id = slotId; + document.body.append(container); + + window.googletag.defineSlot('', '', slotId); + window.googletag.display(slotId); + + const iframe = document.querySelector(`#${slotId} > iframe`); + assert.ok(iframe instanceof HTMLIFrameElement, 'container was created'); + + const srcdoc = ''; + const mockStyle = 'position: absolute; width: 0px; height: 0px; left: 0px; right: 0px; z-index: -1; border: 0px;'; + assert.strictEqual(iframe.getAttribute('srcdoc'), srcdoc, 'srcdoc was mocked'); + assert.strictEqual(iframe.getAttribute('style'), mockStyle, 'slot was hidden by style attr'); + assert.strictEqual(iframe.getAttribute('width'), '0', 'slot was hidden by width attr'); + assert.strictEqual(iframe.getAttribute('height'), '0', 'slot was hidden by height attr'); + + // https://github.com/AdguardTeam/Scriptlets/issues/259 + assert.ok(iframe.getAttribute('data-load-complete'), 'attr was mocked'); + assert.ok(iframe.getAttribute('data-google-container-id'), 'attr was mocked'); + assert.ok(iframe.getAttribute('sandbox'), 'attr was mocked'); + + assert.strictEqual(window.hit, 'FIRED', 'hit function was executed'); +}); From b81c79c2dbd3e292a98464a14ece8d1ae278b916 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 15 Dec 2022 12:18:22 -0500 Subject: [PATCH 25/70] Fix converter for uBO's `[]`/`{}` in `set-constant` scriptlet Related issue: - https://github.com/uBlockOrigin/uBlock-issues/issues/2411 This fixes conversion of scriptlet filters such as: mirrormedia.mg#%#//scriptlet("set-constant", "dataLayer", "emptyArr") To: mirrormedia.mg##+js(set-constant, dataLayer, []) Whereas before the fix this would result in the following scriptlet: mirrormedia.mg##+js(set-constant, dataLayer, emptyArr) Which would be rejected by uBO. Similarly for `emptyObj` => `{}`. --- src/helpers/converter.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/helpers/converter.js b/src/helpers/converter.js index 9f5318a9..669d20ae 100644 --- a/src/helpers/converter.js +++ b/src/helpers/converter.js @@ -42,7 +42,11 @@ const ADG_XHR_TYPE = 'xmlhttprequest'; const ADG_SET_CONSTANT_NAME = 'set-constant'; const ADG_SET_CONSTANT_EMPTY_STRING = ''; +const ADG_SET_CONSTANT_EMPTY_ARRAY = 'emptyArr'; +const ADG_SET_CONSTANT_EMPTY_OBJECT = 'emptyObj'; const UBO_SET_CONSTANT_EMPTY_STRING = '\'\''; +const UBO_SET_CONSTANT_EMPTY_ARRAY = '[]'; +const UBO_SET_CONSTANT_EMPTY_OBJECT = '{}'; const ADG_PREVENT_FETCH_NAME = 'prevent-fetch'; const ADG_PREVENT_FETCH_EMPTY_STRING = ''; @@ -250,6 +254,12 @@ export const convertAdgScriptletToUbo = (rule) => { if (parsedName === ADG_SET_CONSTANT_NAME && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) { preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_STRING]; + } else if (parsedName === ADG_SET_CONSTANT_NAME + && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_ARRAY) { + preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_ARRAY]; + } else if (parsedName === ADG_SET_CONSTANT_NAME + && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_OBJECT) { + preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_OBJECT]; } else if (parsedName === ADG_PREVENT_FETCH_NAME // https://github.com/AdguardTeam/Scriptlets/issues/109 && (parsedParams[0] === ADG_PREVENT_FETCH_WILDCARD From d318f9e74f59564271767256afb3fa70590478ae Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Fri, 16 Dec 2022 13:01:31 +0200 Subject: [PATCH 26/70] fix readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index af622964..d13db534 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# AdGuard Scriptlets and Redirect resources +# AdGuard Scriptlets and Redirect Resources AdGuard's Scriptlets and Redirect resources library which provides extended capabilities for content blocking. From b750784ad8839a5d208b5376dc3644da6cb993f7 Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Fri, 16 Dec 2022 13:11:46 +0200 Subject: [PATCH 27/70] fix converter comments --- src/helpers/converter.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/helpers/converter.js b/src/helpers/converter.js index 669d20ae..6dafe996 100644 --- a/src/helpers/converter.js +++ b/src/helpers/converter.js @@ -250,11 +250,12 @@ export const convertAdgScriptletToUbo = (rule) => { const { name: parsedName, args: parsedParams } = parseRule(rule); let preparedParams; - // https://github.com/AdguardTeam/FiltersCompiler/issues/102 if (parsedName === ADG_SET_CONSTANT_NAME + // https://github.com/AdguardTeam/FiltersCompiler/issues/102 && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) { preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_STRING]; } else if (parsedName === ADG_SET_CONSTANT_NAME + // https://github.com/uBlockOrigin/uBlock-issues/issues/2411 && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_ARRAY) { preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_ARRAY]; } else if (parsedName === ADG_SET_CONSTANT_NAME From 4c0174335f7d49da3970694578ff0964e09a9be8 Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Fri, 16 Dec 2022 13:12:23 +0200 Subject: [PATCH 28/70] add few simple tests --- tests/lib-tests/index.test.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/lib-tests/index.test.js b/tests/lib-tests/index.test.js index 97aa3a78..0055d125 100644 --- a/tests/lib-tests/index.test.js +++ b/tests/lib-tests/index.test.js @@ -246,6 +246,16 @@ test('Test SCRIPTLET converting - ADG -> UBO', (assert) => { inputAdg = 'example.com#%#//scriptlet(\'close-window\')'; expectedUbo = 'example.com##+js(window-close-if)'; assert.strictEqual(convertAdgScriptletToUbo(inputAdg), expectedUbo); + + // emptyArr as set-constant parameter + inputAdg = "example.org#%#//scriptlet('set-constant', 'adUnits', 'emptyArr')"; + expectedUbo = 'example.org##+js(set-constant, adUnits, [])'; + assert.strictEqual(convertAdgScriptletToUbo(inputAdg), expectedUbo); + + // emptyObj as set-constant parameter + inputAdg = "example.org#%#//scriptlet('set-constant', 'adUnits', 'emptyObj')"; + expectedUbo = 'example.org##+js(set-constant, adUnits, {})'; + assert.strictEqual(convertAdgScriptletToUbo(inputAdg), expectedUbo); }); test('Test $redirect validation', (assert) => { From a7a663d23f1f0ab009be027bf9656c582c172402 Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Fri, 16 Dec 2022 13:13:25 +0200 Subject: [PATCH 29/70] update changelog --- CHANGELOG.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 251e3eb2..fa6b9ae6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,20 @@ # Scriptlets and Redirect Resources Changelog + +## v1.7.14 + +### Added + +* `set-constant` ADG→UBO conversion for `emptyArr` and `emptyObj` + + ## v1.7.13 -### Fixed +### Fixed * `isEmptyObject` helper not counting `prototype` as an object property + ## v1.7.10 ### Added @@ -19,6 +28,7 @@ * spread of args bug at `getXhrData` call for `trusted-replace-xhr-response` * request properties array not being served to `getRequestData` and `parseMatchProps` helpers + ## v1.7.3 ### Added From 993c7648279c7c6c7eb7ee8f3ef92724fe584651 Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Fri, 16 Dec 2022 13:15:54 +0200 Subject: [PATCH 30/70] add related issue link to changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa6b9ae6..dc286d49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ ### Added -* `set-constant` ADG→UBO conversion for `emptyArr` and `emptyObj` +* `set-constant` ADG→UBO conversion for [`emptyArr` and `emptyObj`](https://github.com/uBlockOrigin/uBlock-issues/issues/2411) ## v1.7.13 From 7fd04c90b2eb89db80d3fb287b797b461ec53524 Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Fri, 16 Dec 2022 16:42:20 +0300 Subject: [PATCH 31/70] AG-17893 Add googletagmanager-gtm to compatibility-redirect #260 Merge in ADGUARD-FILTERS/scriptlets from fix/AG-17893 to release/v1.8 Squashed commit of the following: commit 38f310336e3c56548e2343941c45afd7263f74cc Author: Stanislav A Date: Fri Dec 16 15:59:23 2022 +0300 Add googletagmanager-gtm to compatibility-redirect --- src/helpers/compatibility-redirects.js | 5 +++++ tests/lib-tests/index.test.js | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/src/helpers/compatibility-redirects.js b/src/helpers/compatibility-redirects.js index abce2dc0..6fc84620 100644 --- a/src/helpers/compatibility-redirects.js +++ b/src/helpers/compatibility-redirects.js @@ -71,6 +71,11 @@ const redirects = [ adg: 'googletagmanager-gtm', ubo: 'google-analytics_ga.js', }, + { + // https://github.com/AdguardTeam/Scriptlets/issues/260 + adg: 'googletagmanager-gtm', + ubo: 'googletagmanager_gtm.js', + }, { adg: 'googletagservices-gpt', ubo: 'googletagservices_gpt.js', diff --git a/tests/lib-tests/index.test.js b/tests/lib-tests/index.test.js index 97aa3a78..979b5a25 100644 --- a/tests/lib-tests/index.test.js +++ b/tests/lib-tests/index.test.js @@ -428,6 +428,10 @@ test('Test REDIRECT-RULE converting - UBO -> ADG', (assert) => { uboRule = '||googlesyndication.com^$script,redirect-rule=googlesyndication_adsbygoogle.js,domain=darmowa-tv.ws'; expectedAdgRule = '||googlesyndication.com^$script,redirect-rule=googlesyndication-adsbygoogle,domain=darmowa-tv.ws'; assert.strictEqual(convertRedirectToAdg(uboRule), expectedAdgRule); + + uboRule = '||googletagmanager.com/gtag/js$script,redirect-rule=googletagmanager_gtm.js'; + expectedAdgRule = '||googletagmanager.com/gtag/js$script,redirect-rule=googletagmanager-gtm'; + assert.strictEqual(convertRedirectToAdg(uboRule), expectedAdgRule); }); test('Test REDIRECT converting - ABP -> ADG', (assert) => { From 092c388abb134f16803c87326a16cb8c73a61dd7 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Fri, 16 Dec 2022 17:43:32 +0300 Subject: [PATCH 32/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 407b9aba..977fdf06 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.13", + "version": "1.7.14", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From b59a0002989a06cab3ae1c5b85967937a940dc44 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Fri, 16 Dec 2022 17:53:17 +0300 Subject: [PATCH 33/70] deploy: update dist v1.7.14 --- dist/build.txt | 2 +- dist/redirects.yml | 2 +- dist/scriptlets.corelibs.json | 2 +- dist/scriptlets.js | 15 +++++++++++++-- dist/umd/scriptlets.umd.js | 15 +++++++++++++-- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/dist/build.txt b/dist/build.txt index c50d1ee6..72708e25 100644 --- a/dist/build.txt +++ b/dist/build.txt @@ -1 +1 @@ -version=1.7.13 \ No newline at end of file +version=1.7.14 \ No newline at end of file diff --git a/dist/redirects.yml b/dist/redirects.yml index 3e329807..14156768 100644 --- a/dist/redirects.yml +++ b/dist/redirects.yml @@ -1,6 +1,6 @@ # # AdGuard Scriptlets (Redirects Source) -# Version 1.7.13 +# Version 1.7.14 # - title: 1x1-transparent.gif description: |- diff --git a/dist/scriptlets.corelibs.json b/dist/scriptlets.corelibs.json index de69658a..6f6c280f 100644 --- a/dist/scriptlets.corelibs.json +++ b/dist/scriptlets.corelibs.json @@ -1,5 +1,5 @@ { - "version": "1.7.13", + "version": "1.7.14", "scriptlets": [ { "names": [ diff --git a/dist/scriptlets.js b/dist/scriptlets.js index 7b315cc6..a8281498 100644 --- a/dist/scriptlets.js +++ b/dist/scriptlets.js @@ -1,7 +1,7 @@ /** * AdGuard Scriptlets - * Version 1.7.13 + * Version 1.7.14 */ (function () { @@ -7886,7 +7886,11 @@ var ADG_XHR_TYPE = 'xmlhttprequest'; var ADG_SET_CONSTANT_NAME = 'set-constant'; var ADG_SET_CONSTANT_EMPTY_STRING = ''; + var ADG_SET_CONSTANT_EMPTY_ARRAY = 'emptyArr'; + var ADG_SET_CONSTANT_EMPTY_OBJECT = 'emptyObj'; var UBO_SET_CONSTANT_EMPTY_STRING = '\'\''; + var UBO_SET_CONSTANT_EMPTY_ARRAY = '[]'; + var UBO_SET_CONSTANT_EMPTY_OBJECT = '{}'; var ADG_PREVENT_FETCH_NAME = 'prevent-fetch'; var ADG_PREVENT_FETCH_EMPTY_STRING = ''; var ADG_PREVENT_FETCH_WILDCARD = '*'; @@ -8078,9 +8082,16 @@ parsedName = _parseRule.name, parsedParams = _parseRule.args; var preparedParams; + if (parsedName === ADG_SET_CONSTANT_NAME // https://github.com/AdguardTeam/FiltersCompiler/issues/102 - if (parsedName === ADG_SET_CONSTANT_NAME && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) { + && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) { preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_STRING]; + } else if (parsedName === ADG_SET_CONSTANT_NAME + // https://github.com/uBlockOrigin/uBlock-issues/issues/2411 + && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_ARRAY) { + preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_ARRAY]; + } else if (parsedName === ADG_SET_CONSTANT_NAME && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_OBJECT) { + preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_OBJECT]; } else if (parsedName === ADG_PREVENT_FETCH_NAME // https://github.com/AdguardTeam/Scriptlets/issues/109 && (parsedParams[0] === ADG_PREVENT_FETCH_WILDCARD || parsedParams[0] === ADG_PREVENT_FETCH_EMPTY_STRING)) { diff --git a/dist/umd/scriptlets.umd.js b/dist/umd/scriptlets.umd.js index 8348399f..aeb50d15 100644 --- a/dist/umd/scriptlets.umd.js +++ b/dist/umd/scriptlets.umd.js @@ -1,7 +1,7 @@ /** * AdGuard Scriptlets - * Version 1.7.13 + * Version 1.7.14 */ (function (factory) { @@ -7888,7 +7888,11 @@ var ADG_XHR_TYPE = 'xmlhttprequest'; var ADG_SET_CONSTANT_NAME = 'set-constant'; var ADG_SET_CONSTANT_EMPTY_STRING = ''; + var ADG_SET_CONSTANT_EMPTY_ARRAY = 'emptyArr'; + var ADG_SET_CONSTANT_EMPTY_OBJECT = 'emptyObj'; var UBO_SET_CONSTANT_EMPTY_STRING = '\'\''; + var UBO_SET_CONSTANT_EMPTY_ARRAY = '[]'; + var UBO_SET_CONSTANT_EMPTY_OBJECT = '{}'; var ADG_PREVENT_FETCH_NAME = 'prevent-fetch'; var ADG_PREVENT_FETCH_EMPTY_STRING = ''; var ADG_PREVENT_FETCH_WILDCARD = '*'; @@ -8080,9 +8084,16 @@ parsedName = _parseRule.name, parsedParams = _parseRule.args; var preparedParams; + if (parsedName === ADG_SET_CONSTANT_NAME // https://github.com/AdguardTeam/FiltersCompiler/issues/102 - if (parsedName === ADG_SET_CONSTANT_NAME && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) { + && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_STRING) { preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_STRING]; + } else if (parsedName === ADG_SET_CONSTANT_NAME + // https://github.com/uBlockOrigin/uBlock-issues/issues/2411 + && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_ARRAY) { + preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_ARRAY]; + } else if (parsedName === ADG_SET_CONSTANT_NAME && parsedParams[1] === ADG_SET_CONSTANT_EMPTY_OBJECT) { + preparedParams = [parsedParams[0], UBO_SET_CONSTANT_EMPTY_OBJECT]; } else if (parsedName === ADG_PREVENT_FETCH_NAME // https://github.com/AdguardTeam/Scriptlets/issues/109 && (parsedParams[0] === ADG_PREVENT_FETCH_WILDCARD || parsedParams[0] === ADG_PREVENT_FETCH_EMPTY_STRING)) { From f0fbd119b8db11ae61361bf04b8488df29e023a2 Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Mon, 19 Dec 2022 20:01:21 +0300 Subject: [PATCH 34/70] AG-18132 handle getScriptletFunction calls on unknown scriptlet names Merge in ADGUARD-FILTERS/scriptlets from fix/AG-18132 to release/v1.8 Squashed commit of the following: commit 0beb472b267281206429976b209ff068bad1bef3 Merge: 481ed62 7fd04c9 Author: Stanislav A Date: Mon Dec 19 19:55:37 2022 +0300 Merge branch 'release/v1.8' into fix/AG-18132 commit 481ed62304bae9be28168f5b5137278cfbad4869 Author: Stanislav A Date: Fri Dec 16 21:57:14 2022 +0300 add comment commit dc38b52a3ead6e3f65e937f584d21ed1689b6c5d Author: Stanislav A Date: Thu Dec 15 21:41:26 2022 +0300 refactor and update readme commit 35440f5078575fd5de0d06d8b573f32aea7ec6f9 Author: Stanislav A Date: Thu Dec 15 19:53:30 2022 +0300 Handle getScriptletFunction calls on unknown scriptlet names --- README.md | 5 +++-- src/scriptlets/index.js | 14 +++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index af622964..24c3ca5a 100644 --- a/README.md +++ b/README.md @@ -161,9 +161,10 @@ And also there is a module at `dist/scriptlets.js` which has been exported to a ```javascript /** - * Returns scriptlet code + * Returns scriptlet code by param * @param {Source} source - * @returns {string} + * @returns {string|null} scriptlet code + * @throws on unknown scriptlet name */ scriptlets.invoke(source); ``` diff --git a/src/scriptlets/index.js b/src/scriptlets/index.js index 69aba887..c3d618e8 100644 --- a/src/scriptlets/index.js +++ b/src/scriptlets/index.js @@ -29,16 +29,24 @@ import { getScriptletFunction } from '../../tmp/scriptlets-func'; * Returns scriptlet code by param * @param {Source} source * @returns {string|null} scriptlet code + * @throws on unknown scriptlet name */ function getScriptletCode(source) { if (!validator.isValidScriptletName(source.name)) { return null; } - const scriptletFunction = getScriptletFunction(source.name).toString(); + const scriptletFunction = getScriptletFunction(source.name); + // In case isValidScriptletName check will pass invalid scriptlet name, + // for example when there is a bad alias + if (typeof scriptletFunction !== 'function') { + throw new Error(`Error: cannot invoke scriptlet with name: '${source.name}'`); + } + const scriptletFunctionString = scriptletFunction.toString(); + const result = source.engine === 'corelibs' || source.engine === 'test' - ? wrapInNonameFunc(scriptletFunction) - : passSourceAndProps(source, scriptletFunction); + ? wrapInNonameFunc(scriptletFunctionString) + : passSourceAndProps(source, scriptletFunctionString); return result; } From 075bc589c1869d715b16b88b93c14c4acfea170b Mon Sep 17 00:00:00 2001 From: Dmitry Seregin Date: Tue, 20 Dec 2022 12:16:42 +0300 Subject: [PATCH 35/70] AG-18402: replaced .substr by .slice Merge in ADGUARD-FILTERS/scriptlets from fixes/AG-18402 to master Squashed commit of the following: commit 8d0a8630ced42033a385ee35cb003384cc67bbd3 Author: Slava Leleka Date: Mon Dec 19 20:29:44 2022 +0200 fix randomId comment commit 82cacf5778ae5f5df61e1860be06739d86cfef02 Author: Dmitriy Seregin Date: Mon Dec 19 19:17:20 2022 +0400 AG-18402: replaced .substr by .slice --- dist/redirect-files/prevent-popads-net.js | 2 +- dist/redirects.json | 2 +- dist/redirects.yml | 2 +- dist/scriptlets.corelibs.json | 16 ++++++++-------- dist/scriptlets.js | 18 +++++++++--------- dist/umd/scriptlets.umd.js | 18 +++++++++--------- src/helpers/random-id.js | 4 ++-- 7 files changed, 31 insertions(+), 31 deletions(-) diff --git a/dist/redirect-files/prevent-popads-net.js b/dist/redirect-files/prevent-popads-net.js index d1041256..d42129f8 100644 --- a/dist/redirect-files/prevent-popads-net.js +++ b/dist/redirect-files/prevent-popads-net.js @@ -33,7 +33,7 @@ }; } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function hit(source) { if (source.verbose !== true) { diff --git a/dist/redirects.json b/dist/redirects.json index 0f177f90..5619c040 100644 --- a/dist/redirects.json +++ b/dist/redirects.json @@ -362,7 +362,7 @@ ], "isBlocking": false, "contentType": "application/javascript;base64", - "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIHJpZD1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiw5KSx0aHJvd0Vycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKHJpZCl9O2RlbGV0ZSB3aW5kb3cuUG9wQWRzLGRlbGV0ZSB3aW5kb3cucG9wbnMsT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LHtQb3BBZHM6e3NldDp0aHJvd0Vycm9yfSxwb3Buczp7c2V0OnRocm93RXJyb3J9fSksd2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24ocmlkKXt2YXIgbmF0aXZlT25FcnJvcj13aW5kb3cub25lcnJvcjtyZXR1cm4gZnVuY3Rpb24oZXJyb3Ipe2lmKCJzdHJpbmciPT10eXBlb2YgZXJyb3ImJi0xIT09ZXJyb3IuaW5kZXhPZihyaWQpKXJldHVybiEwO2lmKG5hdGl2ZU9uRXJyb3IgaW5zdGFuY2VvZiBGdW5jdGlvbil7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1uZXcgQXJyYXkoX2xlbj4xP19sZW4tMTowKSxfa2V5PTE7X2tleTxfbGVuO19rZXkrKylhcmdzW19rZXktMV09YXJndW1lbnRzW19rZXldO3JldHVybiBuYXRpdmVPbkVycm9yLmFwcGx5KHRoaXMsW2Vycm9yXS5jb25jYXQoYXJncykpfXJldHVybiExfX0ocmlkKS5iaW5kKCksZnVuY3Rpb24oc291cmNlKXtpZighMD09PXNvdXJjZS52ZXJib3NlKXt0cnl7dmFyIGxvZz1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLHRyYWNlPWNvbnNvbGUudHJhY2UuYmluZChjb25zb2xlKSxwcmVmaXg9c291cmNlLnJ1bGVUZXh0fHwiIjtpZihzb3VyY2UuZG9tYWluTmFtZSl7dmFyIHJ1bGVTdGFydEluZGV4LEFHX1NDUklQVExFVF9NQVJLRVI9IiMlIy8vIixVQk9fU0NSSVBUTEVUX01BUktFUj0iIyMranMiO3NvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpPi0xP3J1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKEFHX1NDUklQVExFVF9NQVJLRVIpOnNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKT4tMSYmKHJ1bGVTdGFydEluZGV4PXNvdXJjZS5ydWxlVGV4dC5pbmRleE9mKFVCT19TQ1JJUFRMRVRfTUFSS0VSKSk7dmFyIHJ1bGVQYXJ0PXNvdXJjZS5ydWxlVGV4dC5zbGljZShydWxlU3RhcnRJbmRleCk7cHJlZml4PSIiLmNvbmNhdChzb3VyY2UuZG9tYWluTmFtZSkuY29uY2F0KHJ1bGVQYXJ0KX1sb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIHN0YXJ0IikpLHRyYWNlJiZ0cmFjZSgpLGxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2UgZW5kIikpfWNhdGNoKGUpe30iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9fZGVidWcmJndpbmRvdy5fX2RlYnVnKHNvdXJjZSl9fShzb3VyY2UpfSkuYXBwbHkodGhpcyx1cGRhdGVkQXJncyl9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9fSh7bmFtZToicHJldmVudC1wb3BhZHMtbmV0IixhcmdzOltdfSxbXSk7" + "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtjb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIHJpZD1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLDkpLHRocm93RXJyb3I9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IocmlkKX07ZGVsZXRlIHdpbmRvdy5Qb3BBZHMsZGVsZXRlIHdpbmRvdy5wb3BucyxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3cse1BvcEFkczp7c2V0OnRocm93RXJyb3J9LHBvcG5zOntzZXQ6dGhyb3dFcnJvcn19KSx3aW5kb3cub25lcnJvcj1mdW5jdGlvbihyaWQpe3ZhciBuYXRpdmVPbkVycm9yPXdpbmRvdy5vbmVycm9yO3JldHVybiBmdW5jdGlvbihlcnJvcil7aWYoInN0cmluZyI9PXR5cGVvZiBlcnJvciYmLTEhPT1lcnJvci5pbmRleE9mKHJpZCkpcmV0dXJuITA7aWYobmF0aXZlT25FcnJvciBpbnN0YW5jZW9mIEZ1bmN0aW9uKXtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPW5ldyBBcnJheShfbGVuPjE/X2xlbi0xOjApLF9rZXk9MTtfa2V5PF9sZW47X2tleSsrKWFyZ3NbX2tleS0xXT1hcmd1bWVudHNbX2tleV07cmV0dXJuIG5hdGl2ZU9uRXJyb3IuYXBwbHkodGhpcyxbZXJyb3JdLmNvbmNhdChhcmdzKSl9cmV0dXJuITF9fShyaWQpLmJpbmQoKSxmdW5jdGlvbihzb3VyY2Upe2lmKCEwPT09c291cmNlLnZlcmJvc2Upe3RyeXt2YXIgbG9nPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksdHJhY2U9Y29uc29sZS50cmFjZS5iaW5kKGNvbnNvbGUpLHByZWZpeD1zb3VyY2UucnVsZVRleHR8fCIiO2lmKHNvdXJjZS5kb21haW5OYW1lKXt2YXIgcnVsZVN0YXJ0SW5kZXgsQUdfU0NSSVBUTEVUX01BUktFUj0iIyUjLy8iLFVCT19TQ1JJUFRMRVRfTUFSS0VSPSIjIytqcyI7c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik+LTE/cnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoQUdfU0NSSVBUTEVUX01BUktFUik6c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpPi0xJiYocnVsZVN0YXJ0SW5kZXg9c291cmNlLnJ1bGVUZXh0LmluZGV4T2YoVUJPX1NDUklQVExFVF9NQVJLRVIpKTt2YXIgcnVsZVBhcnQ9c291cmNlLnJ1bGVUZXh0LnNsaWNlKHJ1bGVTdGFydEluZGV4KTtwcmVmaXg9IiIuY29uY2F0KHNvdXJjZS5kb21haW5OYW1lKS5jb25jYXQocnVsZVBhcnQpfWxvZygiIi5jb25jYXQocHJlZml4LCIgdHJhY2Ugc3RhcnQiKSksdHJhY2UmJnRyYWNlKCksbG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBlbmQiKSl9Y2F0Y2goZSl7fSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19kZWJ1ZyYmd2luZG93Ll9fZGVidWcoc291cmNlKX19KHNvdXJjZSl9KS5hcHBseSh0aGlzLHVwZGF0ZWRBcmdzKX1jYXRjaChlKXtjb25zb2xlLmxvZyhlKX19KHtuYW1lOiJwcmV2ZW50LXBvcGFkcy1uZXQiLGFyZ3M6W119LFtdKTs=" }, { "title": "scorecardresearch-beacon", diff --git a/dist/redirects.yml b/dist/redirects.yml index 14156768..465f04b2 100644 --- a/dist/redirects.yml +++ b/dist/redirects.yml @@ -3388,7 +3388,7 @@ }; } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function hit(source) { if (source.verbose !== true) { diff --git a/dist/scriptlets.corelibs.json b/dist/scriptlets.corelibs.json index 6f6c280f..5ae3c733 100644 --- a/dist/scriptlets.corelibs.json +++ b/dist/scriptlets.corelibs.json @@ -18,7 +18,7 @@ "ubo-aopr", "abp-abort-on-property-read" ], - "scriptlet": "function abortOnPropertyRead(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:abort,set:function(){}})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function abortOnPropertyRead(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).slice(2,9),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:abort,set:function(){}})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -31,7 +31,7 @@ "ubo-aopw", "abp-abort-on-property-write" ], - "scriptlet": "function abortOnPropertyWrite(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:abort})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function abortOnPropertyWrite(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).slice(2,9),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:abort})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -98,7 +98,7 @@ "ubo-acis", "abp-abort-current-inline-script" ], - "scriptlet": "function abortCurrentInlineScript(source,args){function randomId(){return Math.random().toString(36).substr(2,9)}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,search){var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(search),rid=randomId(),getCurrentScript=function(){if(\"currentScript\"in document)return document.currentScript;var scripts=document.getElementsByTagName(\"script\");return scripts[scripts.length-1]},ourScript=getCurrentScript(),abort=function(){var scriptEl=getCurrentScript();if(scriptEl){var str,prefix,content=scriptEl.textContent;try{content=Object.getOwnPropertyDescriptor(Node.prototype,\"textContent\").get.call(scriptEl)}catch(e){}if(0===content.length&&void 0!==scriptEl.src&&(prefix=\"data:text/javascript;base64,\",(str=scriptEl.src)&&0===str.indexOf(prefix))){var encodedContent=scriptEl.src.slice(\"data:text/javascript;base64,\".length);content=window.atob(encodedContent)}if(scriptEl instanceof HTMLScriptElement&&content.length>0&&scriptEl!==ourScript&&searchRegexp.test(content))throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)}};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(base instanceof Object!=0||null!==base)if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var currentValue=base[prop],origDescriptor=Object.getOwnPropertyDescriptor(base,prop);origDescriptor instanceof Object!=0&&origDescriptor.get instanceof Function!=0||(currentValue=base[prop],origDescriptor=void 0);var descriptorWrapper=Object.assign({isAbortingSuspended:!1,isolateCallback:function(cb){this.isAbortingSuspended=!0;try{for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var result=cb.apply(void 0,args);return this.isAbortingSuspended=!1,result}catch(_unused){var rid=randomId();throw this.isAbortingSuspended=!1,new ReferenceError(rid)}}},{currentValue:currentValue,get:function(){return this.isAbortingSuspended||this.isolateCallback(abort),origDescriptor instanceof Object?origDescriptor.get.call(base):this.currentValue},set:function(newValue){this.isAbortingSuspended||this.isolateCallback(abort),origDescriptor instanceof Object?origDescriptor.set.call(base,newValue):this.currentValue=newValue}});!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return descriptorWrapper.get.call(descriptorWrapper)},set:function(newValue){descriptorWrapper.set.call(descriptorWrapper,newValue)}})}else{var props=property.split(\".\"),propIndex=props.indexOf(prop),baseName=props[propIndex-1],message=\"The scriptlet had been executed before the \".concat(baseName,\" was loaded.\");!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,message)}}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function abortCurrentInlineScript(source,args){function randomId(){return Math.random().toString(36).slice(2,9)}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,search){var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(search),rid=randomId(),getCurrentScript=function(){if(\"currentScript\"in document)return document.currentScript;var scripts=document.getElementsByTagName(\"script\");return scripts[scripts.length-1]},ourScript=getCurrentScript(),abort=function(){var scriptEl=getCurrentScript();if(scriptEl){var str,prefix,content=scriptEl.textContent;try{content=Object.getOwnPropertyDescriptor(Node.prototype,\"textContent\").get.call(scriptEl)}catch(e){}if(0===content.length&&void 0!==scriptEl.src&&(prefix=\"data:text/javascript;base64,\",(str=scriptEl.src)&&0===str.indexOf(prefix))){var encodedContent=scriptEl.src.slice(\"data:text/javascript;base64,\".length);content=window.atob(encodedContent)}if(scriptEl instanceof HTMLScriptElement&&content.length>0&&scriptEl!==ourScript&&searchRegexp.test(content))throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)}};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(base instanceof Object!=0||null!==base)if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var currentValue=base[prop],origDescriptor=Object.getOwnPropertyDescriptor(base,prop);origDescriptor instanceof Object!=0&&origDescriptor.get instanceof Function!=0||(currentValue=base[prop],origDescriptor=void 0);var descriptorWrapper=Object.assign({isAbortingSuspended:!1,isolateCallback:function(cb){this.isAbortingSuspended=!0;try{for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var result=cb.apply(void 0,args);return this.isAbortingSuspended=!1,result}catch(_unused){var rid=randomId();throw this.isAbortingSuspended=!1,new ReferenceError(rid)}}},{currentValue:currentValue,get:function(){return this.isAbortingSuspended||this.isolateCallback(abort),origDescriptor instanceof Object?origDescriptor.get.call(base):this.currentValue},set:function(newValue){this.isAbortingSuspended||this.isolateCallback(abort),origDescriptor instanceof Object?origDescriptor.set.call(base,newValue):this.currentValue=newValue}});!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return descriptorWrapper.get.call(descriptorWrapper)},set:function(newValue){descriptorWrapper.set.call(descriptorWrapper,newValue)}})}else{var props=property.split(\".\"),propIndex=props.indexOf(prop),baseName=props[propIndex-1],message=\"The scriptlet had been executed before the \".concat(baseName,\" was loaded.\");!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,message)}}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -227,7 +227,7 @@ "ubo-popads.net.js", "ubo-popads.net" ], - "scriptlet": "function preventPopadsNet(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var rid=Math.random().toString(36).substr(2,9),throwError=function(){throw new ReferenceError(rid)};delete window.PopAds,delete window.popns,Object.defineProperties(window,{PopAds:{set:throwError},popns:{set:throwError}}),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind(),function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventPopadsNet(source,args){var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var rid=Math.random().toString(36).slice(2,9),throwError=function(){throw new ReferenceError(rid)};delete window.PopAds,delete window.popns,Object.defineProperties(window,{PopAds:{set:throwError},popns:{set:throwError}}),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind(),function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -242,19 +242,19 @@ "names": [ "debug-on-property-read" ], - "scriptlet": "function debugOnPropertyRead(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:abort,set:noopFunc})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function debugOnPropertyRead(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).slice(2,9),abort=function(){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:abort,set:noopFunc})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "debug-on-property-write" ], - "scriptlet": "function debugOnPropertyWrite(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).substr(2,9),abort=function(){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:abort})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function debugOnPropertyWrite(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property){if(property){var rid=Math.random().toString(36).slice(2,9),abort=function(){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;chain?Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}}):function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:abort})}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ "debug-current-inline-script" ], - "scriptlet": "function debugCurrentInlineScript(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,search){var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(search),rid=Math.random().toString(36).substr(2,9),getCurrentScript=function(){if(\"currentScript\"in document)return document.currentScript;var scripts=document.getElementsByTagName(\"script\");return scripts[scripts.length-1]},ourScript=getCurrentScript(),abort=function(){var scriptEl=getCurrentScript();if(scriptEl){var content=scriptEl.textContent;try{content=Object.getOwnPropertyDescriptor(Node.prototype,\"textContent\").get.call(scriptEl)}catch(e){}if(scriptEl instanceof HTMLScriptElement&&content.length>0&&scriptEl!==ourScript&&searchRegexp.test(content)){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger}}};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(base instanceof Object!=0||null!==base)if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var currentValue=base[prop];!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:function(value){abort(),currentValue=value},get:function(){return abort(),currentValue}})}else{var props=property.split(\".\"),propIndex=props.indexOf(prop),baseName=props[propIndex-1];!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(\"The scriptlet had been executed before the \".concat(baseName,\" was loaded.\"),source.verbose)}}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function debugCurrentInlineScript(source,args){function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,search){var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(search),rid=Math.random().toString(36).slice(2,9),getCurrentScript=function(){if(\"currentScript\"in document)return document.currentScript;var scripts=document.getElementsByTagName(\"script\");return scripts[scripts.length-1]},ourScript=getCurrentScript(),abort=function(){var scriptEl=getCurrentScript();if(scriptEl){var content=scriptEl.textContent;try{content=Object.getOwnPropertyDescriptor(Node.prototype,\"textContent\").get.call(scriptEl)}catch(e){}if(scriptEl instanceof HTMLScriptElement&&content.length>0&&scriptEl!==ourScript&&searchRegexp.test(content)){!function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source);debugger}}};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(base instanceof Object!=0||null!==base)if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else{var currentValue=base[prop];!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{set:function(value){abort(),currentValue=value},get:function(){return abort(),currentValue}})}else{var props=property.split(\".\"),propIndex=props.indexOf(prop),baseName=props[propIndex-1];!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(\"The scriptlet had been executed before the \".concat(baseName,\" was loaded.\"),source.verbose)}}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -404,7 +404,7 @@ "ubo-aost", "abp-abort-on-stack-trace" ], - "scriptlet": "function abortOnStackTrace(source,args){function randomId(){return Math.random().toString(36).substr(2,9)}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function matchStackTrace(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(function(stackMatch,stackTrace){var INLINE_SCRIPT_STRING=\"inlineScript\",INJECTED_SCRIPT_STRING=\"injectedScript\",INJECTED_SCRIPT_MARKER=\"\",isInlineScript=function(stackMatch){return stackMatch.indexOf(INLINE_SCRIPT_STRING)>-1},isInjectedScript=function(stackMatch){return stackMatch.indexOf(INJECTED_SCRIPT_STRING)>-1};if(!isInlineScript(stackMatch)&&!isInjectedScript(stackMatch))return!1;var documentURL=window.location.href,pos=documentURL.indexOf(\"#\");-1!==pos&&(documentURL=documentURL.slice(0,pos));var stackSteps=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})),stackLines=stackSteps.map((function(line){var stack,getStackTraceURL=/(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);if(getStackTraceURL){var stackURL=getStackTraceURL[2];if(startsWith(stackURL,\"(\")&&(stackURL=stackURL.slice(1)),startsWith(stackURL,INJECTED_SCRIPT_MARKER)){stackURL=INJECTED_SCRIPT_STRING;var stackFunction=void 0!==getStackTraceURL[1]?getStackTraceURL[1].slice(0,-1):line.slice(0,getStackTraceURL.index).trim();startsWith(stackFunction,\"at\")&&(stackFunction=stackFunction.slice(2).trim()),stack=\"\".concat(stackFunction,\" \").concat(stackURL).trim()}else stack=stackURL}else stack=line;return stack}));if(stackLines)for(var index=0;index0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(stackMatch),refinedStackTrace=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).join(\"\\n\");return Object.getOwnPropertyDescriptor(RegExp.prototype,\"test\").value.call(stackRegexp,refinedStackTrace)}function startsWith(str,prefix){return!!str&&0===str.indexOf(prefix)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,stack){if(property&&stack){var rid=randomId(),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else if(stack.match(/^(inlineScript|injectedScript)$/)||function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(stack)){var descriptorWrapper=Object.assign({isAbortingSuspended:!1,isolateCallback:function(cb){this.isAbortingSuspended=!0;try{for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var result=cb.apply(void 0,args);return this.isAbortingSuspended=!1,result}catch(_unused){var rid=randomId();throw this.isAbortingSuspended=!1,new ReferenceError(rid)}}},{value:base[prop],get:function(){return!this.isAbortingSuspended&&this.isolateCallback(matchStackTrace,stack,(new Error).stack)&&abort(),this.value},set:function(newValue){!this.isAbortingSuspended&&this.isolateCallback(matchStackTrace,stack,(new Error).stack)&&abort(),this.value=newValue}});!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return descriptorWrapper.get.call(descriptorWrapper)},set:function(newValue){descriptorWrapper.set.call(descriptorWrapper,newValue)}})}else!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,\"Invalid parameter: \".concat(stack))}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function abortOnStackTrace(source,args){function randomId(){return Math.random().toString(36).slice(2,9)}function getPropertyInChain(base,chain){var pos=chain.indexOf(\".\");if(-1===pos)return{base:base,prop:chain};var prop=chain.slice(0,pos);if(null===base)return{base:base,prop:prop,chain:chain};var obj,nextBase=base[prop];return chain=chain.slice(pos+1),(base instanceof Object||\"object\"==typeof base)&&(obj=base,0===Object.keys(obj).length&&!obj.prototype)||null===nextBase?{base:base,prop:prop,chain:chain}:void 0!==nextBase?getPropertyInChain(nextBase,chain):(Object.defineProperty(base,prop,{configurable:!0}),{base:base,prop:prop,chain:chain})}function matchStackTrace(stackMatch,stackTrace){if(!stackMatch||\"\"===stackMatch)return!0;if(function(stackMatch,stackTrace){var INLINE_SCRIPT_STRING=\"inlineScript\",INJECTED_SCRIPT_STRING=\"injectedScript\",INJECTED_SCRIPT_MARKER=\"\",isInlineScript=function(stackMatch){return stackMatch.indexOf(INLINE_SCRIPT_STRING)>-1},isInjectedScript=function(stackMatch){return stackMatch.indexOf(INJECTED_SCRIPT_STRING)>-1};if(!isInlineScript(stackMatch)&&!isInjectedScript(stackMatch))return!1;var documentURL=window.location.href,pos=documentURL.indexOf(\"#\");-1!==pos&&(documentURL=documentURL.slice(0,pos));var stackSteps=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})),stackLines=stackSteps.map((function(line){var stack,getStackTraceURL=/(.*?@)?(\\S+)(:\\d+):\\d+\\)?$/.exec(line);if(getStackTraceURL){var stackURL=getStackTraceURL[2];if(startsWith(stackURL,\"(\")&&(stackURL=stackURL.slice(1)),startsWith(stackURL,INJECTED_SCRIPT_MARKER)){stackURL=INJECTED_SCRIPT_STRING;var stackFunction=void 0!==getStackTraceURL[1]?getStackTraceURL[1].slice(0,-1):line.slice(0,getStackTraceURL.index).trim();startsWith(stackFunction,\"at\")&&(stackFunction=stackFunction.slice(2).trim()),stack=\"\".concat(stackFunction,\" \").concat(stackURL).trim()}else stack=stackURL}else stack=line;return stack}));if(stackLines)for(var index=0;index0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(stackMatch),refinedStackTrace=stackTrace.split(\"\\n\").slice(2).map((function(line){return line.trim()})).join(\"\\n\");return Object.getOwnPropertyDescriptor(RegExp.prototype,\"test\").value.call(stackRegexp,refinedStackTrace)}function startsWith(str,prefix){return!!str&&0===str.indexOf(prefix)}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,property,stack){if(property&&stack){var rid=randomId(),abort=function(){throw function(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex,AG_SCRIPTLET_MARKER=\"#%#//\",UBO_SCRIPTLET_MARKER=\"##+js\";source.ruleText.indexOf(AG_SCRIPTLET_MARKER)>-1?ruleStartIndex=source.ruleText.indexOf(AG_SCRIPTLET_MARKER):source.ruleText.indexOf(UBO_SCRIPTLET_MARKER)>-1&&(ruleStartIndex=source.ruleText.indexOf(UBO_SCRIPTLET_MARKER));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}(source),new ReferenceError(rid)};!function setChainPropAccess(owner,property){var chainInfo=getPropertyInChain(owner,property),base=chainInfo.base,prop=chainInfo.prop,chain=chainInfo.chain;if(chain)Object.defineProperty(owner,prop,{get:function(){return base},set:function(a){base=a,a instanceof Object&&setChainPropAccess(a,chain)}});else if(stack.match(/^(inlineScript|injectedScript)$/)||function(input){var isValid,FORWARD_SLASH=\"/\",str=function(str){return str.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}(input);input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH&&(str=input.slice(1,-1));try{isValid=new RegExp(str),isValid=!0}catch(e){isValid=!1}return isValid}(stack)){var descriptorWrapper=Object.assign({isAbortingSuspended:!1,isolateCallback:function(cb){this.isAbortingSuspended=!0;try{for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var result=cb.apply(void 0,args);return this.isAbortingSuspended=!1,result}catch(_unused){var rid=randomId();throw this.isAbortingSuspended=!1,new ReferenceError(rid)}}},{value:base[prop],get:function(){return!this.isAbortingSuspended&&this.isolateCallback(matchStackTrace,stack,(new Error).stack)&&abort(),this.value},set:function(newValue){!this.isAbortingSuspended&&this.isolateCallback(matchStackTrace,stack,(new Error).stack)&&abort(),this.value=newValue}});!function(object,property,descriptor){var currentDescriptor=Object.getOwnPropertyDescriptor(object,property);if(currentDescriptor&&!currentDescriptor.configurable)return!1;Object.defineProperty(object,property,descriptor)}(base,prop,{get:function(){return descriptorWrapper.get.call(descriptorWrapper)},set:function(newValue){descriptorWrapper.set.call(descriptorWrapper,newValue)}})}else!function(source,message){(arguments.length>2&&void 0!==arguments[2]&&arguments[2]||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}(source,\"Invalid parameter: \".concat(stack))}(window,property),window.onerror=function(rid){var nativeOnError=window.onerror;return function(error){if(\"string\"==typeof error&&-1!==error.indexOf(rid))return!0;if(nativeOnError instanceof Function){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];return nativeOnError.apply(this,[error].concat(args))}return!1}}(rid).bind()}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ diff --git a/dist/scriptlets.js b/dist/scriptlets.js index a8281498..fcf4e420 100644 --- a/dist/scriptlets.js +++ b/dist/scriptlets.js @@ -1587,7 +1587,7 @@ * Generate random six symbols id */ function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } /** @@ -13810,7 +13810,7 @@ window.onerror = createOnErrorHandler(rid).bind(); } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); @@ -14000,7 +14000,7 @@ window.onerror = createOnErrorHandler(rid).bind(); } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); @@ -14147,7 +14147,7 @@ window.onerror = createOnErrorHandler(rid).bind(); } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); @@ -14318,7 +14318,7 @@ window.onerror = createOnErrorHandler(rid).bind(); } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); @@ -14854,7 +14854,7 @@ window.onerror = createOnErrorHandler(rid).bind(); } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); @@ -15021,7 +15021,7 @@ window.onerror = createOnErrorHandler(rid).bind(); } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); @@ -15169,7 +15169,7 @@ window.onerror = createOnErrorHandler(rid).bind(); } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); @@ -17410,7 +17410,7 @@ }; } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function hit(source) { if (source.verbose !== true) { diff --git a/dist/umd/scriptlets.umd.js b/dist/umd/scriptlets.umd.js index aeb50d15..5aa51a87 100644 --- a/dist/umd/scriptlets.umd.js +++ b/dist/umd/scriptlets.umd.js @@ -1589,7 +1589,7 @@ * Generate random six symbols id */ function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } /** @@ -13812,7 +13812,7 @@ window.onerror = createOnErrorHandler(rid).bind(); } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); @@ -14002,7 +14002,7 @@ window.onerror = createOnErrorHandler(rid).bind(); } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); @@ -14149,7 +14149,7 @@ window.onerror = createOnErrorHandler(rid).bind(); } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); @@ -14320,7 +14320,7 @@ window.onerror = createOnErrorHandler(rid).bind(); } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); @@ -14856,7 +14856,7 @@ window.onerror = createOnErrorHandler(rid).bind(); } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); @@ -15023,7 +15023,7 @@ window.onerror = createOnErrorHandler(rid).bind(); } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); @@ -15171,7 +15171,7 @@ window.onerror = createOnErrorHandler(rid).bind(); } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function setPropertyAccess(object, property, descriptor) { var currentDescriptor = Object.getOwnPropertyDescriptor(object, property); @@ -17412,7 +17412,7 @@ }; } function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } function hit(source) { if (source.verbose !== true) { diff --git a/src/helpers/random-id.js b/src/helpers/random-id.js index 3d5f8962..288d7339 100644 --- a/src/helpers/random-id.js +++ b/src/helpers/random-id.js @@ -1,6 +1,6 @@ /** - * Generate random six symbols id + * Generate random seven symbols id */ export function randomId() { - return Math.random().toString(36).substr(2, 9); + return Math.random().toString(36).slice(2, 9); } From cb656b7b9f2ede31d0d3678fa703435453041944 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 20 Dec 2022 12:24:52 +0300 Subject: [PATCH 36/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 977fdf06..0b67f89c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.14", + "version": "1.7.15", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From 755d38f6da3c88681c8c42feb3d0feda0719d50e Mon Sep 17 00:00:00 2001 From: Dmitry Seregin Date: Tue, 20 Dec 2022 13:48:35 +0300 Subject: [PATCH 37/70] AG-18323: fixed Trusted Types Policy name Merge in ADGUARD-FILTERS/scriptlets from fixes/AG-18323 to master Squashed commit of the following: commit 4feed32814cf03bcaa7b238dd54690c8e65ef16d Merge: c0a489d cb656b7 Author: Dmitriy Seregin Date: Tue Dec 20 13:44:17 2022 +0400 Merge branch 'master' into fixes/AG-18323 commit c0a489df496ea40c80e58649cab522036a80eb8f Merge: cfd416d 075bc58 Author: Dmitriy Seregin Date: Tue Dec 20 13:20:04 2022 +0400 Merge branch 'master' into fixes/AG-18323 commit cfd416dca5d85335256b1f92541ce7f71dffa072 Merge: c49245a b59a000 Author: Dmitriy Seregin Date: Mon Dec 19 14:02:46 2022 +0400 Merge branch 'master' into fixes/AG-18323 commit c49245aa9edb725f4317c25cf14f75270cae0740 Author: Dmitriy Seregin Date: Mon Dec 19 14:02:30 2022 +0400 added comment commit 693e1e81e81d1f28575c7d442b4213fe0cfd282b Author: Dmitriy Seregin Date: Thu Dec 15 16:01:46 2022 +0400 AG-18323: fixed Trusted Types Policy name --- src/scriptlets/prevent-element-src-loading.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/scriptlets/prevent-element-src-loading.js b/src/scriptlets/prevent-element-src-loading.js index ea5b1a6c..c3c52bac 100644 --- a/src/scriptlets/prevent-element-src-loading.js +++ b/src/scriptlets/prevent-element-src-loading.js @@ -61,7 +61,13 @@ export function preventElementSrcLoading(source, tagName, match) { const hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function'; let policy; if (hasTrustedTypes) { - policy = window.trustedTypes.createPolicy('mock', { + // The name for the trusted-types policy should only be 'AGPolicy',because corelibs can + // allow our policy if the server has restricted the creation of a trusted-types policy with + // the directive 'Content-Security-Policy: trusted-types ;`. + // If such a header is presented in the server response, corelibs adds permission to create + // the 'AGPolicy' policy with the 'allow-duplicates' option to prevent errors. + // See AG-18204 for details. + policy = window.trustedTypes.createPolicy('AGPolicy', { createScriptURL: (arg) => arg, }); } From 6c0416f127b2db0d0f22c494b425179dac6de271 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 20 Dec 2022 13:48:57 +0300 Subject: [PATCH 38/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0b67f89c..ecd0e541 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.15", + "version": "1.7.16", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From 2c10348ee70d5e6a91830e0bff5f077fd62688cd Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Tue, 20 Dec 2022 17:09:28 +0300 Subject: [PATCH 39/70] AG-17905 fix closure bug for prevent-xhr and trusted-replace-xhr-response #261 Merge in ADGUARD-FILTERS/scriptlets from fix/AG-17905 to release/v1.8 Squashed commit of the following: commit 09626a31665014ce514ce5c347d053ab4b14645c Merge: 25c9820 f0fbd11 Author: Stanislav A Date: Tue Dec 20 16:53:59 2022 +0300 Merge branch 'release/v1.8' into fix/AG-17905 commit 25c9820494ae8d1e1d35dddfac7dfb2e8f4b2547 Author: Stanislav A Date: Tue Dec 20 13:29:55 2022 +0300 update changelog and fix typos in test commit 6973376ccdb7e4c730a9ad76bf2658d98b5f2a80 Author: Stanislav A Date: Mon Dec 19 22:10:18 2022 +0300 add tests commit 492da8f85ccb0da99f023c042163f79d9879ffbd Author: Stanislav A Date: Fri Dec 16 21:40:20 2022 +0300 fix closure bug for trusted-replace-xhr-response commit 4f1d59b783b558a23e5f02766186ab2de02bc2f6 Author: Stanislav A Date: Fri Dec 16 21:24:30 2022 +0300 fix closure bug for prevent-xhr and add testcase --- CHANGELOG.md | 53 +++++++++++-------- src/scriptlets/prevent-xhr.js | 7 ++- .../trusted-replace-xhr-response.js | 17 +++--- tests/scriptlets/prevent-xhr.test.js | 52 +++++++++++++++--- .../trusted-replace-xhr-response.test.js | 41 ++++++++++++++ 5 files changed, 128 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8487501..757985df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,41 +1,48 @@ # Scriptlets and Redirect Resources Changelog +## 1.8.0 + +### Fixed + +- `prevent-xhr` and `trusted-replace-xhr-response` closure bug on multiple requests [#261](https://github.com/AdguardTeam/Scriptlets/issues/261) + + ## v1.7.10 ### Added -* new scriptlet `trusted-set-cookie-reload` +- new scriptlet `trusted-set-cookie-reload` ### Fixed -* `set-cookie-reload` infinite page reloading [#265](https://github.com/AdguardTeam/Scriptlets/issues/265) -* breakage of `prevent-element-src-loading` due to `window` getting into `apply` wrapper [#264](https://github.com/AdguardTeam/Scriptlets/issues/264) -* spread of args bug at `getXhrData` call for `trusted-replace-xhr-response` -* request properties array not being served to `getRequestData` and `parseMatchProps` helpers +- `set-cookie-reload` infinite page reloading [#265](https://github.com/AdguardTeam/Scriptlets/issues/265) +- breakage of `prevent-element-src-loading` due to `window` getting into `apply` wrapper [#264](https://github.com/AdguardTeam/Scriptlets/issues/264) +- spread of args bug at `getXhrData` call for `trusted-replace-xhr-response` +- request properties array not being served to `getRequestData` and `parseMatchProps` helpers ## v1.7.3 ### Added -* [Trusted scriptlets](./README.md#trusted-scriptlets) with extended capabilities: - * trusted-click-element [#23](https://github.com/AdguardTeam/Scriptlets/issues/23) - * trusted-replace-xhr-response [#202](https://github.com/AdguardTeam/Scriptlets/issues/202) - * trusted-replace-fetch-response - * trusted-set-local-storage-item - * trusted-set-cookie +- [Trusted scriptlets](./README.md#trusted-scriptlets) with extended capabilities: + - trusted-click-element [#23](https://github.com/AdguardTeam/Scriptlets/issues/23) + - trusted-replace-xhr-response [#202](https://github.com/AdguardTeam/Scriptlets/issues/202) + - trusted-replace-fetch-response + - trusted-set-local-storage-item + - trusted-set-cookie -* Scriptlets: - * xml-prune [#249](https://github.com/AdguardTeam/Scriptlets/issues/249) +- Scriptlets: + - xml-prune [#249](https://github.com/AdguardTeam/Scriptlets/issues/249) ### Improved -* Scriptlets: - * prevent-element-src-loading [#228](https://github.com/AdguardTeam/Scriptlets/issues/228) - * prevent-fetch [#216](https://github.com/AdguardTeam/Scriptlets/issues/216) - * abort-on-stack-trace [#201](https://github.com/AdguardTeam/Scriptlets/issues/201) - * abort-current-inline-script [#251](https://github.com/AdguardTeam/Scriptlets/issues/251) - * set-cookie & set-cookie-reload -* Redirects: - * google-ima3 [#255](https://github.com/AdguardTeam/Scriptlets/issues/255) - * metrika-yandex-tag [#254](https://github.com/AdguardTeam/Scriptlets/issues/254) - * googlesyndication-adsbygoogle [#252](https://github.com/AdguardTeam/Scriptlets/issues/252) +- Scriptlets: + - prevent-element-src-loading [#228](https://github.com/AdguardTeam/Scriptlets/issues/228) + - prevent-fetch [#216](https://github.com/AdguardTeam/Scriptlets/issues/216) + - abort-on-stack-trace [#201](https://github.com/AdguardTeam/Scriptlets/issues/201) + - abort-current-inline-script [#251](https://github.com/AdguardTeam/Scriptlets/issues/251) + - set-cookie & set-cookie-reload +- Redirects: + - google-ima3 [#255](https://github.com/AdguardTeam/Scriptlets/issues/255) + - metrika-yandex-tag [#254](https://github.com/AdguardTeam/Scriptlets/issues/254) + - googlesyndication-adsbygoogle [#252](https://github.com/AdguardTeam/Scriptlets/issues/252) diff --git a/src/scriptlets/prevent-xhr.js b/src/scriptlets/prevent-xhr.js index 4147da97..39e115c1 100644 --- a/src/scriptlets/prevent-xhr.js +++ b/src/scriptlets/prevent-xhr.js @@ -96,7 +96,6 @@ export function preventXHR(source, propsToMatch, customResponseText) { return; } - let shouldPrevent = false; let response = ''; let responseText = ''; let responseUrl; @@ -111,15 +110,15 @@ export function preventXHR(source, propsToMatch, customResponseText) { // Log if no propsToMatch given logMessage(source, `xhr( ${objectToString(xhrData)} )`, true); hit(source); - } else { - shouldPrevent = matchRequestProps(source, propsToMatch, xhrData); + } else if (matchRequestProps(source, propsToMatch, xhrData)) { + thisArg.shouldBePrevented = true; } return Reflect.apply(target, thisArg, args); }; const sendWrapper = (target, thisArg, args) => { - if (!shouldPrevent) { + if (!thisArg.shouldBePrevented) { return Reflect.apply(target, thisArg, args); } diff --git a/src/scriptlets/trusted-replace-xhr-response.js b/src/scriptlets/trusted-replace-xhr-response.js index 5279cead..9eaccd88 100644 --- a/src/scriptlets/trusted-replace-xhr-response.js +++ b/src/scriptlets/trusted-replace-xhr-response.js @@ -90,9 +90,7 @@ export function trustedReplaceXhrResponse(source, pattern = '', replacement = '' const nativeOpen = window.XMLHttpRequest.prototype.open; const nativeSend = window.XMLHttpRequest.prototype.send; - let shouldReplace = false; let xhrData; - let requestHeaders = []; const openWrapper = (target, thisArg, args) => { // eslint-disable-next-line prefer-spread @@ -106,13 +104,16 @@ export function trustedReplaceXhrResponse(source, pattern = '', replacement = '' return Reflect.apply(target, thisArg, args); } - shouldReplace = matchRequestProps(source, propsToMatch, xhrData); + if (matchRequestProps(source, propsToMatch, xhrData)) { + thisArg.shouldBePrevented = true; + } // Trap setRequestHeader of target xhr object to mimic request headers later - if (shouldReplace) { + if (thisArg.shouldBePrevented) { + thisArg.collectedHeaders = []; const setRequestHeaderWrapper = (target, thisArg, args) => { // Collect headers - requestHeaders.push(args); + thisArg.collectedHeaders.push(args); return Reflect.apply(target, thisArg, args); }; @@ -129,7 +130,7 @@ export function trustedReplaceXhrResponse(source, pattern = '', replacement = '' }; const sendWrapper = (target, thisArg, args) => { - if (!shouldReplace) { + if (!thisArg.shouldBePrevented) { return Reflect.apply(target, thisArg, args); } @@ -197,13 +198,13 @@ export function trustedReplaceXhrResponse(source, pattern = '', replacement = '' // Mimic request headers before sending // setRequestHeader can only be called on open request objects - requestHeaders.forEach((header) => { + thisArg.collectedHeaders.forEach((header) => { const name = header[0]; const value = header[1]; forgedRequest.setRequestHeader(name, value); }); - requestHeaders = []; + thisArg.collectedHeaders = []; try { nativeSend.call(forgedRequest, args); diff --git a/tests/scriptlets/prevent-xhr.test.js b/tests/scriptlets/prevent-xhr.test.js index 3672ad50..91dc1585 100644 --- a/tests/scriptlets/prevent-xhr.test.js +++ b/tests/scriptlets/prevent-xhr.test.js @@ -159,7 +159,7 @@ if (isSupported) { xhr.send(); }); - test('Args, method matched, randomize response text, rangeMin equal to rangeMax (length:100-100)', async (assert) => { + test('Args, method matched, randomize response text, rangeMin === rangeMax (length:100-100)', async (assert) => { const METHOD = 'GET'; const URL = `${FETCH_OBJECTS_PATH}/test01.json`; const MATCH_DATA = ['method:GET', 'length:100-100']; @@ -203,7 +203,7 @@ if (isSupported) { xhr.send(); }); - test('Empty arg, prevent all, do not randomize response text - limit range (rangeMin + rangeMax - length:8888888888888888-99999999999999999999999)', async (assert) => { + test('Empty arg, prevent all, dont randomize response - limit range (rangeMin+rangeMax-length)', async (assert) => { const METHOD = 'GET'; const URL = `${FETCH_OBJECTS_PATH}/test01.json`; const MATCH_DATA = ['', 'length:8888888888888888-99999999999999999999999']; @@ -224,7 +224,7 @@ if (isSupported) { xhr.send(); }); - test('Empty arg, prevent all, do not randomize response text - limit range (rangeMax - length:10000-600000)', async (assert) => { + test('Empty arg, prevent all, dont randomize response text - limit range (rangeMax - length)', async (assert) => { const METHOD = 'GET'; const URL = `${FETCH_OBJECTS_PATH}/test01.json`; const MATCH_DATA = ['', 'length:10000-600000']; @@ -286,7 +286,7 @@ if (isSupported) { xhr.send(); }); - test('Empty arg, prevent all, do not randomize response text - invalid argument (length:test-30000)', async (assert) => { + test('Empty arg, prevent all, dont randomize response - invalid argument (length:test-30000)', async (assert) => { const METHOD = 'GET'; const URL = `${FETCH_OBJECTS_PATH}/test01.json`; const MATCH_DATA = ['', 'length:test-30000']; @@ -346,7 +346,7 @@ if (isSupported) { xhr.send(); }); - test('Empty arg, prevent all, do not randomize response text - invalid argument (length:123-345-450)', async (assert) => { + test('Empty arg, prevent all, dont randomize response - invalid argument (length:123-345-450)', async (assert) => { const METHOD = 'GET'; const URL = `${FETCH_OBJECTS_PATH}/test01.json`; const MATCH_DATA = ['', 'length:123-345-450']; @@ -366,7 +366,7 @@ if (isSupported) { xhr.send(); }); - test('Empty arg, prevent all, do not randomize response text - invalid argument (length:123---450)', async (assert) => { + test('Empty arg, prevent all, dont randomize response - invalid argument (length:123---450)', async (assert) => { const METHOD = 'GET'; const URL = `${FETCH_OBJECTS_PATH}/test01.json`; const MATCH_DATA = ['', 'length:123---450']; @@ -386,7 +386,7 @@ if (isSupported) { xhr.send(); }); - test('Empty arg, prevent all, do not randomize response text - invalid argument (length::123-450)', async (assert) => { + test('Empty arg, prevent all, dont randomize response - invalid argument (length::123-450)', async (assert) => { const METHOD = 'GET'; const URL = `${FETCH_OBJECTS_PATH}/test01.json`; const MATCH_DATA = ['', 'length::123-450']; @@ -588,6 +588,44 @@ if (isSupported) { }; xhr.send(); }); + + // https://github.com/AdguardTeam/Scriptlets/issues/261 + test('Works correctly with different parallel XHR requests', async (assert) => { + const METHOD = 'GET'; + const URL_TO_BLOCK = `${FETCH_OBJECTS_PATH}/test01.json`; + const URL_TO_PASS = `${FETCH_OBJECTS_PATH}/test02.json`; + const MATCH_DATA = ['test01.json']; + + runScriptlet(name, MATCH_DATA); + + const done1 = assert.async(); + const done2 = assert.async(); + + const xhr1 = new XMLHttpRequest(); + const xhr2 = new XMLHttpRequest(); + + xhr1.open(METHOD, URL_TO_PASS); + xhr2.open(METHOD, URL_TO_BLOCK); + + xhr1.onload = () => { + assert.strictEqual(xhr1.readyState, 4, 'Response done'); + assert.ok(xhr1.response, 'Response data exists'); + assert.strictEqual(window.hit, undefined, 'hit should not fire'); + done1(); + }; + + xhr2.onload = () => { + assert.strictEqual(xhr2.readyState, 4, 'Response done'); + assert.strictEqual(typeof xhr2.responseText, 'string', 'Response text mocked'); + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + clearGlobalProps('hit'); + done2(); + }; + + xhr1.send(); + // use timeout to avoid hit collisions + setTimeout(() => xhr2.send(), 1); + }); } else { test('unsupported', (assert) => { assert.ok(true, 'Browser does not support it'); diff --git a/tests/scriptlets/trusted-replace-xhr-response.test.js b/tests/scriptlets/trusted-replace-xhr-response.test.js index 47ebdb38..92ff2171 100644 --- a/tests/scriptlets/trusted-replace-xhr-response.test.js +++ b/tests/scriptlets/trusted-replace-xhr-response.test.js @@ -194,6 +194,47 @@ if (isSupported) { done3(); }); }); + + test('Works correctly with different parallel XHR requests', async (assert) => { + const URL_TO_PASS = `${FETCH_OBJECTS_PATH}/test02.json`; + const INTACT_RESPONSE_PART = 'test'; + + const METHOD = 'GET'; + const URL_TO_BLOCK = `${FETCH_OBJECTS_PATH}/test01.json`; + const PATTERN = '*'; + const REPLACEMENT = ''; + const MATCH_DATA = [PATTERN, REPLACEMENT, 'test01']; + + runScriptlet(name, MATCH_DATA); + + const done1 = assert.async(); + const done2 = assert.async(); + + const xhr1 = new XMLHttpRequest(); + const xhr2 = new XMLHttpRequest(); + + xhr1.open(METHOD, URL_TO_PASS); + xhr2.open(METHOD, URL_TO_BLOCK); + + xhr1.onload = () => { + assert.strictEqual(xhr1.readyState, 4, 'Response done'); + assert.ok(xhr1.response.includes(INTACT_RESPONSE_PART), 'Response is intact'); + assert.strictEqual(window.hit, undefined, 'hit should not fire'); + done1(); + }; + + xhr2.onload = () => { + assert.strictEqual(xhr2.readyState, 4, 'Response done'); + assert.ok(xhr2.response === '', 'Response has been removed'); + + assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); + done2(); + }; + + xhr1.send(); + // use timeout to avoid hit collisions + setTimeout(() => xhr2.send(), 1); + }); } else { test('unsupported', (assert) => { assert.ok(true, 'Browser does not support it'); From 51a1853e03f014b76b94bea8a5697f26df01bd99 Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Tue, 20 Dec 2022 17:09:39 +0300 Subject: [PATCH 40/70] AG-18379 imrpove prevent-addEventListener and log-addEventListener #271 Merge in ADGUARD-FILTERS/scriptlets from fix/AG-18379 to master Squashed commit of the following: commit 2dd860653f746e7c010015c6bcabf609df5e615d Merge: 244655d 6c0416f Author: Stanislav A Date: Tue Dec 20 16:58:03 2022 +0300 Merge branch 'master' into fix/AG-18379 commit 244655dbffd020ee7c2d2c88e2d71d1d9df5e63d Author: Stanislav A Date: Tue Dec 20 12:26:55 2022 +0300 fix changelog commit cf6e0a9ee44ae541722e77ca56a8003da4636c50 Author: Stanislav A Date: Mon Dec 19 22:18:34 2022 +0300 update CHANGELOG commit 2468c58c601b341e8848dddf065b71d3c826c086 Author: Stanislav A Date: Mon Dec 19 18:08:52 2022 +0300 add fix to log-addEventListener commit ffa0e525a17480c0e79d0c4a9f3325fa518b9331 Author: Stanislav A Date: Mon Dec 19 18:04:45 2022 +0300 imrpove prevent-addEventListener and log-addEventListener --- CHANGELOG.md | 5 +++++ src/scriptlets/log-addEventListener.js | 8 +++++++- src/scriptlets/prevent-addEventListener.js | 8 +++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc286d49..30e42fff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Scriptlets and Redirect Resources Changelog +## Unreleased + +### Fixed + +- `prevent-addEventListener` and `log-addEventListener` loosing context when encountering already bound `.addEventListener` ## v1.7.14 diff --git a/src/scriptlets/log-addEventListener.js b/src/scriptlets/log-addEventListener.js index 0d30a86f..61bf49ec 100644 --- a/src/scriptlets/log-addEventListener.js +++ b/src/scriptlets/log-addEventListener.js @@ -41,7 +41,13 @@ type: ${convertTypeToString(type)} listener: ${convertTypeToString(listener)}`; logMessage(source, message, true); - return nativeAddEventListener.apply(this, [type, listener, ...args]); + // Avoid illegal invocations due to lost context + // https://github.com/AdguardTeam/Scriptlets/issues/271 + let context = this; + if (this && this.constructor?.name === 'Window' && this !== window) { + context = window; + } + return nativeAddEventListener.apply(context, [type, listener, ...args]); } const descriptor = { diff --git a/src/scriptlets/prevent-addEventListener.js b/src/scriptlets/prevent-addEventListener.js index 78b6bb08..b821bb22 100644 --- a/src/scriptlets/prevent-addEventListener.js +++ b/src/scriptlets/prevent-addEventListener.js @@ -63,7 +63,13 @@ export function preventAddEventListener(source, typeSearch, listenerSearch) { return undefined; } - return nativeAddEventListener.apply(this, [type, listener, ...args]); + // Avoid illegal invocations due to lost context + // https://github.com/AdguardTeam/Scriptlets/issues/271 + let context = this; + if (this && this.constructor?.name === 'Window' && this !== window) { + context = window; + } + return nativeAddEventListener.apply(context, [type, listener, ...args]); } const descriptor = { From 049012a44fdfc6f0f35d251a392ec338e01bf1b0 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Tue, 20 Dec 2022 17:09:59 +0300 Subject: [PATCH 41/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ecd0e541..7a0856c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.16", + "version": "1.7.17", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From c44e89c8e8fea5d0bb3366796f0f17237fac7bfc Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Thu, 22 Dec 2022 16:02:27 +0300 Subject: [PATCH 42/70] fix `google-ima3` compatibility. #272 AG-18460 related: https://github.com/AdguardTeam/FiltersCompiler/issues/167 Squashed commit of the following: commit f9d1c8bd73bbb930c7acb14f13325281b0bae57b Author: Slava Leleka Date: Wed Dec 21 21:03:15 2022 +0200 update changelog commit 8bdc9326ed4d93cd522347e662f1372462d28fd5 Author: Slava Leleka Date: Wed Dec 21 21:02:34 2022 +0200 update compatibility-table commit 2538a5b788b36702033b382b6051553454fe836b Author: Slava Leleka Date: Wed Dec 21 21:01:25 2022 +0200 fix google-ima3 conversion commit 5e990c43e6607dd243a6e6712e908f1af60b04aa Author: Slava Leleka Date: Wed Dec 21 21:00:46 2022 +0200 add alias for google-ima3 --- CHANGELOG.md | 3 ++- scripts/compatibility-table.json | 7 ++++--- src/helpers/compatibility-redirects.js | 1 + src/redirects/google-ima3.js | 8 +++++++- tests/lib-tests/index.test.js | 8 ++++++++ tests/redirects/google-ima3.test.js | 18 ++++++++++++++++++ wiki/compatibility-table.md | 2 +- 7 files changed, 41 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30e42fff..e1ff9664 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,11 @@ # Scriptlets and Redirect Resources Changelog -## Unreleased +## Unreleased 1.7.x ### Fixed - `prevent-addEventListener` and `log-addEventListener` loosing context when encountering already bound `.addEventListener` +- `google-ima3` conversion ## v1.7.14 diff --git a/scripts/compatibility-table.json b/scripts/compatibility-table.json index 3082fabd..0172bf51 100644 --- a/scripts/compatibility-table.json +++ b/scripts/compatibility-table.json @@ -295,6 +295,10 @@ "adg": "google-analytics-ga", "ubo": "google-analytics_ga.js" }, + { + "adg": "google-ima3", + "ubo": "google-ima.js" + }, { "adg": "googlesyndication-adsbygoogle", "ubo": "googlesyndication_adsbygoogle.js" @@ -444,9 +448,6 @@ { "ubo": "mxpnl_mixpanel.js" }, - { - "ubo": "google-ima.js" - }, { "ubo": "noop-0.5s.mp3" } diff --git a/src/helpers/compatibility-redirects.js b/src/helpers/compatibility-redirects.js index abce2dc0..656702a2 100644 --- a/src/helpers/compatibility-redirects.js +++ b/src/helpers/compatibility-redirects.js @@ -77,6 +77,7 @@ const redirects = [ }, { adg: 'google-ima3', + ubo: 'google-ima.js', }, { adg: 'gemius', diff --git a/src/redirects/google-ima3.js b/src/redirects/google-ima3.js index 792f1c4e..90b06e1f 100644 --- a/src/redirects/google-ima3.js +++ b/src/redirects/google-ima3.js @@ -478,7 +478,13 @@ export function GoogleIma3(source) { hit(source); } -GoogleIma3.names = ['google-ima3']; +GoogleIma3.names = [ + 'google-ima3', + // prefixed name + 'ubo-google-ima.js', + // original ubo name + 'google-ima.js', +]; GoogleIma3.injections = [ hit, diff --git a/tests/lib-tests/index.test.js b/tests/lib-tests/index.test.js index 0055d125..5339c8d2 100644 --- a/tests/lib-tests/index.test.js +++ b/tests/lib-tests/index.test.js @@ -418,6 +418,10 @@ test('Test REDIRECT converting - UBO -> ADG', (assert) => { uboRule = '||g9g.eu^*fa.js$script,redirect=fuckadblock.js-3.2.0'; expectedAdgRule = '||g9g.eu^*fa.js$script,redirect=prevent-fab-3.2.0'; assert.strictEqual(convertRedirectToAdg(uboRule), expectedAdgRule); + + uboRule = '||imasdk.googleapis.com/js/sdkloader/ima3.js$script,important,redirect=google-ima.js,domain=example.org'; + expectedAdgRule = '||imasdk.googleapis.com/js/sdkloader/ima3.js$script,important,redirect=google-ima3,domain=example.org'; + assert.strictEqual(convertRedirectToAdg(uboRule), expectedAdgRule); }); test('Test REDIRECT-RULE converting - UBO -> ADG', (assert) => { @@ -555,6 +559,10 @@ test('Test REDIRECT converting - ADG -> UBO', (assert) => { new RegExp('Unable to convert for uBO'), // specific error matcher 'no TYPES to specify, ABSENT_SOURCE_TYPE_REPLACEMENT should be updated', ); + + adgRule = '||imasdk.googleapis.com/js/sdkloader/ima3.js$script,important,redirect=google-ima3,domain=example.org'; + expectedUboRule = '||imasdk.googleapis.com/js/sdkloader/ima3.js$script,important,redirect=google-ima.js,domain=example.org'; + assert.strictEqual(convertAdgRedirectToUbo(adgRule), expectedUboRule); }); test('Test REDIRECT-RULE converting - ADG -> UBO', (assert) => { diff --git a/tests/redirects/google-ima3.test.js b/tests/redirects/google-ima3.test.js index 12971cb2..23f7a8a3 100644 --- a/tests/redirects/google-ima3.test.js +++ b/tests/redirects/google-ima3.test.js @@ -18,6 +18,24 @@ const afterEach = () => { module(name, { beforeEach, afterEach }); +test('Checking if alias name works', (assert) => { + const adgParams = { + name, + engine: 'test', + verbose: true, + }; + const uboParams = { + name: 'ubo-google-ima.js', + engine: 'test', + verbose: true, + }; + + const codeByAdgParams = window.scriptlets.redirects.getCode(adgParams); + const codeByUboParams = window.scriptlets.redirects.getCode(uboParams); + + assert.strictEqual(codeByAdgParams, codeByUboParams, 'ubo name - ok'); +}); + test('Ima mocked', (assert) => { assert.expect(28); diff --git a/wiki/compatibility-table.md b/wiki/compatibility-table.md index 18b155ff..bbdc5dfa 100644 --- a/wiki/compatibility-table.md +++ b/wiki/compatibility-table.md @@ -91,6 +91,7 @@ | [fingerprint3js](../wiki/about-redirects.md#fingerprint3js) | fingerprint3.js | | | [google-analytics](../wiki/about-redirects.md#google-analytics) | google-analytics_analytics.js | | | [google-analytics-ga](../wiki/about-redirects.md#google-analytics-ga) | google-analytics_ga.js | | +| [google-ima3](../wiki/about-redirects.md#google-ima3) | google-ima.js | | | [googlesyndication-adsbygoogle](../wiki/about-redirects.md#googlesyndication-adsbygoogle) | googlesyndication_adsbygoogle.js | | | [googletagservices-gpt](../wiki/about-redirects.md#googletagservices-gpt) | googletagservices_gpt.js | | | [gemius](../wiki/about-redirects.md#gemius) | | | @@ -133,5 +134,4 @@ | | window.open-defuser.js | | | | noeval.js | | | | mxpnl_mixpanel.js | | -| | google-ima.js | | | | noop-0.5s.mp3 | | From 3f5b20633bae511d4d3442ed7a6d70a614b9d229 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Thu, 22 Dec 2022 16:02:47 +0300 Subject: [PATCH 43/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7a0856c9..19be6217 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.17", + "version": "1.7.18", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From cd476974cc5af5493175e0dac8917c2c808710c6 Mon Sep 17 00:00:00 2001 From: Slava Leleka Date: Thu, 22 Dec 2022 18:42:03 +0300 Subject: [PATCH 44/70] update changelog Squashed commit of the following: commit cb5ec0a24cc27d553e97a3bccec1c1989590291e Author: Slava Leleka Date: Thu Dec 22 17:32:45 2022 +0200 Revert "add dist to gitignore" This reverts commit d4b9e11d112b0ceb96b8297f3cbc35c2cfe84c2a. commit e1e7fa28838332026989d78e8776a51c6f503a9c Author: Slava Leleka Date: Thu Dec 22 17:32:28 2022 +0200 Revert "remove dist content" This reverts commit 1c3637aaf37b28e1605487a368b1f91a57d8acb2. commit 1c3637aaf37b28e1605487a368b1f91a57d8acb2 Author: Slava Leleka Date: Thu Dec 22 15:09:50 2022 +0200 remove dist content commit d4b9e11d112b0ceb96b8297f3cbc35c2cfe84c2a Author: Slava Leleka Date: Thu Dec 22 15:05:21 2022 +0200 add dist to gitignore commit c8aeb54a1f2e2a6dcf05d17e2b2c753141202069 Author: Slava Leleka Date: Thu Dec 22 15:04:05 2022 +0200 update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1ff9664..c8ca0644 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Scriptlets and Redirect Resources Changelog -## Unreleased 1.7.x +## v1.7.19 ### Fixed From 7f6dbeb105eaed86e8df5d2ab1e344def53129b0 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Thu, 22 Dec 2022 18:42:14 +0300 Subject: [PATCH 45/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19be6217..5e89e63f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.18", + "version": "1.7.19", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From bb8bfaba3eaab42630ba69bbc27dc91a559e9f1a Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Thu, 22 Dec 2022 18:49:03 +0300 Subject: [PATCH 46/70] deploy: update dist v1.7.19 --- dist/build.txt | 2 +- dist/redirects.json | 5 ++- dist/redirects.yml | 6 ++-- dist/scriptlets.corelibs.json | 8 ++--- dist/scriptlets.js | 59 +++++++++++++++++++++++++++++------ dist/umd/scriptlets.umd.js | 59 +++++++++++++++++++++++++++++------ 6 files changed, 111 insertions(+), 28 deletions(-) diff --git a/dist/build.txt b/dist/build.txt index 72708e25..7231fa44 100644 --- a/dist/build.txt +++ b/dist/build.txt @@ -1 +1 @@ -version=1.7.14 \ No newline at end of file +version=1.7.19 \ No newline at end of file diff --git a/dist/redirects.json b/dist/redirects.json index 5619c040..cc277e50 100644 --- a/dist/redirects.json +++ b/dist/redirects.json @@ -226,7 +226,10 @@ }, { "title": "google-ima3", - "aliases": [], + "aliases": [ + "ubo-google-ima.js", + "google-ima.js" + ], "isBlocking": false, "contentType": "application/javascript;base64", "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31mdW5jdGlvbiBsb2dNZXNzYWdlKHNvdXJjZSxtZXNzYWdlKXt2YXIgZm9yY2VkPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07KGZvcmNlZHx8c291cmNlLnZlcmJvc2UpJiZjb25zb2xlLmxvZygiIi5jb25jYXQoc291cmNlLm5hbWUsIjogIikuY29uY2F0KG1lc3NhZ2UpKX1jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIGltYT17fSxBZERpc3BsYXlDb250YWluZXI9ZnVuY3Rpb24oKXt9O0FkRGlzcGxheUNvbnRhaW5lci5wcm90b3R5cGUuZGVzdHJveT1ub29wRnVuYyxBZERpc3BsYXlDb250YWluZXIucHJvdG90eXBlLmluaXRpYWxpemU9bm9vcEZ1bmM7dmFyIEltYVNka1NldHRpbmdzPWZ1bmN0aW9uKCl7fTtJbWFTZGtTZXR0aW5ncy5Db21wYW5pb25CYWNrZmlsbE1vZGU9e0FMV0FZUzoiYWx3YXlzIixPTl9NQVNURVJfQUQ6Im9uX21hc3Rlcl9hZCJ9LEltYVNka1NldHRpbmdzLlZwYWlkTW9kZT17RElTQUJMRUQ6MCxFTkFCTEVEOjEsSU5TRUNVUkU6Mn0sSW1hU2RrU2V0dGluZ3MucHJvdG90eXBlPXtjOiEwLGY6e30saTohMSxsOiIiLHA6IiIscjowLHQ6IiIsdjoiIixnZXRDb21wYW5pb25CYWNrZmlsbDpub29wRnVuYyxnZXREaXNhYmxlQ3VzdG9tUGxheWJhY2tGb3JJT1MxMFBsdXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pfSxnZXREaXNhYmxlZEZsYXNoQWRzOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEZlYXR1cmVGbGFnczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZ9LGdldExvY2FsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmx9LGdldE51bVJlZGlyZWN0czpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJ9LGdldFBsYXllclR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50fSxnZXRQbGF5ZXJWZXJzaW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudn0sZ2V0UHBpZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB9LGdldFZwYWlkTW9kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN9LGlzQ29va2llc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jfSxpc1ZwYWlkQWRhcHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLk19LHNldENvbXBhbmlvbkJhY2tmaWxsOm5vb3BGdW5jLHNldEF1dG9QbGF5QWRCcmVha3M6ZnVuY3Rpb24oYSl7dGhpcy5LPWF9LHNldENvb2tpZXNFbmFibGVkOmZ1bmN0aW9uKGMpe3RoaXMuYz0hIWN9LHNldERpc2FibGVDdXN0b21QbGF5YmFja0ZvcklPUzEwUGx1czpmdW5jdGlvbihpKXt0aGlzLmk9ISFpfSxzZXREaXNhYmxlRmxhc2hBZHM6bm9vcEZ1bmMsc2V0RmVhdHVyZUZsYWdzOmZ1bmN0aW9uKGYpe3RoaXMuZj0hIWZ9LHNldElzVnBhaWRBZGFwdGVyOmZ1bmN0aW9uKGEpe3RoaXMuTT1hfSxzZXRMb2NhbGU6ZnVuY3Rpb24obCl7dGhpcy5sPSEhbH0sc2V0TnVtUmVkaXJlY3RzOmZ1bmN0aW9uKHIpe3RoaXMucj0hIXJ9LHNldFBhZ2VDb3JyZWxhdG9yOmZ1bmN0aW9uKGEpe3RoaXMuUj1hfSxzZXRQbGF5ZXJUeXBlOmZ1bmN0aW9uKHQpe3RoaXMudD0hIXR9LHNldFBsYXllclZlcnNpb246ZnVuY3Rpb24odil7dGhpcy52PSEhdn0sc2V0UHBpZDpmdW5jdGlvbihwKXt0aGlzLnA9ISFwfSxzZXRWcGFpZE1vZGU6ZnVuY3Rpb24oYSl7dGhpcy5DPWF9LHNldFNlc3Npb25JZDpub29wRnVuYyxzZXRTdHJlYW1Db3JyZWxhdG9yOm5vb3BGdW5jLHNldFZwYWlkQWxsb3dlZDpub29wRnVuYyxDb21wYW5pb25CYWNrZmlsbE1vZGU6e0FMV0FZUzoiYWx3YXlzIixPTl9NQVNURVJfQUQ6Im9uX21hc3Rlcl9hZCJ9LFZwYWlkTW9kZTp7RElTQUJMRUQ6MCxFTkFCTEVEOjEsSU5TRUNVUkU6Mn19O3ZhciBFdmVudEhhbmRsZXI9ZnVuY3Rpb24oKXt0aGlzLmxpc3RlbmVycz1uZXcgTWFwLHRoaXMuX2Rpc3BhdGNoPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbGlzdGVuZXJzPXRoaXMubGlzdGVuZXJzLmdldChlLnR5cGUpfHxbXSxfaT0wLF9BcnJheSRmcm9tPUFycmF5LmZyb20obGlzdGVuZXJzKTtfaTxfQXJyYXkkZnJvbS5sZW5ndGg7X2krKyl7dmFyIGxpc3RlbmVyPV9BcnJheSRmcm9tW19pXTt0cnl7bGlzdGVuZXIoZSl9Y2F0Y2gocil7bG9nTWVzc2FnZShzb3VyY2Uscil9fX0sdGhpcy5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsYyl7dGhpcy5saXN0ZW5lcnMuaGFzKHQpfHx0aGlzLmxpc3RlbmVycy5zZXQodCxuZXcgU2V0KSx0aGlzLmxpc3RlbmVycy5nZXQodCkuYWRkKGMpfSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxjKXt2YXIgX3RoaXMkbGlzdGVuZXJzJGdldDtudWxsPT09KF90aGlzJGxpc3RlbmVycyRnZXQ9dGhpcy5saXN0ZW5lcnMuZ2V0KHQpKXx8dm9pZCAwPT09X3RoaXMkbGlzdGVuZXJzJGdldHx8X3RoaXMkbGlzdGVuZXJzJGdldC5kZWxldGUoYyl9fSxBZHNNYW5hZ2VyPW5ldyBFdmVudEhhbmRsZXI7QWRzTWFuYWdlci52b2x1bWU9MSxBZHNNYW5hZ2VyLmNvbGxhcHNlPW5vb3BGdW5jLEFkc01hbmFnZXIuY29uZmlndXJlQWRzTWFuYWdlcj1ub29wRnVuYyxBZHNNYW5hZ2VyLmRlc3Ryb3k9bm9vcEZ1bmMsQWRzTWFuYWdlci5kaXNjYXJkQWRCcmVhaz1ub29wRnVuYyxBZHNNYW5hZ2VyLmV4cGFuZD1ub29wRnVuYyxBZHNNYW5hZ2VyLmZvY3VzPW5vb3BGdW5jLEFkc01hbmFnZXIuZ2V0QWRTa2lwcGFibGVTdGF0ZT1mdW5jdGlvbigpe3JldHVybiExfSxBZHNNYW5hZ2VyLmdldEN1ZVBvaW50cz1mdW5jdGlvbigpe3JldHVyblswXX0sQWRzTWFuYWdlci5nZXRDdXJyZW50QWQ9ZnVuY3Rpb24oKXtyZXR1cm4gY3VycmVudEFkfSxBZHNNYW5hZ2VyLmdldEN1cnJlbnRBZEN1ZVBvaW50cz1mdW5jdGlvbigpe3JldHVybltdfSxBZHNNYW5hZ2VyLmdldFJlbWFpbmluZ1RpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sQWRzTWFuYWdlci5nZXRWb2x1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52b2x1bWV9LEFkc01hbmFnZXIuaW5pdD1ub29wRnVuYyxBZHNNYW5hZ2VyLmlzQ3VzdG9tQ2xpY2tUcmFja2luZ1VzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sQWRzTWFuYWdlci5pc0N1c3RvbVBsYXliYWNrVXNlZD1mdW5jdGlvbigpe3JldHVybiExfSxBZHNNYW5hZ2VyLnBhdXNlPW5vb3BGdW5jLEFkc01hbmFnZXIucmVxdWVzdE5leHRBZEJyZWFrPW5vb3BGdW5jLEFkc01hbmFnZXIucmVzaXplPW5vb3BGdW5jLEFkc01hbmFnZXIucmVzdW1lPW5vb3BGdW5jLEFkc01hbmFnZXIuc2V0Vm9sdW1lPWZ1bmN0aW9uKHYpe3RoaXMudm9sdW1lPXZ9LEFkc01hbmFnZXIuc2tpcD1ub29wRnVuYyxBZHNNYW5hZ2VyLnN0YXJ0PWZ1bmN0aW9uKCl7Zm9yKHZhciBfaTI9MCxfYXJyPVtBZEV2ZW50LlR5cGUuQUxMX0FEU19DT01QTEVURUQsQWRFdmVudC5UeXBlLkNPTlRFTlRfUkVTVU1FX1JFUVVFU1RFRF07X2kyPF9hcnIubGVuZ3RoO19pMisrKXt2YXIgdHlwZT1fYXJyW19pMl07dHJ5e3RoaXMuX2Rpc3BhdGNoKG5ldyBpbWEuQWRFdmVudCh0eXBlKSl9Y2F0Y2goZSl7bG9nTWVzc2FnZShzb3VyY2UsZSl9fX0sQWRzTWFuYWdlci5zdG9wPW5vb3BGdW5jLEFkc01hbmFnZXIudXBkYXRlQWRzUmVuZGVyaW5nU2V0dGluZ3M9bm9vcEZ1bmM7dmFyIG1hbmFnZXI9T2JqZWN0LmNyZWF0ZShBZHNNYW5hZ2VyKSxBZHNNYW5hZ2VyTG9hZGVkRXZlbnQ9ZnVuY3Rpb24odHlwZSxhZHNSZXF1ZXN0LHVzZXJSZXF1ZXN0Q29udGV4dCl7dGhpcy50eXBlPXR5cGUsdGhpcy5hZHNSZXF1ZXN0PWFkc1JlcXVlc3QsdGhpcy51c2VyUmVxdWVzdENvbnRleHQ9dXNlclJlcXVlc3RDb250ZXh0fTtBZHNNYW5hZ2VyTG9hZGVkRXZlbnQucHJvdG90eXBlPXtnZXRBZHNNYW5hZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG1hbmFnZXJ9LGdldFVzZXJSZXF1ZXN0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVzZXJSZXF1ZXN0Q29udGV4dD90aGlzLnVzZXJSZXF1ZXN0Q29udGV4dDp7fX19LEFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlPXtBRFNfTUFOQUdFUl9MT0FERUQ6ImFkc01hbmFnZXJMb2FkZWQifTt2YXIgQWRzTG9hZGVyPUV2ZW50SGFuZGxlcjtBZHNMb2FkZXIucHJvdG90eXBlLnNldHRpbmdzPW5ldyBJbWFTZGtTZXR0aW5ncyxBZHNMb2FkZXIucHJvdG90eXBlLmNvbnRlbnRDb21wbGV0ZT1ub29wRnVuYyxBZHNMb2FkZXIucHJvdG90eXBlLmRlc3Ryb3k9bm9vcEZ1bmMsQWRzTG9hZGVyLnByb3RvdHlwZS5nZXRTZXR0aW5ncz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNldHRpbmdzfSxBZHNMb2FkZXIucHJvdG90eXBlLmdldFZlcnNpb249ZnVuY3Rpb24oKXtyZXR1cm4iMy40NTMuMCJ9LEFkc0xvYWRlci5wcm90b3R5cGUucmVxdWVzdEFkcz1mdW5jdGlvbihhZHNSZXF1ZXN0LHVzZXJSZXF1ZXN0Q29udGV4dCl7dmFyIF90aGlzPXRoaXM7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe3ZhciBBRFNfTUFOQUdFUl9MT0FERUQ9QWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVELGV2ZW50PW5ldyBpbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50KEFEU19NQU5BR0VSX0xPQURFRCxhZHNSZXF1ZXN0LHVzZXJSZXF1ZXN0Q29udGV4dCk7X3RoaXMuX2Rpc3BhdGNoKGV2ZW50KX0pKTt2YXIgZT1uZXcgaW1hLkFkRXJyb3IoImFkUGxheUVycm9yIiwxMjA1LDEyMDUsIlRoZSBicm93c2VyIHByZXZlbnRlZCBwbGF5YmFjayBpbml0aWF0ZWQgd2l0aG91dCB1c2VyIGludGVyYWN0aW9uLiIsYWRzUmVxdWVzdCx1c2VyUmVxdWVzdENvbnRleHQpO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXtfdGhpcy5fZGlzcGF0Y2gobmV3IGltYS5BZEVycm9yRXZlbnQoZSkpfSkpfTt2YXIgQWRzUmVuZGVyaW5nU2V0dGluZ3M9bm9vcEZ1bmMsQWRzUmVxdWVzdD1mdW5jdGlvbigpe307QWRzUmVxdWVzdC5wcm90b3R5cGU9e3NldEFkV2lsbEF1dG9QbGF5Om5vb3BGdW5jLHNldEFkV2lsbFBsYXlNdXRlZDpub29wRnVuYyxzZXRDb250aW51b3VzUGxheWJhY2s6bm9vcEZ1bmN9O3ZhciBBZFBvZEluZm89ZnVuY3Rpb24oKXt9O0FkUG9kSW5mby5wcm90b3R5cGU9e2dldEFkUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZ2V0SXNCdW1wZXI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2V0TWF4RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4tMX0sZ2V0UG9kSW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZ2V0VGltZU9mZnNldDpmdW5jdGlvbigpe3JldHVybiAwfSxnZXRUb3RhbEFkczpmdW5jdGlvbigpe3JldHVybiAxfX07dmFyIEFkPWZ1bmN0aW9uKCl7fTtBZC5wcm90b3R5cGU9e3BpOm5ldyBBZFBvZEluZm8sZ2V0QWRJZDpmdW5jdGlvbigpe3JldHVybiIifSxnZXRBZFBvZEluZm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5waX0sZ2V0QWRTeXN0ZW06ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0QWR2ZXJ0aXNlck5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0QXBpRnJhbWV3b3JrOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGdldENvbXBhbmlvbkFkczpmdW5jdGlvbigpe3JldHVybltdfSxnZXRDb250ZW50VHlwZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXRDcmVhdGl2ZUFkSWQ6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RGVhbElkOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldERlc2NyaXB0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDguNX0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldE1lZGlhVXJsOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGdldE1pblN1Z2dlc3RlZER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuLTJ9LGdldFNraXBUaW1lT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuLTF9LGdldFN1cnZleVVybDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxnZXRUaXRsZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXRUcmFmZmlja2luZ1BhcmFtZXRlcnNTdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0VWlFbGVtZW50czpmdW5jdGlvbigpe3JldHVyblsiIl19LGdldFVuaXZlcnNhbEFkSWRSZWdpc3RyeTpmdW5jdGlvbigpe3JldHVybiJ1bmtub3duIn0sZ2V0VW5pdmVyc2FsQWRJZHM6ZnVuY3Rpb24oKXtyZXR1cm5bIiJdfSxnZXRVbml2ZXJzYWxBZElkVmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4idW5rbm93biJ9LGdldFZhc3RNZWRpYUJpdHJhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZ2V0VmFzdE1lZGlhSGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldFZhc3RNZWRpYVdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldFdyYXBwZXJBZElkczpmdW5jdGlvbigpe3JldHVyblsiIl19LGdldFdyYXBwZXJBZFN5c3RlbXM6ZnVuY3Rpb24oKXtyZXR1cm5bIiJdfSxnZXRXcmFwcGVyQ3JlYXRpdmVJZHM6ZnVuY3Rpb24oKXtyZXR1cm5bIiJdfSxpc0xpbmVhcjpmdW5jdGlvbigpe3JldHVybiEwfSxpc1NraXBwYWJsZTpmdW5jdGlvbigpe3JldHVybiEwfX07dmFyIENvbXBhbmlvbkFkPWZ1bmN0aW9uKCl7fTtDb21wYW5pb25BZC5wcm90b3R5cGU9e2dldEFkU2xvdElkOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0Q29udGVudFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIDF9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDF9fTt2YXIgQWRFcnJvcj1mdW5jdGlvbih0eXBlLGNvZGUsdmFzdCxtZXNzYWdlLGFkc1JlcXVlc3QsdXNlclJlcXVlc3RDb250ZXh0KXt0aGlzLmVycm9yQ29kZT1jb2RlLHRoaXMubWVzc2FnZT1tZXNzYWdlLHRoaXMudHlwZT10eXBlLHRoaXMuYWRzUmVxdWVzdD1hZHNSZXF1ZXN0LHRoaXMudXNlclJlcXVlc3RDb250ZXh0PXVzZXJSZXF1ZXN0Q29udGV4dCx0aGlzLmdldEVycm9yQ29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sdGhpcy5nZXRJbm5lckVycm9yPWZ1bmN0aW9uKCl7fSx0aGlzLmdldE1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZXNzYWdlfSx0aGlzLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfSx0aGlzLmdldFZhc3RFcnJvckNvZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YXN0RXJyb3JDb2RlfSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkFkRXJyb3IgIi5jb25jYXQodGhpcy5lcnJvckNvZGUsIjogIikuY29uY2F0KHRoaXMubWVzc2FnZSl9fTtBZEVycm9yLkVycm9yQ29kZT17fSxBZEVycm9yLlR5cGU9e307dmFyIGN1cnJlbnRBZD1mdW5jdGlvbigpe3RyeXtmb3IodmFyIF9pMz0wLF9PYmplY3QkdmFsdWVzPU9iamVjdC52YWx1ZXMod2luZG93LnZpZGlibGUuX2dldENvbnRleHRzKCkpO19pMzxfT2JqZWN0JHZhbHVlcy5sZW5ndGg7X2kzKyspe3ZhciBfY3R4JGdldFBsYXllcixfY3R4JGdldFBsYXllciRkaXY7aWYobnVsbCE9PShfY3R4JGdldFBsYXllcj1fT2JqZWN0JHZhbHVlc1tfaTNdLmdldFBsYXllcigpKSYmdm9pZCAwIT09X2N0eCRnZXRQbGF5ZXImJm51bGwhPT0oX2N0eCRnZXRQbGF5ZXIkZGl2PV9jdHgkZ2V0UGxheWVyLmRpdikmJnZvaWQgMCE9PV9jdHgkZ2V0UGxheWVyJGRpdiYmX2N0eCRnZXRQbGF5ZXIkZGl2LmlubmVySFRNTC5pbmNsdWRlcygid3d3LmVuZ2FkZ2V0LmNvbSIpKXJldHVybiEwfX1jYXRjaChlKXt9cmV0dXJuITF9KCk/dm9pZCAwOm5ldyBBZCxBZEV2ZW50PWZ1bmN0aW9uKHR5cGUpe3RoaXMudHlwZT10eXBlfTtBZEV2ZW50LnByb3RvdHlwZT17Z2V0QWQ6ZnVuY3Rpb24oKXtyZXR1cm4gY3VycmVudEFkfSxnZXRBZERhdGE6ZnVuY3Rpb24oKXt9fSxBZEV2ZW50LlR5cGU9e0FEX0JSRUFLX1JFQURZOiJhZEJyZWFrUmVhZHkiLEFEX0JVRkZFUklORzoiYWRCdWZmZXJpbmciLEFEX0NBTl9QTEFZOiJhZENhblBsYXkiLEFEX01FVEFEQVRBOiJhZE1ldGFkYXRhIixBRF9QUk9HUkVTUzoiYWRQcm9ncmVzcyIsQUxMX0FEU19DT01QTEVURUQ6ImFsbEFkc0NvbXBsZXRlZCIsQ0xJQ0s6ImNsaWNrIixDT01QTEVURToiY29tcGxldGUiLENPTlRFTlRfUEFVU0VfUkVRVUVTVEVEOiJjb250ZW50UGF1c2VSZXF1ZXN0ZWQiLENPTlRFTlRfUkVTVU1FX1JFUVVFU1RFRDoiY29udGVudFJlc3VtZVJlcXVlc3RlZCIsRFVSQVRJT05fQ0hBTkdFOiJkdXJhdGlvbkNoYW5nZSIsRVhQQU5ERURfQ0hBTkdFRDoiZXhwYW5kZWRDaGFuZ2VkIixGSVJTVF9RVUFSVElMRToiZmlyc3RRdWFydGlsZSIsSU1QUkVTU0lPTjoiaW1wcmVzc2lvbiIsSU5URVJBQ1RJT046ImludGVyYWN0aW9uIixMSU5FQVJfQ0hBTkdFOiJsaW5lYXJDaGFuZ2UiLExJTkVBUl9DSEFOR0VEOiJsaW5lYXJDaGFuZ2VkIixMT0FERUQ6ImxvYWRlZCIsTE9HOiJsb2ciLE1JRFBPSU5UOiJtaWRwb2ludCIsUEFVU0VEOiJwYXVzZSIsUkVTVU1FRDoicmVzdW1lIixTS0lQUEFCTEVfU1RBVEVfQ0hBTkdFRDoic2tpcHBhYmxlU3RhdGVDaGFuZ2VkIixTS0lQUEVEOiJza2lwIixTVEFSVEVEOiJzdGFydCIsVEhJUkRfUVVBUlRJTEU6InRoaXJkUXVhcnRpbGUiLFVTRVJfQ0xPU0U6InVzZXJDbG9zZSIsVklERU9fQ0xJQ0tFRDoidmlkZW9DbGlja2VkIixWSURFT19JQ09OX0NMSUNLRUQ6InZpZGVvSWNvbkNsaWNrZWQiLFZJRVdBQkxFX0lNUFJFU1NJT046InZpZXdhYmxlX2ltcHJlc3Npb24iLFZPTFVNRV9DSEFOR0VEOiJ2b2x1bWVDaGFuZ2UiLFZPTFVNRV9NVVRFRDoibXV0ZSJ9O3ZhciBBZEVycm9yRXZlbnQ9ZnVuY3Rpb24oZXJyb3Ipe3RoaXMuZXJyb3I9ZXJyb3IsdGhpcy50eXBlPSJhZEVycm9yIix0aGlzLmdldEVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3J9LHRoaXMuZ2V0VXNlclJlcXVlc3RDb250ZXh0PWZ1bmN0aW9uKCl7dmFyIF90aGlzJGVycm9yO3JldHVybiBudWxsIT09KF90aGlzJGVycm9yPXRoaXMuZXJyb3IpJiZ2b2lkIDAhPT1fdGhpcyRlcnJvciYmX3RoaXMkZXJyb3IudXNlclJlcXVlc3RDb250ZXh0P3RoaXMuZXJyb3IudXNlclJlcXVlc3RDb250ZXh0Ont9fX07QWRFcnJvckV2ZW50LlR5cGU9e0FEX0VSUk9SOiJhZEVycm9yIn07dmFyIEN1c3RvbUNvbnRlbnRMb2FkZWRFdmVudD1mdW5jdGlvbigpe307Q3VzdG9tQ29udGVudExvYWRlZEV2ZW50LlR5cGU9e0NVU1RPTV9DT05URU5UX0xPQURFRDoiZGVwcmVjYXRlZC1ldmVudCJ9O3ZhciBDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzPWZ1bmN0aW9uKCl7fTtDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzLkNyZWF0aXZlVHlwZT17QUxMOiJBbGwiLEZMQVNIOiJGbGFzaCIsSU1BR0U6IkltYWdlIn0sQ29tcGFuaW9uQWRTZWxlY3Rpb25TZXR0aW5ncy5SZXNvdXJjZVR5cGU9e0FMTDoiQWxsIixIVE1MOiJIdG1sIixJRlJBTUU6IklGcmFtZSIsU1RBVElDOiJTdGF0aWMifSxDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzLlNpemVDcml0ZXJpYT17SUdOT1JFOiJJZ25vcmVTaXplIixTRUxFQ1RfRVhBQ1RfTUFUQ0g6IlNlbGVjdEV4YWN0TWF0Y2giLFNFTEVDVF9ORUFSX01BVENIOiJTZWxlY3ROZWFyTWF0Y2gifTt2YXIgQWRDdWVQb2ludHM9ZnVuY3Rpb24oKXt9O0FkQ3VlUG9pbnRzLnByb3RvdHlwZT17Z2V0Q3VlUG9pbnRzOmZ1bmN0aW9uKCl7cmV0dXJuW119LGdldEFkSWRSZWdpc3RyeTpmdW5jdGlvbigpe3JldHVybiIifSxnZXRBZElzVmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn19O3ZhciBBZFByb2dyZXNzRGF0YT1ub29wRnVuYztPYmplY3QuYXNzaWduKGltYSx7QWRDdWVQb2ludHM6QWRDdWVQb2ludHMsQWREaXNwbGF5Q29udGFpbmVyOkFkRGlzcGxheUNvbnRhaW5lcixBZEVycm9yOkFkRXJyb3IsQWRFcnJvckV2ZW50OkFkRXJyb3JFdmVudCxBZEV2ZW50OkFkRXZlbnQsQWRQb2RJbmZvOkFkUG9kSW5mbyxBZFByb2dyZXNzRGF0YTpBZFByb2dyZXNzRGF0YSxBZHNMb2FkZXI6QWRzTG9hZGVyLEFkc01hbmFnZXI6bWFuYWdlcixBZHNNYW5hZ2VyTG9hZGVkRXZlbnQ6QWRzTWFuYWdlckxvYWRlZEV2ZW50LEFkc1JlbmRlcmluZ1NldHRpbmdzOkFkc1JlbmRlcmluZ1NldHRpbmdzLEFkc1JlcXVlc3Q6QWRzUmVxdWVzdCxDb21wYW5pb25BZDpDb21wYW5pb25BZCxDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzOkNvbXBhbmlvbkFkU2VsZWN0aW9uU2V0dGluZ3MsQ3VzdG9tQ29udGVudExvYWRlZEV2ZW50OkN1c3RvbUNvbnRlbnRMb2FkZWRFdmVudCxncHRQcm94eUluc3RhbmNlOnt9LEltYVNka1NldHRpbmdzOkltYVNka1NldHRpbmdzLE9taWRBY2Nlc3NNb2RlOntET01BSU46ImRvbWFpbiIsRlVMTDoiZnVsbCIsTElNSVRFRDoibGltaXRlZCJ9LHNldHRpbmdzOm5ldyBJbWFTZGtTZXR0aW5ncyxVaUVsZW1lbnRzOntBRF9BVFRSSUJVVElPTjoiYWRBdHRyaWJ1dGlvbiIsQ09VTlRET1dOOiJjb3VudGRvd24ifSxVbml2ZXJzYWxBZElkSW5mbzpmdW5jdGlvbigpe30sVkVSU0lPTjoiMy40NTMuMCIsVmlld01vZGU6e0ZVTExTQ1JFRU46ImZ1bGxzY3JlZW4iLE5PUk1BTDoibm9ybWFsIn19KSx3aW5kb3cuZ29vZ2xlfHwod2luZG93Lmdvb2dsZT17fSksd2luZG93Lmdvb2dsZS5pbWE9aW1hLGZ1bmN0aW9uKHNvdXJjZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6Imdvb2dsZS1pbWEzIixhcmdzOltdfSxbXSk7" diff --git a/dist/redirects.yml b/dist/redirects.yml index 465f04b2..7d328015 100644 --- a/dist/redirects.yml +++ b/dist/redirects.yml @@ -1,6 +1,6 @@ # # AdGuard Scriptlets (Redirects Source) -# Version 1.7.14 +# Version 1.7.19 # - title: 1x1-transparent.gif description: |- @@ -1428,7 +1428,9 @@ - title: google-ima3 comment: Mocks the IMA SDK of Google. - aliases: [] + aliases: + - ubo-google-ima.js + - google-ima.js contentType: application/javascript content: |- (function(source, args) { diff --git a/dist/scriptlets.corelibs.json b/dist/scriptlets.corelibs.json index 5ae3c733..6678c4d9 100644 --- a/dist/scriptlets.corelibs.json +++ b/dist/scriptlets.corelibs.json @@ -1,5 +1,5 @@ { - "version": "1.7.14", + "version": "1.7.19", "scriptlets": [ { "names": [ @@ -132,7 +132,7 @@ "ubo-addEventListener-defuser", "ubo-aeld" ], - "scriptlet": "function preventAddEventListener(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function validateType(type){return void 0!==type}function validateListener(listener){return void 0!==listener&&(\"function\"==typeof listener||\"object\"==typeof listener&&null!==listener&&\"function\"==typeof listener.handleEvent)}function listenerToString(listener){return\"function\"==typeof listener?listener.toString():listener.handleEvent.toString()}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,typeSearch,listenerSearch){var typeSearchRegexp=toRegExp(typeSearch),listenerSearchRegexp=toRegExp(listenerSearch),nativeAddEventListener=window.EventTarget.prototype.addEventListener;function addEventListenerWrapper(type,listener){var shouldPrevent=!1;if(validateType(type)&&validateListener(listener)&&(shouldPrevent=typeSearchRegexp.test(type.toString())&&listenerSearchRegexp.test(listenerToString(listener))),!shouldPrevent){for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeAddEventListener.apply(this,[type,listener].concat(args))}hit(source)}var descriptor={configurable:!0,set:function(){},get:function(){return addEventListenerWrapper}};Object.defineProperty(window.EventTarget.prototype,\"addEventListener\",descriptor),Object.defineProperty(window,\"addEventListener\",descriptor),Object.defineProperty(document,\"addEventListener\",descriptor)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventAddEventListener(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function validateType(type){return void 0!==type}function validateListener(listener){return void 0!==listener&&(\"function\"==typeof listener||\"object\"==typeof listener&&null!==listener&&\"function\"==typeof listener.handleEvent)}function listenerToString(listener){return\"function\"==typeof listener?listener.toString():listener.handleEvent.toString()}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,typeSearch,listenerSearch){var typeSearchRegexp=toRegExp(typeSearch),listenerSearchRegexp=toRegExp(listenerSearch),nativeAddEventListener=window.EventTarget.prototype.addEventListener;function addEventListenerWrapper(type,listener){var _this$constructor,shouldPrevent=!1;if(validateType(type)&&validateListener(listener)&&(shouldPrevent=typeSearchRegexp.test(type.toString())&&listenerSearchRegexp.test(listenerToString(listener))),!shouldPrevent){var context=this;this&&\"Window\"===(null===(_this$constructor=this.constructor)||void 0===_this$constructor?void 0:_this$constructor.name)&&this!==window&&(context=window);for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeAddEventListener.apply(context,[type,listener].concat(args))}hit(source)}var descriptor={configurable:!0,set:function(){},get:function(){return addEventListenerWrapper}};Object.defineProperty(window.EventTarget.prototype,\"addEventListener\",descriptor),Object.defineProperty(window,\"addEventListener\",descriptor),Object.defineProperty(document,\"addEventListener\",descriptor)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -165,7 +165,7 @@ "ubo-addEventListener-logger", "ubo-aell" ], - "scriptlet": "function logAddEventListener(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function validateType(type){return void 0!==type}function validateListener(listener){return void 0!==listener&&(\"function\"==typeof listener||\"object\"==typeof listener&&null!==listener&&\"function\"==typeof listener.handleEvent)}function listenerToString(listener){return\"function\"==typeof listener?listener.toString():listener.handleEvent.toString()}function convertTypeToString(value){return void 0===value?\"undefined\":\"object\"==typeof value?null===value?\"null\":objectToString(value):value.toString()}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length&&!obj.prototype}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var nativeAddEventListener=window.EventTarget.prototype.addEventListener;function addEventListenerWrapper(type,listener){if(validateType(type)&&validateListener(listener)){var _message='addEventListener(\"'.concat(type,'\", ').concat(listenerToString(listener),\")\");logMessage(source,_message,!0),hit(source)}var message=\"Invalid event type or listener passed to addEventListener:\\ntype: \".concat(convertTypeToString(type),\"\\nlistener: \").concat(convertTypeToString(listener));logMessage(source,message,!0);for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeAddEventListener.apply(this,[type,listener].concat(args))}var descriptor={configurable:!0,set:function(){},get:function(){return addEventListenerWrapper}};Object.defineProperty(window.EventTarget.prototype,\"addEventListener\",descriptor),Object.defineProperty(window,\"addEventListener\",descriptor),Object.defineProperty(document,\"addEventListener\",descriptor)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function logAddEventListener(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function validateType(type){return void 0!==type}function validateListener(listener){return void 0!==listener&&(\"function\"==typeof listener||\"object\"==typeof listener&&null!==listener&&\"function\"==typeof listener.handleEvent)}function listenerToString(listener){return\"function\"==typeof listener?listener.toString():listener.handleEvent.toString()}function convertTypeToString(value){return void 0===value?\"undefined\":\"object\"==typeof value?null===value?\"null\":objectToString(value):value.toString()}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length&&!obj.prototype}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var nativeAddEventListener=window.EventTarget.prototype.addEventListener;function addEventListenerWrapper(type,listener){var _this$constructor;if(validateType(type)&&validateListener(listener)){var _message='addEventListener(\"'.concat(type,'\", ').concat(listenerToString(listener),\")\");logMessage(source,_message,!0),hit(source)}var message=\"Invalid event type or listener passed to addEventListener:\\ntype: \".concat(convertTypeToString(type),\"\\nlistener: \").concat(convertTypeToString(listener));logMessage(source,message,!0);var context=this;this&&\"Window\"===(null===(_this$constructor=this.constructor)||void 0===_this$constructor?void 0:_this$constructor.name)&&this!==window&&(context=window);for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeAddEventListener.apply(context,[type,listener].concat(args))}var descriptor={configurable:!0,set:function(){},get:function(){return addEventListenerWrapper}};Object.defineProperty(window.EventTarget.prototype,\"addEventListener\",descriptor),Object.defineProperty(window,\"addEventListener\",descriptor),Object.defineProperty(document,\"addEventListener\",descriptor)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -444,7 +444,7 @@ "names": [ "prevent-element-src-loading" ], - "scriptlet": "function preventElementSrcLoading(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function safeGetDescriptor(obj,prop){var descriptor=Object.getOwnPropertyDescriptor(obj,prop);return descriptor&&descriptor.configurable?descriptor:null}function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,tagName,match){if(\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Reflect){var instance,policy,srcMockData={script:\"data:text/javascript;base64,KCk9Pnt9\",img:\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",iframe:\"data:text/html;base64, PGRpdj48L2Rpdj4=\"};if(\"script\"===tagName)instance=HTMLScriptElement;else if(\"img\"===tagName)instance=HTMLImageElement;else{if(\"iframe\"!==tagName)return;instance=HTMLIFrameElement}window.trustedTypes&&\"function\"==typeof window.trustedTypes.createPolicy&&(policy=window.trustedTypes.createPolicy(\"mock\",{createScriptURL:function(arg){return arg}}));var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(match),setMatchedAttribute=function(elem){return elem.setAttribute(source.name,\"matched\")},setAttributeHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var nodeName=thisArg.nodeName.toLowerCase(),attrName=args[0].toLowerCase(),attrValue=args[1];return\"src\"===attrName&&tagName.toLowerCase()===nodeName&&srcMockData[nodeName]&&searchRegexp.test(attrValue)?(hit(source),setMatchedAttribute(thisArg),Reflect.apply(target,thisArg,[attrName,srcMockData[nodeName]])):Reflect.apply(target,thisArg,args)}};instance.prototype.setAttribute=new Proxy(Element.prototype.setAttribute,setAttributeHandler);var origSrcDescriptor=safeGetDescriptor(instance.prototype,\"src\");if(origSrcDescriptor){Object.defineProperty(instance.prototype,\"src\",{enumerable:!0,configurable:!0,get:function(){return origSrcDescriptor.get.call(this)},set:function(urlValue){var nodeName=this.nodeName.toLowerCase();if(tagName.toLowerCase()!==nodeName||!srcMockData[nodeName]||!searchRegexp.test(urlValue))return origSrcDescriptor.set.call(this,urlValue),!0;if(policy&&urlValue instanceof TrustedScriptURL){var trustedSrc=policy.createScriptURL(urlValue);return origSrcDescriptor.set.call(this,trustedSrc),void hit(source)}setMatchedAttribute(this),origSrcDescriptor.set.call(this,srcMockData[nodeName]),hit(source)}});var origOnerrorDescriptor=safeGetDescriptor(HTMLElement.prototype,\"onerror\");if(origOnerrorDescriptor){Object.defineProperty(HTMLElement.prototype,\"onerror\",{enumerable:!0,configurable:!0,get:function(){return origOnerrorDescriptor.get.call(this)},set:function(cb){return\"matched\"===this.getAttribute(source.name)?(origOnerrorDescriptor.set.call(this,noopFunc),!0):(origOnerrorDescriptor.set.call(this,cb),!0)}});var addEventListenerHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var eventName=args[0];return\"function\"==typeof thisArg.getAttribute&&\"matched\"===thisArg.getAttribute(source.name)&&\"error\"===eventName?Reflect.apply(target,thisArg,[eventName,noopFunc]):Reflect.apply(target,thisArg,args)}};EventTarget.prototype.addEventListener=new Proxy(EventTarget.prototype.addEventListener,addEventListenerHandler)}}}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventElementSrcLoading(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function safeGetDescriptor(obj,prop){var descriptor=Object.getOwnPropertyDescriptor(obj,prop);return descriptor&&descriptor.configurable?descriptor:null}function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,tagName,match){if(\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Reflect){var instance,policy,srcMockData={script:\"data:text/javascript;base64,KCk9Pnt9\",img:\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",iframe:\"data:text/html;base64, PGRpdj48L2Rpdj4=\"};if(\"script\"===tagName)instance=HTMLScriptElement;else if(\"img\"===tagName)instance=HTMLImageElement;else{if(\"iframe\"!==tagName)return;instance=HTMLIFrameElement}window.trustedTypes&&\"function\"==typeof window.trustedTypes.createPolicy&&(policy=window.trustedTypes.createPolicy(\"AGPolicy\",{createScriptURL:function(arg){return arg}}));var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(match),setMatchedAttribute=function(elem){return elem.setAttribute(source.name,\"matched\")},setAttributeHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var nodeName=thisArg.nodeName.toLowerCase(),attrName=args[0].toLowerCase(),attrValue=args[1];return\"src\"===attrName&&tagName.toLowerCase()===nodeName&&srcMockData[nodeName]&&searchRegexp.test(attrValue)?(hit(source),setMatchedAttribute(thisArg),Reflect.apply(target,thisArg,[attrName,srcMockData[nodeName]])):Reflect.apply(target,thisArg,args)}};instance.prototype.setAttribute=new Proxy(Element.prototype.setAttribute,setAttributeHandler);var origSrcDescriptor=safeGetDescriptor(instance.prototype,\"src\");if(origSrcDescriptor){Object.defineProperty(instance.prototype,\"src\",{enumerable:!0,configurable:!0,get:function(){return origSrcDescriptor.get.call(this)},set:function(urlValue){var nodeName=this.nodeName.toLowerCase();if(tagName.toLowerCase()!==nodeName||!srcMockData[nodeName]||!searchRegexp.test(urlValue))return origSrcDescriptor.set.call(this,urlValue),!0;if(policy&&urlValue instanceof TrustedScriptURL){var trustedSrc=policy.createScriptURL(urlValue);return origSrcDescriptor.set.call(this,trustedSrc),void hit(source)}setMatchedAttribute(this),origSrcDescriptor.set.call(this,srcMockData[nodeName]),hit(source)}});var origOnerrorDescriptor=safeGetDescriptor(HTMLElement.prototype,\"onerror\");if(origOnerrorDescriptor){Object.defineProperty(HTMLElement.prototype,\"onerror\",{enumerable:!0,configurable:!0,get:function(){return origOnerrorDescriptor.get.call(this)},set:function(cb){return\"matched\"===this.getAttribute(source.name)?(origOnerrorDescriptor.set.call(this,noopFunc),!0):(origOnerrorDescriptor.set.call(this,cb),!0)}});var addEventListenerHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var eventName=args[0];return\"function\"==typeof thisArg.getAttribute&&\"matched\"===thisArg.getAttribute(source.name)&&\"error\"===eventName?Reflect.apply(target,thisArg,[eventName,noopFunc]):Reflect.apply(target,thisArg,args)}};EventTarget.prototype.addEventListener=new Proxy(EventTarget.prototype.addEventListener,addEventListenerHandler)}}}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ diff --git a/dist/scriptlets.js b/dist/scriptlets.js index fcf4e420..0032c85a 100644 --- a/dist/scriptlets.js +++ b/dist/scriptlets.js @@ -1,7 +1,7 @@ /** * AdGuard Scriptlets - * Version 1.7.14 + * Version 1.7.19 */ (function () { @@ -1584,7 +1584,7 @@ } /** - * Generate random six symbols id + * Generate random seven symbols id */ function randomId() { return Math.random().toString(36).slice(2, 9); @@ -3439,6 +3439,7 @@ var listenerSearchRegexp = toRegExp(listenerSearch); var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; var shouldPrevent = false; if (validateType(type) && validateListener(listener)) { shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); @@ -3447,10 +3448,17 @@ hit(source); return undefined; } + + // Avoid illegal invocations due to lost context + // https://github.com/AdguardTeam/Scriptlets/issues/271 + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -3619,6 +3627,7 @@ function logAddEventListener$1(source) { var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; if (validateType(type) && validateListener(listener)) { var _message = "addEventListener(\"".concat(type, "\", ").concat(listenerToString(listener), ")"); logMessage(source, _message, true); @@ -3628,10 +3637,17 @@ // logging while debugging var message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); logMessage(source, message, true); + + // Avoid illegal invocations due to lost context + // https://github.com/AdguardTeam/Scriptlets/issues/271 + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -6265,7 +6281,13 @@ var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function'; var policy; if (hasTrustedTypes) { - policy = window.trustedTypes.createPolicy('mock', { + // The name for the trusted-types policy should only be 'AGPolicy',because corelibs can + // allow our policy if the server has restricted the creation of a trusted-types policy with + // the directive 'Content-Security-Policy: trusted-types ;`. + // If such a header is presented in the server response, corelibs adds permission to create + // the 'AGPolicy' policy with the 'allow-duplicates' option to prevent errors. + // See AG-18204 for details. + policy = window.trustedTypes.createPolicy('AGPolicy', { createScriptURL: function createScriptURL(arg) { return arg; } @@ -7357,7 +7379,8 @@ adg: 'googletagservices-gpt', ubo: 'googletagservices_gpt.js' }, { - adg: 'google-ima3' + adg: 'google-ima3', + ubo: 'google-ima.js' }, { adg: 'gemius' }, { @@ -10044,7 +10067,11 @@ window.google.ima = ima; hit(source); } - GoogleIma3.names = ['google-ima3']; + GoogleIma3.names = ['google-ima3', + // prefixed name + 'ubo-google-ima.js', + // original ubo name + 'google-ima.js']; GoogleIma3.injections = [hit, noopFunc, logMessage]; /* eslint-disable func-names, no-underscore-dangle */ @@ -13604,6 +13631,8 @@ "ubo-googletagmanager_gtm.js": "google-analytics.js", "googletagmanager_gtm.js": "google-analytics.js", "google-ima3": "google-ima3.js", + "ubo-google-ima.js": "google-ima3.js", + "google-ima.js": "google-ima3.js", "googlesyndication-adsbygoogle": "googlesyndication-adsbygoogle.js", "ubo-googlesyndication_adsbygoogle.js": "googlesyndication-adsbygoogle.js", "googlesyndication_adsbygoogle.js": "googlesyndication-adsbygoogle.js", @@ -15934,6 +15963,7 @@ function logAddEventListener(source) { var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; if (validateType(type) && validateListener(listener)) { var _message = 'addEventListener("'.concat(type, '", ').concat(listenerToString(listener), ")"); logMessage(source, _message, true); @@ -15941,10 +15971,14 @@ } var message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); logMessage(source, message, true); + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === "Window" && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -16498,6 +16532,7 @@ var listenerSearchRegexp = toRegExp(listenerSearch); var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; var shouldPrevent = false; if (validateType(type) && validateListener(listener)) { shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); @@ -16506,10 +16541,14 @@ hit(source); return undefined; } + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === "Window" && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -16807,7 +16846,7 @@ var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === "function"; var policy; if (hasTrustedTypes) { - policy = window.trustedTypes.createPolicy("mock", { + policy = window.trustedTypes.createPolicy("AGPolicy", { createScriptURL: function createScriptURL(arg) { return arg; } diff --git a/dist/umd/scriptlets.umd.js b/dist/umd/scriptlets.umd.js index 5aa51a87..d5acfc92 100644 --- a/dist/umd/scriptlets.umd.js +++ b/dist/umd/scriptlets.umd.js @@ -1,7 +1,7 @@ /** * AdGuard Scriptlets - * Version 1.7.14 + * Version 1.7.19 */ (function (factory) { @@ -1586,7 +1586,7 @@ } /** - * Generate random six symbols id + * Generate random seven symbols id */ function randomId() { return Math.random().toString(36).slice(2, 9); @@ -3441,6 +3441,7 @@ var listenerSearchRegexp = toRegExp(listenerSearch); var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; var shouldPrevent = false; if (validateType(type) && validateListener(listener)) { shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); @@ -3449,10 +3450,17 @@ hit(source); return undefined; } + + // Avoid illegal invocations due to lost context + // https://github.com/AdguardTeam/Scriptlets/issues/271 + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -3621,6 +3629,7 @@ function logAddEventListener$1(source) { var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; if (validateType(type) && validateListener(listener)) { var _message = "addEventListener(\"".concat(type, "\", ").concat(listenerToString(listener), ")"); logMessage(source, _message, true); @@ -3630,10 +3639,17 @@ // logging while debugging var message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); logMessage(source, message, true); + + // Avoid illegal invocations due to lost context + // https://github.com/AdguardTeam/Scriptlets/issues/271 + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -6267,7 +6283,13 @@ var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function'; var policy; if (hasTrustedTypes) { - policy = window.trustedTypes.createPolicy('mock', { + // The name for the trusted-types policy should only be 'AGPolicy',because corelibs can + // allow our policy if the server has restricted the creation of a trusted-types policy with + // the directive 'Content-Security-Policy: trusted-types ;`. + // If such a header is presented in the server response, corelibs adds permission to create + // the 'AGPolicy' policy with the 'allow-duplicates' option to prevent errors. + // See AG-18204 for details. + policy = window.trustedTypes.createPolicy('AGPolicy', { createScriptURL: function createScriptURL(arg) { return arg; } @@ -7359,7 +7381,8 @@ adg: 'googletagservices-gpt', ubo: 'googletagservices_gpt.js' }, { - adg: 'google-ima3' + adg: 'google-ima3', + ubo: 'google-ima.js' }, { adg: 'gemius' }, { @@ -10046,7 +10069,11 @@ window.google.ima = ima; hit(source); } - GoogleIma3.names = ['google-ima3']; + GoogleIma3.names = ['google-ima3', + // prefixed name + 'ubo-google-ima.js', + // original ubo name + 'google-ima.js']; GoogleIma3.injections = [hit, noopFunc, logMessage]; /* eslint-disable func-names, no-underscore-dangle */ @@ -13606,6 +13633,8 @@ "ubo-googletagmanager_gtm.js": "google-analytics.js", "googletagmanager_gtm.js": "google-analytics.js", "google-ima3": "google-ima3.js", + "ubo-google-ima.js": "google-ima3.js", + "google-ima.js": "google-ima3.js", "googlesyndication-adsbygoogle": "googlesyndication-adsbygoogle.js", "ubo-googlesyndication_adsbygoogle.js": "googlesyndication-adsbygoogle.js", "googlesyndication_adsbygoogle.js": "googlesyndication-adsbygoogle.js", @@ -15936,6 +15965,7 @@ function logAddEventListener(source) { var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; if (validateType(type) && validateListener(listener)) { var _message = 'addEventListener("'.concat(type, '", ').concat(listenerToString(listener), ")"); logMessage(source, _message, true); @@ -15943,10 +15973,14 @@ } var message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); logMessage(source, message, true); + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === "Window" && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -16500,6 +16534,7 @@ var listenerSearchRegexp = toRegExp(listenerSearch); var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; var shouldPrevent = false; if (validateType(type) && validateListener(listener)) { shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); @@ -16508,10 +16543,14 @@ hit(source); return undefined; } + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === "Window" && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -16809,7 +16848,7 @@ var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === "function"; var policy; if (hasTrustedTypes) { - policy = window.trustedTypes.createPolicy("mock", { + policy = window.trustedTypes.createPolicy("AGPolicy", { createScriptURL: function createScriptURL(arg) { return arg; } From 5043393266157e2392d3d60ca2bfeff13a25ef55 Mon Sep 17 00:00:00 2001 From: Maxim Topciu Date: Mon, 26 Dec 2022 14:29:20 +0300 Subject: [PATCH 47/70] AG-18467 fix redirects types and add method isBlocking Merge in ADGUARD-FILTERS/scriptlets from fix/AG-18467 to master Squashed commit of the following: commit 208193b12a41df9aff3871118c517cad54a8b78d Author: Maxim Topciu Date: Mon Dec 26 13:18:43 2022 +0200 AG-18467 fix comments commit 15d45f86ae6a68356a9f824cfc99a02d33ffb899 Author: Maxim Topciu Date: Fri Dec 23 20:06:02 2022 +0200 AG-18467 fix redirects types and add method isBlocking --- CHANGELOG.md | 11 +++++++++++ README.md | 5 +++++ src/redirects/redirects.js | 17 ++++++++++++++++- types/scriptlets.d.ts | 8 +++++++- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8ca0644..a68664dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Scriptlets and Redirect Resources Changelog +## v1.7.20 + +### Added + +- `isBlocking()` method for Redirects class +- `file` field for redirect type + +### Fixed + +- Redirects types. + ## v1.7.19 ### Fixed diff --git a/README.md b/README.md index d13db534..36c74ecb 100644 --- a/README.md +++ b/README.md @@ -426,6 +426,11 @@ const redirects = new Redirects(rawYaml) */ const redirect = redirect.getRedirect('noopjs'); +/** + * Check if redirect is blocking, e.g. click2load.html + */ +const isBlocking = redirect.isBlocking('click2load.html'); + /** * Redirect - object with following props * { diff --git a/src/redirects/redirects.js b/src/redirects/redirects.js index a1972ea4..91435155 100644 --- a/src/redirects/redirects.js +++ b/src/redirects/redirects.js @@ -14,6 +14,7 @@ import jsYaml from 'js-yaml'; * @property {string} comment * @property {string} content * @property {string} contentType + * @property {string} file * @property {boolean} [isBlocking] * @property {string} [sha] */ @@ -44,7 +45,7 @@ class Redirects { /** * Returns redirect source object * @param {string} title - * @return {Redirect} + * @return {Redirect|undefined} Found redirect source object, or `undefined` if not found. */ getRedirect(title) { if (Object.prototype.hasOwnProperty.call(this.redirects, title)) { @@ -62,6 +63,20 @@ class Redirects { return aliases.indexOf(title) > -1; }); } + + /** + * Checks if redirect is blocking like click2load.html + * @param {string} title Title of the redirect. + * @returns True if redirect is blocking otherwise returns `false` even if redirect name is + * unknown. + */ + isBlocking(title) { + const redirect = this.redirects[title]; + if (redirect) { + return !!redirect.isBlocking; + } + return false; + } } export default Redirects; diff --git a/types/scriptlets.d.ts b/types/scriptlets.d.ts index 148196c6..c1be2a8e 100644 --- a/types/scriptlets.d.ts +++ b/types/scriptlets.d.ts @@ -64,6 +64,11 @@ declare module '@adguard/scriptlets' { */ contentType: string; + /** + * Filename of the redirect. + */ + file: string; + /** * If it's new type of redirects, i.e. click2load */ @@ -81,6 +86,7 @@ declare module '@adguard/scriptlets' { class Redirects { constructor(rawYaml: string); getRedirect(title: string): Redirect; + isBlocking(title: string): boolean; } /** @@ -117,7 +123,7 @@ declare module '@adguard/scriptlets' { /** * Object with redirects titles in the keys and RedirectSources */ - Redirects: Redirects; + Redirects: typeof Redirects; /** * Returns filename with extension for requested alias From 67f240a7d2aee00d2b997c718095aaaeaa274dde Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Mon, 26 Dec 2022 14:32:44 +0300 Subject: [PATCH 48/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5e89e63f..b49d12a8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.19", + "version": "1.7.20", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From 88c982d50e11221d9ec7fd4aaea9b3534053d275 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Mon, 26 Dec 2022 14:36:01 +0300 Subject: [PATCH 49/70] deploy: update dist v1.7.20 --- dist/build.txt | 2 +- dist/redirects.yml | 2 +- dist/scriptlets.corelibs.json | 2 +- dist/scriptlets.js | 20 ++++++++++++++++++-- dist/umd/scriptlets.d.ts | 8 +++++++- dist/umd/scriptlets.umd.js | 20 ++++++++++++++++++-- 6 files changed, 46 insertions(+), 8 deletions(-) diff --git a/dist/build.txt b/dist/build.txt index 7231fa44..6492cbe8 100644 --- a/dist/build.txt +++ b/dist/build.txt @@ -1 +1 @@ -version=1.7.19 \ No newline at end of file +version=1.7.20 \ No newline at end of file diff --git a/dist/redirects.yml b/dist/redirects.yml index 7d328015..bfbc24ef 100644 --- a/dist/redirects.yml +++ b/dist/redirects.yml @@ -1,6 +1,6 @@ # # AdGuard Scriptlets (Redirects Source) -# Version 1.7.19 +# Version 1.7.20 # - title: 1x1-transparent.gif description: |- diff --git a/dist/scriptlets.corelibs.json b/dist/scriptlets.corelibs.json index 6678c4d9..c3b96d01 100644 --- a/dist/scriptlets.corelibs.json +++ b/dist/scriptlets.corelibs.json @@ -1,5 +1,5 @@ { - "version": "1.7.19", + "version": "1.7.20", "scriptlets": [ { "names": [ diff --git a/dist/scriptlets.js b/dist/scriptlets.js index 0032c85a..6cc3c1d5 100644 --- a/dist/scriptlets.js +++ b/dist/scriptlets.js @@ -1,7 +1,7 @@ /** * AdGuard Scriptlets - * Version 1.7.19 + * Version 1.7.20 */ (function () { @@ -13518,6 +13518,7 @@ * @property {string} comment * @property {string} content * @property {string} contentType + * @property {string} file * @property {boolean} [isBlocking] * @property {string} [sha] */ @@ -13545,7 +13546,7 @@ /** * Returns redirect source object * @param {string} title - * @return {Redirect} + * @return {Redirect|undefined} Found redirect source object, or `undefined` if not found. */ createClass(Redirects, [{ key: "getRedirect", @@ -13567,6 +13568,21 @@ return aliases.indexOf(title) > -1; }); } + /** + * Checks if redirect is blocking like click2load.html + * @param {string} title Title of the redirect. + * @returns True if redirect is blocking otherwise returns `false` even if redirect name is + * unknown. + */ + }, { + key: "isBlocking", + value: function isBlocking(title) { + var redirect = this.redirects[title]; + if (redirect) { + return !!redirect.isBlocking; + } + return false; + } }]); return Redirects; }(); diff --git a/dist/umd/scriptlets.d.ts b/dist/umd/scriptlets.d.ts index 148196c6..c1be2a8e 100644 --- a/dist/umd/scriptlets.d.ts +++ b/dist/umd/scriptlets.d.ts @@ -64,6 +64,11 @@ declare module '@adguard/scriptlets' { */ contentType: string; + /** + * Filename of the redirect. + */ + file: string; + /** * If it's new type of redirects, i.e. click2load */ @@ -81,6 +86,7 @@ declare module '@adguard/scriptlets' { class Redirects { constructor(rawYaml: string); getRedirect(title: string): Redirect; + isBlocking(title: string): boolean; } /** @@ -117,7 +123,7 @@ declare module '@adguard/scriptlets' { /** * Object with redirects titles in the keys and RedirectSources */ - Redirects: Redirects; + Redirects: typeof Redirects; /** * Returns filename with extension for requested alias diff --git a/dist/umd/scriptlets.umd.js b/dist/umd/scriptlets.umd.js index d5acfc92..6fa8e863 100644 --- a/dist/umd/scriptlets.umd.js +++ b/dist/umd/scriptlets.umd.js @@ -1,7 +1,7 @@ /** * AdGuard Scriptlets - * Version 1.7.19 + * Version 1.7.20 */ (function (factory) { @@ -13520,6 +13520,7 @@ * @property {string} comment * @property {string} content * @property {string} contentType + * @property {string} file * @property {boolean} [isBlocking] * @property {string} [sha] */ @@ -13547,7 +13548,7 @@ /** * Returns redirect source object * @param {string} title - * @return {Redirect} + * @return {Redirect|undefined} Found redirect source object, or `undefined` if not found. */ createClass(Redirects, [{ key: "getRedirect", @@ -13569,6 +13570,21 @@ return aliases.indexOf(title) > -1; }); } + /** + * Checks if redirect is blocking like click2load.html + * @param {string} title Title of the redirect. + * @returns True if redirect is blocking otherwise returns `false` even if redirect name is + * unknown. + */ + }, { + key: "isBlocking", + value: function isBlocking(title) { + var redirect = this.redirects[title]; + if (redirect) { + return !!redirect.isBlocking; + } + return false; + } }]); return Redirects; }(); From 22e41f814c1f2c9e130e1d42c4599c554aa8c4cd Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Tue, 27 Dec 2022 12:08:49 +0300 Subject: [PATCH 50/70] AG-16616 add decimal delay matching for prevent-setTimeout/-setInterval #247 Merge in ADGUARD-FILTERS/scriptlets from fix/AG-16616 to release/v1.8 Squashed commit of the following: commit 6313c0e08b790f2b1a34cece32aac17dd667020f Author: Stanislav A Date: Mon Dec 26 15:57:57 2022 +0300 improve helper commit 47b92021e6d9564d56b664d3990cc3be642e54cd Author: Stanislav A Date: Thu Dec 22 20:40:17 2022 +0300 tweak buggy test commit 55c72f6765417cab8ccdaaa2f903c5592e37e44c Author: Stanislav A Date: Thu Dec 22 17:29:25 2022 +0300 fix typo commit 72946adf9784ab98b7dc7ed7e2ab4d4f571b5bdf Author: Stanislav A Date: Thu Dec 22 12:16:27 2022 +0300 fix parseRawDelay helper commit 5350f36e8a50cdd76e54b4b4c27e82900810ba7c Author: Stanislav A Date: Wed Dec 21 20:06:15 2022 +0300 fix parseRawDelay helper commit 369c3271205cb0ab7ce035abbf42b6de73604fbc Merge: dd79e29 6191100 Author: Stanislav A Date: Wed Dec 21 16:32:20 2022 +0300 merge release/v1.8 commit dd79e291506392b70ef581e3c4385c9c5e820263 Author: Stanislav A Date: Mon Dec 19 19:49:08 2022 +0300 improve helper commit 8d52c1ba1264c9a80994967a0d9c470acfb0f4c4 Author: Stanislav A Date: Mon Dec 19 18:49:34 2022 +0300 fix helper description commit 28b374d7a4ccd60952849ee23134ff86181325e9 Author: Stanislav A Date: Mon Dec 19 18:34:22 2022 +0300 improve descriptions commit 6bf00c100826a648763f74a0bb2800ad160f0185 Author: Stanislav A Date: Mon Dec 19 18:17:55 2022 +0300 imporve parseRawDelay and move to prevent-utils commit 491b35fdc0c337686596819ecc2d9eb7bfb68941 Author: Stanislav A Date: Fri Dec 16 19:34:43 2022 +0300 fix changelog indents commit e35248d8986891da1b16dc07bb1806fc451cbc1e Author: Stanislav A Date: Fri Dec 16 15:00:53 2022 +0300 improve and test helper commit baca1d803a3668c5e32f08b1950e47c68cba46f8 Author: Stanislav A Date: Thu Dec 15 21:21:10 2022 +0300 improve raw delay parsing commit e0e669822a596bca4f4e917632b0d899b6232333 Author: Stanislav A Date: Thu Dec 15 19:24:40 2022 +0300 add typecheck for delay + tests commit 60505e960a0bd5adda405ad302f54a08b659f363 Author: Stanislav A Date: Thu Dec 15 19:06:15 2022 +0300 update scriptlets descriptions, fix typo in changelog commit f4b48cee5cc074e0abed461faf1c51a139d13584 Author: Stanislav A Date: Thu Dec 15 17:03:37 2022 +0300 add decimal delay matching for prevent-setTimeout/-setInterval --- CHANGELOG.md | 35 +++--- src/helpers/prevent-utils.js | 21 +++- src/scriptlets/prevent-setInterval.js | 18 +++ src/scriptlets/prevent-setTimeout.js | 18 +++ tests/helpers/prevent-utils.js | 23 ++++ tests/scriptlets/prevent-setInterval.test.js | 119 ++++++++++++++++++- tests/scriptlets/prevent-setTimeout.test.js | 113 +++++++++++++++++- tests/scriptlets/prevent-xhr.test.js | 7 +- 8 files changed, 329 insertions(+), 25 deletions(-) create mode 100644 tests/helpers/prevent-utils.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 1955b667..dc357956 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased 1.8.x +### Changed + +- add decimal delay matching for `prevent-setInterval` and `prevent-setTimeout` [#247](https://github.com/AdguardTeam/Scriptlets/issues/247) + ### Fixed - `prevent-xhr` and `trusted-replace-xhr-response` closure bug on multiple requests [#261](https://github.com/AdguardTeam/Scriptlets/issues/261) @@ -38,30 +42,29 @@ - spread of args bug at `getXhrData` call for `trusted-replace-xhr-response` - request properties array not being served to `getRequestData` and `parseMatchProps` helpers - ## v1.7.3 ### Added - [Trusted scriptlets](./README.md#trusted-scriptlets) with extended capabilities: - - trusted-click-element [#23](https://github.com/AdguardTeam/Scriptlets/issues/23) - - trusted-replace-xhr-response [#202](https://github.com/AdguardTeam/Scriptlets/issues/202) - - trusted-replace-fetch-response - - trusted-set-local-storage-item - - trusted-set-cookie + - `trusted-click-element` [#23](https://github.com/AdguardTeam/Scriptlets/issues/23) + - `trusted-replace-xhr-response` [#202](https://github.com/AdguardTeam/Scriptlets/issues/202) + - `trusted-replace-fetch-response` + - `trusted-set-local-storage-item` + - `trusted-set-cookie` - Scriptlets: - - xml-prune [#249](https://github.com/AdguardTeam/Scriptlets/issues/249) + - `xml-prune` [#249](https://github.com/AdguardTeam/Scriptlets/issues/249) -### Improved +### Changed - Scriptlets: - - prevent-element-src-loading [#228](https://github.com/AdguardTeam/Scriptlets/issues/228) - - prevent-fetch [#216](https://github.com/AdguardTeam/Scriptlets/issues/216) - - abort-on-stack-trace [#201](https://github.com/AdguardTeam/Scriptlets/issues/201) - - abort-current-inline-script [#251](https://github.com/AdguardTeam/Scriptlets/issues/251) - - set-cookie & set-cookie-reload + - `prevent-element-src-loading` [#228](https://github.com/AdguardTeam/Scriptlets/issues/228) + - `prevent-fetch` [#216](https://github.com/AdguardTeam/Scriptlets/issues/216) + - `abort-on-stack-trace` [#201](https://github.com/AdguardTeam/Scriptlets/issues/201) + - `abort-current-inline-script` [#251](https://github.com/AdguardTeam/Scriptlets/issues/251) + - `set-cookie` & `set-cookie-reload` - Redirects: - - google-ima3 [#255](https://github.com/AdguardTeam/Scriptlets/issues/255) - - metrika-yandex-tag [#254](https://github.com/AdguardTeam/Scriptlets/issues/254) - - googlesyndication-adsbygoogle [#252](https://github.com/AdguardTeam/Scriptlets/issues/252) + - `google-ima3` [#255](https://github.com/AdguardTeam/Scriptlets/issues/255) + - `metrika-yandex-tag` [#254](https://github.com/AdguardTeam/Scriptlets/issues/254) + - `googlesyndication-adsbygoogle` [#252](https://github.com/AdguardTeam/Scriptlets/issues/252) diff --git a/src/helpers/prevent-utils.js b/src/helpers/prevent-utils.js index b75ff295..e9327080 100644 --- a/src/helpers/prevent-utils.js +++ b/src/helpers/prevent-utils.js @@ -4,6 +4,7 @@ import { isValidMatchNumber, isValidMatchStr, } from './string-utils'; +import { nativeIsNaN } from './number-utils'; /** * Checks whether the passed arg is proper callback @@ -18,6 +19,18 @@ export const isValidCallback = (callback) => { || typeof callback === 'string'; }; +/** + * Parses delay argument of setTimeout / setInterval methods into + * rounded down number for number/string values or passes on for other types. + * Needed for prevent-setTimeout and prevent-setInterval + * @param {any} delay + * @returns {any} number as parsed delay or any input type if `delay` is not parsable + */ +export const parseRawDelay = (delay) => { + const parsedDelay = Math.floor(parseInt(delay, 10)); + return typeof parsedDelay === 'number' && !nativeIsNaN(parsedDelay) ? parsedDelay : delay; +}; + /** * Checks whether 'callback' and 'delay' are matching * by given parameters 'matchCallback' and 'matchDelay'. @@ -45,16 +58,20 @@ export const isPreventionNeeded = ({ const { isInvertedMatch, matchRegexp } = parseMatchArg(matchCallback); const { isInvertedDelayMatch, delayMatch } = parseDelayArg(matchDelay); + // Parse delay for decimal, string and non-number values + // https://github.com/AdguardTeam/Scriptlets/issues/247 + const parsedDelay = parseRawDelay(delay); + let shouldPrevent = false; // https://github.com/AdguardTeam/Scriptlets/issues/105 const callbackStr = String(callback); if (delayMatch === null) { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch; } else if (!matchCallback) { - shouldPrevent = (delay === delayMatch) !== isInvertedDelayMatch; + shouldPrevent = (parsedDelay === delayMatch) !== isInvertedDelayMatch; } else { shouldPrevent = matchRegexp.test(callbackStr) !== isInvertedMatch - && (delay === delayMatch) !== isInvertedDelayMatch; + && (parsedDelay === delayMatch) !== isInvertedDelayMatch; } return shouldPrevent; }; diff --git a/src/scriptlets/prevent-setInterval.js b/src/scriptlets/prevent-setInterval.js index 8f9f1fa7..d831700a 100644 --- a/src/scriptlets/prevent-setInterval.js +++ b/src/scriptlets/prevent-setInterval.js @@ -15,6 +15,7 @@ import { escapeRegExp, nativeIsFinite, isValidMatchNumber, + parseRawDelay, } from '../helpers/index'; /* eslint-disable max-len */ @@ -44,6 +45,7 @@ import { * - `matchDelay` - optional, must be an integer. * If starts with `!`, scriptlet will not match the delay but all other will be defused. * If do not start with `!`, the delay passed to the `setInterval` call will be matched. + * Decimal delay values will be rounded down, e.g `10.95` will be matched by `matchDelay` with value `10`. * * > If `prevent-setInterval` log looks like `setInterval(undefined, 1000)`, * it means that no callback was passed to setInterval() and that's not scriptlet issue @@ -118,6 +120,21 @@ import { * window.value = "test -- executed"; * }, 500); * ``` + * + * 5. Prevents `setInterval` calls if the callback contains `value` and delay is a decimal. + * ``` + * example.org#%#//scriptlet('prevent-setInterval', 'value', '300') + * ``` + * + * For instance, the following calls will be prevented: + * ```javascript + * setInterval(function () { + * window.test = "value"; + * }, 300); + * setInterval(function () { + * window.test = "value"; + * }, 300 + Math.random()); + * ``` */ /* eslint-enable max-len */ export function preventSetInterval(source, matchCallback, matchDelay) { @@ -218,4 +235,5 @@ preventSetInterval.injections = [ escapeRegExp, nativeIsFinite, isValidMatchNumber, + parseRawDelay, ]; diff --git a/src/scriptlets/prevent-setTimeout.js b/src/scriptlets/prevent-setTimeout.js index 846d3b95..ceb6ca56 100644 --- a/src/scriptlets/prevent-setTimeout.js +++ b/src/scriptlets/prevent-setTimeout.js @@ -15,6 +15,7 @@ import { isValidStrPattern, nativeIsFinite, isValidMatchNumber, + parseRawDelay, } from '../helpers/index'; /* eslint-disable max-len */ @@ -44,6 +45,7 @@ import { * - `matchDelay` - optional, must be an integer. * If starts with `!`, scriptlet will not match the delay but all other will be defused. * If do not start with `!`, the delay passed to the `setTimeout` call will be matched. + * Decimal delay values will be rounded down, e.g `10.95` will be matched by `matchDelay` with value `10`. * * > If `prevent-setTimeout` log looks like `setTimeout(undefined, 1000)`, * it means that no callback was passed to setTimeout() and that's not scriptlet issue @@ -118,6 +120,21 @@ import { * window.value = "test -- executed"; * }, 500); * ``` + * + * 5. Prevents `setTimeout` calls if the callback contains `value` and delay is a decimal. + * ``` + * example.org#%#//scriptlet('prevent-setTimeout', 'value', '300') + * ``` + * + * For instance, the following calls will be prevented: + * ```javascript + * setTimeout(function () { + * window.test = "value"; + * }, 300); + * setTimeout(function () { + * window.test = "value"; + * }, 300 + Math.random()); + * ``` */ /* eslint-enable max-len */ export function preventSetTimeout(source, matchCallback, matchDelay) { @@ -221,4 +238,5 @@ preventSetTimeout.injections = [ isValidStrPattern, nativeIsFinite, isValidMatchNumber, + parseRawDelay, ]; diff --git a/tests/helpers/prevent-utils.js b/tests/helpers/prevent-utils.js new file mode 100644 index 00000000..0155cb4d --- /dev/null +++ b/tests/helpers/prevent-utils.js @@ -0,0 +1,23 @@ +import { parseRawDelay } from '../../src/helpers'; + +const { test, module } = QUnit; +const name = 'scriptlets-redirects helpers'; + +module(name); +test('Test parseRawDelay', (assert) => { + assert.strictEqual(parseRawDelay(0), 0, 'parsing number ok'); + assert.strictEqual(parseRawDelay(10), 10, 'parsing number ok'); + assert.strictEqual(parseRawDelay(10.123), 10, 'parsing number ok'); + + assert.strictEqual(parseRawDelay('0'), 0, 'parsing number in string ok'); + assert.strictEqual(parseRawDelay('10'), 10, 'parsing number in string ok'); + assert.strictEqual(parseRawDelay('10.123'), 10, 'parsing number in string ok'); + + assert.strictEqual(parseRawDelay('string'), 'string', 'parsing string ok'); + + assert.strictEqual(parseRawDelay(null), null, 'parsing other types ok'); + assert.strictEqual(parseRawDelay(undefined), undefined, 'parsing other types ok'); + assert.strictEqual(parseRawDelay(false), false, 'parsing other types ok'); + // as NaN !== NaN + assert.strictEqual(parseRawDelay(NaN).toString(), 'NaN', 'parsing other types ok'); +}); diff --git a/tests/scriptlets/prevent-setInterval.test.js b/tests/scriptlets/prevent-setInterval.test.js index c8136450..47b75559 100644 --- a/tests/scriptlets/prevent-setInterval.test.js +++ b/tests/scriptlets/prevent-setInterval.test.js @@ -18,7 +18,7 @@ const beforeEach = () => { const afterEach = () => { window.setInterval = nativeSetInterval; testIntervals.forEach((i) => (clearInterval(i))); - clearGlobalProps('hit', '__debug', 'aaa', 'one', 'two', 'three', 'four'); + clearGlobalProps('hit', '__debug', 'aaa', 'one', 'two', 'three', 'four', 'five'); console.log = nativeConsole; // eslint-disable-line no-console }; @@ -67,7 +67,11 @@ test('no args -- logging', (assert) => { // We need to run our assertion after all timeouts setTimeout(() => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); - assert.strictEqual(loggedMessage, `prevent-setInterval: setInterval(${callback.toString()}, ${timeout})`, 'console.hit input ok'); + assert.strictEqual( + loggedMessage, + `prevent-setInterval: setInterval(${callback.toString()}, ${timeout})`, + 'console.hit input ok', + ); assert.strictEqual(window[agLogSetInterval], 'changed', 'property changed'); clearGlobalProps(agLogSetInterval); done(); @@ -368,3 +372,114 @@ test('prevent-setInterval: single square bracket in matchCallback', (assert) => const testInterval = setInterval(callback, 10); testIntervals.push(testInterval); }); + +test('match any callback + decimal delay', (assert) => { + const done = assert.async(); + window.one = 'old one'; + window.two = 'old two'; + window.three = 'old three'; + // We need to run our assertion after all timeouts + setTimeout(() => { + assert.equal(window.one, 'NEW ONE', 'property \'one\' is changed due to non-matched delay'); + assert.equal(window.two, 'old two', 'property \'two\' should NOT be changed'); + assert.equal(window.three, 'old three', 'property \'three\' should NOT be changed'); + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); + done(); + }, 100); + + // run scriptlet code + const scriptletArgs = ['', '10']; + runScriptlet(name, scriptletArgs); + + // only this one SHOULD NOT be prevented because of delay mismatch + const one = () => { window.one = 'NEW ONE'; }; + const intervalTest1 = setInterval(one, 25); + testIntervals.push(intervalTest1); + + const second = () => { window.two = 'NEW TWO'; }; + const intervalTest2 = setInterval(second, 10.05); + testIntervals.push(intervalTest2); + + const third = () => { window.three = 'NEW THREE'; }; + const intervalTest3 = setInterval(third, 10.95); + testIntervals.push(intervalTest3); +}); + +test('match any callback + non-number, decimal and string delays', (assert) => { + const done = assert.async(); + window.one = 'old one'; + window.two = 'old two'; + window.three = 'old three'; + window.four = 'old four'; + window.five = 'old five'; + // We need to run our assertion after all timeouts + setTimeout(() => { + assert.equal(window.one, 'old one', 'property \'one\' should NOT be changed'); + assert.equal(window.two, 'NEW TWO', 'property \'two\' should be changed'); + assert.equal(window.three, 'NEW THREE', 'property \'three\' should be changed'); + + assert.equal(window.four, 'old four', 'property \'four\' should NOT be changed'); + assert.equal(window.five, 'NEW FIVE', 'property \'five\' should be changed'); + + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); + done(); + }, 100); + + // run scriptlet code + const scriptletArgs = ['', '25']; + runScriptlet(name, scriptletArgs); + + // only this one SHOULD NOT be prevented because of delay mismatch + const one = () => { window.one = 'NEW ONE'; }; + const intervalTest1 = setInterval(one, 25.123); + testIntervals.push(intervalTest1); + + const second = () => { window.two = 'NEW TWO'; }; + const intervalTest2 = setInterval(second, null); + testIntervals.push(intervalTest2); + + const third = () => { window.three = 'NEW THREE'; }; + const intervalTest3 = setInterval(third, false); + testIntervals.push(intervalTest3); + + // test with string delays + const fourth = () => { window.four = 'NEW FOUR'; }; + const intervalTest4 = setInterval(fourth, '25.123'); + testIntervals.push(intervalTest4); + + const fifth = () => { window.five = 'NEW FIVE'; }; + const intervalTest5 = setInterval(fifth, '10'); + testIntervals.push(intervalTest5); +}); + +test('match any callback, falsy non-numbers delays dont collide with 0 ', (assert) => { + const done = assert.async(); + window.one = 'one'; + window.two = 'two'; + window.three = 'three'; + // We need to run our assertion after all timeouts + setTimeout(() => { + assert.equal(window.one, 'one', 'property \'one\' should NOT be changed'); + assert.equal(window.two, 'NEW TWO', 'property \'two\' should be changed'); + assert.equal(window.three, 'NEW THREE', 'property \'three\' should be changed'); + + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); + done(); + }, 100); + + // run scriptlet code + const scriptletArgs = ['', '0']; + runScriptlet(name, scriptletArgs); + + const first = () => { window.one = 'NEW ONE'; }; + const intervalTest1 = setInterval(first, 0); + testIntervals.push(intervalTest1); + + const second = () => { window.two = 'NEW TWO'; }; + const intervalTest2 = setInterval(second, null); + testIntervals.push(intervalTest2); + + const third = () => { window.three = 'NEW THREE'; }; + const intervalTest3 = setInterval(third, undefined); + testIntervals.push(intervalTest3); +}); diff --git a/tests/scriptlets/prevent-setTimeout.test.js b/tests/scriptlets/prevent-setTimeout.test.js index b1454f54..0010cfa8 100644 --- a/tests/scriptlets/prevent-setTimeout.test.js +++ b/tests/scriptlets/prevent-setTimeout.test.js @@ -18,7 +18,7 @@ const beforeEach = () => { const afterEach = () => { window.setTimeout = nativeSetTimeout; testTimeouts.forEach((t) => (clearTimeout(t))); - clearGlobalProps('hit', '__debug', 'one', 'two', 'three', 'four'); + clearGlobalProps('hit', '__debug', 'one', 'two', 'three', 'four', 'five'); console.log = nativeConsole; // eslint-disable-line no-console }; @@ -373,3 +373,114 @@ test('prevent-setTimeout: single square bracket in matchCallback', (assert) => { const timeoutTest = setTimeout(callback, 10); testTimeouts.push(timeoutTest); }); + +test('match any callback + decimal delay', (assert) => { + const done = assert.async(); + window.one = 'one'; + window.two = 'two'; + window.three = 'three'; + // We need to run our assertion after all timeouts + nativeSetTimeout(() => { + assert.equal(window.one, 'NEW ONE', 'property \'one\' is changed due to non-matched delay'); + assert.equal(window.two, 'two', 'property \'two\' should NOT be changed'); + assert.equal(window.three, 'three', 'property \'three\' should NOT be changed'); + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); + done(); + }, 100); + + // run scriptlet code + const scriptletArgs = ['', '10']; + runScriptlet(name, scriptletArgs); + + // only this one SHOULD NOT be prevented because of delay mismatch + const first = () => { window.one = 'NEW ONE'; }; + const timeoutTest1 = setTimeout(first, 30); + testTimeouts.push(timeoutTest1); + + const second = () => { window.two = 'NEW TWO'; }; + const timeoutTest2 = setTimeout(second, 10.05); + testTimeouts.push(timeoutTest2); + + const third = () => { window.three = 'NEW THREE'; }; + const timeoutTest3 = setTimeout(third, 10.95); + testTimeouts.push(timeoutTest3); +}); + +test('match any callback + non-number, decimal and string delays', (assert) => { + const done = assert.async(); + window.one = 'one'; + window.two = 'two'; + window.three = 'three'; + window.four = 'old four'; + window.five = 'old five'; + // We need to run our assertion after all timeouts + nativeSetTimeout(() => { + assert.equal(window.one, 'one', 'property \'one\' should NOT be changed'); + assert.equal(window.two, 'NEW TWO', 'property \'two\' should be changed'); + assert.equal(window.three, 'NEW THREE', 'property \'three\' should be changed'); + + assert.equal(window.four, 'old four', 'property \'four\' should NOT be changed'); + assert.equal(window.five, 'NEW FIVE', 'property \'five\' should be changed'); + + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); + done(); + }, 100); + + // run scriptlet code + const scriptletArgs = ['', '25']; + runScriptlet(name, scriptletArgs); + + // only this one SHOULD NOT be prevented because of delay mismatch + const first = () => { window.one = 'NEW ONE'; }; + const timeoutTest1 = setTimeout(first, 25.123); + testTimeouts.push(timeoutTest1); + + const second = () => { window.two = 'NEW TWO'; }; + const timeoutTest2 = setTimeout(second, null); + testTimeouts.push(timeoutTest2); + + const third = () => { window.three = 'NEW THREE'; }; + const timeoutTest3 = setTimeout(third, true); + testTimeouts.push(timeoutTest3); + + // test with string delays + const fourth = () => { window.four = 'NEW FOUR'; }; + const timeoutTest4 = setTimeout(fourth, '25.123'); + testTimeouts.push(timeoutTest4); + + const fifth = () => { window.five = 'NEW FIVE'; }; + const timeoutTest5 = setTimeout(fifth, '10'); + testTimeouts.push(timeoutTest5); +}); + +test('match any callback, falsy non-numbers delays dont collide with 0 ', (assert) => { + const done = assert.async(); + window.one = 'one'; + window.two = 'two'; + window.three = 'three'; + // We need to run our assertion after all timeouts + nativeSetTimeout(() => { + assert.equal(window.one, 'one', 'property \'one\' should NOT be changed'); + assert.equal(window.two, 'NEW TWO', 'property \'two\' should be changed'); + assert.equal(window.three, 'NEW THREE', 'property \'three\' should be changed'); + + assert.strictEqual(window.hit, 'FIRED', 'hit fired'); + done(); + }, 100); + + // run scriptlet code + const scriptletArgs = ['', '0']; + runScriptlet(name, scriptletArgs); + + const first = () => { window.one = 'NEW ONE'; }; + const timeoutTest1 = setTimeout(first, 0); + testTimeouts.push(timeoutTest1); + + const second = () => { window.two = 'NEW TWO'; }; + const timeoutTest2 = setTimeout(second, null); + testTimeouts.push(timeoutTest2); + + const third = () => { window.three = 'NEW THREE'; }; + const timeoutTest3 = setTimeout(third, undefined); + testTimeouts.push(timeoutTest3); +}); diff --git a/tests/scriptlets/prevent-xhr.test.js b/tests/scriptlets/prevent-xhr.test.js index 91dc1585..18b149ed 100644 --- a/tests/scriptlets/prevent-xhr.test.js +++ b/tests/scriptlets/prevent-xhr.test.js @@ -598,8 +598,7 @@ if (isSupported) { runScriptlet(name, MATCH_DATA); - const done1 = assert.async(); - const done2 = assert.async(); + const done = assert.async(2); const xhr1 = new XMLHttpRequest(); const xhr2 = new XMLHttpRequest(); @@ -611,7 +610,7 @@ if (isSupported) { assert.strictEqual(xhr1.readyState, 4, 'Response done'); assert.ok(xhr1.response, 'Response data exists'); assert.strictEqual(window.hit, undefined, 'hit should not fire'); - done1(); + done(); }; xhr2.onload = () => { @@ -619,7 +618,7 @@ if (isSupported) { assert.strictEqual(typeof xhr2.responseText, 'string', 'Response text mocked'); assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); clearGlobalProps('hit'); - done2(); + done(); }; xhr1.send(); From 419d4a01cc3fa9a2ab950a27d0025d1895209223 Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Tue, 27 Dec 2022 13:38:53 +0300 Subject: [PATCH 51/70] AG-13199 improve set-constant: noopCallbackFunc, noopThrow Merge in ADGUARD-FILTERS/scriptlets from fix/AG-13199 to release/v1.8 Squashed commit of the following: commit 8a95806d8c7bbf639bbfea03dc6b9d7fc686d573 Author: Stanislav A Date: Tue Dec 27 12:53:22 2022 +0300 tweak trusted-set-cookie test commit f7e2f08ad93ff3d607f46be594b54ffe86b64678 Merge: d681b99 22e41f8 Author: Stanislav A Date: Tue Dec 27 12:28:44 2022 +0300 merge release commit d681b99f8a3708ffbecffe19cdf020412c60d8d9 Author: Stanislav A Date: Tue Dec 27 12:10:17 2022 +0300 improve changelog commit d1206f0ae9afd11cafa72618e86caab77559259d Author: Stanislav A Date: Mon Dec 26 20:43:06 2022 +0300 fix changelog commit 34a6b6c488ceb9c7e3c7eb6d65181502f6187c14 Author: Stanislav A Date: Mon Dec 26 19:20:57 2022 +0300 update changelog commit 659ec773389493b4e345a970065c1e0bc032207c Author: Stanislav A Date: Mon Dec 26 18:44:17 2022 +0300 improve set-constant, add corresponding helpers and testcases --- CHANGELOG.md | 3 +++ src/helpers/noop-utils.js | 14 ++++++++++++++ src/scriptlets/set-constant.js | 10 ++++++++++ tests/helpers/noop.test.js | 18 +++++++++++++++++- tests/scriptlets/set-constant.test.js | 14 ++++++++++++++ tests/scriptlets/trusted-set-cookie.test.js | 2 +- 6 files changed, 59 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc357956..d429d0d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased 1.8.x +### Added +- `noopThrow` and `noopCallbackFunc` prop values for `set-constant` scriptlet + ### Changed - add decimal delay matching for `prevent-setInterval` and `prevent-setTimeout` [#247](https://github.com/AdguardTeam/Scriptlets/issues/247) diff --git a/src/helpers/noop-utils.js b/src/helpers/noop-utils.js index b4cca11e..c2a3605f 100644 --- a/src/helpers/noop-utils.js +++ b/src/helpers/noop-utils.js @@ -4,6 +4,12 @@ */ export const noopFunc = () => { }; +/** + * Function return noopFunc + * @returns {Function} + */ +export const noopCallbackFunc = () => noopFunc; + /** * Function returns null * @return {null} null @@ -47,6 +53,14 @@ export const noopArray = () => []; */ export const noopObject = () => ({}); +/** + * Function throws an error + * @throws + */ +export const noopThrow = () => { + throw new Error(); +}; + /** * Function returns Promise.reject() */ diff --git a/src/scriptlets/set-constant.js b/src/scriptlets/set-constant.js index 64bf1103..5df914c3 100644 --- a/src/scriptlets/set-constant.js +++ b/src/scriptlets/set-constant.js @@ -3,9 +3,11 @@ import { logMessage, noopArray, noopObject, + noopCallbackFunc, noopFunc, trueFunc, falseFunc, + noopThrow, noopPromiseReject, noopPromiseResolve, getPropertyInChain, @@ -53,8 +55,10 @@ import { * - `emptyObj` - empty object * - `emptyArr` - empty array * - `noopFunc` - function with empty body + * - `noopCallbackFunc` - function returning noopFunc * - `trueFunc` - function returning true * - `falseFunc` - function returning false + * - `noopThrow` - function throwing an error * - `noopPromiseResolve` - function returning Promise object that is resolved with an empty response * - `noopPromiseReject` - function returning Promise.reject() * - `''` - empty string @@ -112,10 +116,14 @@ export function setConstant(source, property, value, stack) { constantValue = emptyObj; } else if (value === 'noopFunc') { constantValue = noopFunc; + } else if (value === 'noopCallbackFunc') { + constantValue = noopCallbackFunc; } else if (value === 'trueFunc') { constantValue = trueFunc; } else if (value === 'falseFunc') { constantValue = falseFunc; + } else if (value === 'noopThrow') { + constantValue = noopThrow; } else if (value === 'noopPromiseResolve') { constantValue = noopPromiseResolve; } else if (value === 'noopPromiseReject') { @@ -283,8 +291,10 @@ setConstant.injections = [ noopArray, noopObject, noopFunc, + noopCallbackFunc, trueFunc, falseFunc, + noopThrow, noopPromiseReject, noopPromiseResolve, getPropertyInChain, diff --git a/tests/helpers/noop.test.js b/tests/helpers/noop.test.js index 510386fa..5f84db70 100644 --- a/tests/helpers/noop.test.js +++ b/tests/helpers/noop.test.js @@ -1,4 +1,9 @@ -import { noopPromiseResolve } from '../../src/helpers'; +import { + noopPromiseResolve, + noopCallbackFunc, + noopFunc, + noopThrow, +} from '../../src/helpers'; const { test, module } = QUnit; const name = 'scriptlets-redirects helpers'; @@ -22,3 +27,14 @@ test('Test noopPromiseResolve for valid response props', async (assert) => { assert.ok(Array.isArray(arrBody) && !arrBody.length); assert.strictEqual(responseWithType.type, TEST_TYPE); }); + +test('noopCallbackFunc returns noopFunc', async (assert) => { + const func = noopCallbackFunc(); + assert.ok(typeof func === 'function', 'returns function'); + assert.strictEqual(func.toString(), noopFunc.toString(), 'returns empty function'); + assert.strictEqual(func(), undefined, 'function returns undefined'); +}); + +test('noopThrow throws an error', async (assert) => { + assert.throws(() => noopThrow(), 'noopThrow throws an error'); +}); diff --git a/tests/scriptlets/set-constant.test.js b/tests/scriptlets/set-constant.test.js index b766991c..0b8cb11a 100644 --- a/tests/scriptlets/set-constant.test.js +++ b/tests/scriptlets/set-constant.test.js @@ -104,6 +104,20 @@ if (!isSupported) { assert.strictEqual(window[noopFuncProp](), undefined); clearGlobalProps(noopFuncProp); + // setting constant to noopCallbackFunc; + const noopCallbackFuncProp = 'noopCallbackFunc'; + runScriptletFromTag(noopCallbackFuncProp, 'noopCallbackFunc'); + const noopFuncCb = window[noopCallbackFuncProp](); + assert.ok(typeof noopFuncCb === 'function', 'returns function'); + assert.strictEqual(noopFuncCb(), undefined, 'function returns undefined'); + clearGlobalProps(noopCallbackFuncProp); + + // setting constant to noopCallbackFunc; + const noopThrowProp = 'noopThrow'; + runScriptletFromTag(noopThrowProp, 'noopThrow'); + assert.throws(() => window[noopThrowProp]()(), 'noopThrowProp throws an error'); + clearGlobalProps(noopThrowProp); + // setting constant to trueFunc; const trueFuncProp = 'trueFuncProp'; runScriptletFromTag(trueFuncProp, 'trueFunc'); diff --git a/tests/scriptlets/trusted-set-cookie.test.js b/tests/scriptlets/trusted-set-cookie.test.js index 5949809e..db70bc8e 100644 --- a/tests/scriptlets/trusted-set-cookie.test.js +++ b/tests/scriptlets/trusted-set-cookie.test.js @@ -59,7 +59,7 @@ test('Set cookie with current time value', (assert) => { // Some time will pass between calling scriptlet // and qunit running assertion - const tolerance = 20; + const tolerance = 100; const cookieValue = parseCookieString(document.cookie)[cName]; const currentTime = new Date().getTime(); const timeDiff = currentTime - cookieValue; From 56fdd865f08334ae0f6b382806c3cb7e748d6dd5 Mon Sep 17 00:00:00 2001 From: Stanislav A Date: Tue, 27 Dec 2022 15:48:12 +0300 Subject: [PATCH 52/70] improve logMessage helper and update tests --- src/helpers/log-message.js | 24 ++++++++++++++++--- src/scriptlets/adjust-setInterval.js | 2 +- src/scriptlets/adjust-setTimeout.js | 2 +- .../trusted-replace-fetch-response.js | 2 +- src/scriptlets/trusted-set-cookie-reload.js | 4 ++-- src/scriptlets/trusted-set-cookie.js | 4 ++-- .../trusted-set-local-storage-item.js | 4 ++-- tests/scriptlets/adjust-setInterval.test.js | 2 +- tests/scriptlets/adjust-setTimeout.test.js | 2 +- tests/scriptlets/log-eval.test.js | 4 ++-- tests/scriptlets/nowebrtc.test.js | 2 +- .../prevent-requestAnimationFrame.test.js | 6 ++++- tests/scriptlets/prevent-setInterval.test.js | 2 +- tests/scriptlets/prevent-setTimeout.test.js | 2 +- tests/scriptlets/prevent-window-open.test.js | 4 ++-- tests/scriptlets/remove-attr.test.js | 6 ++++- tests/scriptlets/remove-class.test.js | 2 +- tests/scriptlets/trusted-set-cookie.test.js | 8 ++++--- 18 files changed, 55 insertions(+), 27 deletions(-) diff --git a/src/helpers/log-message.js b/src/helpers/log-message.js index 59504576..86e02e3b 100644 --- a/src/helpers/log-message.js +++ b/src/helpers/log-message.js @@ -12,8 +12,26 @@ * @param {boolean} [forced=false] to log message unconditionally */ export const logMessage = (source, message, forced = false) => { - if (forced || source.verbose) { - // eslint-disable-next-line no-console - console.log(`${source.name}: ${message}`); + const { + name, + ruleText, + verbose, + } = source; + + if (!forced && !verbose) { + return; } + + let messageStr = `${name}: ${message};`; + + // Extract scriptlet part from rule text + if (ruleText) { + const RULE_MARKER = '#%#'; + const markerIdx = ruleText.indexOf(RULE_MARKER); + const extension = ruleText.slice(markerIdx, ruleText.length); + messageStr += ` cannot apply rule: ${extension}`; + } + + // eslint-disable-next-line no-console + console.log(messageStr); }; diff --git a/src/scriptlets/adjust-setInterval.js b/src/scriptlets/adjust-setInterval.js index 3743a659..2570081a 100644 --- a/src/scriptlets/adjust-setInterval.js +++ b/src/scriptlets/adjust-setInterval.js @@ -71,7 +71,7 @@ export function adjustSetInterval(source, matchCallback, matchDelay, boost) { // https://github.com/AdguardTeam/Scriptlets/issues/221 if (!isValidCallback(callback)) { // eslint-disable-next-line max-len - const message = `Scriptlet can't be applied because of invalid callback: '${String(callback)}'.`; + const message = `Scriptlet can't be applied because of invalid callback: '${String(callback)}'`; logMessage(source, message); } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { delay *= getBoostMultiplier(boost); diff --git a/src/scriptlets/adjust-setTimeout.js b/src/scriptlets/adjust-setTimeout.js index 94322384..eefdd61e 100644 --- a/src/scriptlets/adjust-setTimeout.js +++ b/src/scriptlets/adjust-setTimeout.js @@ -71,7 +71,7 @@ export function adjustSetTimeout(source, matchCallback, matchDelay, boost) { // https://github.com/AdguardTeam/Scriptlets/issues/221 if (!isValidCallback(callback)) { // eslint-disable-next-line max-len - const message = `Scriptlet can't be applied because of invalid callback: '${String(callback)}'.`; + const message = `Scriptlet can't be applied because of invalid callback: '${String(callback)}'`; logMessage(source, message); } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { delay *= getBoostMultiplier(boost); diff --git a/src/scriptlets/trusted-replace-fetch-response.js b/src/scriptlets/trusted-replace-fetch-response.js index 27b8039d..1bb21916 100644 --- a/src/scriptlets/trusted-replace-fetch-response.js +++ b/src/scriptlets/trusted-replace-fetch-response.js @@ -88,7 +88,7 @@ export function trustedReplaceFetchResponse(source, pattern = '', replacement = // Only allow pattern as empty string for logging purposes if (pattern === '' && replacement !== '') { - logMessage(source, 'Pattern argument should not be empty string.'); + logMessage(source, 'Pattern argument should not be empty string'); return; } const shouldLog = pattern === '' && replacement === ''; diff --git a/src/scriptlets/trusted-set-cookie-reload.js b/src/scriptlets/trusted-set-cookie-reload.js index 0155088f..abe83916 100644 --- a/src/scriptlets/trusted-set-cookie-reload.js +++ b/src/scriptlets/trusted-set-cookie-reload.js @@ -72,11 +72,11 @@ import { export function trustedSetCookieReload(source, name, value, offsetExpiresSec = '', path = '/') { if (typeof name === 'undefined') { - logMessage(source, 'Cookie name should be specified.'); + logMessage(source, 'Cookie name should be specified'); return; } if (typeof value === 'undefined') { - logMessage(source, 'Cookie value should be specified.'); + logMessage(source, 'Cookie value should be specified'); return; } diff --git a/src/scriptlets/trusted-set-cookie.js b/src/scriptlets/trusted-set-cookie.js index cc62efe3..6e7ba574 100644 --- a/src/scriptlets/trusted-set-cookie.js +++ b/src/scriptlets/trusted-set-cookie.js @@ -71,11 +71,11 @@ import { export function trustedSetCookie(source, name, value, offsetExpiresSec = '', path = '/') { if (typeof name === 'undefined') { - logMessage(source, 'Cookie name should be specified.'); + logMessage(source, 'Cookie name should be specified'); return; } if (typeof value === 'undefined') { - logMessage(source, 'Cookie value should be specified.'); + logMessage(source, 'Cookie value should be specified'); return; } diff --git a/src/scriptlets/trusted-set-local-storage-item.js b/src/scriptlets/trusted-set-local-storage-item.js index 3ffefecd..1b4f23e4 100644 --- a/src/scriptlets/trusted-set-local-storage-item.js +++ b/src/scriptlets/trusted-set-local-storage-item.js @@ -56,12 +56,12 @@ import { export function trustedSetLocalStorageItem(source, key, value) { if (typeof key === 'undefined') { - logMessage(source, 'Item key should be specified.'); + logMessage(source, 'Item key should be specified'); return; } if (typeof value === 'undefined') { - logMessage(source, 'Item value should be specified.'); + logMessage(source, 'Item value should be specified'); return; } diff --git a/tests/scriptlets/adjust-setInterval.test.js b/tests/scriptlets/adjust-setInterval.test.js index 90379025..0cd9a6ab 100644 --- a/tests/scriptlets/adjust-setInterval.test.js +++ b/tests/scriptlets/adjust-setInterval.test.js @@ -288,7 +288,7 @@ test('no match -- invalid callback - undefined', (assert) => { assert.strictEqual(window.hit, undefined, 'hit should not fire'); assert.strictEqual( loggedMessage, - `${name}: Scriptlet can't be applied because of invalid callback: '${String(callback)}'.`, // eslint-disable-line max-len + `${name}: Scriptlet can't be applied because of invalid callback: '${String(callback)}';`, // eslint-disable-line max-len 'console.logged warning ok', ); clearInterval(testInterval); diff --git a/tests/scriptlets/adjust-setTimeout.test.js b/tests/scriptlets/adjust-setTimeout.test.js index 999ce1ed..26a630dc 100644 --- a/tests/scriptlets/adjust-setTimeout.test.js +++ b/tests/scriptlets/adjust-setTimeout.test.js @@ -288,7 +288,7 @@ test('no match -- invalid callback - undefined', (assert) => { assert.strictEqual(window.hit, undefined, 'hit should not fire'); assert.strictEqual( loggedMessage, - `${name}: Scriptlet can't be applied because of invalid callback: '${String(callback)}'.`, // eslint-disable-line max-len + `${name}: Scriptlet can't be applied because of invalid callback: '${String(callback)}';`, // eslint-disable-line max-len 'console.logged warning ok', ); clearTimeout(testTimeout); diff --git a/tests/scriptlets/log-eval.test.js b/tests/scriptlets/log-eval.test.js index b12a6beb..d455d5f2 100644 --- a/tests/scriptlets/log-eval.test.js +++ b/tests/scriptlets/log-eval.test.js @@ -32,7 +32,7 @@ test('logs eval calls', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, `${name}: eval("${evalStr}")`, 'console.hit input should be equal'); + assert.strictEqual(input, `${name}: eval("${evalStr}");`, 'console.hit input should be equal'); }; runScriptlet(name); const evalWrap = eval; @@ -52,7 +52,7 @@ test('logs new Function() calls', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, `${name}: new Function(${args.join(', ')})`, 'console.hit input should be equal'); + assert.strictEqual(input, `${name}: new Function(${args.join(', ')});`, 'console.hit input should be equal'); }; runScriptlet(name); diff --git a/tests/scriptlets/nowebrtc.test.js b/tests/scriptlets/nowebrtc.test.js index 5e13b273..f0f217c9 100644 --- a/tests/scriptlets/nowebrtc.test.js +++ b/tests/scriptlets/nowebrtc.test.js @@ -87,7 +87,7 @@ if (!isSupported) { return; } // eslint-disable-next-line max-len - const EXPECTED_LOG_STR = `${name}: Document tried to create an RTCPeerConnection: ${TEST_URL_VALUE}`; + const EXPECTED_LOG_STR = `${name}: Document tried to create an RTCPeerConnection: ${TEST_URL_VALUE};`; assert.ok(endsWith(input, EXPECTED_LOG_STR), 'console.hit input'); }; diff --git a/tests/scriptlets/prevent-requestAnimationFrame.test.js b/tests/scriptlets/prevent-requestAnimationFrame.test.js index 1cf65991..280a9736 100644 --- a/tests/scriptlets/prevent-requestAnimationFrame.test.js +++ b/tests/scriptlets/prevent-requestAnimationFrame.test.js @@ -62,7 +62,11 @@ test('prevent-requestAnimationFrame: no args -- logging', (assert) => { // do test checking after scriptlet's execution end setTimeout(() => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); - assert.strictEqual(loggedMessage, `prevent-requestAnimationFrame: requestAnimationFrame(${testFunction.toString()})`, 'console.hit input'); + assert.strictEqual( + loggedMessage, + `prevent-requestAnimationFrame: requestAnimationFrame(${testFunction.toString()});`, + 'console.hit input', + ); assert.strictEqual(window[logProperty], 'changed', 'property changed'); clearGlobalProps(logProperty); done(); diff --git a/tests/scriptlets/prevent-setInterval.test.js b/tests/scriptlets/prevent-setInterval.test.js index 47b75559..f4bf43b0 100644 --- a/tests/scriptlets/prevent-setInterval.test.js +++ b/tests/scriptlets/prevent-setInterval.test.js @@ -69,7 +69,7 @@ test('no args -- logging', (assert) => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); assert.strictEqual( loggedMessage, - `prevent-setInterval: setInterval(${callback.toString()}, ${timeout})`, + `prevent-setInterval: setInterval(${callback.toString()}, ${timeout});`, 'console.hit input ok', ); assert.strictEqual(window[agLogSetInterval], 'changed', 'property changed'); diff --git a/tests/scriptlets/prevent-setTimeout.test.js b/tests/scriptlets/prevent-setTimeout.test.js index 0010cfa8..499b737c 100644 --- a/tests/scriptlets/prevent-setTimeout.test.js +++ b/tests/scriptlets/prevent-setTimeout.test.js @@ -69,7 +69,7 @@ test('no args -- logging', (assert) => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); assert.strictEqual( loggedMessage, - `prevent-setTimeout: setTimeout(${callback.toString()}, ${timeout})`, + `prevent-setTimeout: setTimeout(${callback.toString()}, ${timeout});`, 'console.hit input ok', ); assert.strictEqual(window[agLogSetTimeout], 'changed', 'property changed'); diff --git a/tests/scriptlets/prevent-window-open.test.js b/tests/scriptlets/prevent-window-open.test.js index 89e804d0..6dedd651 100644 --- a/tests/scriptlets/prevent-window-open.test.js +++ b/tests/scriptlets/prevent-window-open.test.js @@ -184,7 +184,7 @@ test('new syntax: log checking - only url', (assert) => { if (input.indexOf('trace') > -1) { return; } - const EXPECTED_LOG_STR = `${name}: ${testUrl}`; + const EXPECTED_LOG_STR = `${name}: ${testUrl};`; assert.strictEqual(input, EXPECTED_LOG_STR, 'console.hit input'); }; @@ -208,7 +208,7 @@ test('new syntax: log checking - url + args', (assert) => { return; } // eslint-disable-next-line max-len - const EXPECTED_LOG_STR = `${name}: ${testUrl}, ${testWindowName}, ${testWindowFeatures}`; + const EXPECTED_LOG_STR = `${name}: ${testUrl}, ${testWindowName}, ${testWindowFeatures};`; assert.strictEqual(input, EXPECTED_LOG_STR, 'console.hit input'); }; diff --git a/tests/scriptlets/remove-attr.test.js b/tests/scriptlets/remove-attr.test.js index 22e9c7b0..ac56d423 100644 --- a/tests/scriptlets/remove-attr.test.js +++ b/tests/scriptlets/remove-attr.test.js @@ -306,7 +306,11 @@ test('invalid selector — no match', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, `${name}: Invalid selector arg: '${selector}'`, 'logged error for invalid remove-attr selector'); + assert.strictEqual( + input, + `${name}: Invalid selector arg: '${selector}';`, + 'logged error for invalid remove-attr selector;', + ); }; runScriptlet(name, scriptletArgs); diff --git a/tests/scriptlets/remove-class.test.js b/tests/scriptlets/remove-class.test.js index e3b11ba9..107e65c7 100644 --- a/tests/scriptlets/remove-class.test.js +++ b/tests/scriptlets/remove-class.test.js @@ -276,7 +276,7 @@ test('invalid selector — no match', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, `${name}: Invalid selector arg: '${selectors}'`, 'logged error for invalid remove-class selector'); + assert.strictEqual(input, `${name}: Invalid selector arg: '${selectors}';`, 'logged error for invalid remove-class selector'); }; assert.strictEqual(window.hit, undefined, 'hit SHOULD NOT fire'); diff --git a/tests/scriptlets/trusted-set-cookie.test.js b/tests/scriptlets/trusted-set-cookie.test.js index db70bc8e..1385c0bd 100644 --- a/tests/scriptlets/trusted-set-cookie.test.js +++ b/tests/scriptlets/trusted-set-cookie.test.js @@ -112,9 +112,11 @@ test('Set cookie with invalid expires', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, - `${name}: Invalid offsetExpiresSec value: ${expiresSec}`, - 'logs correctly on invalid offsetExpiresSec'); + assert.strictEqual( + input, + `${name}: Invalid offsetExpiresSec value: ${expiresSec};`, + 'logs correctly on invalid offsetExpiresSec', + ); }; runScriptlet(name, [cName, cValue, `${expiresSec}`]); From 1caed036660fa0a9a28059bc1747f0fb43cbb9f8 Mon Sep 17 00:00:00 2001 From: Stanislav A Date: Tue, 27 Dec 2022 15:58:26 +0300 Subject: [PATCH 53/70] Revert "improve logMessage helper and update tests" This reverts commit 56fdd865f08334ae0f6b382806c3cb7e748d6dd5. --- src/helpers/log-message.js | 24 +++---------------- src/scriptlets/adjust-setInterval.js | 2 +- src/scriptlets/adjust-setTimeout.js | 2 +- .../trusted-replace-fetch-response.js | 2 +- src/scriptlets/trusted-set-cookie-reload.js | 4 ++-- src/scriptlets/trusted-set-cookie.js | 4 ++-- .../trusted-set-local-storage-item.js | 4 ++-- tests/scriptlets/adjust-setInterval.test.js | 2 +- tests/scriptlets/adjust-setTimeout.test.js | 2 +- tests/scriptlets/log-eval.test.js | 4 ++-- tests/scriptlets/nowebrtc.test.js | 2 +- .../prevent-requestAnimationFrame.test.js | 6 +---- tests/scriptlets/prevent-setInterval.test.js | 2 +- tests/scriptlets/prevent-setTimeout.test.js | 2 +- tests/scriptlets/prevent-window-open.test.js | 4 ++-- tests/scriptlets/remove-attr.test.js | 6 +---- tests/scriptlets/remove-class.test.js | 2 +- tests/scriptlets/trusted-set-cookie.test.js | 8 +++---- 18 files changed, 27 insertions(+), 55 deletions(-) diff --git a/src/helpers/log-message.js b/src/helpers/log-message.js index 86e02e3b..59504576 100644 --- a/src/helpers/log-message.js +++ b/src/helpers/log-message.js @@ -12,26 +12,8 @@ * @param {boolean} [forced=false] to log message unconditionally */ export const logMessage = (source, message, forced = false) => { - const { - name, - ruleText, - verbose, - } = source; - - if (!forced && !verbose) { - return; + if (forced || source.verbose) { + // eslint-disable-next-line no-console + console.log(`${source.name}: ${message}`); } - - let messageStr = `${name}: ${message};`; - - // Extract scriptlet part from rule text - if (ruleText) { - const RULE_MARKER = '#%#'; - const markerIdx = ruleText.indexOf(RULE_MARKER); - const extension = ruleText.slice(markerIdx, ruleText.length); - messageStr += ` cannot apply rule: ${extension}`; - } - - // eslint-disable-next-line no-console - console.log(messageStr); }; diff --git a/src/scriptlets/adjust-setInterval.js b/src/scriptlets/adjust-setInterval.js index 2570081a..3743a659 100644 --- a/src/scriptlets/adjust-setInterval.js +++ b/src/scriptlets/adjust-setInterval.js @@ -71,7 +71,7 @@ export function adjustSetInterval(source, matchCallback, matchDelay, boost) { // https://github.com/AdguardTeam/Scriptlets/issues/221 if (!isValidCallback(callback)) { // eslint-disable-next-line max-len - const message = `Scriptlet can't be applied because of invalid callback: '${String(callback)}'`; + const message = `Scriptlet can't be applied because of invalid callback: '${String(callback)}'.`; logMessage(source, message); } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { delay *= getBoostMultiplier(boost); diff --git a/src/scriptlets/adjust-setTimeout.js b/src/scriptlets/adjust-setTimeout.js index eefdd61e..94322384 100644 --- a/src/scriptlets/adjust-setTimeout.js +++ b/src/scriptlets/adjust-setTimeout.js @@ -71,7 +71,7 @@ export function adjustSetTimeout(source, matchCallback, matchDelay, boost) { // https://github.com/AdguardTeam/Scriptlets/issues/221 if (!isValidCallback(callback)) { // eslint-disable-next-line max-len - const message = `Scriptlet can't be applied because of invalid callback: '${String(callback)}'`; + const message = `Scriptlet can't be applied because of invalid callback: '${String(callback)}'.`; logMessage(source, message); } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { delay *= getBoostMultiplier(boost); diff --git a/src/scriptlets/trusted-replace-fetch-response.js b/src/scriptlets/trusted-replace-fetch-response.js index 1bb21916..27b8039d 100644 --- a/src/scriptlets/trusted-replace-fetch-response.js +++ b/src/scriptlets/trusted-replace-fetch-response.js @@ -88,7 +88,7 @@ export function trustedReplaceFetchResponse(source, pattern = '', replacement = // Only allow pattern as empty string for logging purposes if (pattern === '' && replacement !== '') { - logMessage(source, 'Pattern argument should not be empty string'); + logMessage(source, 'Pattern argument should not be empty string.'); return; } const shouldLog = pattern === '' && replacement === ''; diff --git a/src/scriptlets/trusted-set-cookie-reload.js b/src/scriptlets/trusted-set-cookie-reload.js index abe83916..0155088f 100644 --- a/src/scriptlets/trusted-set-cookie-reload.js +++ b/src/scriptlets/trusted-set-cookie-reload.js @@ -72,11 +72,11 @@ import { export function trustedSetCookieReload(source, name, value, offsetExpiresSec = '', path = '/') { if (typeof name === 'undefined') { - logMessage(source, 'Cookie name should be specified'); + logMessage(source, 'Cookie name should be specified.'); return; } if (typeof value === 'undefined') { - logMessage(source, 'Cookie value should be specified'); + logMessage(source, 'Cookie value should be specified.'); return; } diff --git a/src/scriptlets/trusted-set-cookie.js b/src/scriptlets/trusted-set-cookie.js index 6e7ba574..cc62efe3 100644 --- a/src/scriptlets/trusted-set-cookie.js +++ b/src/scriptlets/trusted-set-cookie.js @@ -71,11 +71,11 @@ import { export function trustedSetCookie(source, name, value, offsetExpiresSec = '', path = '/') { if (typeof name === 'undefined') { - logMessage(source, 'Cookie name should be specified'); + logMessage(source, 'Cookie name should be specified.'); return; } if (typeof value === 'undefined') { - logMessage(source, 'Cookie value should be specified'); + logMessage(source, 'Cookie value should be specified.'); return; } diff --git a/src/scriptlets/trusted-set-local-storage-item.js b/src/scriptlets/trusted-set-local-storage-item.js index 1b4f23e4..3ffefecd 100644 --- a/src/scriptlets/trusted-set-local-storage-item.js +++ b/src/scriptlets/trusted-set-local-storage-item.js @@ -56,12 +56,12 @@ import { export function trustedSetLocalStorageItem(source, key, value) { if (typeof key === 'undefined') { - logMessage(source, 'Item key should be specified'); + logMessage(source, 'Item key should be specified.'); return; } if (typeof value === 'undefined') { - logMessage(source, 'Item value should be specified'); + logMessage(source, 'Item value should be specified.'); return; } diff --git a/tests/scriptlets/adjust-setInterval.test.js b/tests/scriptlets/adjust-setInterval.test.js index 0cd9a6ab..90379025 100644 --- a/tests/scriptlets/adjust-setInterval.test.js +++ b/tests/scriptlets/adjust-setInterval.test.js @@ -288,7 +288,7 @@ test('no match -- invalid callback - undefined', (assert) => { assert.strictEqual(window.hit, undefined, 'hit should not fire'); assert.strictEqual( loggedMessage, - `${name}: Scriptlet can't be applied because of invalid callback: '${String(callback)}';`, // eslint-disable-line max-len + `${name}: Scriptlet can't be applied because of invalid callback: '${String(callback)}'.`, // eslint-disable-line max-len 'console.logged warning ok', ); clearInterval(testInterval); diff --git a/tests/scriptlets/adjust-setTimeout.test.js b/tests/scriptlets/adjust-setTimeout.test.js index 26a630dc..999ce1ed 100644 --- a/tests/scriptlets/adjust-setTimeout.test.js +++ b/tests/scriptlets/adjust-setTimeout.test.js @@ -288,7 +288,7 @@ test('no match -- invalid callback - undefined', (assert) => { assert.strictEqual(window.hit, undefined, 'hit should not fire'); assert.strictEqual( loggedMessage, - `${name}: Scriptlet can't be applied because of invalid callback: '${String(callback)}';`, // eslint-disable-line max-len + `${name}: Scriptlet can't be applied because of invalid callback: '${String(callback)}'.`, // eslint-disable-line max-len 'console.logged warning ok', ); clearTimeout(testTimeout); diff --git a/tests/scriptlets/log-eval.test.js b/tests/scriptlets/log-eval.test.js index d455d5f2..b12a6beb 100644 --- a/tests/scriptlets/log-eval.test.js +++ b/tests/scriptlets/log-eval.test.js @@ -32,7 +32,7 @@ test('logs eval calls', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, `${name}: eval("${evalStr}");`, 'console.hit input should be equal'); + assert.strictEqual(input, `${name}: eval("${evalStr}")`, 'console.hit input should be equal'); }; runScriptlet(name); const evalWrap = eval; @@ -52,7 +52,7 @@ test('logs new Function() calls', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, `${name}: new Function(${args.join(', ')});`, 'console.hit input should be equal'); + assert.strictEqual(input, `${name}: new Function(${args.join(', ')})`, 'console.hit input should be equal'); }; runScriptlet(name); diff --git a/tests/scriptlets/nowebrtc.test.js b/tests/scriptlets/nowebrtc.test.js index f0f217c9..5e13b273 100644 --- a/tests/scriptlets/nowebrtc.test.js +++ b/tests/scriptlets/nowebrtc.test.js @@ -87,7 +87,7 @@ if (!isSupported) { return; } // eslint-disable-next-line max-len - const EXPECTED_LOG_STR = `${name}: Document tried to create an RTCPeerConnection: ${TEST_URL_VALUE};`; + const EXPECTED_LOG_STR = `${name}: Document tried to create an RTCPeerConnection: ${TEST_URL_VALUE}`; assert.ok(endsWith(input, EXPECTED_LOG_STR), 'console.hit input'); }; diff --git a/tests/scriptlets/prevent-requestAnimationFrame.test.js b/tests/scriptlets/prevent-requestAnimationFrame.test.js index 280a9736..1cf65991 100644 --- a/tests/scriptlets/prevent-requestAnimationFrame.test.js +++ b/tests/scriptlets/prevent-requestAnimationFrame.test.js @@ -62,11 +62,7 @@ test('prevent-requestAnimationFrame: no args -- logging', (assert) => { // do test checking after scriptlet's execution end setTimeout(() => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); - assert.strictEqual( - loggedMessage, - `prevent-requestAnimationFrame: requestAnimationFrame(${testFunction.toString()});`, - 'console.hit input', - ); + assert.strictEqual(loggedMessage, `prevent-requestAnimationFrame: requestAnimationFrame(${testFunction.toString()})`, 'console.hit input'); assert.strictEqual(window[logProperty], 'changed', 'property changed'); clearGlobalProps(logProperty); done(); diff --git a/tests/scriptlets/prevent-setInterval.test.js b/tests/scriptlets/prevent-setInterval.test.js index f4bf43b0..47b75559 100644 --- a/tests/scriptlets/prevent-setInterval.test.js +++ b/tests/scriptlets/prevent-setInterval.test.js @@ -69,7 +69,7 @@ test('no args -- logging', (assert) => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); assert.strictEqual( loggedMessage, - `prevent-setInterval: setInterval(${callback.toString()}, ${timeout});`, + `prevent-setInterval: setInterval(${callback.toString()}, ${timeout})`, 'console.hit input ok', ); assert.strictEqual(window[agLogSetInterval], 'changed', 'property changed'); diff --git a/tests/scriptlets/prevent-setTimeout.test.js b/tests/scriptlets/prevent-setTimeout.test.js index 499b737c..0010cfa8 100644 --- a/tests/scriptlets/prevent-setTimeout.test.js +++ b/tests/scriptlets/prevent-setTimeout.test.js @@ -69,7 +69,7 @@ test('no args -- logging', (assert) => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); assert.strictEqual( loggedMessage, - `prevent-setTimeout: setTimeout(${callback.toString()}, ${timeout});`, + `prevent-setTimeout: setTimeout(${callback.toString()}, ${timeout})`, 'console.hit input ok', ); assert.strictEqual(window[agLogSetTimeout], 'changed', 'property changed'); diff --git a/tests/scriptlets/prevent-window-open.test.js b/tests/scriptlets/prevent-window-open.test.js index 6dedd651..89e804d0 100644 --- a/tests/scriptlets/prevent-window-open.test.js +++ b/tests/scriptlets/prevent-window-open.test.js @@ -184,7 +184,7 @@ test('new syntax: log checking - only url', (assert) => { if (input.indexOf('trace') > -1) { return; } - const EXPECTED_LOG_STR = `${name}: ${testUrl};`; + const EXPECTED_LOG_STR = `${name}: ${testUrl}`; assert.strictEqual(input, EXPECTED_LOG_STR, 'console.hit input'); }; @@ -208,7 +208,7 @@ test('new syntax: log checking - url + args', (assert) => { return; } // eslint-disable-next-line max-len - const EXPECTED_LOG_STR = `${name}: ${testUrl}, ${testWindowName}, ${testWindowFeatures};`; + const EXPECTED_LOG_STR = `${name}: ${testUrl}, ${testWindowName}, ${testWindowFeatures}`; assert.strictEqual(input, EXPECTED_LOG_STR, 'console.hit input'); }; diff --git a/tests/scriptlets/remove-attr.test.js b/tests/scriptlets/remove-attr.test.js index ac56d423..22e9c7b0 100644 --- a/tests/scriptlets/remove-attr.test.js +++ b/tests/scriptlets/remove-attr.test.js @@ -306,11 +306,7 @@ test('invalid selector — no match', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual( - input, - `${name}: Invalid selector arg: '${selector}';`, - 'logged error for invalid remove-attr selector;', - ); + assert.strictEqual(input, `${name}: Invalid selector arg: '${selector}'`, 'logged error for invalid remove-attr selector'); }; runScriptlet(name, scriptletArgs); diff --git a/tests/scriptlets/remove-class.test.js b/tests/scriptlets/remove-class.test.js index 107e65c7..e3b11ba9 100644 --- a/tests/scriptlets/remove-class.test.js +++ b/tests/scriptlets/remove-class.test.js @@ -276,7 +276,7 @@ test('invalid selector — no match', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, `${name}: Invalid selector arg: '${selectors}';`, 'logged error for invalid remove-class selector'); + assert.strictEqual(input, `${name}: Invalid selector arg: '${selectors}'`, 'logged error for invalid remove-class selector'); }; assert.strictEqual(window.hit, undefined, 'hit SHOULD NOT fire'); diff --git a/tests/scriptlets/trusted-set-cookie.test.js b/tests/scriptlets/trusted-set-cookie.test.js index 1385c0bd..db70bc8e 100644 --- a/tests/scriptlets/trusted-set-cookie.test.js +++ b/tests/scriptlets/trusted-set-cookie.test.js @@ -112,11 +112,9 @@ test('Set cookie with invalid expires', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual( - input, - `${name}: Invalid offsetExpiresSec value: ${expiresSec};`, - 'logs correctly on invalid offsetExpiresSec', - ); + assert.strictEqual(input, + `${name}: Invalid offsetExpiresSec value: ${expiresSec}`, + 'logs correctly on invalid offsetExpiresSec'); }; runScriptlet(name, [cName, cValue, `${expiresSec}`]); From b2624bfca5f3cfb2e3e58f82de0be82e40079996 Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Wed, 28 Dec 2022 17:46:11 +0300 Subject: [PATCH 54/70] AG-17519 improve logMessage helper and update tests Merge in ADGUARD-FILTERS/scriptlets from fix/AG-17519 to release/v1.8 Squashed commit of the following: commit f54bbcc0bc26123574561bce9101d06fd9c474dd Author: Stanislav A Date: Wed Dec 28 15:52:35 2022 +0300 tweak prevent-xhr test commit 4060687b97c18b9f2c818cdf200d37a6a3d015d1 Author: Stanislav A Date: Tue Dec 27 19:54:06 2022 +0300 improve helper tests commit 855ce89374baaa790901147f80565aba6b2aedd0 Author: Stanislav A Date: Tue Dec 27 19:14:57 2022 +0300 fix changelog commit 70547536fa04c64fc3c734cd1e906989648d924a Author: Stanislav A Date: Tue Dec 27 18:48:09 2022 +0300 remove max-len from tests commit f93dc21586f3d667a57bd2c780442d5693367955 Author: Stanislav A Date: Tue Dec 27 18:42:29 2022 +0300 improve naming commit 21da0013200c00bf6b27bbab10206bf7654b0f30 Author: Stanislav A Date: Tue Dec 27 18:30:38 2022 +0300 update tests commit 0903fb6f238d00d3ee33d5a66fea5f8fa5301cae Author: Stanislav A Date: Tue Dec 27 18:10:55 2022 +0300 improve helper and add tests commit 6e3dc40043f38cd0d1db107a5a5b399d4dc33d48 Author: Stanislav A Date: Tue Dec 27 17:21:56 2022 +0300 improve naming commit d4aa78ea617c14a476b856086bb47b1a041fa612 Author: Stanislav A Date: Tue Dec 27 16:04:39 2022 +0300 update CHANGELOG commit 8342527511688c653b215fd558ced49e124d2b73 Author: Stanislav A Date: Tue Dec 27 16:00:11 2022 +0300 improve logMessage helper and update tests --- CHANGELOG.md | 1 + src/helpers/log-message.js | 26 +++++- src/scriptlets/adjust-setInterval.js | 2 +- src/scriptlets/adjust-setTimeout.js | 2 +- .../trusted-replace-fetch-response.js | 2 +- src/scriptlets/trusted-set-cookie-reload.js | 4 +- src/scriptlets/trusted-set-cookie.js | 4 +- .../trusted-set-local-storage-item.js | 4 +- tests/helpers/index.test.js | 1 + tests/helpers/log-message.test.js | 83 +++++++++++++++++++ tests/scriptlets/adjust-setInterval.test.js | 2 +- tests/scriptlets/adjust-setTimeout.test.js | 2 +- tests/scriptlets/nowebrtc.test.js | 4 +- tests/scriptlets/prevent-eval-if.test.js | 2 +- tests/scriptlets/prevent-fetch.test.js | 1 - .../prevent-requestAnimationFrame.test.js | 6 +- tests/scriptlets/prevent-setInterval.test.js | 2 - tests/scriptlets/prevent-setTimeout.test.js | 2 - tests/scriptlets/prevent-window-open.test.js | 1 - tests/scriptlets/prevent-xhr.test.js | 39 +++++---- tests/scriptlets/remove-attr.test.js | 6 +- .../trusted-replace-fetch-response.test.js | 1 - tests/scriptlets/trusted-set-cookie.test.js | 6 +- 23 files changed, 161 insertions(+), 42 deletions(-) create mode 100644 tests/helpers/log-message.test.js diff --git a/CHANGELOG.md b/CHANGELOG.md index d429d0d0..e368d919 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### Changed - add decimal delay matching for `prevent-setInterval` and `prevent-setTimeout` [#247](https://github.com/AdguardTeam/Scriptlets/issues/247) +- debug logging to include rule text when available ### Fixed diff --git a/src/helpers/log-message.js b/src/helpers/log-message.js index 59504576..0f9d0b78 100644 --- a/src/helpers/log-message.js +++ b/src/helpers/log-message.js @@ -12,8 +12,28 @@ * @param {boolean} [forced=false] to log message unconditionally */ export const logMessage = (source, message, forced = false) => { - if (forced || source.verbose) { - // eslint-disable-next-line no-console - console.log(`${source.name}: ${message}`); + const { + name, + ruleText, + verbose, + } = source; + + if (!forced && !verbose) { + return; } + + let messageStr = `${name}: ${message}`; + + // Extract scriptlet part from rule text + if (ruleText) { + const RULE_MARKER = '#%#//scriptlet'; + const markerIdx = ruleText.indexOf(RULE_MARKER); + if (markerIdx > -1) { + const ruleWithoutDomains = ruleText.slice(markerIdx, ruleText.length); + messageStr += `; cannot apply rule: ${ruleWithoutDomains}`; + } + } + + // eslint-disable-next-line no-console + console.log(messageStr); }; diff --git a/src/scriptlets/adjust-setInterval.js b/src/scriptlets/adjust-setInterval.js index 3743a659..2570081a 100644 --- a/src/scriptlets/adjust-setInterval.js +++ b/src/scriptlets/adjust-setInterval.js @@ -71,7 +71,7 @@ export function adjustSetInterval(source, matchCallback, matchDelay, boost) { // https://github.com/AdguardTeam/Scriptlets/issues/221 if (!isValidCallback(callback)) { // eslint-disable-next-line max-len - const message = `Scriptlet can't be applied because of invalid callback: '${String(callback)}'.`; + const message = `Scriptlet can't be applied because of invalid callback: '${String(callback)}'`; logMessage(source, message); } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { delay *= getBoostMultiplier(boost); diff --git a/src/scriptlets/adjust-setTimeout.js b/src/scriptlets/adjust-setTimeout.js index 94322384..eefdd61e 100644 --- a/src/scriptlets/adjust-setTimeout.js +++ b/src/scriptlets/adjust-setTimeout.js @@ -71,7 +71,7 @@ export function adjustSetTimeout(source, matchCallback, matchDelay, boost) { // https://github.com/AdguardTeam/Scriptlets/issues/221 if (!isValidCallback(callback)) { // eslint-disable-next-line max-len - const message = `Scriptlet can't be applied because of invalid callback: '${String(callback)}'.`; + const message = `Scriptlet can't be applied because of invalid callback: '${String(callback)}'`; logMessage(source, message); } else if (matchRegexp.test(callback.toString()) && isDelayMatched(matchDelay, delay)) { delay *= getBoostMultiplier(boost); diff --git a/src/scriptlets/trusted-replace-fetch-response.js b/src/scriptlets/trusted-replace-fetch-response.js index 27b8039d..1bb21916 100644 --- a/src/scriptlets/trusted-replace-fetch-response.js +++ b/src/scriptlets/trusted-replace-fetch-response.js @@ -88,7 +88,7 @@ export function trustedReplaceFetchResponse(source, pattern = '', replacement = // Only allow pattern as empty string for logging purposes if (pattern === '' && replacement !== '') { - logMessage(source, 'Pattern argument should not be empty string.'); + logMessage(source, 'Pattern argument should not be empty string'); return; } const shouldLog = pattern === '' && replacement === ''; diff --git a/src/scriptlets/trusted-set-cookie-reload.js b/src/scriptlets/trusted-set-cookie-reload.js index 0155088f..abe83916 100644 --- a/src/scriptlets/trusted-set-cookie-reload.js +++ b/src/scriptlets/trusted-set-cookie-reload.js @@ -72,11 +72,11 @@ import { export function trustedSetCookieReload(source, name, value, offsetExpiresSec = '', path = '/') { if (typeof name === 'undefined') { - logMessage(source, 'Cookie name should be specified.'); + logMessage(source, 'Cookie name should be specified'); return; } if (typeof value === 'undefined') { - logMessage(source, 'Cookie value should be specified.'); + logMessage(source, 'Cookie value should be specified'); return; } diff --git a/src/scriptlets/trusted-set-cookie.js b/src/scriptlets/trusted-set-cookie.js index cc62efe3..6e7ba574 100644 --- a/src/scriptlets/trusted-set-cookie.js +++ b/src/scriptlets/trusted-set-cookie.js @@ -71,11 +71,11 @@ import { export function trustedSetCookie(source, name, value, offsetExpiresSec = '', path = '/') { if (typeof name === 'undefined') { - logMessage(source, 'Cookie name should be specified.'); + logMessage(source, 'Cookie name should be specified'); return; } if (typeof value === 'undefined') { - logMessage(source, 'Cookie value should be specified.'); + logMessage(source, 'Cookie value should be specified'); return; } diff --git a/src/scriptlets/trusted-set-local-storage-item.js b/src/scriptlets/trusted-set-local-storage-item.js index 3ffefecd..1b4f23e4 100644 --- a/src/scriptlets/trusted-set-local-storage-item.js +++ b/src/scriptlets/trusted-set-local-storage-item.js @@ -56,12 +56,12 @@ import { export function trustedSetLocalStorageItem(source, key, value) { if (typeof key === 'undefined') { - logMessage(source, 'Item key should be specified.'); + logMessage(source, 'Item key should be specified'); return; } if (typeof value === 'undefined') { - logMessage(source, 'Item value should be specified.'); + logMessage(source, 'Item value should be specified'); return; } diff --git a/tests/helpers/index.test.js b/tests/helpers/index.test.js index dc518e42..fcf63ecf 100644 --- a/tests/helpers/index.test.js +++ b/tests/helpers/index.test.js @@ -4,3 +4,4 @@ import './noop.test'; import './number-utils.test'; import './string-utils.test'; import './object-utils.test'; +import './log-message.test'; diff --git a/tests/helpers/log-message.test.js b/tests/helpers/log-message.test.js new file mode 100644 index 00000000..eda2de10 --- /dev/null +++ b/tests/helpers/log-message.test.js @@ -0,0 +1,83 @@ +/* eslint-disable no-console */ +import { + logMessage, +} from '../../src/helpers'; + +const { test, module } = QUnit; +const name = 'scriptlets-redirects helpers'; +const nativeConsole = console.log; + +const afterEach = () => { + console.log = nativeConsole; +}; + +module(name, { afterEach }); + +const RULE_TEXT = 'example.org#%#//scriptlet(\'set-cookie\', \'name\', \'value\')'; +const SCRIPTLET_NAME = 'set-cookie'; +const MESSAGE = 'arbitrary text message'; +const MESSAGE_EXTENSION = '; cannot apply rule: #%#//scriptlet(\'set-cookie\', \'name\', \'value\')'; + +test('Logs message conditionally', async (assert) => { + // eslint-disable-next-line no-console + console.log = function log(input) { + if (input.indexOf('trace') > -1) { + return; + } + assert.strictEqual( + input, + `${SCRIPTLET_NAME}: ${MESSAGE}${MESSAGE_EXTENSION}`, + 'message logged correctly', + ); + }; + + assert.expect(2); + + // Log forced message + let forced = true; + let source = { + name: SCRIPTLET_NAME, + ruleText: RULE_TEXT, + verbose: false, + }; + logMessage(source, MESSAGE, forced); + + // Log message on verbose + forced = false; + source = { + name: SCRIPTLET_NAME, + ruleText: RULE_TEXT, + verbose: true, + }; + logMessage(source, MESSAGE, forced); + + // Message should not be logged this time, thus expected 2 asserts + forced = false; + source = { + name: SCRIPTLET_NAME, + ruleText: RULE_TEXT, + verbose: false, + }; + logMessage(source, MESSAGE, forced); +}); + +test('Logs message without ruleText', async (assert) => { + // eslint-disable-next-line no-console + console.log = function log(input) { + if (input.indexOf('trace') > -1) { + return; + } + assert.strictEqual( + input, + `${SCRIPTLET_NAME}: ${MESSAGE}`, + 'message logged correctly', + ); + }; + + const FORCED = true; + const source = { + name: SCRIPTLET_NAME, + verbose: false, + }; + logMessage(source, MESSAGE, FORCED); +}); diff --git a/tests/scriptlets/adjust-setInterval.test.js b/tests/scriptlets/adjust-setInterval.test.js index 90379025..181c056c 100644 --- a/tests/scriptlets/adjust-setInterval.test.js +++ b/tests/scriptlets/adjust-setInterval.test.js @@ -288,7 +288,7 @@ test('no match -- invalid callback - undefined', (assert) => { assert.strictEqual(window.hit, undefined, 'hit should not fire'); assert.strictEqual( loggedMessage, - `${name}: Scriptlet can't be applied because of invalid callback: '${String(callback)}'.`, // eslint-disable-line max-len + `${name}: Scriptlet can't be applied because of invalid callback: '${String(callback)}'`, 'console.logged warning ok', ); clearInterval(testInterval); diff --git a/tests/scriptlets/adjust-setTimeout.test.js b/tests/scriptlets/adjust-setTimeout.test.js index 999ce1ed..5b49855d 100644 --- a/tests/scriptlets/adjust-setTimeout.test.js +++ b/tests/scriptlets/adjust-setTimeout.test.js @@ -288,7 +288,7 @@ test('no match -- invalid callback - undefined', (assert) => { assert.strictEqual(window.hit, undefined, 'hit should not fire'); assert.strictEqual( loggedMessage, - `${name}: Scriptlet can't be applied because of invalid callback: '${String(callback)}'.`, // eslint-disable-line max-len + `${name}: Scriptlet can't be applied because of invalid callback: '${String(callback)}'`, 'console.logged warning ok', ); clearTimeout(testTimeout); diff --git a/tests/scriptlets/nowebrtc.test.js b/tests/scriptlets/nowebrtc.test.js index 5e13b273..ef339390 100644 --- a/tests/scriptlets/nowebrtc.test.js +++ b/tests/scriptlets/nowebrtc.test.js @@ -86,8 +86,8 @@ if (!isSupported) { if (input.indexOf('trace') > -1) { return; } - // eslint-disable-next-line max-len - const EXPECTED_LOG_STR = `${name}: Document tried to create an RTCPeerConnection: ${TEST_URL_VALUE}`; + + const EXPECTED_LOG_STR = `${name}: Document tried to create an RTCPeerConnection: ${TEST_URL_VALUE};`; assert.ok(endsWith(input, EXPECTED_LOG_STR), 'console.hit input'); }; diff --git a/tests/scriptlets/prevent-eval-if.test.js b/tests/scriptlets/prevent-eval-if.test.js index 20931255..e11709b6 100644 --- a/tests/scriptlets/prevent-eval-if.test.js +++ b/tests/scriptlets/prevent-eval-if.test.js @@ -46,7 +46,7 @@ test('AG prevent-eval-if works', (assert) => { const firstActual = evalWrapper(`(function () {return '${agPreventEvalIf}'})()`); assert.strictEqual(window.hit, undefined, 'hit function should not fire for not matched function'); assert.strictEqual(firstActual, agPreventEvalIf, 'result of eval evaluation should exist'); - // eslint-disable-next-line max-len + const secondActual = evalWrapper(`(function () {const test = 0; return '${agPreventEvalIf}'})()`); assert.strictEqual(window.hit, 'FIRED', 'hit function should fire'); assert.strictEqual(secondActual, undefined, 'result of eval evaluation should be undefined'); diff --git a/tests/scriptlets/prevent-fetch.test.js b/tests/scriptlets/prevent-fetch.test.js index 47bc68e0..3e48b78a 100644 --- a/tests/scriptlets/prevent-fetch.test.js +++ b/tests/scriptlets/prevent-fetch.test.js @@ -70,7 +70,6 @@ if (!isSupported) { if (input.indexOf('trace') > -1) { return; } - // eslint-disable-next-line max-len const EXPECTED_LOG_STR_START = `${name}: fetch( url:"${INPUT_JSON_PATH}" method:"${TEST_METHOD}"`; assert.ok(startsWith(input, EXPECTED_LOG_STR_START), 'console.hit input'); }; diff --git a/tests/scriptlets/prevent-requestAnimationFrame.test.js b/tests/scriptlets/prevent-requestAnimationFrame.test.js index 1cf65991..fc030160 100644 --- a/tests/scriptlets/prevent-requestAnimationFrame.test.js +++ b/tests/scriptlets/prevent-requestAnimationFrame.test.js @@ -62,7 +62,11 @@ test('prevent-requestAnimationFrame: no args -- logging', (assert) => { // do test checking after scriptlet's execution end setTimeout(() => { assert.strictEqual(window.hit, 'FIRED', 'hit fired'); - assert.strictEqual(loggedMessage, `prevent-requestAnimationFrame: requestAnimationFrame(${testFunction.toString()})`, 'console.hit input'); + assert.strictEqual( + loggedMessage, + `prevent-requestAnimationFrame: requestAnimationFrame(${testFunction.toString()})`, + 'console.hit input', + ); assert.strictEqual(window[logProperty], 'changed', 'property changed'); clearGlobalProps(logProperty); done(); diff --git a/tests/scriptlets/prevent-setInterval.test.js b/tests/scriptlets/prevent-setInterval.test.js index 47b75559..d857f0a8 100644 --- a/tests/scriptlets/prevent-setInterval.test.js +++ b/tests/scriptlets/prevent-setInterval.test.js @@ -85,7 +85,6 @@ test('setInterval callback name matching', (assert) => { // We need to run our assertion after all timeouts setTimeout(() => { assert.equal(window.one, 'value', 'Target property not changed'); - // eslint-disable-next-line max-len assert.equal(window.two, 'new value', 'Another property should successfully changed by another timeout'); assert.strictEqual(window.hit, 'FIRED', 'hit fired'); done(); @@ -113,7 +112,6 @@ test('code matching', (assert) => { // We need to run our assertion after all timeouts setTimeout(() => { assert.equal(window.one, 'value', 'Target property not changed'); - // eslint-disable-next-line max-len assert.equal(window.two, 'new value', 'Another property should be successfully changed by another timeout'); assert.strictEqual(window.hit, 'FIRED', 'hit fired'); done(); diff --git a/tests/scriptlets/prevent-setTimeout.test.js b/tests/scriptlets/prevent-setTimeout.test.js index 0010cfa8..5c515351 100644 --- a/tests/scriptlets/prevent-setTimeout.test.js +++ b/tests/scriptlets/prevent-setTimeout.test.js @@ -85,7 +85,6 @@ test('setTimeout callback name matching', (assert) => { // We need to run our assertion after all timeouts nativeSetTimeout(() => { assert.equal(window.one, 'value', 'Target property not changed'); - // eslint-disable-next-line max-len assert.equal(window.two, 'new value', 'Another property should successfully changed by another timeout'); assert.strictEqual(window.hit, 'FIRED', 'hit fired'); done(); @@ -113,7 +112,6 @@ test('code matching', (assert) => { // We need to run our assertion after all timeouts nativeSetTimeout(() => { assert.equal(window.one, 'value', 'Target property not changed'); - // eslint-disable-next-line max-len assert.equal(window.two, 'new value', 'Another property should be successfully changed by another timeout'); assert.strictEqual(window.hit, 'FIRED', 'hit fired'); done(); diff --git a/tests/scriptlets/prevent-window-open.test.js b/tests/scriptlets/prevent-window-open.test.js index 89e804d0..40eec57f 100644 --- a/tests/scriptlets/prevent-window-open.test.js +++ b/tests/scriptlets/prevent-window-open.test.js @@ -207,7 +207,6 @@ test('new syntax: log checking - url + args', (assert) => { if (input.indexOf('trace') > -1) { return; } - // eslint-disable-next-line max-len const EXPECTED_LOG_STR = `${name}: ${testUrl}, ${testWindowName}, ${testWindowFeatures}`; assert.strictEqual(input, EXPECTED_LOG_STR, 'console.hit input'); }; diff --git a/tests/scriptlets/prevent-xhr.test.js b/tests/scriptlets/prevent-xhr.test.js index 18b149ed..a6c8ac10 100644 --- a/tests/scriptlets/prevent-xhr.test.js +++ b/tests/scriptlets/prevent-xhr.test.js @@ -129,8 +129,10 @@ if (isSupported) { xhr.open(METHOD, URL); xhr.onload = () => { assert.strictEqual(typeof xhr.responseText, 'string', 'Response text mocked'); - // eslint-disable-next-line max-len - assert.ok(xhr.responseText.length > 20000, `Response text randomized, response length: ${xhr.responseText.length}`); + assert.ok( + xhr.responseText.length > 20000, + `Response text randomized, response length: ${xhr.responseText.length}`, + ); assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); done(); }; @@ -151,8 +153,10 @@ if (isSupported) { xhr.onload = () => { assert.strictEqual(xhr.readyState, 4, 'Response done'); assert.strictEqual(typeof xhr.responseText, 'string', 'Response text mocked'); - // eslint-disable-next-line max-len - assert.ok(xhr.responseText.length > 20000, `Response text randomized, response length: ${xhr.responseText.length}`); + assert.ok( + xhr.responseText.length > 20000, + `Response text randomized, response length: ${xhr.responseText.length}`, + ); assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); done(); }; @@ -173,8 +177,10 @@ if (isSupported) { xhr.onload = () => { assert.strictEqual(xhr.readyState, 4, 'Response done'); assert.strictEqual(typeof xhr.responseText, 'string', 'Response text mocked'); - // eslint-disable-next-line max-len - assert.ok(xhr.responseText.length === 100, `Response text randomized, response length: ${xhr.responseText.length}`); + assert.ok( + xhr.responseText.length === 100, + `Response text randomized, response length: ${xhr.responseText.length}`, + ); assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); done(); }; @@ -195,8 +201,10 @@ if (isSupported) { xhr.onload = () => { assert.strictEqual(xhr.readyState, 4, 'Response done'); assert.strictEqual(typeof xhr.responseText, 'string', 'Response text mocked'); - // eslint-disable-next-line max-len - assert.ok(xhr.responseText.length === 500000, `Response text randomized, response length: ${xhr.responseText.length}`); + assert.ok( + xhr.responseText.length === 500000, + `Response text randomized, response length: ${xhr.responseText.length}`, + ); assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); done(); }; @@ -216,7 +224,6 @@ if (isSupported) { xhr.open(METHOD, URL); xhr.onload = () => { assert.strictEqual(typeof xhr.responseText, 'string', 'Response text mocked'); - // eslint-disable-next-line max-len assert.ok(xhr.responseText.length === 0, 'Response text is not randomized'); assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); done(); @@ -257,8 +264,10 @@ if (isSupported) { xhr.open(METHOD, URL); xhr.onload = () => { assert.strictEqual(typeof xhr.responseText, 'string', 'Response text mocked'); - // eslint-disable-next-line max-len - assert.ok(xhr.responseText.length >= 100 && xhr.responseText.length <= 300, `Response text randomized, response length: ${xhr.responseText.length}`); + assert.ok( + xhr.responseText.length >= 100 && xhr.responseText.length <= 300, + `Response text randomized, response length: ${xhr.responseText.length}`, + ); assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); done(); }; @@ -278,8 +287,10 @@ if (isSupported) { xhr.open(METHOD, URL); xhr.onload = () => { assert.strictEqual(typeof xhr.responseText, 'string', 'Response text mocked'); - // eslint-disable-next-line max-len - assert.ok(xhr.responseText.length >= 10 && xhr.responseText.length <= 20, `Response text randomized, response length: ${xhr.responseText.length}`); + assert.ok( + xhr.responseText.length >= 10 && xhr.responseText.length <= 20, + `Response text randomized, response length: ${xhr.responseText.length}`, + ); assert.strictEqual(window.hit, 'FIRED', 'hit function fired'); done(); }; @@ -623,7 +634,7 @@ if (isSupported) { xhr1.send(); // use timeout to avoid hit collisions - setTimeout(() => xhr2.send(), 1); + setTimeout(() => xhr2.send(), 10); }); } else { test('unsupported', (assert) => { diff --git a/tests/scriptlets/remove-attr.test.js b/tests/scriptlets/remove-attr.test.js index 22e9c7b0..80e7b863 100644 --- a/tests/scriptlets/remove-attr.test.js +++ b/tests/scriptlets/remove-attr.test.js @@ -306,7 +306,11 @@ test('invalid selector — no match', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, `${name}: Invalid selector arg: '${selector}'`, 'logged error for invalid remove-attr selector'); + assert.strictEqual( + input, + `${name}: Invalid selector arg: '${selector}'`, + 'logged error for invalid remove-attr selector;', + ); }; runScriptlet(name, scriptletArgs); diff --git a/tests/scriptlets/trusted-replace-fetch-response.test.js b/tests/scriptlets/trusted-replace-fetch-response.test.js index 6ce2dd85..d564dd5f 100644 --- a/tests/scriptlets/trusted-replace-fetch-response.test.js +++ b/tests/scriptlets/trusted-replace-fetch-response.test.js @@ -50,7 +50,6 @@ if (!isSupported) { if (input.indexOf('trace') > -1) { return; } - // eslint-disable-next-line max-len const EXPECTED_LOG_STR_START = `${name}: fetch( url:"${INPUT_JSON_PATH}" method:"${TEST_METHOD}"`; assert.ok(startsWith(input, EXPECTED_LOG_STR_START), 'console.hit input'); }; diff --git a/tests/scriptlets/trusted-set-cookie.test.js b/tests/scriptlets/trusted-set-cookie.test.js index db70bc8e..1800e6d4 100644 --- a/tests/scriptlets/trusted-set-cookie.test.js +++ b/tests/scriptlets/trusted-set-cookie.test.js @@ -112,9 +112,11 @@ test('Set cookie with invalid expires', (assert) => { if (input.indexOf('trace') > -1) { return; } - assert.strictEqual(input, + assert.strictEqual( + input, `${name}: Invalid offsetExpiresSec value: ${expiresSec}`, - 'logs correctly on invalid offsetExpiresSec'); + 'logs correctly on invalid offsetExpiresSec', + ); }; runScriptlet(name, [cName, cValue, `${expiresSec}`]); From 89185d3ef76d0ec86131982c7c0fb471dcf63bbd Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Wed, 28 Dec 2022 17:56:12 +0300 Subject: [PATCH 55/70] AG-13199 rename noopThrow helper into throwFunc Merge in ADGUARD-FILTERS/scriptlets from fix/AG-13199_01 to release/v1.8 Squashed commit of the following: commit 0278bdf07ede962b66c900045fff24b57df5732a Merge: 1fe4d3b b2624bf Author: Stanislav A Date: Wed Dec 28 17:48:57 2022 +0300 Merge branch 'release/v1.8' into fix/AG-13199_01 commit 1fe4d3bfed90652426c2acdfda264a429d4e5f2d Author: Stanislav A Date: Wed Dec 28 17:32:01 2022 +0300 rename noopThrow helper into throwFunc --- CHANGELOG.md | 2 +- src/helpers/noop-utils.js | 2 +- src/scriptlets/set-constant.js | 10 +++++----- tests/helpers/noop.test.js | 6 +++--- tests/scriptlets/set-constant.test.js | 8 ++++---- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e368d919..f3fa0d13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ## Unreleased 1.8.x ### Added -- `noopThrow` and `noopCallbackFunc` prop values for `set-constant` scriptlet +- `throwFunc` and `noopCallbackFunc` prop values for `set-constant` scriptlet ### Changed diff --git a/src/helpers/noop-utils.js b/src/helpers/noop-utils.js index c2a3605f..68a15aa2 100644 --- a/src/helpers/noop-utils.js +++ b/src/helpers/noop-utils.js @@ -57,7 +57,7 @@ export const noopObject = () => ({}); * Function throws an error * @throws */ -export const noopThrow = () => { +export const throwFunc = () => { throw new Error(); }; diff --git a/src/scriptlets/set-constant.js b/src/scriptlets/set-constant.js index 5df914c3..8973c92c 100644 --- a/src/scriptlets/set-constant.js +++ b/src/scriptlets/set-constant.js @@ -7,7 +7,7 @@ import { noopFunc, trueFunc, falseFunc, - noopThrow, + throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, @@ -58,7 +58,7 @@ import { * - `noopCallbackFunc` - function returning noopFunc * - `trueFunc` - function returning true * - `falseFunc` - function returning false - * - `noopThrow` - function throwing an error + * - `throwFunc` - function throwing an error * - `noopPromiseResolve` - function returning Promise object that is resolved with an empty response * - `noopPromiseReject` - function returning Promise.reject() * - `''` - empty string @@ -122,8 +122,8 @@ export function setConstant(source, property, value, stack) { constantValue = trueFunc; } else if (value === 'falseFunc') { constantValue = falseFunc; - } else if (value === 'noopThrow') { - constantValue = noopThrow; + } else if (value === 'throwFunc') { + constantValue = throwFunc; } else if (value === 'noopPromiseResolve') { constantValue = noopPromiseResolve; } else if (value === 'noopPromiseReject') { @@ -294,7 +294,7 @@ setConstant.injections = [ noopCallbackFunc, trueFunc, falseFunc, - noopThrow, + throwFunc, noopPromiseReject, noopPromiseResolve, getPropertyInChain, diff --git a/tests/helpers/noop.test.js b/tests/helpers/noop.test.js index 5f84db70..06bebdf9 100644 --- a/tests/helpers/noop.test.js +++ b/tests/helpers/noop.test.js @@ -2,7 +2,7 @@ import { noopPromiseResolve, noopCallbackFunc, noopFunc, - noopThrow, + throwFunc, } from '../../src/helpers'; const { test, module } = QUnit; @@ -35,6 +35,6 @@ test('noopCallbackFunc returns noopFunc', async (assert) => { assert.strictEqual(func(), undefined, 'function returns undefined'); }); -test('noopThrow throws an error', async (assert) => { - assert.throws(() => noopThrow(), 'noopThrow throws an error'); +test('throwFunc throws an error', async (assert) => { + assert.throws(() => throwFunc(), 'throwFunc throws an error'); }); diff --git a/tests/scriptlets/set-constant.test.js b/tests/scriptlets/set-constant.test.js index 0b8cb11a..033a9ff5 100644 --- a/tests/scriptlets/set-constant.test.js +++ b/tests/scriptlets/set-constant.test.js @@ -113,10 +113,10 @@ if (!isSupported) { clearGlobalProps(noopCallbackFuncProp); // setting constant to noopCallbackFunc; - const noopThrowProp = 'noopThrow'; - runScriptletFromTag(noopThrowProp, 'noopThrow'); - assert.throws(() => window[noopThrowProp]()(), 'noopThrowProp throws an error'); - clearGlobalProps(noopThrowProp); + const throwFuncProp = 'throwFunc'; + runScriptletFromTag(throwFuncProp, 'throwFunc'); + assert.throws(() => window[throwFuncProp]()(), 'throwFuncProp throws an error'); + clearGlobalProps(throwFuncProp); // setting constant to trueFunc; const trueFuncProp = 'trueFuncProp'; From a31a4f10991c0ecfda988674dabe2a21251c2192 Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Fri, 30 Dec 2022 15:01:38 +0300 Subject: [PATCH 56/70] fix compatibility table for prevent refresh Merge in ADGUARD-FILTERS/scriptlets from fix/compatibility-table_prevent-refresh to master Squashed commit of the following: commit 550a199c075b4b253c11635439a2b668f7a4399f Author: Stanislav A Date: Fri Dec 30 13:20:31 2022 +0300 add xml-prune to table commit 7582335d17d2bb6f04e252e7738dad19cd00235f Author: Stanislav A Date: Fri Dec 30 13:03:13 2022 +0300 move refresh higher commit 0ac5a3ae275315759c98a0b79ee9c342008a983f Author: Stanislav A Date: Fri Dec 30 12:59:13 2022 +0300 fix compatibility table for prevent refresh --- scripts/compatibility-table.json | 14 ++++++++------ wiki/compatibility-table.md | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/scripts/compatibility-table.json b/scripts/compatibility-table.json index 0172bf51..9eb79223 100644 --- a/scripts/compatibility-table.json +++ b/scripts/compatibility-table.json @@ -106,6 +106,10 @@ { "adg": "prevent-popads-net" }, + { + "adg": "prevent-refresh", + "ubo": "refresh-defuser.js" + }, { "adg": "prevent-requestAnimationFrame", "ubo": "no-requestAnimationFrame-if.js (norafif.js)" @@ -144,6 +148,10 @@ { "adg": "set-popads-dummy" }, + { + "adg": "xml-prune", + "ubo": "xml-prune.js" + }, { "ubo": "webrtc-if.js" }, @@ -231,18 +239,12 @@ { "ubo": "abort-current-script.js (acs.js, abort-current-inline-script.js, acis.js)" }, - { - "ubo": "refresh-defuser.js" - }, { "ubo": "no-floc.js" }, { "ubo": "window.name-defuser.js" }, - { - "ubo": "xml-prune.js" - }, { "ubo": "m3u-prune.js" } diff --git a/wiki/compatibility-table.md b/wiki/compatibility-table.md index bbdc5dfa..70d7b92c 100644 --- a/wiki/compatibility-table.md +++ b/wiki/compatibility-table.md @@ -30,6 +30,7 @@ | [prevent-fetch](../wiki/about-scriptlets.md#prevent-fetch) | no-fetch-if.js | | | [prevent-xhr](../wiki/about-scriptlets.md#prevent-xhr) | no-xhr-if.js | | | [prevent-popads-net](../wiki/about-scriptlets.md#prevent-popads-net) | | | +| [prevent-refresh](../wiki/about-scriptlets.md#prevent-refresh) | refresh-defuser.js | | | [prevent-requestAnimationFrame](../wiki/about-scriptlets.md#prevent-requestAnimationFrame) | no-requestAnimationFrame-if.js (norafif.js) | | | [prevent-setInterval](../wiki/about-scriptlets.md#prevent-setInterval) | no-setInterval-if.js (nosiif.js) | | | [prevent-setTimeout](../wiki/about-scriptlets.md#prevent-setTimeout) | no-setTimeout-if.js (nostif.js, setTimeout-defuser.js) | | @@ -40,6 +41,7 @@ | [set-attr](../wiki/about-scriptlets.md#set-attr) | | | | [set-constant](../wiki/about-scriptlets.md#set-constant) | set-constant.js (set.js) | override-property-read | | [set-popads-dummy](../wiki/about-scriptlets.md#set-popads-dummy) | | | +| [xml-prune](../wiki/about-scriptlets.md#xml-prune) | xml-prune.js | | | | webrtc-if.js | | | | overlay-buster.js | | | | alert-buster.js | | @@ -69,10 +71,8 @@ | | | abort-on-iframe-property-read | | | | abort-on-iframe-property-write | | | abort-current-script.js (acs.js, abort-current-inline-script.js, acis.js) | | -| | refresh-defuser.js | | | | no-floc.js | | | | window.name-defuser.js | | -| | xml-prune.js | | | | m3u-prune.js | | From 9f307ecc75d2406f29baabbc5a0aa21a8aaffe24 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Fri, 30 Dec 2022 15:02:00 +0300 Subject: [PATCH 57/70] skipci: Automatic increment build number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b49d12a8..c8957f13 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adguard/scriptlets", - "version": "1.7.20", + "version": "1.7.21", "description": "AdGuard's JavaScript library of Scriptlets and Redirect resources", "scripts": { "build": "babel-node bundler.js", From 96e65b4b4ec899268f9a685bc54ed3fcd4fe88eb Mon Sep 17 00:00:00 2001 From: Stanislav Atroschenko Date: Tue, 10 Jan 2023 14:36:30 +0300 Subject: [PATCH 58/70] AG-17246 fix code style to conform to guidelines Merge in ADGUARD-FILTERS/scriptlets from fix/AG-17246 to release/v1.8 Squashed commit of the following: commit 62ebabae021badccfa3bedfdf13ad8cda84a675a Author: Stanislav A Date: Mon Jan 9 21:20:40 2023 +0300 remove dashes after param docs commit 3e1ea2d02c0c2e75d3f6e618563f338928e9bc78 Author: Stanislav A Date: Mon Jan 9 21:18:22 2023 +0300 swap wildcard to 'any' for param types commit 9edacb068d328039ac5d0f67f215a43c0d69f7ae Author: Stanislav A Date: Fri Dec 30 14:52:40 2022 +0300 config and apply check-types commit 8a17e2d657e572d746c28ad19c021b023d890617 Author: Stanislav A Date: Fri Dec 30 14:10:50 2022 +0300 remove unsupported import syntax commit c49ebf47b79996efed88ea05c88ef455c838df40 Author: Stanislav A Date: Thu Dec 29 20:51:12 2022 +0300 enable rules for helpers p2 commit 279c58904a11c16473729bd382bc4fe9868925d7 Author: Stanislav A Date: Thu Dec 29 20:18:20 2022 +0300 enable rules for helpers p1 commit 6e3f5de3968035acff369747a8cd119913ebd1be Author: Stanislav A Date: Thu Dec 29 17:04:06 2022 +0300 split overrides into separate eslint configs commit bbffe492aa6f9f33385b4b20f8be1f4b0edc019a Merge: 8717f33b 0aeb1d5c Author: Stanislav A Date: Thu Dec 29 16:34:42 2022 +0300 merge master commit 8717f33bd9d4affd6f1aeeb4d43b97354e933b8c Author: Stanislav A Date: Wed Dec 28 20:39:28 2022 +0300 use rules for helpers commit 026785f4ce6b2dbb83e9e80f63a969b075790981 Author: Stanislav A Date: Wed Dec 28 20:03:59 2022 +0300 fix tag-lines p2 commit 9a4aa4d0e3e9cee4c812d98a8460a269388dc04e Merge: 048e32c8 89185d3e Author: Stanislav A Date: Wed Dec 28 18:48:44 2022 +0300 merge release/v1.8 commit 048e32c886cced586fe5f6b32cb95814072c0ef2 Author: Stanislav A Date: Wed Dec 28 15:09:30 2022 +0300 enable jsdoc/require-property-description commit c3d3d5d10dc48259be416e78d675ecce2c0f6501 Author: Stanislav A Date: Wed Dec 28 14:39:00 2022 +0300 enable jsdoc/tag-lines commit fe47c15f0fe1f537d860df1e05e84637d082ae6e Author: Stanislav A Date: Wed Dec 28 14:14:21 2022 +0300 enable jsdoc/require-returns commit f5d898e43ba49800707e16f97d7f5f29bf5d1dea Author: Stanislav A Date: Wed Dec 28 13:33:58 2022 +0300 enable jsdoc/newline-after-description commit 034db74d130feaad63622b9f78774b6e22cc89a1 Author: Stanislav A Date: Wed Dec 28 12:59:12 2022 +0300 enable jsdoc/check-tag-names commit 286558e0d6aeaf42f5941ef0c36d7a731d01a0b5 Author: Stanislav A Date: Tue Dec 27 21:11:37 2022 +0300 enable jsdoc/require-param-type commit b34878a2ca29ade2235927207c3584e46726da50 Author: Stanislav A Date: Tue Dec 27 20:59:30 2022 +0300 enable jsdoc/check-alignment commit fe206576731c70958e9c92724e8cad6d902bb347 Author: Stanislav A Date: Tue Dec 27 20:56:32 2022 +0300 enable jsdoc/check-types commit 4908c90f48e8a552f0600bfb50c30f3e0aa16b0c Author: Stanislav A Date: Tue Dec 27 20:48:19 2022 +0300 enable jsdoc/check-param-names ... and 4 more commits --- .eslintrc | 30 -- .eslintrc.js | 48 +++ package.json | 1 + scripts/build-compatibility-table.js | 13 +- scripts/build-corelibs.js | 3 +- scripts/build-docs.js | 6 +- scripts/build-funcs.js | 5 +- scripts/build-redirects.js | 6 +- scripts/build-tests.js | 2 + scripts/check-sources-updates.js | 19 +- scripts/helpers.js | 6 +- scripts/rollup-runners.js | 6 +- src/helpers/.eslintrc.js | 14 + src/helpers/add-event-listener-utils.js | 17 +- src/helpers/adjust-set-utils.js | 13 +- src/helpers/array-utils.js | 9 +- src/helpers/converter.js | 69 +++-- src/helpers/cookie-utils.js | 30 +- src/helpers/create-on-error-handler.js | 3 +- src/helpers/get-descriptor-addon.js | 8 +- src/helpers/get-property-in-chain.js | 14 +- src/helpers/get-wildcard-property-in-chain.js | 14 +- src/helpers/hit.js | 4 +- src/helpers/injector.js | 20 +- src/helpers/log-message.js | 7 +- src/helpers/match-request-props.js | 11 +- src/helpers/match-stack.js | 3 +- src/helpers/noop-utils.js | 40 ++- src/helpers/number-utils.js | 22 +- src/helpers/object-utils.js | 23 +- src/helpers/observer.js | 11 +- src/helpers/open-shadow-dom-utils.js | 10 +- src/helpers/parse-flags.js | 12 +- src/helpers/parse-keyword-value.js | 4 +- src/helpers/parse-rule.js | 37 ++- src/helpers/prevent-utils.js | 17 +- src/helpers/random-id.js | 2 + src/helpers/request-utils.js | 35 ++- src/helpers/script-source-utils.js | 3 +- src/helpers/storage-utils.js | 13 +- src/helpers/string-utils.js | 80 +++-- src/helpers/throttle.js | 6 +- src/helpers/validator.js | 67 ++-- src/redirects/amazon-apstag.js | 1 - src/redirects/ati-smarttag.js | 1 - .../blocking-redirects/click2load.js | 5 + src/redirects/didomi-loader.js | 1 - src/redirects/fingerprintjs2.js | 1 - src/redirects/fingerprintjs3.js | 1 - src/redirects/gemius.js | 1 - src/redirects/google-analytics-ga.js | 1 - src/redirects/google-analytics.js | 8 +- src/redirects/google-ima3.js | 1 - .../googlesyndication-adsbygoogle.js | 1 - src/redirects/googletagservices-gpt.js | 1 - src/redirects/index.js | 3 + src/redirects/matomo.js | 1 - src/redirects/metrika-yandex-tag.js | 5 +- src/redirects/metrika-yandex-watch.js | 2 +- src/redirects/naver-wcslog.js | 1 - src/redirects/noeval.js | 1 - src/redirects/pardot-1.0.js | 1 - src/redirects/prebid-ads.js | 1 - src/redirects/prebid.js | 1 - src/redirects/prevent-bab.js | 1 - src/redirects/prevent-bab2.js | 1 - src/redirects/prevent-fab-3.2.0.js | 1 - src/redirects/prevent-popads-net.js | 1 - src/redirects/redirects.js | 23 +- src/redirects/scorecardresearch-beacon.js | 1 - src/redirects/set-popads-dummy.js | 1 - src/scriptlets/abort-current-inline-script.js | 1 - src/scriptlets/abort-on-property-read.js | 1 - src/scriptlets/abort-on-property-write.js | 1 - src/scriptlets/abort-on-stack-trace.js | 1 - src/scriptlets/adjust-setInterval.js | 1 - src/scriptlets/adjust-setTimeout.js | 1 - src/scriptlets/close-window.js | 1 - src/scriptlets/debug-current-inline-script.js | 1 - src/scriptlets/debug-on-property-read.js | 1 - src/scriptlets/debug-on-property-write.js | 1 - src/scriptlets/dir-string.js | 1 - src/scriptlets/disable-newtab-links.js | 1 - src/scriptlets/hide-in-shadow-dom.js | 1 - src/scriptlets/index.js | 5 +- src/scriptlets/json-prune.js | 3 +- src/scriptlets/log-addEventListener.js | 1 - src/scriptlets/log-eval.js | 1 - src/scriptlets/log-on-stack-trace.js | 1 - src/scriptlets/log.js | 1 - src/scriptlets/no-topics.js | 1 - src/scriptlets/noeval.js | 1 - src/scriptlets/nowebrtc.js | 1 - src/scriptlets/prevent-addEventListener.js | 3 +- src/scriptlets/prevent-adfly.js | 1 - src/scriptlets/prevent-bab.js | 1 - src/scriptlets/prevent-element-src-loading.js | 1 - src/scriptlets/prevent-eval-if.js | 1 - src/scriptlets/prevent-fab-3.2.0.js | 1 - src/scriptlets/prevent-fetch.js | 1 - src/scriptlets/prevent-popads-net.js | 1 - src/scriptlets/prevent-refresh.js | 1 - .../prevent-requestAnimationFrame.js | 1 - src/scriptlets/prevent-setInterval.js | 1 - src/scriptlets/prevent-setTimeout.js | 1 - src/scriptlets/prevent-window-open.js | 1 - src/scriptlets/prevent-xhr.js | 1 - src/scriptlets/remove-attr.js | 1 - src/scriptlets/remove-class.js | 1 - src/scriptlets/remove-cookie.js | 1 - src/scriptlets/remove-in-shadow-dom.js | 1 - src/scriptlets/set-attr.js | 1 - src/scriptlets/set-constant.js | 1 - src/scriptlets/set-cookie-reload.js | 1 - src/scriptlets/set-cookie.js | 1 - src/scriptlets/set-local-storage-item.js | 1 - src/scriptlets/set-popads-dummy.js | 1 - src/scriptlets/set-session-storage-item.js | 1 - src/scriptlets/trusted-click-element.js | 1 - .../trusted-replace-fetch-response.js | 2 +- .../trusted-replace-xhr-response.js | 1 - src/scriptlets/trusted-set-cookie-reload.js | 1 - src/scriptlets/trusted-set-cookie.js | 1 - .../trusted-set-local-storage-item.js | 1 - src/scriptlets/xml-prune.js | 2 - tests/.eslintrc.js | 8 + tests/helpers.js | 4 + tests/helpers/fetch-utils.test.js | 18 +- tests/helpers/number-utils.test.js | 4 - ...prevent-utils.js => prevent-utils.test.js} | 0 tests/index.js | 3 +- tests/redirects/ati-smarttag.test.js | 77 +++-- tests/scriptlets/hide-in-shadow-dom.test.js | 16 +- tests/scriptlets/json-prune.test.js | 290 +++++++++++++++--- tests/scriptlets/prevent-refresh.test.js | 2 +- tests/scriptlets/remove-in-shadow-dom.test.js | 16 +- tests/scriptlets/set-cookie.test.js | 12 +- yarn.lock | 48 ++- 138 files changed, 906 insertions(+), 487 deletions(-) delete mode 100644 .eslintrc create mode 100644 .eslintrc.js create mode 100644 src/helpers/.eslintrc.js create mode 100644 tests/.eslintrc.js rename tests/helpers/{prevent-utils.js => prevent-utils.test.js} (100%) diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index bc7d5b7b..00000000 --- a/.eslintrc +++ /dev/null @@ -1,30 +0,0 @@ -{ - "extends": ["airbnb-base"], - "parser": "@babel/eslint-parser", - "parserOptions": { - "babelOptions": { - "rootMode": "upward" - } - }, - "env": { - "browser": true, - "qunit": true - }, - "rules": { - "max-len": [ - "error", - { - "code": 120, - "ignoreUrls": true - } - ], - "indent": ["error", 4, { "SwitchCase": 1}], - "no-param-reassign": 0, - "no-shadow": 0, - "import/prefer-default-export": 0, - "arrow-body-style": 0, - "import/no-extraneous-dependencies": 0, - "no-await-in-loop": 0, - "no-restricted-syntax": 0 - } -} diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..de4697c8 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,48 @@ +module.exports = { + extends: [ + 'airbnb-base', + 'plugin:jsdoc/recommended', + ], + parser: '@babel/eslint-parser', + parserOptions: { + babelOptions: { + rootMode: 'upward', + }, + }, + env: { + browser: true, + qunit: true, + }, + rules: { + 'max-len': [ + 'error', + { + code: 120, + ignoreUrls: true, + }, + ], + indent: ['error', 4, { SwitchCase: 1 }], + 'no-param-reassign': 0, + 'no-shadow': 0, + 'import/prefer-default-export': 0, + 'arrow-body-style': 0, + 'import/no-extraneous-dependencies': 0, + 'no-await-in-loop': 0, + 'no-restricted-syntax': 0, + // jsdoc rules + 'jsdoc/check-tag-names': ['error', { definedTags: ['scriptlet', 'trustedScriptlet', 'redirect'] }], + 'jsdoc/require-jsdoc': 0, + 'jsdoc/require-param': 0, + 'jsdoc/valid-types': 0, + 'jsdoc/no-undefined-types': 0, + 'jsdoc/require-param-description': 0, + 'jsdoc/require-returns-description': 0, + }, + settings: { + jsdoc: { + preferredTypes: { + object: 'Object', + }, + }, + }, +}; diff --git a/package.json b/package.json index de2a235a..72b8347f 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "eslint-config-airbnb-base": "^14.2.1", "eslint-plugin-compat": "^3.9.0", "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jsdoc": "^39.6.4", "fs-extra": "^10.0.1", "husky": "~8.0.2", "js-reporters": "^2.1.0", diff --git a/scripts/build-compatibility-table.js b/scripts/build-compatibility-table.js index f1ab4179..9fb98825 100644 --- a/scripts/build-compatibility-table.js +++ b/scripts/build-compatibility-table.js @@ -21,15 +21,15 @@ const WIKI_COMPATIBILITY_TABLE_PATH = path.resolve( /** * @typedef {Object} CompatibilityItem - * @property {string} adg - * @property {string} abp - * @property {string} ubo + * @property {string} adg AdGuard name + * @property {string} abp Adblock Plus name + * @property {string} ubo uBlock name */ /** * @typedef {Object} CompatibilityData - * @property {CompatibilityItem[]} scriptlets - * @property {CompatibilityItem[]} redirects + * @property {CompatibilityItem[]} scriptlets list of scriptlets compatibility items + * @property {CompatibilityItem[]} redirects list of redirects compatibility items */ /** @@ -50,7 +50,6 @@ const getTableData = () => { * @param {string} item.adg AdGuard name * @param {string} item.abp Adblock Plus name * @param {string} item.ubo uBlock name - * * @returns {string} markdown table row */ const getRow = (id, { adg, abp, ubo }) => { @@ -77,10 +76,10 @@ const getTableHeader = () => { /** * Builds markdown string of scriptlets/redirect compatibility table + * * @param {string} title title for scriptlets or redirects * @param {CompatibilityItem[]} data array of scriptlets or redirects compatibility data items * @param {'scriptlets'|'redirects'} id - * * @returns {string} scriptlets or redirects compatibility table */ const buildTable = (title, data = [], id = '') => { diff --git a/scripts/build-corelibs.js b/scripts/build-corelibs.js index d335ef0f..2338d65b 100644 --- a/scripts/build-corelibs.js +++ b/scripts/build-corelibs.js @@ -7,7 +7,8 @@ import { version } from '../package.json'; import { writeFile } from './helpers'; const buildCorelibsJson = async () => { - const { getScriptletFunction } = require('../tmp/scriptlets-func'); // eslint-disable-line import/no-unresolved,global-require + // eslint-disable-next-line import/no-unresolved,global-require + const { getScriptletFunction } = require('../tmp/scriptlets-func'); const scriptlets = await Promise.all(Object .values(scriptletList) diff --git a/scripts/build-docs.js b/scripts/build-docs.js index 6ce57432..c785c858 100644 --- a/scripts/build-docs.js +++ b/scripts/build-docs.js @@ -46,8 +46,9 @@ const aboutTrustedScriptletsPath = path.resolve( ); /** - * Collects required comments from files and - * returns describing object for scriptlets and redirects + * Collects required comments from files + * + * @returns {Object} describing object for scriptlets and redirects */ const manageDataFromFiles = () => { const dataFromScriptletsFiles = getDataFromFiles( @@ -95,7 +96,6 @@ const manageDataFromFiles = () => { * Generates markdown list and describing text. * * @param {DescribingCommentData[]} dataItems array of comment data objects - * * @returns {MarkdownData} */ const getMarkdownData = (dataItems) => { diff --git a/scripts/build-funcs.js b/scripts/build-funcs.js index 57683c13..0219e1d3 100644 --- a/scripts/build-funcs.js +++ b/scripts/build-funcs.js @@ -23,6 +23,8 @@ import { writeFile } from './helpers'; /** * Method creates string for file with scriptlets functions, * where dependencies are placed inside scriptlet functions + * + * @returns {string} */ const getScriptletFunctionsString = () => { function wrapInFunc(name, code) { @@ -31,7 +33,8 @@ const getScriptletFunctionsString = () => { // we require scriptlets list dynamically, because scriptletsList file can be not built in the // moment of this script execution - const scriptletsList = require('../tmp/scriptlets-list'); // eslint-disable-line global-require, import/no-unresolved + // eslint-disable-next-line import/no-unresolved,global-require + const scriptletsList = require('../tmp/scriptlets-list'); const scriptletsFunctions = Object.values(scriptletsList); diff --git a/scripts/build-redirects.js b/scripts/build-redirects.js index d12437e4..70e0f7ec 100644 --- a/scripts/build-redirects.js +++ b/scripts/build-redirects.js @@ -143,7 +143,9 @@ const getJsRedirects = async (options = {}) => { // TODO: seems like duplicate of already existed code /** * Returns first line of describing comment from redirect resource file + * * @param {string} rrName redirect resource name + * @returns {string|undefined} */ const getComment = (rrName) => { const { description } = redirectsDescriptions.find((rr) => rr.name === rrName); @@ -197,7 +199,7 @@ export const getPreparedRedirects = async (options) => { /** * Copies non-static redirects sources to dist * - * @param redirectsData + * @param {object[]} redirectsData */ const buildJsRedirectFiles = async (redirectsData) => { const saveRedirectData = async (redirect) => { @@ -212,7 +214,7 @@ const buildJsRedirectFiles = async (redirectsData) => { /** * Prepares static redirects sources to dist * - * @param redirectsData + * @param {object[]} redirectsData */ const buildStaticRedirectFiles = async (redirectsData) => { const prepareRedirectData = async (redirect) => { diff --git a/scripts/build-tests.js b/scripts/build-tests.js index d75871f9..090eb9cb 100644 --- a/scripts/build-tests.js +++ b/scripts/build-tests.js @@ -14,9 +14,11 @@ const TEST_FILE_NAME_MARKER = '.test.js'; /** * Prepares rollup config for test file + * * @param {string} fileName test file name * @param {string} dirPath resolved directory path * @param {string} subDir subdirectory with test files + * @returns {Object} rollup config */ const getTestConfig = (fileName, dirPath, subDir) => { if (!fs.existsSync(TESTS_DIST)) { diff --git a/scripts/check-sources-updates.js b/scripts/check-sources-updates.js index 99fe8940..f548d3e3 100644 --- a/scripts/check-sources-updates.js +++ b/scripts/check-sources-updates.js @@ -14,8 +14,10 @@ const { /** * Checks if arrays contain the same strings + * * @param {Array} arr1 * @param {Array} arr2 + * @returns {boolean} */ const areArraysOfStringsEqual = (arr1, arr2) => { if (arr1.length !== arr2.length) { @@ -30,6 +32,8 @@ const areArraysOfStringsEqual = (arr1, arr2) => { /** * Returns parsed compatibility table + * + * @returns {Object} */ const getCompatibilityTable = () => { const rawData = fs.readFileSync(COMPATIBILITY_TABLE_DATA_PATH); @@ -39,7 +43,9 @@ const getCompatibilityTable = () => { /** * Returns list of scriptlets listed in table for specified platform + * * @param {"ubo"|"abp"} platform + * @returns {string[]} */ const getScriptletsFromTable = (platform) => { const { scriptlets } = getCompatibilityTable(); @@ -48,22 +54,32 @@ const getScriptletsFromTable = (platform) => { /** * Returns list of redirects listed in table for specified platform + * * @param {"ubo"|"abp"} platform + * @returns {string[]} */ const getRedirectsFromTable = (platform) => { const { redirects } = getCompatibilityTable(); return redirects.map((item) => item[platform]).filter((item) => !!item); }; +/** + * @typedef {Object} Diff + * @property {string[]} added added content + * @property {string[]} removed removed content + */ + /** * Finds a difference between old and new array + * * @param {Array} oldList * @param {Array} newList + * @returns {Diff|null} */ const getDiff = (oldList, newList) => { const diff = { - removed: [], added: [], + removed: [], }; diff.removed = oldList.filter((item) => ( @@ -77,6 +93,7 @@ const getDiff = (oldList, newList) => { /** * Marks removed rules with (removed) and adds new rules to the end of the table + * * @param {{removed: Array, added: Array}} diff Object with diffs for certain type and platform * @param {"scriptlets"|"redirects"} ruleType * @param {"ubo"|"abp"} platform diff --git a/scripts/helpers.js b/scripts/helpers.js index 6a75008b..8dcec4ef 100644 --- a/scripts/helpers.js +++ b/scripts/helpers.js @@ -21,6 +21,7 @@ const writeFile = async (filePath, content) => { /** * Gets list of `.js` files in directory + * * @param {string} relativeDirPath relative path to directory * @returns {string[]} array of file names */ @@ -43,7 +44,6 @@ const getFilesList = (relativeDirPath) => { * In one file might be comments describing scriptlet and redirect as well. * * @param {string} filePath absolute path to file - * * @returns {CommentTag[]} */ const getDescribingCommentTags = (filePath) => { @@ -80,7 +80,6 @@ Please add one OR edit the list of NON_SCRIPTLETS_FILES / NON_REDIRECTS_FILES.`) * @typedef {Object} DescribingCommentData * * Collected data from jsdoc-type comment for every scriptlet or redirect. - * * @property {string} type parsed instance tag: * 'scriptlet' for '@scriptlet', 'redirect' for '@redirect' * @property {string} name name of instance which goes after the instance tag @@ -93,7 +92,6 @@ Please add one OR edit the list of NON_SCRIPTLETS_FILES / NON_REDIRECTS_FILES.`) * * @param {CommentTag[]} commentTags parsed tags from describing comment * @param {string} source relative path to file - * * @returns {DescribingCommentData} */ const prepareCommentsData = (commentTags, source) => { @@ -108,9 +106,9 @@ const prepareCommentsData = (commentTags, source) => { /** * Gets data objects which describe every required comment in one directory + * * @param {string[]} filesList list of files in directory * @param {string} relativeDirPath relative path to directory - * * @returns {DescribingCommentData} */ const getDataFromFiles = (filesList, relativeDirPath) => { diff --git a/scripts/rollup-runners.js b/scripts/rollup-runners.js index 4498b0eb..61e4d976 100644 --- a/scripts/rollup-runners.js +++ b/scripts/rollup-runners.js @@ -5,7 +5,8 @@ const { log } = console; /** * Builds scriptlets - * @param config config may be list of configs or one config + * + * @param {object|object[]} config config may be list of configs or one config */ export const rollupStandard = async (config) => { const runOneConfig = async (config) => { @@ -26,7 +27,8 @@ export const rollupStandard = async (config) => { /** * Builds scriptlets in the watch mode - * @param config - config may be list of configs or one config + * + * @param {object|object[]} config - config may be list of configs or one config */ export const rollupWatch = (config) => { const watcher = rollup.watch(config); diff --git a/src/helpers/.eslintrc.js b/src/helpers/.eslintrc.js new file mode 100644 index 00000000..29fd65df --- /dev/null +++ b/src/helpers/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + extends: [ + '../../.eslintrc', + '../.eslintrc', + ], + rules: { + 'jsdoc/require-jsdoc': 1, + 'jsdoc/require-param': 1, + 'jsdoc/valid-types': 1, + 'jsdoc/no-undefined-types': 1, + 'jsdoc/require-param-description': 1, + 'jsdoc/require-returns-description': 1, + }, +}; diff --git a/src/helpers/add-event-listener-utils.js b/src/helpers/add-event-listener-utils.js index c579dca5..b8737573 100644 --- a/src/helpers/add-event-listener-utils.js +++ b/src/helpers/add-event-listener-utils.js @@ -1,7 +1,8 @@ /** * Validates event type - * @param {*} type - * @returns {boolean} + * + * @param {any} type event type + * @returns {boolean} if type is valid */ export const validateType = (type) => { // https://github.com/AdguardTeam/Scriptlets/issues/125 @@ -10,8 +11,9 @@ export const validateType = (type) => { /** * Validates event listener - * @param {*} listener - * @returns {boolean} + * + * @param {any} listener event listener + * @returns {boolean} if listener callback is valid */ export const validateListener = (listener) => { // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#parameters @@ -23,11 +25,16 @@ export const validateListener = (listener) => { && typeof listener.handleEvent === 'function')); }; +/** + * @typedef {object|Function|null} EventListener + */ + /** * Serialize valid event listener * https://developer.mozilla.org/en-US/docs/Web/API/EventListener + * * @param {EventListener} listener valid listener - * @returns {string} + * @returns {string} listener string */ export const listenerToString = (listener) => { return typeof listener === 'function' diff --git a/src/helpers/adjust-set-utils.js b/src/helpers/adjust-set-utils.js index 791b7b1e..91b10e35 100644 --- a/src/helpers/adjust-set-utils.js +++ b/src/helpers/adjust-set-utils.js @@ -4,7 +4,8 @@ export const shouldMatchAnyDelay = (delay) => delay === '*'; /** * Handles input delay value - * @param {*} delay + * + * @param {any} delay matchDelay argument of adjust-* scriptlets * @returns {number} proper number delay value */ export const getMatchDelay = (delay) => { @@ -18,9 +19,10 @@ export const getMatchDelay = (delay) => { /** * Checks delay match condition - * @param {*} inputDelay - * @param {number} realDelay - * @returns {boolean} + * + * @param {any} inputDelay matchDelay argument of adjust-* scriptlets + * @param {number} realDelay delay argument of setTimeout/setInterval + * @returns {boolean} if given delays match */ export const isDelayMatched = (inputDelay, realDelay) => { return shouldMatchAnyDelay(inputDelay) @@ -29,7 +31,8 @@ export const isDelayMatched = (inputDelay, realDelay) => { /** * Handles input boost value - * @param {*} boost + * + * @param {any} boost boost argument of adjust-* scriptlets * @returns {number} proper number boost multiplier value */ export const getBoostMultiplier = (boost) => { diff --git a/src/helpers/array-utils.js b/src/helpers/array-utils.js index 371e4266..9263e434 100644 --- a/src/helpers/array-utils.js +++ b/src/helpers/array-utils.js @@ -2,7 +2,9 @@ * Some browsers do not support Array.prototype.flat() * for example, Opera 42 which is used for browserstack tests * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat - * @param {Array} input + * + * @param {Array} input arbitrary array + * @returns {Array} flattened array */ export const flatten = (input) => { const stack = []; @@ -24,7 +26,8 @@ export const flatten = (input) => { /** * Predicate method to check if the array item exists - * @param {any} item - * @returns {boolean} + * + * @param {any} item arbitrary + * @returns {boolean} if item is truthy or not */ export const isExisting = (item) => !!item; diff --git a/src/helpers/converter.js b/src/helpers/converter.js index 6dafe996..54bc28a5 100644 --- a/src/helpers/converter.js +++ b/src/helpers/converter.js @@ -65,8 +65,10 @@ const ADG_REMOVE_CLASS_NAME = REMOVE_CLASS_ALIASES[0]; const REMOVE_ATTR_CLASS_APPLYING = ['asap', 'stay', 'complete']; /** - * Returns array of strings separated by space which not in quotes - * @param {string} str + * Returns array of strings separated by space which is not in quotes + * + * @param {string} str arbitrary string + * @returns {string[]} result array */ const getSentences = (str) => { const reg = /'.*?'|".*?"|\S+/g; @@ -75,8 +77,10 @@ const getSentences = (str) => { /** * Replaces string with data by placeholders - * @param {string} str - * @param {Object} data - where keys are placeholders names + * + * @param {string} str string with placeholders + * @param {Object} data where keys are placeholders names + * @returns {string} string filled with data */ const replacePlaceholders = (str, data) => { return Object.keys(data).reduce((acc, key) => { @@ -104,7 +108,8 @@ const splitArgs = (str) => { /** * Validates remove-attr/class scriptlet args - * @param {string[]} parsedArgs + * + * @param {string[]} parsedArgs scriptlet arguments * @returns {string[]|Error} valid args OR error for invalid selector */ const validateRemoveAttrClassArgs = (parsedArgs) => { @@ -147,8 +152,9 @@ const validateRemoveAttrClassArgs = (parsedArgs) => { /** * Converts string of UBO scriptlet rule to AdGuard scriptlet rule - * @param {string} rule - UBO scriptlet rule - * @returns {string[]} - array with one AdGuard scriptlet rule + * + * @param {string} rule UBO scriptlet rule + * @returns {string[]} array with one AdGuard scriptlet rule */ export const convertUboScriptletToAdg = (rule) => { const domains = getBeforeRegExp(rule, validator.UBO_SCRIPTLET_MASK_REG); @@ -193,9 +199,10 @@ export const convertUboScriptletToAdg = (rule) => { /** * Convert string of ABP snippet rule to AdGuard scriptlet rule - * @param {string} rule - ABP snippet rule - * @returns {Array} - array of AdGuard scriptlet rules - - * one or few items depends on Abp-rule + * + * @param {string} rule ABP snippet rule + * @returns {Array} array of AdGuard scriptlet rules, one or few items depends on Abp-rule + * */ export const convertAbpSnippetToAdg = (rule) => { const SEMICOLON_DIVIDER = /;(?=(?:(?:[^"]*"){2})*[^"]*$)/g; @@ -221,9 +228,9 @@ export const convertAbpSnippetToAdg = (rule) => { /** * Converts scriptlet rule to AdGuard one - * @param {string} rule - * @returns {Array} - array of AdGuard scriptlet rules - - * one item for Adg and Ubo or few items for Abp + * + * @param {string} rule scriptlet rule + * @returns {Array} array of AdGuard scriptlet rules, one item for Adg and Ubo or few items for Abp */ export const convertScriptletToAdg = (rule) => { let result; @@ -240,8 +247,9 @@ export const convertScriptletToAdg = (rule) => { /** * Converts UBO scriptlet rule to AdGuard one - * @param {string} rule - AdGuard scriptlet rule - * @returns {string} - UBO scriptlet rule + * + * @param {string} rule AdGuard scriptlet rule + * @returns {string} UBO scriptlet rule */ export const convertAdgScriptletToUbo = (rule) => { let res; @@ -328,8 +336,9 @@ export const convertAdgScriptletToUbo = (rule) => { /** * Checks whether the ADG scriptlet exists or UBO/ABP scriptlet is compatible to ADG - * @param {string} input - can be ADG or UBO or ABP scriptlet rule - * @returns {boolean} + * + * @param {string} input can be ADG or UBO or ABP scriptlet rule + * @returns {boolean} if scriptlet rule is valid */ export const isValidScriptletRule = (input) => { if (!input) { @@ -350,9 +359,10 @@ export const isValidScriptletRule = (input) => { /** * Gets index and redirect resource marker from UBO/ADG modifiers array - * @param {string[]} modifiers + * + * @param {string[]} modifiers rule modifiers * @param {Object} redirectsData validator.REDIRECT_RULE_TYPES.(UBO|ADG) - * @param {string} rule + * @param {string} rule rule string * @returns {Object} { index, marker } */ const getMarkerData = (modifiers, redirectsData, rule) => { @@ -373,8 +383,9 @@ const getMarkerData = (modifiers, redirectsData, rule) => { /** * Converts Ubo redirect rule to Adg one - * @param {string} rule - * @returns {string} + * + * @param {string} rule ubo redirect rule + * @returns {string} converted adg rule */ export const convertUboRedirectToAdg = (rule) => { const firstPartOfRule = substringBefore(rule, '$'); @@ -403,8 +414,9 @@ export const convertUboRedirectToAdg = (rule) => { /** * Converts Abp redirect rule to Adg one - * @param {string} rule - * @returns {string} + * + * @param {string} rule abp redirect rule + * @returns {string} converted adg rule */ export const convertAbpRedirectToAdg = (rule) => { const firstPartOfRule = substringBefore(rule, '$'); @@ -428,8 +440,9 @@ export const convertAbpRedirectToAdg = (rule) => { /** * Converts redirect rule to AdGuard one - * @param {string} rule - * @returns {string} + * + * @param {string} rule redirect rule + * @returns {string} converted adg rule */ export const convertRedirectToAdg = (rule) => { let result; @@ -452,8 +465,10 @@ export const convertRedirectToAdg = (rule) => { * Source types are chosen according to redirect name * e.g. ||ad.com^$redirect=,important ->> ||ad.com^$redirect=,important,script * 3. Replaces Adg redirect name by Ubo analog - * @param {string} rule - * @returns {string} + * + * @param {string} rule adg rule + * @returns {string} converted ubo rule + * @throws on incompatible rule */ export const convertAdgRedirectToUbo = (rule) => { if (!validator.isAdgRedirectCompatibleWithUbo(rule)) { diff --git a/src/helpers/cookie-utils.js b/src/helpers/cookie-utils.js index eaec3446..7bebf680 100644 --- a/src/helpers/cookie-utils.js +++ b/src/helpers/cookie-utils.js @@ -1,15 +1,10 @@ import { nativeIsNaN } from './number-utils'; -/** - * @typedef { import('../scriptlets/index').Source } Source - */ - /** * Checks whether the input path is supported * * @param {string} rawPath input path - * - * @returns {boolean} + * @returns {boolean} if cookie path is valid */ export const isValidCookiePath = (rawPath) => rawPath === '/' || rawPath === 'none'; @@ -17,9 +12,8 @@ export const isValidCookiePath = (rawPath) => rawPath === '/' || rawPath === 'no * Returns 'path=/' if rawPath is '/' * or empty string '' for other cases, `rawPath === 'none'` included * - * @param {string} rawPath - * - * @returns {string} + * @param {string} rawPath path argument of *set-cookie-* scriptlets + * @returns {string} cookie path */ export const getCookiePath = (rawPath) => { if (rawPath === '/') { @@ -33,10 +27,9 @@ export const getCookiePath = (rawPath) => { /** * Combines input cookie name, value, and path into string. * - * @param {string} rawName - * @param {string} rawValue - * @param {string} rawPath - * + * @param {string} rawName name argument of *set-cookie-* scriptlets + * @param {string} rawValue value argument of *set-cookie-* scriptlets + * @param {string} rawPath path argument of *set-cookie-* scriptlets * @returns {string|null} string OR `null` if path is not supported */ export const concatCookieNameValuePath = (rawName, rawValue, rawPath) => { @@ -48,7 +41,6 @@ export const concatCookieNameValuePath = (rawName, rawValue, rawPath) => { * Gets supported cookie value * * @param {string} value input cookie value - * * @returns {string|null} valid cookie string if ok OR null if not */ export const getLimitedCookieValue = (value) => { @@ -94,6 +86,7 @@ export const getLimitedCookieValue = (value) => { /** * Parses cookie string into object + * * @param {string} cookieString string that conforms to document.cookie format * @returns {Object} key:value object that corresponds with incoming cookies keys and values */ @@ -124,10 +117,11 @@ export const parseCookieString = (cookieString) => { /** * Check if cookie with specified name and value is present in a cookie string - * @param {string} cookieString - * @param {string} name - * @param {string} value - * @returns {boolean} + * + * @param {string} cookieString 'document.cookie'-like string + * @param {string} name name argument of *set-cookie-* scriptlets + * @param {string} value value argument of *set-cookie-* scriptlets + * @returns {boolean} if cookie is already set */ export const isCookieSetWithValue = (cookieString, name, value) => { return cookieString.split(';') diff --git a/src/helpers/create-on-error-handler.js b/src/helpers/create-on-error-handler.js index 4b9eca79..041f8094 100644 --- a/src/helpers/create-on-error-handler.js +++ b/src/helpers/create-on-error-handler.js @@ -1,8 +1,9 @@ /** * Generates function which silents global errors on page generated by scriptlet * If error doesn't belong to our error we transfer it to the native onError handler + * * @param {string} rid - unique identifier of scriptlet - * @return {onError} + * @returns {Function} window.onerror handler */ export function createOnErrorHandler(rid) { // eslint-disable-next-line consistent-return diff --git a/src/helpers/get-descriptor-addon.js b/src/helpers/get-descriptor-addon.js index 8c930a7b..1acb3909 100644 --- a/src/helpers/get-descriptor-addon.js +++ b/src/helpers/get-descriptor-addon.js @@ -1,21 +1,21 @@ import { randomId } from './random-id'; /** - * Prevent infinite loops when trapping props that could be used by scriptlet's own helpers + * Prevents infinite loops when trapping props that could be used by scriptlet's own helpers * Example: window.RegExp, that is used by matchStackTrace > toRegExp * * https://github.com/AdguardTeam/Scriptlets/issues/251 * https://github.com/AdguardTeam/Scriptlets/issues/226 * https://github.com/AdguardTeam/Scriptlets/issues/232 * - * @return {Object} + * @returns {Object} descriptor addon */ export function getDescriptorAddon() { return { isAbortingSuspended: false, isolateCallback(cb, ...args) { this.isAbortingSuspended = true; - // try...catch is required in case if there are more than one inline scripts - // which should be aborted. + // try...catch is required in case there are more than one inline scripts + // which should be aborted, // so after the first successful abortion, `cb(...args);` will throw error, // and we should not stop on that and continue to abort other scripts try { diff --git a/src/helpers/get-property-in-chain.js b/src/helpers/get-property-in-chain.js index a1d71a64..dd1f413b 100644 --- a/src/helpers/get-property-in-chain.js +++ b/src/helpers/get-property-in-chain.js @@ -1,10 +1,10 @@ import { isEmptyObject } from './object-utils'; /** - * @typedef Chain - * @property {Object} base - * @property {string} prop - * @property {string} [chain] + * @typedef ChainInfo + * @property {Object} base current chain base + * @property {string} prop current chain prop + * @property {string} [chain] string representation */ /** @@ -14,9 +14,9 @@ import { isEmptyObject } from './object-utils'; * defines this property as 'undefined' * and returns base, property name and remaining part of property chain * - * @param {Object} base - * @param {string} chain - * @returns {Chain} + * @param {Object} base object that owns chain + * @param {string} chain chain of owner properties + * @returns {ChainInfo} chain info object */ export function getPropertyInChain(base, chain) { const pos = chain.indexOf('.'); diff --git a/src/helpers/get-wildcard-property-in-chain.js b/src/helpers/get-wildcard-property-in-chain.js index 0274983b..0b139c8d 100644 --- a/src/helpers/get-wildcard-property-in-chain.js +++ b/src/helpers/get-wildcard-property-in-chain.js @@ -1,8 +1,8 @@ /** - * @typedef Chain - * @property {Object} base - * @property {string} prop - * @property {string} [chain] + * @typedef ChainInfo + * @property {Object} base current chain base + * @property {string} prop current chain prop + * @property {string} [chain] string representation */ /** @@ -10,12 +10,12 @@ * Similar to getPropertyInChain but upgraded for json-prune: * handle wildcard properties and does not define nonexistent base property as 'undefined' * - * @param {Object} base - * @param {string} chain + * @param {Object} base object that owns chain + * @param {string} chain chain of owner properties * @param {boolean} [lookThrough=false] * should the method look through it's props in order to wildcard * @param {Array} [output=[]] result acc - * @returns {Chain[]} array of objects + * @returns {ChainInfo[]} array of objects */ export function getWildcardPropertyInChain(base, chain, lookThrough = false, output = []) { const pos = chain.indexOf('.'); diff --git a/src/helpers/hit.js b/src/helpers/hit.js index 810216ef..8d5c685d 100644 --- a/src/helpers/hit.js +++ b/src/helpers/hit.js @@ -1,7 +1,9 @@ /* eslint-disable no-console, no-underscore-dangle */ + /** * Hit used only for debug purposes now - * @param {Source} source + * + * @param {Object} source scriptlet properties * use LOG_MARKER = 'log: ' at the start of a message * for logging scriptlets */ diff --git a/src/helpers/injector.js b/src/helpers/injector.js index 80f99e57..74a1958e 100644 --- a/src/helpers/injector.js +++ b/src/helpers/injector.js @@ -1,6 +1,8 @@ /** * Concat dependencies to scriptlet code + * * @param {string} scriptlet string view of scriptlet + * @returns {string} string view of scriptlet with attached dependencies */ export function attachDependencies(scriptlet) { const { injections = [] } = scriptlet; @@ -11,8 +13,10 @@ export function attachDependencies(scriptlet) { /** * Add scriptlet call to existing code - * @param {Function} scriptlet - * @param {string} code + * + * @param {Function} scriptlet scriptlet func + * @param {string} code scriptlet's string representation + * @returns {string} wrapped scriptlet call */ export function addCall(scriptlet, code) { return `${code} @@ -27,12 +31,6 @@ export function addCall(scriptlet, code) { /** * Wrap function into IIFE (Immediately invoked function expression) * - * @param {Source} source - object with scriptlet properties - * @param {string} code - scriptlet source code with dependencies - * - * @param redirect - * @returns {string} full scriptlet code - * * @example * const source = { * args: ["aaa", "bbb"], @@ -46,6 +44,10 @@ export function addCall(scriptlet, code) { * function noeval(source) { alert(source); } * noeval.apply(this, args); * )({"args": ["aaa", "bbb"], "name":"noeval"}, ["aaa", "bbb"])` + * @param {Object} source - object with scriptlet properties + * @param {string} code - scriptlet source code with dependencies + * @param {boolean} redirect if function is redirect + * @returns {string} full scriptlet code */ export function passSourceAndProps(source, code, redirect = false) { if (source.hit) { @@ -64,7 +66,9 @@ export function passSourceAndProps(source, code, redirect = false) { /** * Wrap code in no name function + * * @param {string} code which must be wrapped + * @returns {string} wrapped code */ export function wrapInNonameFunc(code) { return `function(source, args){\n${code}\n}`; diff --git a/src/helpers/log-message.js b/src/helpers/log-message.js index 0f9d0b78..1a87bf5e 100644 --- a/src/helpers/log-message.js +++ b/src/helpers/log-message.js @@ -1,13 +1,10 @@ -/** - * @typedef { import('../scriptlets/index').Source } Source - */ - /** * Conditionally logs message to console. * Convention is to log messages by source.verbose if such log * is not a part of scriptlet's functionality, eg on invalid input, * and use 'forced' argument otherwise. - * @param {Source} source required + * + * @param {Object} source required, scriptlet properties * @param {string} message required, message to log * @param {boolean} [forced=false] to log message unconditionally */ diff --git a/src/helpers/match-request-props.js b/src/helpers/match-request-props.js index 63744dde..2c4f52bd 100644 --- a/src/helpers/match-request-props.js +++ b/src/helpers/match-request-props.js @@ -5,18 +5,15 @@ import { } from './request-utils'; import { logMessage } from './log-message'; -/** - * @typedef { import('../scriptlets/index').Source } Source - */ - /** * Checks if given propsToMatch string matches with given request data * This is used by prevent-xhr, prevent-fetch, trusted-replace-xhr-response * and trusted-replace-fetch-response scriptlets - * @param {Source} source - * @param {string} propsToMatch + * + * @param {Object} source scriptlet properties + * @param {string} propsToMatch string of space-separated request properties to match * @param {Object} requestData object with standard properties of fetch/xhr like url, method etc - * @returns {boolean} + * @returns {boolean} if request properties match */ export const matchRequestProps = (source, propsToMatch, requestData) => { if (propsToMatch === '' || propsToMatch === '*') { diff --git a/src/helpers/match-stack.js b/src/helpers/match-stack.js index 457e0ce8..8a713f4a 100644 --- a/src/helpers/match-stack.js +++ b/src/helpers/match-stack.js @@ -5,9 +5,10 @@ import { getNativeRegexpTest } from './regexp-utils'; /** * Checks if the stackTrace contains stackRegexp * https://github.com/AdguardTeam/Scriptlets/issues/82 + * * @param {string|undefined} stackMatch - input stack value to match * @param {string} stackTrace - script error stack trace - * @returns {boolean} + * @returns {boolean} if the stackTrace contains stackRegexp */ export const matchStackTrace = (stackMatch, stackTrace) => { if (!stackMatch || stackMatch === '') { diff --git a/src/helpers/noop-utils.js b/src/helpers/noop-utils.js index 68a15aa2..5e106b34 100644 --- a/src/helpers/noop-utils.js +++ b/src/helpers/noop-utils.js @@ -1,35 +1,42 @@ /** * Noop function - * @return {undefined} undefined + * + * @returns {undefined} undefined */ export const noopFunc = () => { }; /** - * Function return noopFunc - * @returns {Function} + * Function returns noopFunc + * + * @returns {Function} noopFunc */ export const noopCallbackFunc = () => noopFunc; /** * Function returns null - * @return {null} null + * + * @returns {null} null */ export const noopNull = () => null; /** * Function returns true - * @return {boolean} true + * + * @returns {boolean} true */ export const trueFunc = () => true; /** * Function returns false - * @return {boolean} false + * + * @returns {boolean} false */ export const falseFunc = () => false; /** * Function returns this + * + * @returns {this} this object */ export function noopThis() { return this; @@ -37,24 +44,28 @@ export function noopThis() { /** * Function returns empty string - * @return {string} empty string + * + * @returns {string} empty string */ export const noopStr = () => ''; /** * Function returns empty array - * @return {Array} empty array + * + * @returns {Array} empty array */ export const noopArray = () => []; /** * Function returns empty object - * @return {Object} empty object + * + * @returns {Object} empty object */ export const noopObject = () => ({}); /** * Function throws an error + * * @throws */ export const throwFunc = () => { @@ -63,13 +74,18 @@ export const throwFunc = () => { /** * Function returns Promise.reject() + * + * @returns {Promise} rejected Promise */ export const noopPromiseReject = () => Promise.reject(); // eslint-disable-line compat/compat /** - * Returns Promise object that is resolved value of response body - * @param {string} [url=''] value of response url to set on response object - * @param {string} [response='default'] value of response type to set on response object + * Returns Promise object that is resolved with specified props + * + * @param {string} [responseBody='{}'] value to set as responseBody + * @param {string} [responseUrl=''] value to set as responseUrl + * @param {string} [responseType='default'] value to set as responseType + * @returns {Promise|undefined} resolved Promise or undefined if Response interface is not available */ export const noopPromiseResolve = (responseBody = '{}', responseUrl = '', responseType = 'default') => { if (typeof Response === 'undefined') { diff --git a/src/helpers/number-utils.js b/src/helpers/number-utils.js index 72b50db7..3a6b9b0f 100644 --- a/src/helpers/number-utils.js +++ b/src/helpers/number-utils.js @@ -1,8 +1,9 @@ /** * Determines whether the passed value is NaN * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN - * @param {*} num - * @returns {boolean} + * + * @param {any} num arbitrary value + * @returns {boolean} if provided value is NaN */ export const nativeIsNaN = (num) => { // eslint-disable-next-line no-restricted-properties @@ -13,8 +14,9 @@ export const nativeIsNaN = (num) => { /** * Determines whether the passed value is a finite number * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite - * @param {*} num - * @returns {boolean} + * + * @param {any} num arbitrary value + * @returns {boolean} if provided value is finite */ export const nativeIsFinite = (num) => { // eslint-disable-next-line no-restricted-properties @@ -24,8 +26,9 @@ export const nativeIsFinite = (num) => { /** * Parses string for a number, if possible, otherwise returns null. - * @param {*} rawString - * @returns {number|null} + * + * @param {any} rawString arbitrary string + * @returns {number|null} number or null if string not parsable */ export const getNumberFromString = (rawString) => { const parsedDelay = parseInt(rawString, 10); @@ -38,9 +41,10 @@ export const getNumberFromString = (rawString) => { /** * Generate a random integer between two values, inclusive * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#getting_a_random_integer_between_two_values_inclusive - * @param {number} min - * @param {number} max - * @returns {number} + * + * @param {number} min range minimum + * @param {number} max range maximum + * @returns {number} random number */ export function getRandomIntInclusive(min, max) { min = Math.ceil(min); diff --git a/src/helpers/object-utils.js b/src/helpers/object-utils.js index 89a7a9b7..d8aa5973 100644 --- a/src/helpers/object-utils.js +++ b/src/helpers/object-utils.js @@ -2,7 +2,8 @@ * Converts object to array of pairs. * Object.entries() polyfill because it is not supported by IE * https://caniuse.com/?search=Object.entries - * @param {Object} object + * + * @param {Object} object arbitrary object * @returns {Array} array of pairs */ export const getObjectEntries = (object) => { @@ -16,8 +17,9 @@ export const getObjectEntries = (object) => { * Converts array of pairs to object. * Object.fromEntries() polyfill because it is not supported by IE * https://caniuse.com/?search=Object.fromEntries + * * @param {Array} entries - array of pairs - * @returns {Object} + * @returns {Object} result object */ export const getObjectFromEntries = (entries) => { const output = entries @@ -32,16 +34,18 @@ export const getObjectFromEntries = (entries) => { /** * Checks whether the obj is an empty object - * @param {Object} obj - * @returns {boolean} + * + * @param {Object} obj arbitrary object + * @returns {boolean} if object is empty */ export const isEmptyObject = (obj) => Object.keys(obj).length === 0 && !obj.prototype; /** - * Checks whether the obj is an empty object - * @param {Object} obj - * @param {string} prop - * @returns {Object|null} + * Safely retrieve property descriptor + * + * @param {Object} obj target object + * @param {string} prop target property + * @returns {object|null} descriptor or null if it's not available or non-configurable */ export const safeGetDescriptor = (obj, prop) => { const descriptor = Object.getOwnPropertyDescriptor(obj, prop); @@ -53,9 +57,10 @@ export const safeGetDescriptor = (obj, prop) => { /** * Set getter and setter to property if it's configurable + * * @param {Object} object target object with property * @param {string} property property name - * @param {PropertyDescriptor} descriptor contains getter and setter functions + * @param {Object} descriptor contains getter and setter functions * @returns {boolean} is operation successful */ export function setPropertyAccess(object, property, descriptor) { diff --git a/src/helpers/observer.js b/src/helpers/observer.js index a8f4d129..fea1dc9a 100644 --- a/src/helpers/observer.js +++ b/src/helpers/observer.js @@ -2,8 +2,10 @@ import { throttle } from './throttle'; /** * DOM tree changes observer. Used for 'remove-attr' and 'remove-class' scriptlets - * @param {Function} callback - * @param {boolean} observeAttrs - optional parameter - should observer check attributes changes + * + * @param {Function} callback function to call on each mutation + * @param {boolean} [observeAttrs] if observer should observe attributes changes + * @param {Array} [attrsToObserve] list of attributes to observe */ export const observeDOMChanges = (callback, observeAttrs = false, attrsToObserve = []) => { /** @@ -35,6 +37,11 @@ export const observeDOMChanges = (callback, observeAttrs = false, attrsToObserve const disconnect = () => { observer.disconnect(); }; + + /** + * Callback wrapper to prevent loops + * when callback tinkers with attributes + */ function callbackWrapper() { disconnect(); callback(); diff --git a/src/helpers/open-shadow-dom-utils.js b/src/helpers/open-shadow-dom-utils.js index 8793a2fb..83797a9a 100644 --- a/src/helpers/open-shadow-dom-utils.js +++ b/src/helpers/open-shadow-dom-utils.js @@ -2,7 +2,8 @@ import { flatten } from './array-utils'; /** * Finds shadow-dom host (elements with shadowRoot property) in DOM of rootElement. - * @param {HTMLElement} rootElement + * + * @param {HTMLElement} rootElement shadow dom root * @returns {HTMLElement[]} shadow-dom hosts */ export const findHostElements = (rootElement) => { @@ -37,9 +38,10 @@ export const findHostElements = (rootElement) => { * Pierces open shadow-dom in order to find: * - elements by 'selector' matching * - inner shadow-dom hosts - * @param {string} selector - * @param {HTMLElement[]|external:NodeList} hostElements - * @returns {PierceData} + * + * @param {string} selector DOM elements selector + * @param {HTMLElement[]|external:NodeList} hostElements shadow-dom hosts + * @returns {PierceData} object with found elements and shadow-dom hosts */ export const pierceShadowDom = (selector, hostElements) => { let targets = []; diff --git a/src/helpers/parse-flags.js b/src/helpers/parse-flags.js index d28226f5..5c679f1a 100644 --- a/src/helpers/parse-flags.js +++ b/src/helpers/parse-flags.js @@ -1,7 +1,17 @@ +/** + * @typedef {Object} FlagsData object that holds info about valid flags + * and provides method for easy access + * @property {string} ASAP asap flag string + * @property {string} COMPLETE complete flag string + * @property {string} STAY stay flag string + * @property {Function} hasFlag to check if given flag is present + */ + /** * Behaviour flags string parser + * * @param {string} flags required, 'applying' argument string - * @return {Object} + * @returns {FlagsData} object with parsed flags */ export const parseFlags = (flags) => { const FLAGS_DIVIDER = ' '; diff --git a/src/helpers/parse-keyword-value.js b/src/helpers/parse-keyword-value.js index 3e0ee557..e7faecf9 100644 --- a/src/helpers/parse-keyword-value.js +++ b/src/helpers/parse-keyword-value.js @@ -6,8 +6,8 @@ * - '$now$' - returns current time in ms, e.g 1667915146503 * - '$currentDate$' - returns current date e.g 'Tue Nov 08 2022 13:53:19 GMT+0300' * - * @param {string} rawValue - * @returns {string} + * @param {string} rawValue keyword + * @returns {string} parsed value */ export const parseKeywordValue = (rawValue) => { const NOW_VALUE_KEYWORD = '$now$'; diff --git a/src/helpers/parse-rule.js b/src/helpers/parse-rule.js index 3ca15544..809a8810 100644 --- a/src/helpers/parse-rule.js +++ b/src/helpers/parse-rule.js @@ -1,9 +1,11 @@ /** * Iterate over iterable argument and evaluate current state with transitions - * @param {string} init first transition name - * @param {Array|Collection|string} iterable + * + * @param {Array|string} iterable rule or list or rules * @param {Object} transitions transtion functions + * @param {string} init first transition name * @param {any} args arguments which should be passed to transition functions + * @returns {string} state */ function iterateWithTransitions(iterable, transitions, init, args) { let state = init || Object.keys(transitions)[0]; @@ -20,6 +22,8 @@ export const ADG_SCRIPTLET_MASK = '#//scriptlet'; /** * Helper to accumulate an array of strings char by char + * + * @returns {Object} object with helper methods */ const wordSaver = () => { let str = ''; @@ -47,8 +51,10 @@ const substringAfter = (str, separator) => { /** * Parse and validate scriptlet rule - * @param {*} ruleText - * @returns {{name: string, args: Array}} + * + * @param {string} ruleText rule string + * @returns {{name: string, args: Array}} parsed rule + * @throws */ export const parseRule = (ruleText) => { ruleText = substringAfter(ruleText, ADG_SCRIPTLET_MASK); @@ -63,10 +69,13 @@ export const parseRule = (ruleText) => { /** * Transition function: the current index position in start, end or between params - * @param {string} rule - * @param {number} index - * @param {Object} Object - * @property {Object} Object.sep contains prop symb with current separator char + * + * @param {string} rule rule string + * @param {number} index index + * @param {Object} Object helper object + * @param {Object} Object.sep contains prop symb with current separator char + * @throws {string} throws if given rule is not a scriptlet + * @returns {string} transition */ const opened = (rule, index, { sep }) => { const char = rule[index]; @@ -99,11 +108,13 @@ export const parseRule = (ruleText) => { }; /** * Transition function: the current index position inside param - * @param {string} rule - * @param {number} index - * @param {Object} Object - * @property {Object} Object.sep contains prop `symb` with current separator char - * @property {Object} Object.saver helper which allow to save strings by car by char + * + * @param {string} rule rule string + * @param {number} index index + * @param {Object} Object helper object + * @param {Object} Object.sep contains prop `symb` with current separator char + * @param {Object} Object.saver helper which allow to save strings by car by char + * @returns {void} */ const param = (rule, index, { saver, sep }) => { const char = rule[index]; diff --git a/src/helpers/prevent-utils.js b/src/helpers/prevent-utils.js index e9327080..d08d3a1d 100644 --- a/src/helpers/prevent-utils.js +++ b/src/helpers/prevent-utils.js @@ -8,8 +8,9 @@ import { nativeIsNaN } from './number-utils'; /** * Checks whether the passed arg is proper callback - * @param {*} callback - * @returns {boolean} + * + * @param {any} callback arbitrary callback + * @returns {boolean} if callback is valid */ export const isValidCallback = (callback) => { return callback instanceof Function @@ -23,7 +24,8 @@ export const isValidCallback = (callback) => { * Parses delay argument of setTimeout / setInterval methods into * rounded down number for number/string values or passes on for other types. * Needed for prevent-setTimeout and prevent-setInterval - * @param {any} delay + * + * @param {any} delay native method delay arg * @returns {any} number as parsed delay or any input type if `delay` is not parsable */ export const parseRawDelay = (delay) => { @@ -35,8 +37,13 @@ export const parseRawDelay = (delay) => { * Checks whether 'callback' and 'delay' are matching * by given parameters 'matchCallback' and 'matchDelay'. * Used for prevent-setTimeout and prevent-setInterval. - * @param {Object} { callback, delay, matchCallback, matchDelay } - * @returns {boolean} + * + * @param {Object} preventData set of data to determine if scriptlet should match + * @param {Function} preventData.callback method's callback arg + * @param {any} preventData.delay method's delay arg + * @param {string} preventData.matchCallback scriptlets's callback arg + * @param {string} preventData.matchDelay scriptlets's delay arg + * @returns {boolean} if scriptlet should match */ export const isPreventionNeeded = ({ callback, diff --git a/src/helpers/random-id.js b/src/helpers/random-id.js index 288d7339..291e634c 100644 --- a/src/helpers/random-id.js +++ b/src/helpers/random-id.js @@ -1,5 +1,7 @@ /** * Generate random seven symbols id + * + * @returns {string} randomized id */ export function randomId() { return Math.random().toString(36).slice(2, 9); diff --git a/src/helpers/request-utils.js b/src/helpers/request-utils.js index 777892e9..240d34d1 100644 --- a/src/helpers/request-utils.js +++ b/src/helpers/request-utils.js @@ -4,7 +4,8 @@ import { getObjectFromEntries } from './object-utils'; /** * Returns array of request props that are supported by fetch/xhr scriptlets. * Includes common 'url' and 'method' props and all other fetch-specific props - * @returns {string[]} + * + * @returns {string[]} list of request props */ export const getRequestProps = () => [ 'url', @@ -24,7 +25,8 @@ export const getRequestProps = () => [ /** * Collects Request options to object - * @param {Request} request + * + * @param {Request} request Request instance to collect properties from * @returns {Object} data object */ export const getRequestData = (request) => { @@ -40,7 +42,8 @@ export const getRequestData = (request) => { /** * Collects fetch args to object - * @param {*} args fetch args + * + * @param {any} args fetch args * @returns {Object} data object */ export const getFetchData = (args) => { @@ -70,12 +73,13 @@ export const getFetchData = (args) => { /** * Collect xhr.open arguments to object - * @param {string} method - * @param {string} url - * @param {string} async - * @param {string} user - * @param {string} password - * @returns {Object} + * + * @param {string} method request method + * @param {string} url request url + * @param {string} async request async prop + * @param {string} user request user prop + * @param {string} password request password prop + * @returns {Object} aggregated request data */ export const getXhrData = (method, url, async, user, password) => { return { @@ -90,7 +94,8 @@ export const getXhrData = (method, url, async, user, password) => { /** * Parse propsToMatch input string into object; * used for prevent-fetch and prevent-xhr - * @param {string} propsToMatchStr + * + * @param {string} propsToMatchStr string of space-separated request properties to match * @returns {Object} object where 'key' is prop name and 'value' is prop value */ export const parseMatchProps = (propsToMatchStr) => { @@ -123,8 +128,9 @@ export const parseMatchProps = (propsToMatchStr) => { /** * Validates parsed data values - * @param {Object} data - * @returns {boolean} + * + * @param {Object} data request data + * @returns {boolean} if data is valid */ export const validateParsedData = (data) => { return Object.values(data) @@ -133,8 +139,9 @@ export const validateParsedData = (data) => { /** * Converts valid parsed data to data obj for further matching - * @param {Object} data - * @returns {Object} + * + * @param {Object} data parsed request data + * @returns {Object} data obj ready for matching */ export const getMatchPropsData = (data) => { const matchData = {}; diff --git a/src/helpers/script-source-utils.js b/src/helpers/script-source-utils.js index 740659da..c3ff4078 100644 --- a/src/helpers/script-source-utils.js +++ b/src/helpers/script-source-utils.js @@ -4,9 +4,10 @@ import { startsWith } from './string-utils'; * Determines if type of script is inline or injected * and when it's one of them then return true, otherwise false * https://github.com/AdguardTeam/Scriptlets/issues/201 + * * @param {string|undefined} stackMatch - input stack value to match * @param {string} stackTrace - script error stack trace - * @returns {boolean} + * @returns {boolean} if stacks match */ export const shouldAbortInlineOrInjectedScript = (stackMatch, stackTrace) => { const INLINE_SCRIPT_STRING = 'inlineScript'; diff --git a/src/helpers/storage-utils.js b/src/helpers/storage-utils.js index 9865a635..acdb3e36 100644 --- a/src/helpers/storage-utils.js +++ b/src/helpers/storage-utils.js @@ -1,17 +1,13 @@ import { nativeIsNaN } from './number-utils'; import { logMessage } from './log-message'; -/** - * @typedef { import('../scriptlets/index').Source } Source - */ - /** * Sets item to a specified storage, if storage isn't full. - * @param {Source} source + * + * @param {Object} source scriptlet's configuration * @param {Storage} storage storage instance to set item into - * @param {string} key - * @param {string} value - * @param {boolean} shouldLog determines if helper should log on a failed set attempt + * @param {string} key storage key + * @param {string} value staroge value */ export const setStorageItem = (source, storage, key, value) => { // setItem() may throw an exception if the storage is full. @@ -25,6 +21,7 @@ export const setStorageItem = (source, storage, key, value) => { /** * Gets supported storage item value + * * @param {string} value input item value * @returns {string|null|undefined|boolean} valid item value if ok OR null if not */ diff --git a/src/helpers/string-utils.js b/src/helpers/string-utils.js index 892ef3c4..2763bd09 100644 --- a/src/helpers/string-utils.js +++ b/src/helpers/string-utils.js @@ -8,29 +8,33 @@ import { /** * String.prototype.replaceAll polyfill + * * @param {string} input input string * @param {string} substr to look for * @param {string} newSubstr replacement - * @returns {string} + * @returns {string} result string */ export const replaceAll = (input, substr, newSubstr) => input.split(substr).join(newSubstr); /** * Escapes special chars in string - * @param {string} str - * @returns {string} + * + * @param {string} str raw string + * @returns {string} string with escaped special characters */ export const escapeRegExp = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); /** * A literal string or regexp pattern wrapped in forward slashes. * For example, 'simpleStr' or '/adblock|_0x/'. + * * @typedef {string} RawStrPattern */ /** * Converts string to the regexp * TODO think about nested dependencies, but be careful with dependency loops + * * @param {RawStrPattern} [input=''] literal string or regexp pattern; defaults to '' (empty string) * @returns {RegExp} regular expression; defaults to /.?/ * @throws {SyntaxError} Throw an error for invalid regex pattern @@ -50,8 +54,9 @@ export const toRegExp = (input = '') => { /** * Checks whether the input string can be converted to regexp + * * @param {RawStrPattern} input literal string or regexp pattern - * @returns {boolean} + * @returns {boolean} if input can be converted to regexp */ export const isValidStrPattern = (input) => { const FORWARD_SLASH = '/'; @@ -72,8 +77,10 @@ export const isValidStrPattern = (input) => { /** * Get string before regexp first match - * @param {string} str - * @param {RegExp} rx + * + * @param {string} str input string + * @param {RegExp} rx find pattern + * @returns {string} result string */ export const getBeforeRegExp = (str, rx) => { const index = str.search(rx); @@ -82,9 +89,10 @@ export const getBeforeRegExp = (str, rx) => { /** * Checks whether the string starts with the substring + * * @param {string} str full string * @param {string} prefix substring - * @returns {boolean} + * @returns {boolean} if string start with the substring */ export const startsWith = (str, prefix) => { // if str === '', (str && false) will return '' @@ -94,9 +102,10 @@ export const startsWith = (str, prefix) => { /** * Checks whether the string ends with the substring + * * @param {string} str full string * @param {string} ending substring - * @returns {boolean} + * @returns {boolean} string ends with the substring */ export const endsWith = (str, ending) => { // if str === '', (str && false) will return '' @@ -122,7 +131,9 @@ export const substringBefore = (str, separator) => { /** * Wrap str in single quotes and replaces single quotes to double one - * @param {string} str + * + * @param {string} str input string + * @returns {string} string with swapped quotes */ export const wrapInSingleQuotes = (str) => { if ((str[0] === '\'' && str[str.length - 1] === '\'') @@ -137,7 +148,9 @@ export const wrapInSingleQuotes = (str) => { /** * Returns substring enclosed in the widest braces - * @param {string} str + * + * @param {string} str input string + * @returns {string} substring */ export const getStringInBraces = (str) => { const firstIndex = str.indexOf('('); @@ -147,9 +160,10 @@ export const getStringInBraces = (str) => { /** * Prepares RTCPeerConnection config as string for proper logging - * @param {*} config + * + * @param {any} config RTC config * @returns {string} stringified config -*/ + */ export const convertRtcConfigToString = (config) => { const UNDEF_STR = 'undefined'; let str = UNDEF_STR; @@ -178,8 +192,9 @@ export const convertRtcConfigToString = (config) => { /** * Checks whether the match input string can be converted to regexp, * used for match inputs with possible negation + * * @param {string} match literal string or regexp pattern - * @returns {boolean} + * @returns {boolean} true if input can be converted to regexp */ export const isValidMatchStr = (match) => { const INVERT_MARKER = '!'; @@ -193,8 +208,9 @@ export const isValidMatchStr = (match) => { /** * Validates the match input number, * used for match inputs with possible negation + * * @param {string} match string of match number - * @returns {boolean} + * @returns {boolean} if match number is valid */ export const isValidMatchNumber = (match) => { const INVERT_MARKER = '!'; @@ -208,16 +224,17 @@ export const isValidMatchNumber = (match) => { /** * @typedef {Object} MatchData - * @property {boolean} isInvertedMatch - * @property {RegExp} matchRegexp + * @property {boolean} isInvertedMatch if matching should be inverted + * @property {RegExp} matchRegexp match value parsed into regex */ /** * Parses match arg with possible negation for no matching. * Needed for prevent-setTimeout, prevent-setInterval, * prevent-requestAnimationFrame and prevent-window-open - * @param {string} match - * @returns {MatchData} + * + * @param {string} match matching arg + * @returns {MatchData} data prepared for matching */ export const parseMatchArg = (match) => { const INVERT_MARKER = '!'; @@ -229,17 +246,16 @@ export const parseMatchArg = (match) => { /** * @typedef {Object} DelayData - * @property {boolean} isInvertedDelayMatch - * @property {number|null} delayMatch + * @property {boolean} isInvertedDelayMatch if matching should be inverted + * @property {number|null} delayMatch parsed delay or null if delay is invalid */ /** * Parses delay arg with possible negation for no matching. * Needed for prevent-setTimeout and prevent-setInterval - * @param {string} delay - * @returns {DelayData} `{ isInvertedDelayMatch, delayMatch }` where: - * `isInvertedDelayMatch` is boolean, - * `delayMatch` is number OR null for invalid `delay` + * + * @param {string} delay scriptlet's delay arg + * @returns {DelayData} parsed delay data */ export const parseDelayArg = (delay) => { const INVERT_MARKER = '!'; @@ -252,8 +268,9 @@ export const parseDelayArg = (delay) => { /** * Converts object to string for logging + * * @param {Object} obj data object - * @returns {string} + * @returns {string} object's string representation */ export const objectToString = (obj) => { return isEmptyObject(obj) @@ -273,8 +290,9 @@ export const objectToString = (obj) => { /** * Converts types into a string - * @param {*} value - * @returns {string} + * + * @param {any} value input value type + * @returns {string} type's string representation */ export const convertTypeToString = (value) => { let output; @@ -295,8 +313,9 @@ export const convertTypeToString = (value) => { /** * Generate a random string, a length of the string is provided as an argument - * @param {number} length - * @returns {string} + * + * @param {number} length output's length + * @returns {string} random string */ export function getRandomStrByLength(length) { let result = ''; @@ -310,7 +329,8 @@ export function getRandomStrByLength(length) { /** * Generate a random string - * @param {string} customResponseText + * + * @param {string} customResponseText response text to include in output * @returns {string|null} random string or null if passed argument is invalid */ export function generateRandomResponse(customResponseText) { diff --git a/src/helpers/throttle.js b/src/helpers/throttle.js index 45537d12..419c39ea 100644 --- a/src/helpers/throttle.js +++ b/src/helpers/throttle.js @@ -1,8 +1,10 @@ /** * Returns a wrapper, passing the call to 'method' at maximum once per 'delay' milliseconds. * Those calls that fall into the "cooldown" period, are ignored - * @param {Function} method - * @param {Number} delay - milliseconds + * + * @param {Function} cb callback + * @param {number} delay - milliseconds + * @returns {Function} throttled callback */ export const throttle = (cb, delay) => { let wait = false; diff --git a/src/helpers/validator.js b/src/helpers/validator.js index e2faf489..30235b5f 100644 --- a/src/helpers/validator.js +++ b/src/helpers/validator.js @@ -18,8 +18,9 @@ const COMMENT_MARKER = '!'; /** * Checks if rule text is comment e.g. !!example.org##+js(set-constant.js, test, false) - * @param {string} rule - * @return {boolean} + * + * @param {string} rule rule text + * @returns {boolean} if rule text is comment */ const isComment = (rule) => startsWith(rule, COMMENT_MARKER); @@ -51,7 +52,9 @@ const ADG_CSS_MASK_REG = /#@?\$#.+?\s*\{.*\}\s*$/g; /** * Checks if the `rule` is AdGuard scriptlet rule + * * @param {string} rule - rule text + * @returns {boolean} if given rule is adg rule */ const isAdgScriptletRule = (rule) => { return ( @@ -62,7 +65,9 @@ const isAdgScriptletRule = (rule) => { /** * Checks if the `rule` is uBO scriptlet rule + * * @param {string} rule rule text + * @returns {boolean} if given rule is ubo rule */ const isUboScriptletRule = (rule) => { return ( @@ -77,7 +82,9 @@ const isUboScriptletRule = (rule) => { /** * Checks if the `rule` is AdBlock Plus snippet + * * @param {string} rule rule text + * @returns {boolean} if given rule is abp rule */ const isAbpSnippetRule = (rule) => { return ( @@ -90,7 +97,9 @@ const isAbpSnippetRule = (rule) => { /** * Finds scriptlet by it's name + * * @param {string} name - scriptlet name + * @returns {Function} scriptlet function */ const getScriptletByName = (name) => { const scriptlets = Object.keys(scriptletsList).map((key) => scriptletsList[key]); @@ -107,7 +116,9 @@ const getScriptletByName = (name) => { /** * Checks if the scriptlet name is valid + * * @param {string} name - Scriptlet name + * @returns {boolean} if the scriptlet name is valid */ const isValidScriptletName = (name) => { if (!name) { @@ -260,14 +271,16 @@ const REDIRECT_RULE_TYPES = { /** * Parses redirect rule modifiers - * @param {string} rule - * @returns {Array} + * + * @param {string} rule rule text + * @returns {Array} list of rule modifiers */ const parseModifiers = (rule) => substringAfter(rule, '$').split(','); /** * Gets redirect resource name - * @param {string} rule + * + * @param {string} rule rule text * @param {string} marker - specific Adg/Ubo or Abp redirect resources marker * @returns {string} - redirect resource name */ @@ -281,7 +294,9 @@ const getRedirectName = (rule, marker) => { /** * Checks if the `rule` is AdGuard redirect rule. * Discards comments and JS rules and checks if the `rule` has 'redirect' modifier. + * * @param {string} rule - rule text + * @returns {boolean} if given rule is adg redirect */ const isAdgRedirectRule = (rule) => { const MARKER_IN_BASE_PART_MASK = '/((?!\\$|\\,).{1})redirect((-rule)?)=(.{0,}?)\\$(popup)?/'; @@ -300,8 +315,10 @@ const isAdgRedirectRule = (rule) => { /** * Checks if the `rule` satisfies the `type` + * * @param {string} rule - rule text * @param {'VALID_ADG'|'ADG'|'UBO'|'ABP'} type - type of a redirect rule + * @returns {boolean} if the `rule` satisfies the `type` */ const isRedirectRuleByType = (rule, type) => { const { @@ -340,37 +357,41 @@ const isRedirectRuleByType = (rule, type) => { }; /** -* Checks if the `rule` is **valid** AdGuard redirect resource rule -* @param {string} rule - rule text -* @returns {boolean} -*/ + * Checks if the `rule` is **valid** AdGuard redirect resource rule + * + * @param {string} rule - rule text + * @returns {boolean} if given rule is valid adg redirect + */ const isValidAdgRedirectRule = (rule) => { return isRedirectRuleByType(rule, 'VALID_ADG'); }; /** -* Checks if the AdGuard redirect `rule` has Ubo analog. Needed for Adg->Ubo conversion -* @param {string} rule - AdGuard rule text -* @returns {boolean} - true if the rule can be converted to Ubo -*/ + * Checks if the AdGuard redirect `rule` has Ubo analog. Needed for Adg->Ubo conversion + * + * @param {string} rule - AdGuard rule text + * @returns {boolean} - true if the rule can be converted to Ubo + */ const isAdgRedirectCompatibleWithUbo = (rule) => { return isAdgRedirectRule(rule) && isRedirectRuleByType(rule, 'ADG'); }; /** -* Checks if the Ubo redirect `rule` has AdGuard analog. Needed for Ubo->Adg conversion -* @param {string} rule - Ubo rule text -* @returns {boolean} - true if the rule can be converted to AdGuard -*/ + * Checks if the Ubo redirect `rule` has AdGuard analog. Needed for Ubo->Adg conversion + * + * @param {string} rule - Ubo rule text + * @returns {boolean} - true if the rule can be converted to AdGuard + */ const isUboRedirectCompatibleWithAdg = (rule) => { return isRedirectRuleByType(rule, 'UBO'); }; /** -* Checks if the Abp redirect `rule` has AdGuard analog. Needed for Abp->Adg conversion -* @param {string} rule - Abp rule text -* @returns {boolean} - true if the rule can be converted to AdGuard -*/ + * Checks if the Abp redirect `rule` has AdGuard analog. Needed for Abp->Adg conversion + * + * @param {string} rule - Abp rule text + * @returns {boolean} - true if the rule can be converted to AdGuard + */ const isAbpRedirectCompatibleWithAdg = (rule) => { return isRedirectRuleByType(rule, 'ABP'); }; @@ -388,8 +409,8 @@ const isAbpRedirectCompatibleWithAdg = (rule) => { * $script,redirect=noopvast-2.0 * $xmlhttprequest,redirect=noopvast-2.0 * - * @param {string} rule - * @returns {boolean} + * @param {string} rule rule text + * @returns {boolean} if the rule has specified content type before conversion */ const hasValidContentType = (rule) => { const ruleModifiers = parseModifiers(rule); diff --git a/src/redirects/amazon-apstag.js b/src/redirects/amazon-apstag.js index 5c384772..959dca69 100644 --- a/src/redirects/amazon-apstag.js +++ b/src/redirects/amazon-apstag.js @@ -2,7 +2,6 @@ import { hit, noopFunc } from '../helpers/index'; /** * @redirect amazon-apstag - * * @description * Mocks Amazon's apstag.js * diff --git a/src/redirects/ati-smarttag.js b/src/redirects/ati-smarttag.js index 03461313..e4de22a1 100644 --- a/src/redirects/ati-smarttag.js +++ b/src/redirects/ati-smarttag.js @@ -2,7 +2,6 @@ import { hit, noopFunc } from '../helpers/index'; /** * @redirect ati-smarttag - * * @description * Mocks AT Internat SmartTag. * https://developers.atinternet-solutions.com/as2-tagging-en/javascript-en/getting-started-javascript-en/tracker-initialisation-javascript-en/ diff --git a/src/redirects/blocking-redirects/click2load.js b/src/redirects/blocking-redirects/click2load.js index 8bff8d06..e0f19f7b 100644 --- a/src/redirects/blocking-redirects/click2load.js +++ b/src/redirects/blocking-redirects/click2load.js @@ -27,6 +27,7 @@ function clickToLoad() { * Some browsers does not support URL.searchParams.get() * but we need script run with no error * because frame will be shown anyway if click2load redirect rule used + * * @param {string} rawQueryStr * @returns {Object} key is parameter name and value is parameter value */ @@ -123,6 +124,7 @@ function clickToLoad() { /** * Returns translations data for navigator.language * or 'en' if navigator.language is not supported + * * @returns {Object} data for one locale with 'title' and 'button' keys */ const getTranslations = () => { @@ -150,6 +152,7 @@ function clickToLoad() { /** * Prepares frame url to replace on button click + * * @param {string} originUrl passed origin frame url * @param {string} unblockTokenName param name for further validation * @param {string} unblockTokenValue param value for further validation @@ -215,6 +218,7 @@ function clickToLoad() { /** * Checks whether the rule has 'frame' or 'subdocument' modifier + * * @param {string} rule blocking rules passed into redirect * @returns {boolean} */ @@ -231,6 +235,7 @@ function clickToLoad() { }; /** * Checks whether script runs inside a frame + * * @returns {boolean} */ const isInsideFrame = () => window.self !== window.top; diff --git a/src/redirects/didomi-loader.js b/src/redirects/didomi-loader.js index ba364b46..06b28f13 100644 --- a/src/redirects/didomi-loader.js +++ b/src/redirects/didomi-loader.js @@ -9,7 +9,6 @@ import { /** * @redirect didomi-loader - * * @description * Mocks Didomi's CMP loader script. * https://developers.didomi.io/ diff --git a/src/redirects/fingerprintjs2.js b/src/redirects/fingerprintjs2.js index 9e93f9d8..a3f04a8d 100644 --- a/src/redirects/fingerprintjs2.js +++ b/src/redirects/fingerprintjs2.js @@ -3,7 +3,6 @@ import { hit } from '../helpers/index'; /** * @redirect fingerprintjs2 - * * @description * Mocks FingerprintJS v2 * https://github.com/fingerprintjs diff --git a/src/redirects/fingerprintjs3.js b/src/redirects/fingerprintjs3.js index 6f08ca5f..af1d22b5 100644 --- a/src/redirects/fingerprintjs3.js +++ b/src/redirects/fingerprintjs3.js @@ -6,7 +6,6 @@ import { /** * @redirect fingerprintjs3 - * * @description * Mocks FingerprintJS v3 * https://github.com/fingerprintjs diff --git a/src/redirects/gemius.js b/src/redirects/gemius.js index 8059a203..cfaf6284 100644 --- a/src/redirects/gemius.js +++ b/src/redirects/gemius.js @@ -3,7 +3,6 @@ import { hit, noopFunc } from '../helpers/index'; /** * @redirect gemius - * * @description * Mocks Gemius Analytics. * https://flowplayer.com/developers/plugins/gemius diff --git a/src/redirects/google-analytics-ga.js b/src/redirects/google-analytics-ga.js index 559dc542..9e86a66b 100644 --- a/src/redirects/google-analytics-ga.js +++ b/src/redirects/google-analytics-ga.js @@ -7,7 +7,6 @@ import { /** * @redirect google-analytics-ga - * * @description * Mocks old Google Analytics API. * diff --git a/src/redirects/google-analytics.js b/src/redirects/google-analytics.js index 4744cea0..e42214d9 100644 --- a/src/redirects/google-analytics.js +++ b/src/redirects/google-analytics.js @@ -7,7 +7,6 @@ import { /** * @redirect google-analytics - * * @description * Mocks Google's Analytics and Tag Manager APIs. * [Covers obsolete googletagmanager-gtm redirect functionality](https://github.com/AdguardTeam/Scriptlets/issues/127). @@ -78,9 +77,9 @@ export function GoogleAnalytics(source) { /** * checks data object and delays callback - * @param {Object|Array} data gtag payload + * + * @param {object|Array} dataObj gtag payload * @param {string} funcName callback prop name - * @returns */ const handleCallback = (dataObj, funcName) => { if (dataObj && typeof dataObj[funcName] === 'function') { @@ -111,7 +110,8 @@ export function GoogleAnalytics(source) { } // https://github.com/AdguardTeam/Scriptlets/issues/81 - if (google_optimize instanceof Object && typeof google_optimize.get === 'function') { // eslint-disable-line camelcase + // eslint-disable-next-line camelcase + if (google_optimize instanceof Object && typeof google_optimize.get === 'function') { const googleOptimizeWrapper = { get: noopFunc, }; diff --git a/src/redirects/google-ima3.js b/src/redirects/google-ima3.js index 90b06e1f..807bbb79 100644 --- a/src/redirects/google-ima3.js +++ b/src/redirects/google-ima3.js @@ -7,7 +7,6 @@ import { /** * @redirect google-ima3 - * * @description * Mocks the IMA SDK of Google. * diff --git a/src/redirects/googlesyndication-adsbygoogle.js b/src/redirects/googlesyndication-adsbygoogle.js index d65b7243..80832f5a 100644 --- a/src/redirects/googlesyndication-adsbygoogle.js +++ b/src/redirects/googlesyndication-adsbygoogle.js @@ -3,7 +3,6 @@ import { hit } from '../helpers/index'; /* eslint-disable max-len */ /** * @redirect googlesyndication-adsbygoogle - * * @description * Mocks Google AdSense API. * diff --git a/src/redirects/googletagservices-gpt.js b/src/redirects/googletagservices-gpt.js index 6d04c10e..3dca77a8 100644 --- a/src/redirects/googletagservices-gpt.js +++ b/src/redirects/googletagservices-gpt.js @@ -11,7 +11,6 @@ import { /** * @redirect googletagservices-gpt - * * @description * Mocks Google Publisher Tag API. * diff --git a/src/redirects/index.js b/src/redirects/index.js index bd8a36b6..6b9b8244 100644 --- a/src/redirects/index.js +++ b/src/redirects/index.js @@ -22,7 +22,9 @@ import { redirectsMap } from '../../tmp/redirects-map'; /** * Finds redirect resource by it's name + * * @param {string} name - redirect name + * @returns {Function} */ const getRedirectByName = (name) => { const redirects = Object.keys(redirectsList).map((key) => redirectsList[key]); @@ -40,6 +42,7 @@ const getRedirectByName = (name) => { /** * Returns redirect code by param + * * @param {Source} source * @returns {string} redirect code */ diff --git a/src/redirects/matomo.js b/src/redirects/matomo.js index 24424124..8bcf2f21 100644 --- a/src/redirects/matomo.js +++ b/src/redirects/matomo.js @@ -3,7 +3,6 @@ import { hit, noopFunc } from '../helpers/index'; /** * @redirect matomo - * * @description * Mocks the piwik.js file of Matomo (formerly Piwik). * diff --git a/src/redirects/metrika-yandex-tag.js b/src/redirects/metrika-yandex-tag.js index 068551c3..a432926b 100644 --- a/src/redirects/metrika-yandex-tag.js +++ b/src/redirects/metrika-yandex-tag.js @@ -2,7 +2,6 @@ import { hit, noopFunc } from '../helpers/index'; /** * @redirect metrika-yandex-tag - * * @description * Mocks Yandex Metrika API. * https://yandex.ru/support/metrica/objects/method-reference.html @@ -39,6 +38,8 @@ export function metrikaYandexTag(source) { /** * https://yandex.ru/support/metrica/objects/get-client-id.html + * + * @param {string} id * @param {Function} cb */ const getClientID = (id, cb) => { @@ -65,6 +66,8 @@ export function metrikaYandexTag(source) { /** * https://yandex.ru/support/metrica/objects/reachgoal.html + * + * @param {string} id * @param {string} target * @param {Object} params * @param {Function} callback diff --git a/src/redirects/metrika-yandex-watch.js b/src/redirects/metrika-yandex-watch.js index 048ba89b..f2646de7 100644 --- a/src/redirects/metrika-yandex-watch.js +++ b/src/redirects/metrika-yandex-watch.js @@ -2,7 +2,6 @@ import { hit, noopFunc, noopArray } from '../helpers/index'; /** * @redirect metrika-yandex-watch - * * @description * Mocks the old Yandex Metrika API. * https://yandex.ru/support/metrica/objects/_method-reference.html @@ -17,6 +16,7 @@ export function metrikaYandexWatch(source) { /** * Gets callback and its context from options and call it in async way + * * @param {Object} options Yandex Metrika API options */ const asyncCallbackFromOptions = (options = {}) => { diff --git a/src/redirects/naver-wcslog.js b/src/redirects/naver-wcslog.js index 8b93b211..e84f0f11 100644 --- a/src/redirects/naver-wcslog.js +++ b/src/redirects/naver-wcslog.js @@ -3,7 +3,6 @@ import { hit, noopFunc } from '../helpers/index'; /** * @redirect naver-wcslog - * * @description * Mocks wcslog.js of Naver Analytics. * diff --git a/src/redirects/noeval.js b/src/redirects/noeval.js index 7754392a..698f4642 100644 --- a/src/redirects/noeval.js +++ b/src/redirects/noeval.js @@ -2,7 +2,6 @@ import { noeval } from '../scriptlets/noeval'; /** * @redirect noeval - * * @description * Redirects request to the source which sets static properties to PopAds and popns objects. * diff --git a/src/redirects/pardot-1.0.js b/src/redirects/pardot-1.0.js index eb2d312b..e23f1904 100644 --- a/src/redirects/pardot-1.0.js +++ b/src/redirects/pardot-1.0.js @@ -8,7 +8,6 @@ import { /** * @redirect pardot-1.0 - * * @description * Mocks the pd.js file of Salesforce. * https://pi.pardot.com/pd.js diff --git a/src/redirects/prebid-ads.js b/src/redirects/prebid-ads.js index 18a209bc..ff4fccc7 100644 --- a/src/redirects/prebid-ads.js +++ b/src/redirects/prebid-ads.js @@ -3,7 +3,6 @@ import { hit } from '../helpers/index'; /** * @redirect prebid-ads - * * @description * Sets predefined constants on a page: * - `canRunAds`: `true` diff --git a/src/redirects/prebid.js b/src/redirects/prebid.js index c5a8198a..77356c57 100644 --- a/src/redirects/prebid.js +++ b/src/redirects/prebid.js @@ -8,7 +8,6 @@ import { /** * @redirect prebid - * * @description * Mocks the prebid.js header bidding suit. * https://docs.prebid.org/ diff --git a/src/redirects/prevent-bab.js b/src/redirects/prevent-bab.js index 56f36928..bbf4feef 100644 --- a/src/redirects/prevent-bab.js +++ b/src/redirects/prevent-bab.js @@ -2,7 +2,6 @@ import { preventBab as preventBabScriptlet } from '../scriptlets/prevent-bab'; /** * @redirect prevent-bab - * * @description * Prevents BlockAdblock script from detecting an ad blocker. * diff --git a/src/redirects/prevent-bab2.js b/src/redirects/prevent-bab2.js index 28fffe72..42dac9b2 100644 --- a/src/redirects/prevent-bab2.js +++ b/src/redirects/prevent-bab2.js @@ -3,7 +3,6 @@ import { hit } from '../helpers/index'; /** * @redirect prevent-bab2 - * * @description * Prevents BlockAdblock script from detecting an ad blocker. * diff --git a/src/redirects/prevent-fab-3.2.0.js b/src/redirects/prevent-fab-3.2.0.js index 503caf98..c4973295 100644 --- a/src/redirects/prevent-fab-3.2.0.js +++ b/src/redirects/prevent-fab-3.2.0.js @@ -2,7 +2,6 @@ import { preventFab } from '../scriptlets/prevent-fab-3.2.0'; /** * @redirect prevent-fab-3.2.0 - * * @description * Redirects fuckadblock script to the source js file. * diff --git a/src/redirects/prevent-popads-net.js b/src/redirects/prevent-popads-net.js index 187b5a3d..b0d2bb54 100644 --- a/src/redirects/prevent-popads-net.js +++ b/src/redirects/prevent-popads-net.js @@ -2,7 +2,6 @@ import { preventPopadsNet } from '../scriptlets/prevent-popads-net'; /** * @redirect prevent-popads-net - * * @description * Redirects request to the source which sets static properties to PopAds and popns objects. * diff --git a/src/redirects/redirects.js b/src/redirects/redirects.js index 91435155..5d90c806 100644 --- a/src/redirects/redirects.js +++ b/src/redirects/redirects.js @@ -9,20 +9,21 @@ import jsYaml from 'js-yaml'; * contentType: image/gif;base64 * content: R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== * } + * * @typedef {Object} Redirect - * @property {string} title - * @property {string} comment - * @property {string} content - * @property {string} contentType - * @property {string} file - * @property {boolean} [isBlocking] - * @property {string} [sha] + * @property {string} title resource name + * @property {string} comment resource description + * @property {string} content encoded resource content + * @property {string} contentType MIME type + * @property {boolean} [isBlocking] e.g click2load redirect + * @property {string} [sha] hash */ class Redirects { /** * Converts rawYaml into JS object with sources titles used as keys - * @param rawYaml + * + * @param {string} rawYaml * @returns {Object} - return object with titles in the keys and RedirectSources * in the values */ @@ -44,8 +45,9 @@ class Redirects { /** * Returns redirect source object + * * @param {string} title - * @return {Redirect|undefined} Found redirect source object, or `undefined` if not found. + * @returns {Redirect|undefined} Found redirect source object, or `undefined` if not found. */ getRedirect(title) { if (Object.prototype.hasOwnProperty.call(this.redirects, title)) { @@ -66,8 +68,9 @@ class Redirects { /** * Checks if redirect is blocking like click2load.html + * * @param {string} title Title of the redirect. - * @returns True if redirect is blocking otherwise returns `false` even if redirect name is + * @returns {boolean} True if redirect is blocking otherwise returns `false` even if redirect name is * unknown. */ isBlocking(title) { diff --git a/src/redirects/scorecardresearch-beacon.js b/src/redirects/scorecardresearch-beacon.js index 318217de..9900706a 100644 --- a/src/redirects/scorecardresearch-beacon.js +++ b/src/redirects/scorecardresearch-beacon.js @@ -2,7 +2,6 @@ import { hit } from '../helpers/index'; /** * @redirect scorecardresearch-beacon - * * @description * Mocks Scorecard Research API. * diff --git a/src/redirects/set-popads-dummy.js b/src/redirects/set-popads-dummy.js index 9ccd9bfc..70af5001 100644 --- a/src/redirects/set-popads-dummy.js +++ b/src/redirects/set-popads-dummy.js @@ -2,7 +2,6 @@ import { setPopadsDummy } from '../scriptlets/set-popads-dummy'; /** * @redirect set-popads-dummy - * * @description * Redirects request to the source which sets static properties to PopAds and popns objects. * diff --git a/src/scriptlets/abort-current-inline-script.js b/src/scriptlets/abort-current-inline-script.js index 1c17f42e..c8092c56 100644 --- a/src/scriptlets/abort-current-inline-script.js +++ b/src/scriptlets/abort-current-inline-script.js @@ -16,7 +16,6 @@ import { /* eslint-disable max-len */ /** * @scriptlet abort-current-inline-script - * * @description * Aborts an inline script when it attempts to **read** or **write to** the specified property * AND when the contents of the `