Version in base suite: 1.37.0+dfsg-1~deb10u1
Base version: ublock-origin_1.37.0+dfsg-1~deb10u1
Target version: ublock-origin_1.42.0+dfsg-1~deb10u1
Base file: /srv/ftp-master.debian.org/ftp/pool/main/u/ublock-origin/ublock-origin_1.37.0+dfsg-1~deb10u1.dsc
Target file: /srv/ftp-master.debian.org/policy/pool/main/u/ublock-origin/ublock-origin_1.42.0+dfsg-1~deb10u1.dsc
/srv/release.debian.org/tmp/6shuIU8Ibw/ublock-origin-1.42.0+dfsg/platform/npm/tests/data/bundle.tgz |binary
/srv/release.debian.org/tmp/6shuIU8Ibw/ublock-origin-1.42.0+dfsg/src/js/wasm/hntrie.wasm |binary
/srv/release.debian.org/tmp/6shuIU8Ibw/ublock-origin-1.42.0+dfsg/src/lib/publicsuffixlist/wasm/publicsuffixlist.wasm |binary
ublock-origin-1.42.0+dfsg/.github/workflows/main.yml | 14
ublock-origin-1.42.0+dfsg/.gitmodules | 3
ublock-origin-1.42.0+dfsg/.jshintrc | 6
ublock-origin-1.42.0+dfsg/Makefile | 77
ublock-origin-1.42.0+dfsg/README.md | 30
ublock-origin-1.42.0+dfsg/assets/assets.json | 232
ublock-origin-1.42.0+dfsg/assets/resources/scriptlets.js | 234
ublock-origin-1.42.0+dfsg/debian/changelog | 35
ublock-origin-1.42.0+dfsg/debian/copyright | 8
ublock-origin-1.42.0+dfsg/debian/patches/disable-nonfree-filters-by-default.patch | 8
ublock-origin-1.42.0+dfsg/debian/patches/lz4-block-codec.wat.patch | 2544
ublock-origin-1.42.0+dfsg/debian/patches/make-assets.sh-for-Debian.patch | 44
ublock-origin-1.42.0+dfsg/debian/patches/python3.patch | 23
ublock-origin-1.42.0+dfsg/debian/patches/series | 3
ublock-origin-1.42.0+dfsg/debian/rules | 3
ublock-origin-1.42.0+dfsg/debian/watch | 2
ublock-origin-1.42.0+dfsg/dist/README.md | 23
ublock-origin-1.42.0+dfsg/dist/description/description-bn.txt | 4
ublock-origin-1.42.0+dfsg/dist/description/description-bs.txt | 34
ublock-origin-1.42.0+dfsg/dist/description/description-ja.txt | 6
ublock-origin-1.42.0+dfsg/dist/firefox/publish-signed-beta.py | 2
ublock-origin-1.42.0+dfsg/dist/firefox/updates.json | 6
ublock-origin-1.42.0+dfsg/dist/firefox/updates.template.json | 2
ublock-origin-1.42.0+dfsg/dist/version | 2
ublock-origin-1.42.0+dfsg/docs/tests/procedural-cosmetic-filters.html | 114
ublock-origin-1.42.0+dfsg/docs/tests/static-filtering-parser-checklist.txt | 2
ublock-origin-1.42.0+dfsg/platform/browser/main.js | 125
ublock-origin-1.42.0+dfsg/platform/browser/test.html | 71
ublock-origin-1.42.0+dfsg/platform/chromium/manifest.json | 8
ublock-origin-1.42.0+dfsg/platform/chromium/vapi-background-ext.js | 25
ublock-origin-1.42.0+dfsg/platform/chromium/webext.js | 8
ublock-origin-1.42.0+dfsg/platform/common/vapi-background.js | 230
ublock-origin-1.42.0+dfsg/platform/common/vapi-client.js | 14
ublock-origin-1.42.0+dfsg/platform/common/vapi-common.js | 67
ublock-origin-1.42.0+dfsg/platform/common/vapi.js | 5
ublock-origin-1.42.0+dfsg/platform/dig/package.json | 28
ublock-origin-1.42.0+dfsg/platform/dig/snfe.js | 392
ublock-origin-1.42.0+dfsg/platform/firefox/manifest.json | 8
ublock-origin-1.42.0+dfsg/platform/firefox/vapi-background-ext.js | 49
ublock-origin-1.42.0+dfsg/platform/firefox/webext.js | 2
ublock-origin-1.42.0+dfsg/platform/nodejs/README.md | 158
ublock-origin-1.42.0+dfsg/platform/nodejs/build.js | 34
ublock-origin-1.42.0+dfsg/platform/nodejs/index.js | 282
ublock-origin-1.42.0+dfsg/platform/npm/.eslintrc.json | 38
ublock-origin-1.42.0+dfsg/platform/npm/.npmignore | 5
ublock-origin-1.42.0+dfsg/platform/npm/package-lock.json | 1658
ublock-origin-1.42.0+dfsg/platform/npm/package.json | 44
ublock-origin-1.42.0+dfsg/platform/npm/test.js | 59
ublock-origin-1.42.0+dfsg/platform/npm/tests/.eslintrc.json | 5
ublock-origin-1.42.0+dfsg/platform/npm/tests/_common.js | 34
ublock-origin-1.42.0+dfsg/platform/npm/tests/leaks.js | 30
ublock-origin-1.42.0+dfsg/platform/npm/tests/request-data.js | 117
ublock-origin-1.42.0+dfsg/platform/npm/tests/snfe.js | 372
ublock-origin-1.42.0+dfsg/platform/npm/tests/wasm.js | 53
ublock-origin-1.42.0+dfsg/platform/opera/manifest.json | 8
ublock-origin-1.42.0+dfsg/platform/thunderbird/manifest.json | 5
ublock-origin-1.42.0+dfsg/src/1p-filters.html | 14
ublock-origin-1.42.0+dfsg/src/3p-filters.html | 21
ublock-origin-1.42.0+dfsg/src/_locales/ar/messages.json | 198
ublock-origin-1.42.0+dfsg/src/_locales/az/messages.json | 212
ublock-origin-1.42.0+dfsg/src/_locales/bg/messages.json | 216
ublock-origin-1.42.0+dfsg/src/_locales/bn/messages.json | 190
ublock-origin-1.42.0+dfsg/src/_locales/bs/messages.json | 266
ublock-origin-1.42.0+dfsg/src/_locales/ca/messages.json | 208
ublock-origin-1.42.0+dfsg/src/_locales/cs/messages.json | 198
ublock-origin-1.42.0+dfsg/src/_locales/cv/messages.json | 206
ublock-origin-1.42.0+dfsg/src/_locales/da/messages.json | 194
ublock-origin-1.42.0+dfsg/src/_locales/de/messages.json | 380
ublock-origin-1.42.0+dfsg/src/_locales/el/messages.json | 190
ublock-origin-1.42.0+dfsg/src/_locales/en/messages.json | 212
ublock-origin-1.42.0+dfsg/src/_locales/en_GB/messages.json | 210
ublock-origin-1.42.0+dfsg/src/_locales/eo/messages.json | 242
ublock-origin-1.42.0+dfsg/src/_locales/es/messages.json | 214
ublock-origin-1.42.0+dfsg/src/_locales/et/messages.json | 194
ublock-origin-1.42.0+dfsg/src/_locales/eu/messages.json | 204
ublock-origin-1.42.0+dfsg/src/_locales/fa/messages.json | 200
ublock-origin-1.42.0+dfsg/src/_locales/fi/messages.json | 496
ublock-origin-1.42.0+dfsg/src/_locales/fil/messages.json | 206
ublock-origin-1.42.0+dfsg/src/_locales/fr/messages.json | 204
ublock-origin-1.42.0+dfsg/src/_locales/fy/messages.json | 192
ublock-origin-1.42.0+dfsg/src/_locales/gl/messages.json | 192
ublock-origin-1.42.0+dfsg/src/_locales/he/messages.json | 194
ublock-origin-1.42.0+dfsg/src/_locales/hi/messages.json | 236
ublock-origin-1.42.0+dfsg/src/_locales/hr/messages.json | 212
ublock-origin-1.42.0+dfsg/src/_locales/hu/messages.json | 192
ublock-origin-1.42.0+dfsg/src/_locales/hy/messages.json | 196
ublock-origin-1.42.0+dfsg/src/_locales/id/messages.json | 196
ublock-origin-1.42.0+dfsg/src/_locales/it/messages.json | 196
ublock-origin-1.42.0+dfsg/src/_locales/ja/messages.json | 544
ublock-origin-1.42.0+dfsg/src/_locales/ka/messages.json | 190
ublock-origin-1.42.0+dfsg/src/_locales/kk/messages.json | 202
ublock-origin-1.42.0+dfsg/src/_locales/kn/messages.json | 208
ublock-origin-1.42.0+dfsg/src/_locales/ko/messages.json | 192
ublock-origin-1.42.0+dfsg/src/_locales/lt/messages.json | 196
ublock-origin-1.42.0+dfsg/src/_locales/lv/messages.json | 212
ublock-origin-1.42.0+dfsg/src/_locales/ml/messages.json | 202
ublock-origin-1.42.0+dfsg/src/_locales/mr/messages.json | 202
ublock-origin-1.42.0+dfsg/src/_locales/ms/messages.json | 204
ublock-origin-1.42.0+dfsg/src/_locales/nb/messages.json | 208
ublock-origin-1.42.0+dfsg/src/_locales/nl/messages.json | 224
ublock-origin-1.42.0+dfsg/src/_locales/oc/messages.json | 204
ublock-origin-1.42.0+dfsg/src/_locales/pl/messages.json | 218
ublock-origin-1.42.0+dfsg/src/_locales/pt_BR/messages.json | 208
ublock-origin-1.42.0+dfsg/src/_locales/pt_PT/messages.json | 208
ublock-origin-1.42.0+dfsg/src/_locales/ro/messages.json | 192
ublock-origin-1.42.0+dfsg/src/_locales/ru/messages.json | 198
ublock-origin-1.42.0+dfsg/src/_locales/sk/messages.json | 190
ublock-origin-1.42.0+dfsg/src/_locales/sl/messages.json | 190
ublock-origin-1.42.0+dfsg/src/_locales/so/messages.json | 1254
ublock-origin-1.42.0+dfsg/src/_locales/sq/messages.json | 238
ublock-origin-1.42.0+dfsg/src/_locales/sr/messages.json | 192
ublock-origin-1.42.0+dfsg/src/_locales/sv/messages.json | 242
ublock-origin-1.42.0+dfsg/src/_locales/ta/messages.json | 198
ublock-origin-1.42.0+dfsg/src/_locales/te/messages.json | 210
ublock-origin-1.42.0+dfsg/src/_locales/th/messages.json | 200
ublock-origin-1.42.0+dfsg/src/_locales/tr/messages.json | 226
ublock-origin-1.42.0+dfsg/src/_locales/uk/messages.json | 196
ublock-origin-1.42.0+dfsg/src/_locales/ur/messages.json | 202
ublock-origin-1.42.0+dfsg/src/_locales/vi/messages.json | 216
ublock-origin-1.42.0+dfsg/src/_locales/zh_CN/messages.json | 206
ublock-origin-1.42.0+dfsg/src/_locales/zh_TW/messages.json | 194
ublock-origin-1.42.0+dfsg/src/about.html | 16
ublock-origin-1.42.0+dfsg/src/advanced-settings.html | 3
ublock-origin-1.42.0+dfsg/src/asset-viewer.html | 12
ublock-origin-1.42.0+dfsg/src/background.html | 41
ublock-origin-1.42.0+dfsg/src/cloud-ui.html | 8
ublock-origin-1.42.0+dfsg/src/css/3p-filters.css | 46
ublock-origin-1.42.0+dfsg/src/css/about.css | 21
ublock-origin-1.42.0+dfsg/src/css/advanced-settings.css | 2
ublock-origin-1.42.0+dfsg/src/css/asset-viewer.css | 8
ublock-origin-1.42.0+dfsg/src/css/click2load.css | 3
ublock-origin-1.42.0+dfsg/src/css/cloud-ui.css | 19
ublock-origin-1.42.0+dfsg/src/css/codemirror.css | 104
ublock-origin-1.42.0+dfsg/src/css/common.css | 133
ublock-origin-1.42.0+dfsg/src/css/dashboard-common.css | 25
ublock-origin-1.42.0+dfsg/src/css/dashboard.css | 31
ublock-origin-1.42.0+dfsg/src/css/devtools.css | 22
ublock-origin-1.42.0+dfsg/src/css/document-blocked.css | 28
ublock-origin-1.42.0+dfsg/src/css/dyna-rules.css | 35
ublock-origin-1.42.0+dfsg/src/css/epicker-ui.css | 60
ublock-origin-1.42.0+dfsg/src/css/fa-icons.css | 3
ublock-origin-1.42.0+dfsg/src/css/fonts/Metropolis/README.md | 2
ublock-origin-1.42.0+dfsg/src/css/logger-ui-inspector.css | 8
ublock-origin-1.42.0+dfsg/src/css/logger-ui.css | 167
ublock-origin-1.42.0+dfsg/src/css/popup-fenix.css | 119
ublock-origin-1.42.0+dfsg/src/css/popup.css | 77
ublock-origin-1.42.0+dfsg/src/css/settings.css | 40
ublock-origin-1.42.0+dfsg/src/css/support.css | 71
ublock-origin-1.42.0+dfsg/src/css/themes/default.css | 765
ublock-origin-1.42.0+dfsg/src/dashboard.html | 27
ublock-origin-1.42.0+dfsg/src/devtools.html | 56
ublock-origin-1.42.0+dfsg/src/document-blocked.html | 12
ublock-origin-1.42.0+dfsg/src/dyna-rules.html | 23
ublock-origin-1.42.0+dfsg/src/img/fontawesome/fontawesome-defs.svg | 1
ublock-origin-1.42.0+dfsg/src/js/1p-filters.js | 4
ublock-origin-1.42.0+dfsg/src/js/3p-filters.js | 15
ublock-origin-1.42.0+dfsg/src/js/about.js | 24
ublock-origin-1.42.0+dfsg/src/js/asset-viewer.js | 4
ublock-origin-1.42.0+dfsg/src/js/assets.js | 107
ublock-origin-1.42.0+dfsg/src/js/background.js | 521
ublock-origin-1.42.0+dfsg/src/js/base64-custom.js | 246
ublock-origin-1.42.0+dfsg/src/js/benchmarks.js | 401
ublock-origin-1.42.0+dfsg/src/js/biditrie.js | 932
ublock-origin-1.42.0+dfsg/src/js/cachestorage.js | 777
ublock-origin-1.42.0+dfsg/src/js/click2load.js | 9
ublock-origin-1.42.0+dfsg/src/js/codemirror/ubo-dynamic-filtering.js | 19
ublock-origin-1.42.0+dfsg/src/js/codemirror/ubo-static-filtering.js | 148
ublock-origin-1.42.0+dfsg/src/js/commands.js | 62
ublock-origin-1.42.0+dfsg/src/js/console.js | 44
ublock-origin-1.42.0+dfsg/src/js/contentscript-extra.js | 172
ublock-origin-1.42.0+dfsg/src/js/contentscript.js | 108
ublock-origin-1.42.0+dfsg/src/js/contextmenu.js | 32
ublock-origin-1.42.0+dfsg/src/js/cosmetic-filtering.js | 295
ublock-origin-1.42.0+dfsg/src/js/dashboard.js | 4
ublock-origin-1.42.0+dfsg/src/js/devtools.js | 173
ublock-origin-1.42.0+dfsg/src/js/document-blocked.js | 48
ublock-origin-1.42.0+dfsg/src/js/dyna-rules.js | 34
ublock-origin-1.42.0+dfsg/src/js/dynamic-net-filtering.js | 250
ublock-origin-1.42.0+dfsg/src/js/epicker-ui.js | 14
ublock-origin-1.42.0+dfsg/src/js/fa-icons.js | 1
ublock-origin-1.42.0+dfsg/src/js/filtering-context.js | 117
ublock-origin-1.42.0+dfsg/src/js/filtering-engines.js | 50
ublock-origin-1.42.0+dfsg/src/js/hnswitches.js | 419
ublock-origin-1.42.0+dfsg/src/js/hntrie.js | 465
ublock-origin-1.42.0+dfsg/src/js/html-filtering.js | 780
ublock-origin-1.42.0+dfsg/src/js/httpheader-filtering.js | 54
ublock-origin-1.42.0+dfsg/src/js/i18n.js | 84
ublock-origin-1.42.0+dfsg/src/js/logger-ui-inspector.js | 2
ublock-origin-1.42.0+dfsg/src/js/logger-ui.js | 16
ublock-origin-1.42.0+dfsg/src/js/logger.js | 115
ublock-origin-1.42.0+dfsg/src/js/lz4.js | 18
ublock-origin-1.42.0+dfsg/src/js/messaging.js | 481
ublock-origin-1.42.0+dfsg/src/js/pagestore.js | 168
ublock-origin-1.42.0+dfsg/src/js/popup-fenix.js | 72
ublock-origin-1.42.0+dfsg/src/js/popup.js | 6
ublock-origin-1.42.0+dfsg/src/js/redirect-engine.js | 92
ublock-origin-1.42.0+dfsg/src/js/reverselookup-worker.js | 300
ublock-origin-1.42.0+dfsg/src/js/reverselookup.js | 611
ublock-origin-1.42.0+dfsg/src/js/scriptlet-filtering.js | 821
ublock-origin-1.42.0+dfsg/src/js/scriptlets/dom-inspector.js | 38
ublock-origin-1.42.0+dfsg/src/js/scriptlets/dom-survey-scripts.js | 4
ublock-origin-1.42.0+dfsg/src/js/scriptlets/epicker.js | 118
ublock-origin-1.42.0+dfsg/src/js/scriptlets/noscript-spoof.js | 9
ublock-origin-1.42.0+dfsg/src/js/scriptlets/subscriber.js | 30
ublock-origin-1.42.0+dfsg/src/js/settings.js | 50
ublock-origin-1.42.0+dfsg/src/js/start.js | 243
ublock-origin-1.42.0+dfsg/src/js/static-ext-filtering-db.js | 224
ublock-origin-1.42.0+dfsg/src/js/static-ext-filtering.js | 442
ublock-origin-1.42.0+dfsg/src/js/static-filtering-io.js | 139
ublock-origin-1.42.0+dfsg/src/js/static-filtering-parser.js | 758
ublock-origin-1.42.0+dfsg/src/js/static-net-filtering.js | 4641 -
ublock-origin-1.42.0+dfsg/src/js/storage.js | 384
ublock-origin-1.42.0+dfsg/src/js/strie.js | 985
ublock-origin-1.42.0+dfsg/src/js/support.js | 290
ublock-origin-1.42.0+dfsg/src/js/tab.js | 201
ublock-origin-1.42.0+dfsg/src/js/tasks.js | 42
ublock-origin-1.42.0+dfsg/src/js/text-encode.js | 32
ublock-origin-1.42.0+dfsg/src/js/text-utils.js | 107
ublock-origin-1.42.0+dfsg/src/js/traffic.js | 174
ublock-origin-1.42.0+dfsg/src/js/ublock.js | 212
ublock-origin-1.42.0+dfsg/src/js/udom.js | 205
ublock-origin-1.42.0+dfsg/src/js/uri-utils.js | 175
ublock-origin-1.42.0+dfsg/src/js/uritools.js | 380
ublock-origin-1.42.0+dfsg/src/js/url-net-filtering.js | 451
ublock-origin-1.42.0+dfsg/src/js/utils.js | 558
ublock-origin-1.42.0+dfsg/src/js/wasm/hntrie.wat | 372
ublock-origin-1.42.0+dfsg/src/js/whitelist.js | 6
ublock-origin-1.42.0+dfsg/src/lib/hsluv/LICENSE | 20
ublock-origin-1.42.0+dfsg/src/lib/hsluv/README | 3
ublock-origin-1.42.0+dfsg/src/lib/hsluv/hsluv-0.1.0.min.js | 8
ublock-origin-1.42.0+dfsg/src/lib/lz4/README.md | 2
ublock-origin-1.42.0+dfsg/src/lib/publicsuffixlist/publicsuffixlist.js | 148
ublock-origin-1.42.0+dfsg/src/lib/publicsuffixlist/wasm/publicsuffixlist.wat | 23
ublock-origin-1.42.0+dfsg/src/lib/punycode.js | 43
ublock-origin-1.42.0+dfsg/src/lib/regexanalyzer/regex.js | 18
ublock-origin-1.42.0+dfsg/src/logger-ui.html | 46
ublock-origin-1.42.0+dfsg/src/no-dashboard.html | 2
ublock-origin-1.42.0+dfsg/src/popup-fenix.html | 25
ublock-origin-1.42.0+dfsg/src/popup.html | 3
ublock-origin-1.42.0+dfsg/src/settings.html | 54
ublock-origin-1.42.0+dfsg/src/shortcuts.html | 2
ublock-origin-1.42.0+dfsg/src/support.html | 120
ublock-origin-1.42.0+dfsg/src/web_accessible_resources/amazon_apstag.js | 3
ublock-origin-1.42.0+dfsg/src/web_accessible_resources/click2load.html | 1
ublock-origin-1.42.0+dfsg/src/web_accessible_resources/epicker-ui.html | 16
ublock-origin-1.42.0+dfsg/src/web_accessible_resources/fingerprint2.js | 37
ublock-origin-1.42.0+dfsg/src/web_accessible_resources/fingerprint3.js | 45
ublock-origin-1.42.0+dfsg/src/web_accessible_resources/google-analytics_analytics.js | 12
ublock-origin-1.42.0+dfsg/src/web_accessible_resources/google-analytics_ga.js | 32
ublock-origin-1.42.0+dfsg/src/web_accessible_resources/googlesyndication_adsbygoogle.js | 40
ublock-origin-1.42.0+dfsg/src/web_accessible_resources/nobab2.js | 42
ublock-origin-1.42.0+dfsg/src/web_accessible_resources/prebid-ads.js | 26
ublock-origin-1.42.0+dfsg/src/whitelist.html | 10
ublock-origin-1.42.0+dfsg/tools/copy-common-files.sh | 8
ublock-origin-1.42.0+dfsg/tools/import-crowdin.sh | 7
ublock-origin-1.42.0+dfsg/tools/import-war.py | 92
ublock-origin-1.42.0+dfsg/tools/make-assets.sh | 26
ublock-origin-1.42.0+dfsg/tools/make-browser.sh | 36
ublock-origin-1.42.0+dfsg/tools/make-chromium.sh | 8
ublock-origin-1.42.0+dfsg/tools/make-clean.sh | 4
ublock-origin-1.42.0+dfsg/tools/make-dig.sh | 17
ublock-origin-1.42.0+dfsg/tools/make-firefox.sh | 10
ublock-origin-1.42.0+dfsg/tools/make-nodejs.sh | 41
ublock-origin-1.42.0+dfsg/tools/make-npm.sh | 43
ublock-origin-1.42.0+dfsg/tools/make-opera.sh | 9
ublock-origin-1.42.0+dfsg/tools/make-safari-meta.py | 77
ublock-origin-1.42.0+dfsg/tools/make-safari.sh | 33
ublock-origin-1.42.0+dfsg/tools/make-thunderbird.sh | 4
ublock-origin-1.42.0+dfsg/tools/make-webext-meta.py | 39
ublock-origin-1.42.0+dfsg/tools/make-webext.sh | 42
ublock-origin-1.42.0+dfsg/tools/update-submodules.sh | 17
ublock-origin-1.42.0+dfsg/uAssets/.github/ISSUE_TEMPLATE/bug_report.yml | 4
ublock-origin-1.42.0+dfsg/uAssets/.github/ISSUE_TEMPLATE/report_from_ubo.yml | 75
ublock-origin-1.42.0+dfsg/uAssets/.github/ISSUE_TEMPLATE/specific_report_from_ubo.yml | 79
ublock-origin-1.42.0+dfsg/uAssets/.github/workflows/main.yml | 46
ublock-origin-1.42.0+dfsg/uAssets/.github/workflows/update-3rd-party-assets.yml | 26
ublock-origin-1.42.0+dfsg/uAssets/README.md | 19
ublock-origin-1.42.0+dfsg/uAssets/filters/annoyances.txt | 1841
ublock-origin-1.42.0+dfsg/uAssets/filters/badlists.txt | 4
ublock-origin-1.42.0+dfsg/uAssets/filters/badware.txt | 977
ublock-origin-1.42.0+dfsg/uAssets/filters/filters-2020.txt | 1689
ublock-origin-1.42.0+dfsg/uAssets/filters/filters-2021.txt | 4607 +
ublock-origin-1.42.0+dfsg/uAssets/filters/filters-2022.txt | 2681
ublock-origin-1.42.0+dfsg/uAssets/filters/filters.txt | 5426 --
ublock-origin-1.42.0+dfsg/uAssets/filters/lan-block.txt | 89
ublock-origin-1.42.0+dfsg/uAssets/filters/legacy.txt | 33
ublock-origin-1.42.0+dfsg/uAssets/filters/privacy.txt | 220
ublock-origin-1.42.0+dfsg/uAssets/filters/quick-fixes.txt | 174
ublock-origin-1.42.0+dfsg/uAssets/filters/resource-abuse.txt | 45
ublock-origin-1.42.0+dfsg/uAssets/filters/unbreak.txt | 1118
ublock-origin-1.42.0+dfsg/uAssets/thirdparties/easylist-downloads.adblockplus.org/easylist.txt |26852 +++++-----
ublock-origin-1.42.0+dfsg/uAssets/thirdparties/easylist-downloads.adblockplus.org/easyprivacy.txt |15384 ++---
ublock-origin-1.42.0+dfsg/uAssets/thirdparties/publicsuffix.org/list/effective_tld_names.dat | 743
ublock-origin-1.42.0+dfsg/uAssets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt |10498 +--
ublock-origin-1.42.0+dfsg/uAssets/tools/update-3rdparties.sh | 2
298 files changed, 72922 insertions(+), 45619 deletions(-)
diff -Nru ublock-origin-1.37.0+dfsg/.github/workflows/main.yml ublock-origin-1.42.0+dfsg/.github/workflows/main.yml
--- ublock-origin-1.37.0+dfsg/.github/workflows/main.yml 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/.github/workflows/main.yml 2022-05-06 01:15:22.000000000 +0000
@@ -19,9 +19,7 @@
persist-credentials: false
- name: Clone uAssets
run: |
- pushd ..
- git clone --depth 1 https://github.com/uBlockOrigin/uAssets.git
- popd
+ git submodule update --depth 1 --init
# https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
- name: Get release information
id: release_info
@@ -41,6 +39,7 @@
tools/make-chromium.sh ${{ steps.release_info.outputs.VERSION }}
tools/make-firefox.sh ${{ steps.release_info.outputs.VERSION }}
tools/make-thunderbird.sh ${{ steps.release_info.outputs.VERSION }}
+ tools/make-npm.sh ${{ steps.release_info.outputs.VERSION }}
- name: Upload Chromium package
uses: actions/upload-release-asset@v1
env:
@@ -68,3 +67,12 @@
asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.thunderbird.xpi
asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.thunderbird.xpi
asset_content_type: application/octet-stream
+ - name: Upload NodeJS package
+ uses: actions/upload-release-asset@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ steps.create_release.outputs.upload_url }}
+ asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.npm.tgz
+ asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.npm.tgz
+ asset_content_type: application/octet-stream
diff -Nru ublock-origin-1.37.0+dfsg/.gitmodules ublock-origin-1.42.0+dfsg/.gitmodules
--- ublock-origin-1.37.0+dfsg/.gitmodules 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/.gitmodules 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,3 @@
+[submodule "submodules/uAssets"]
+ path = submodules/uAssets
+ url = https://github.com/uBlockOrigin/uAssets.git
diff -Nru ublock-origin-1.37.0+dfsg/.jshintrc ublock-origin-1.42.0+dfsg/.jshintrc
--- ublock-origin-1.37.0+dfsg/.jshintrc 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/.jshintrc 2022-05-06 01:15:22.000000000 +0000
@@ -6,12 +6,10 @@
"globals": {
"browser": false, // global variable in Firefox, Edge
"chrome": false, // global variable in Chromium, Chrome, Opera
- "log": false,
- "safari": false,
"self": false,
"vAPI": false,
- "webext": false,
- "µBlock": false
+ "URLSearchParams": false,
+ "WebAssembly": false
},
"laxbreak": true,
"newcap": false,
diff -Nru ublock-origin-1.37.0+dfsg/Makefile ublock-origin-1.42.0+dfsg/Makefile
--- ublock-origin-1.37.0+dfsg/Makefile 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/Makefile 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,77 @@
+# https://stackoverflow.com/a/6273809
+run_options := $(filter-out $@,$(MAKECMDGOALS))
+
+.PHONY: all clean test lint chromium firefox npm dig \
+ compare maxcost medcost mincost modifiers record wasm
+
+sources := $(wildcard assets/resources/* src/* src/*/* src/*/*/* src/*/*/*/*)
+platform := $(wildcard platform/* platform/*/*)
+assets := $(wildcard submodules/uAssets/* \
+ submodules/uAssets/*/* \
+ submodules/uAssets/*/*/* \
+ submodules/uAssets/*/*/*/*)
+
+all: chromium firefox npm
+
+dist/build/uBlock0.chromium: tools/make-chromium.sh $(sources) $(platform) $(assets)
+ tools/make-chromium.sh
+
+# Build the extension for Chromium.
+chromium: dist/build/uBlock0.chromium
+
+dist/build/uBlock0.firefox: tools/make-firefox.sh $(sources) $(platform) $(assets)
+ tools/make-firefox.sh all
+
+# Build the extension for Firefox.
+firefox: dist/build/uBlock0.firefox
+
+dist/build/uBlock0.npm: tools/make-nodejs.sh $(sources) $(platform) $(assets)
+ tools/make-npm.sh
+
+# Build the Node.js package.
+npm: dist/build/uBlock0.npm
+
+lint: npm
+ cd dist/build/uBlock0.npm && npm run lint
+
+test: npm
+ cd dist/build/uBlock0.npm && npm run test
+
+test-full-battery: npm
+ cd dist/build/uBlock0.npm && npm run test-full-battery
+
+check-leaks: npm
+ cd dist/build/uBlock0.npm && npm run check-leaks
+
+dist/build/uBlock0.dig: tools/make-nodejs.sh $(sources) $(platform) $(assets)
+ tools/make-dig.sh
+
+dig: dist/build/uBlock0.dig
+ cd dist/build/uBlock0.dig && npm install
+
+dig-snfe: dig
+ cd dist/build/uBlock0.dig && npm run snfe $(run_options)
+
+# Update submodules.
+update-submodules:
+ tools/update-submodules.sh
+
+clean:
+ rm -rf dist/build tmp/node_modules
+
+
+# Not real targets, just convenient for auto-completion at shell prompt
+compare:
+ @echo
+maxcost:
+ @echo
+medcost:
+ @echo
+mincost:
+ @echo
+modifiers:
+ @echo
+record:
+ @echo
+wasm:
+ @echo
diff -Nru ublock-origin-1.37.0+dfsg/README.md ublock-origin-1.42.0+dfsg/README.md
--- ublock-origin-1.37.0+dfsg/README.md 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/README.md 2022-05-06 01:15:22.000000000 +0000
@@ -1,6 +1,10 @@
-[](https://travis-ci.org/gorhill/uBlock)
+[](https://github.com/gorhill/uBlock/commits/master)
+[](https://github.com/uBlockOrigin/uBlock-issues/issues)
[](https://crowdin.com/project/ublock)
[](https://github.com/gorhill/uBlock/blob/master/LICENSE.txt)
+[](https://www.npmjs.com/package/@gorhill/ubo-core)
+[](https://addons.mozilla.org/firefox/addon/ublock-origin/)
+[](https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm)
***
@@ -11,7 +15,7 @@
uBlock Origin
-
+
pronounced you-block origin (/ˈjuːˌblɒk/
) — you decide what enters your browser.
@@ -21,9 +25,9 @@
***
-
+
-
+
Do not use uBlock Origin along with other similarly-purposed blockers.
See below for more installation options.
@@ -61,7 +65,7 @@
## Philosophy
-uBlock Origin (or uBlock₀) is not an *ad blocker*; it's a general-purpose blocker. uBlock Origin blocks ads through its support of the [Adblock Plus filter syntax](https://adblockplus.org/en/filters). uBlock Origin [extends](https://github.com/gorhill/uBlock/wiki/Filter-syntax-extensions) the syntax and is designed to work with custom rules and filters. Furthermore, advanced mode allows uBlock Origin to work in [default-deny mode](https://github.com/gorhill/uBlock/wiki/Dynamic-filtering:-default-deny), which mode will cause [all 3rd-party network requests](https://requestpolicycontinued.github.io/#what-are-cross-site-requests) to be blocked by default, unless allowed by the user.
+uBlock Origin (or uBlock₀) is not an *ad blocker*; it's a general-purpose blocker. uBlock Origin blocks ads through its support of the [Adblock Plus filter syntax](https://help.eyeo.com/en/adblockplus/how-to-write-filters). uBlock Origin [extends](https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#extended-syntax) the syntax and is designed to work with custom rules and filters. Furthermore, advanced mode allows uBlock Origin to work in [default-deny mode](https://github.com/gorhill/uBlock/wiki/Dynamic-filtering:-default-deny), which mode will cause [all 3rd-party network requests](https://requestpolicycontinued.github.io/#what-are-cross-site-requests) to be blocked by default, unless allowed by the user.
That said, it's important to note that using a blocker is **NOT** [theft](https://twitter.com/LeaVerou/status/518154828166725632). Don't fall for this creepy idea. The _ultimate_ logical consequence of `blocking = theft` is the criminalisation of the inalienable right to privacy.
@@ -85,24 +89,24 @@
#### Firefox / Firefox for Android
-[Firefox Add-ons web site](https://addons.mozilla.org/addon/ublock-origin/).
+[Firefox Add-ons web site](https://addons.mozilla.org/firefox/addon/ublock-origin/).
There is also a development version if you want to test uBlock Origin with the latest changes: for installation, see [Install / Firefox webext / For beta version](https://github.com/gorhill/uBlock/blob/master/dist/README.md#for-beta-version)
-uBlock Origin is compatible with [SeaMonkey](http://www.seamonkey-project.org/), [Pale Moon](https://www.palemoon.org/), and possibly other browsers based on Firefox: for installation, see [Install / Firefox legacy](https://github.com/gorhill/uBlock/blob/master/dist/README.md#firefox-legacy).
+uBlock Origin is compatible with [SeaMonkey](https://www.seamonkey-project.org/), [Pale Moon](https://www.palemoon.org/), and possibly other browsers based on Firefox: for installation, see [Install / Firefox legacy](https://github.com/gorhill/uBlock/blob/master/dist/README.md#firefox-legacy).
uBO may also be installed as a [Debian package](https://packages.debian.org/stable/source/ublock-origin):
- Firefox 56-: `apt-get install xul-ext-ublock-origin`
- Firefox 55+: `apt-get install webext-ublock-origin`
-There is no guarantee the package will be available on your specific platform -- in which case, you will have to install from [Firefox Add-ons web site](https://addons.mozilla.org/addon/ublock-origin/).
+There is no guarantee the package will be available on your specific platform -- in which case, you will have to install from [Firefox Add-ons web site](https://addons.mozilla.org/firefox/addon/ublock-origin/).
#### Microsoft Edge
-Publisher: [Nik Rolls](https://github.com/nikrolls/uBlock-Edge).
+Publisher: [Nicole Rolls](https://github.com/nicole-ashley/uBlock-Edge).
-Chromium-based Edge: Stable version available in [Microsoft Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/odfafepnkmbhccpbejgmiehpchacaeak).
+Chromium-based Edge: Stable version available in [Microsoft Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak).
#### Safari (macOS)
@@ -116,14 +120,14 @@
#### Note for all browsers
-To benefit from uBlock Origin's higher efficiency, it's advised that you don't use other content blockers at the same time (such as Adblock Plus, AdBlock). uBlock Origin will do [as well or better](#blocking) than most popular ad blockers. Other blockers can also prevent uBlock Origin's privacy or anti-blocker-defusing features from working properly.
+To benefit from uBlock Origin's higher efficiency, it's advised that you don't use other content blockers at the same time (such as Adblock Plus, AdBlock). uBlock Origin will do [as well or better](https://www.debugbear.com/blog/chrome-extension-performance-2021#how-do-ad-blockers-and-privacy-tools-affect-browser-performance) than most popular ad blockers. Other blockers can also prevent uBlock Origin's privacy or anti-blocker-defusing features from working properly.
#### Deploying
Below is documentation to assist administrators in deploying uBlock Origin:
- [Deploying uBlock Origin](https://github.com/gorhill/uBlock/wiki/Deploying-uBlock-Origin)
- - Firefox: [Deploying uBlock Origin for Firefox with CCK2 and Group Policy](http://decentsecurity.com/ublock-for-firefox-deployment/) (external)
+ - Firefox: [Deploying uBlock Origin for Firefox with CCK2 and Group Policy](https://decentsecurity.com/ublock-for-firefox-deployment/) (external)
- Google Chrome: [Managing Google Chrome with adblocking and security](https://decentsecurity.com/ublock-for-google-chrome-deployment/) (external)
## Release History
@@ -141,7 +145,7 @@
to maintain the filter lists you are using, which were made available to use by
all for free.
-You can contribute by helping translate uBlock Origin [on Crowdin](https://crowdin.net/project/ublock).
+You can contribute by helping translate uBlock Origin [on Crowdin](https://crowdin.com/project/ublock).
## License
diff -Nru ublock-origin-1.37.0+dfsg/assets/assets.json ublock-origin-1.42.0+dfsg/assets/assets.json
--- ublock-origin-1.37.0+dfsg/assets/assets.json 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/assets/assets.json 2022-05-06 01:15:22.000000000 +0000
@@ -1,17 +1,18 @@
{
"assets.json": {
"content": "internal",
- "updateAfter": 7,
+ "updateAfter": 13,
"contentURL": [
"https://raw.githubusercontent.com/gorhill/uBlock/master/assets/assets.json",
"assets/assets.json"
],
"cdnURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/ublock/assets.json",
+ "https://ublockorigin.pages.dev/ublock/assets.json",
"https://gitcdn.xyz/repo/gorhill/uBlock/master/assets/assets.json",
"https://cdn.jsdelivr.net/gh/gorhill/uBlock@master/assets/assets.json",
"https://cdn.statically.io/gh/gorhill/uBlock/master/assets/assets.json",
- "https://combinatronics.io/gorhill/uBlock/master/assets/assets.json",
- "https://raw.githubusercontent.com/gorhill/uBlock/master/assets/assets.json"
+ "https://combinatronics.io/gorhill/uBlock/master/assets/assets.json"
]
},
"public_suffix_list.dat": {
@@ -25,16 +26,18 @@
},
"ublock-badlists": {
"content": "internal",
- "updateAfter": 13,
+ "updateAfter": 29,
"contentURL": [
- "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/badlists.txt",
+ "https://ublockorigin.github.io/uAssets/filters/badlists.txt",
"assets/ublock/badlists.txt"
],
"cdnURLs": [
- "https://gitcdn.xyz/repo/uBlockOrigin/uAssets/master/filters/badlists.txt",
- "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssets@master/filters/badlists.txt",
- "https://cdn.statically.io/gh/uBlockOrigin/uAssets/master/filters/badlists.txt",
- "https://combinatronics.io/uBlockOrigin/uAssets/master/filters/badlists.txt"
+ "https://ublockorigin.github.io/uAssetsCDN/filters/badlists.txt",
+ "https://ublockorigin.pages.dev/filters/badlists.txt",
+ "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/badlists.txt",
+ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/badlists.txt",
+ "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/badlists.txt",
+ "https://combinatronics.io/uBlockOrigin/uAssetsCDN/main/filters/badlists.txt"
]
},
"ublock-filters": {
@@ -42,15 +45,16 @@
"group": "default",
"title": "uBlock filters",
"contentURL": [
- "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt",
+ "https://ublockorigin.github.io/uAssets/filters/filters.txt",
"assets/ublock/filters.txt"
],
"cdnURLs": [
- "https://gitcdn.xyz/repo/uBlockOrigin/uAssets/master/filters/filters.txt",
- "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssets@master/filters/filters.txt",
- "https://cdn.statically.io/gh/uBlockOrigin/uAssets/master/filters/filters.txt",
- "https://combinatronics.io/uBlockOrigin/uAssets/master/filters/filters.txt",
- "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt"
+ "https://ublockorigin.github.io/uAssetsCDN/filters/filters.txt",
+ "https://ublockorigin.pages.dev/filters/filters.txt",
+ "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/filters.txt",
+ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/filters.txt",
+ "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/filters.txt",
+ "https://combinatronics.io/uBlockOrigin/uAssetsCDN/main/filters/filters.txt"
],
"supportURL": "https://github.com/uBlockOrigin/uAssets/issues"
},
@@ -59,46 +63,54 @@
"group": "default",
"title": "uBlock filters – Badware risks",
"contentURL": [
- "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/badware.txt",
+ "https://ublockorigin.github.io/uAssets/filters/badware.txt",
"assets/ublock/badware.txt"
],
"cdnURLs": [
- "https://gitcdn.xyz/repo/uBlockOrigin/uAssets/master/filters/badware.txt",
- "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssets@master/filters/badware.txt",
- "https://cdn.statically.io/gh/uBlockOrigin/uAssets/master/filters/badware.txt",
- "https://combinatronics.io/uBlockOrigin/uAssets/master/filters/badware.txt"
+ "https://ublockorigin.github.io/uAssetsCDN/filters/badware.txt",
+ "https://ublockorigin.pages.dev/filters/badware.txt",
+ "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/badware.txt",
+ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/badware.txt",
+ "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/badware.txt",
+ "https://combinatronics.io/uBlockOrigin/uAssetsCDN/main/filters/badware.txt"
],
"supportURL": "https://github.com/gorhill/uBlock/wiki/Badware-risks",
"instructionURL": "https://github.com/gorhill/uBlock/wiki/Badware-risks"
},
"ublock-privacy": {
"content": "filters",
+ "updateAfter": 13,
"group": "default",
"title": "uBlock filters – Privacy",
"contentURL": [
- "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/privacy.txt",
+ "https://ublockorigin.github.io/uAssets/filters/privacy.txt",
"assets/ublock/privacy.txt"
],
"cdnURLs": [
- "https://gitcdn.xyz/repo/uBlockOrigin/uAssets/master/filters/privacy.txt",
- "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssets@master/filters/privacy.txt",
- "https://cdn.statically.io/gh/uBlockOrigin/uAssets/master/filters/privacy.txt",
- "https://combinatronics.io/uBlockOrigin/uAssets/master/filters/privacy.txt"
+ "https://ublockorigin.github.io/uAssetsCDN/filters/privacy.txt",
+ "https://ublockorigin.pages.dev/filters/privacy.txt",
+ "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/privacy.txt",
+ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/privacy.txt",
+ "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/privacy.txt",
+ "https://combinatronics.io/uBlockOrigin/uAssetsCDN/main/filters/privacy.txt"
]
},
"ublock-abuse": {
"content": "filters",
+ "updateAfter": 13,
"group": "default",
"title": "uBlock filters – Resource abuse",
"contentURL": [
- "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/resource-abuse.txt",
+ "https://ublockorigin.github.io/uAssets/filters/resource-abuse.txt",
"assets/ublock/resource-abuse.txt"
],
"cdnURLs": [
- "https://gitcdn.xyz/repo/uBlockOrigin/uAssets/master/filters/resource-abuse.txt",
- "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssets@master/filters/resource-abuse.txt",
- "https://cdn.statically.io/gh/uBlockOrigin/uAssets/master/filters/resource-abuse.txt",
- "https://combinatronics.io/uBlockOrigin/uAssets/master/filters/resource-abuse.txt"
+ "https://ublockorigin.github.io/uAssetsCDN/filters/resource-abuse.txt",
+ "https://ublockorigin.pages.dev/filters/resource-abuse.txt",
+ "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/resource-abuse.txt",
+ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/resource-abuse.txt",
+ "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/resource-abuse.txt",
+ "https://combinatronics.io/uBlockOrigin/uAssetsCDN/main/filters/resource-abuse.txt"
]
},
"ublock-unbreak": {
@@ -106,14 +118,33 @@
"group": "default",
"title": "uBlock filters – Unbreak",
"contentURL": [
- "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/unbreak.txt",
+ "https://ublockorigin.github.io/uAssets/filters/unbreak.txt",
"assets/ublock/unbreak.txt"
],
"cdnURLs": [
- "https://gitcdn.xyz/repo/uBlockOrigin/uAssets/master/filters/unbreak.txt",
- "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssets@master/filters/unbreak.txt",
- "https://cdn.statically.io/gh/uBlockOrigin/uAssets/master/filters/unbreak.txt",
- "https://combinatronics.io/uBlockOrigin/uAssets/master/filters/unbreak.txt"
+ "https://ublockorigin.github.io/uAssetsCDN/filters/unbreak.txt",
+ "https://ublockorigin.pages.dev/filters/unbreak.txt",
+ "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/unbreak.txt",
+ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/unbreak.txt",
+ "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/unbreak.txt",
+ "https://combinatronics.io/uBlockOrigin/uAssetsCDN/main/filters/unbreak.txt"
+ ]
+ },
+ "ublock-quick-fixes": {
+ "content": "filters",
+ "updateAfter": 1,
+ "group": "default",
+ "title": "uBlock filters – Quick fixes",
+ "contentURL": [
+ "https://ublockorigin.github.io/uAssets/filters/quick-fixes.txt"
+ ],
+ "cdnURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/quick-fixes.txt",
+ "https://ublockorigin.pages.dev/filters/quick-fixes.txt",
+ "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/quick-fixes.txt",
+ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/quick-fixes.txt",
+ "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/quick-fixes.txt",
+ "https://combinatronics.io/uBlockOrigin/uAssetsCDN/main/filters/quick-fixes.txt"
]
},
"adguard-generic": {
@@ -145,7 +176,7 @@
"https://easylist-downloads.adblockplus.org/easylist.txt",
"assets/thirdparties/easylist-downloads.adblockplus.org/easylist.txt"
],
- "supportURL": "https://forums.lanik.us/"
+ "supportURL": "https://easylist.to/"
},
"adguard-spyware": {
"content": "filters",
@@ -169,9 +200,17 @@
"content": "filters",
"group": "privacy",
"off": true,
- "title": "Block access to LAN",
- "contentURL": "https://raw.githubusercontent.com/gwarser/filter-lists/master/lan-block.txt",
- "supportURL": "https://github.com/gwarser/filter-lists"
+ "title": "Block Outsider Intrusion into LAN",
+ "contentURL": "https://ublockorigin.github.io/uAssets/filters/lan-block.txt",
+ "cdnURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/lan-block.txt",
+ "https://ublockorigin.pages.dev/filters/lan-block.txt",
+ "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/lan-block.txt",
+ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/lan-block.txt",
+ "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/lan-block.txt",
+ "https://combinatronics.io/uBlockOrigin/uAssetsCDN/main/filters/lan-block.txt"
+ ],
+ "supportURL": "https://github.com/uBlockOrigin/uAssets/issues"
},
"easyprivacy": {
"content": "filters",
@@ -183,7 +222,7 @@
"https://easylist-downloads.adblockplus.org/easyprivacy.txt",
"assets/thirdparties/easylist-downloads.adblockplus.org/easyprivacy.txt"
],
- "supportURL": "https://forums.lanik.us/"
+ "supportURL": "https://easylist.to/"
},
"urlhaus-1": {
"content": "filters",
@@ -191,25 +230,40 @@
"title": "Online Malicious URL Blocklist",
"contentURL": [
"https://curben.gitlab.io/malware-filter/urlhaus-filter-online.txt",
- "https://raw.githubusercontent.com/curbengh/urlhaus-filter/master/urlhaus-filter-online.txt",
"assets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt"
],
"cdnURLs": [
- "https://cdn.statically.io/gl/curben/urlhaus-filter/master/urlhaus-filter-online.txt",
- "https://gitcdn.xyz/repo/curbengh/urlhaus-filter/master/urlhaus-filter-online.txt",
- "https://cdn.jsdelivr.net/gh/curbengh/urlhaus-filter/urlhaus-filter-online.txt",
- "https://raw.githubusercontent.com/curbengh/urlhaus-filter/master/urlhaus-filter-online.txt",
- "https://curben.gitlab.io/malware-filter/urlhaus-filter-online.txt"
+ "https://curbengh.github.io/malware-filter/urlhaus-filter-online.txt",
+ "https://curben.gitlab.io/urlhaus-filter/urlhaus-filter-online.txt",
+ "https://malware-filter.pages.dev/urlhaus-filter-online.txt"
],
- "supportURL": "https://gitlab.com/curben/urlhaus-filter#urlhaus-malicious-url-blocklist"
+ "supportURL": "https://gitlab.com/curben/urlhaus-filter#malicious-url-blocklist"
},
- "spam404-0": {
+ "curben-phishing": {
"content": "filters",
"group": "malware",
"off": true,
- "title": "Spam404",
- "contentURL": "https://raw.githubusercontent.com/Spam404/lists/master/adblock-list.txt",
- "supportURL": "http://www.spam404.com/"
+ "title": "Phishing URL Blocklist",
+ "contentURL": "https://curben.gitlab.io/malware-filter/phishing-filter.txt",
+ "cdnURLs": [
+ "https://curbengh.github.io/phishing-filter/phishing-filter.txt",
+ "https://curben.gitlab.io/phishing-filter/phishing-filter.txt",
+ "https://phishing-filter.pages.dev/phishing-filter.txt"
+ ],
+ "supportURL": "https://gitlab.com/curben/phishing-filter#phishing-url-blocklist"
+ },
+ "curben-pup": {
+ "content": "filters",
+ "group": "malware",
+ "off": true,
+ "title": "PUP Domains Blocklist",
+ "contentURL": "https://curben.gitlab.io/malware-filter/pup-filter.txt",
+ "cdnURLs": [
+ "https://curbengh.github.io/pup-filter/pup-filter.txt",
+ "https://curben.gitlab.io/pup-filter/pup-filter.txt",
+ "https://pup-filter.pages.dev/pup-filter.txt"
+ ],
+ "supportURL": "https://gitlab.com/curben/pup-filter#pup-domains-blocklist"
},
"adguard-annoyance": {
"content": "filters",
@@ -243,7 +297,7 @@
"off": true,
"title": "Fanboy’s Annoyance",
"contentURL": "https://secure.fanboy.co.nz/fanboy-annoyance.txt",
- "supportURL": "https://forums.lanik.us/"
+ "supportURL": "https://easylist.to/"
},
"fanboy-cookiemonster": {
"content": "filters",
@@ -262,18 +316,21 @@
"https://easylist.to/easylist/fanboy-social.txt",
"https://secure.fanboy.co.nz/fanboy-social.txt"
],
- "supportURL": "https://forums.lanik.us/"
+ "supportURL": "https://easylist.to/"
},
"ublock-annoyances": {
"content": "filters",
"group": "social",
"title": "uBlock filters – Annoyances",
"off": true,
- "contentURL": "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/annoyances.txt",
+ "contentURL": "https://ublockorigin.github.io/uAssets/filters/annoyances.txt",
"cdnURLs": [
- "https://gitcdn.xyz/repo/uBlockOrigin/uAssets/master/filters/annoyances.txt",
- "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssets@master/filters/annoyances.txt",
- "https://cdn.statically.io/gh/uBlockOrigin/uAssets/master/filters/annoyances.txt"
+ "https://ublockorigin.github.io/uAssetsCDN/filters/annoyances.txt",
+ "https://ublockorigin.pages.dev/filters/annoyances.txt",
+ "https://gitcdn.link/cdn/uBlockOrigin/uAssetsCDN/main/filters/annoyances.txt",
+ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/annoyances.txt",
+ "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/annoyances.txt",
+ "https://combinatronics.io/uBlockOrigin/uAssetsCDN/main/filters/annoyances.txt"
]
},
"dpollock-0": {
@@ -285,15 +342,6 @@
"contentURL": "https://someonewhocares.org/hosts/hosts",
"supportURL": "https://someonewhocares.org/hosts/"
},
- "mvps-0": {
- "content": "filters",
- "group": "multipurpose",
- "updateAfter": 11,
- "off": true,
- "title": "MVPS HOSTS",
- "contentURL": "https://winhelp2002.mvps.org/hosts.txt",
- "supportURL": "https://winhelp2002.mvps.org/"
- },
"plowe-0": {
"content": "filters",
"group": "multipurpose",
@@ -306,6 +354,15 @@
],
"supportURL": "https://pgl.yoyo.org/adservers/"
},
+ "ALB-0": {
+ "content": "filters",
+ "group": "regions",
+ "off": true,
+ "title": "ALB: Adblock List for Albania",
+ "lang": "sq",
+ "contentURL": "https://raw.githubusercontent.com/AnXh3L0/blocklist/master/albanian-easylist-addition/Albania.txt",
+ "supportURL": "https://github.com/AnXh3L0/blocklist"
+ },
"ara-0": {
"content": "filters",
"group": "regions",
@@ -329,7 +386,7 @@
"group": "regions",
"off": true,
"title": "CHN: AdGuard Chinese (中文)",
- "lang": "zh",
+ "lang": "ug zh",
"contentURL": "https://filters.adtidy.org/extension/ublock/filters/224.txt",
"supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters"
},
@@ -347,7 +404,7 @@
"group": "regions",
"off": true,
"title": "DEU: EasyList Germany",
- "lang": "de",
+ "lang": "de dsb hsb lb rm",
"contentURL": [
"https://easylist.to/easylistgermany/easylistgermany.txt",
"https://easylist-downloads.adblockplus.org/easylistgermany.txt"
@@ -377,7 +434,7 @@
"group": "regions",
"off": true,
"title": "FRA: AdGuard Français",
- "lang": "ar br fr oc",
+ "lang": "ar br ff fr lb oc son",
"contentURL": "https://filters.adtidy.org/extension/ublock/filters/16.txt",
"supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters"
},
@@ -448,14 +505,6 @@
"contentURL": "https://easylist-downloads.adblockplus.org/easylistitaly.txt",
"supportURL": "https://forums.lanik.us/viewforum.php?f=96"
},
- "ITA-1": {
- "content": "filters",
- "group": "regions",
- "off": true,
- "title": "ITA: ABP X Files",
- "contentURL": "https://raw.githubusercontent.com/gioxx/xfiles/master/filtri.txt",
- "supportURL": "https://xfiles.noads.it/"
- },
"JPN-1": {
"content": "filters",
"group": "regions",
@@ -482,6 +531,11 @@
"title": "LTU: EasyList Lithuania",
"lang": "lt",
"contentURL": "https://raw.githubusercontent.com/EasyList-Lithuania/easylist_lithuania/master/easylistlithuania.txt",
+ "cdnURLs": [
+ "https://gitcdn.xyz/repo/EasyList-Lithuania/easylist_lithuania/master/easylistlithuania.txt",
+ "https://cdn.jsdelivr.net/gh/EasyList-Lithuania/easylist_lithuania@master/easylistlithuania.txt",
+ "https://cdn.statically.io/gl/DandelionSprout/easylist_lithuania/raw/master/easylistlithuania.txt"
+ ],
"supportURL": "https://github.com/EasyList-Lithuania/easylist_lithuania"
},
"LVA-0": {
@@ -497,10 +551,10 @@
"content": "filters",
"group": "regions",
"off": true,
- "title": "NLD: EasyList Dutch",
+ "title": "NLD: EasyDutch",
"lang": "af fy nl",
- "contentURL": "https://easylist-downloads.adblockplus.org/easylistdutch.txt",
- "supportURL": "https://forums.lanik.us/viewforum.php?f=100"
+ "contentURL": "https://raw.githubusercontent.com/EasyDutch-uBO/EasyDutch/main/EasyDutch.txt",
+ "supportURL": "https://github.com/EasyDutch-uBO/EasyDutch/"
},
"NOR-0": {
"content": "filters",
@@ -509,8 +563,12 @@
"title": "NOR, DNK, ISL: Dandelion Sprouts nordiske filtre",
"lang": "nb nn no da is",
"contentURL": [
- "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianList.txt",
- "https://repo.or.cz/FilterMirrorRepo.git/blob_plain/refs/heads/master:/NorwegianList.txt"
+ "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianList.txt"
+ ],
+ "cdnURLs": [
+ "https://gitcdn.xyz/repo/DandelionSprout/adfilt/master/NorwegianList.txt",
+ "https://cdn.jsdelivr.net/gh/DandelionSprout/adfilt@master/NorwegianList.txt",
+ "https://cdn.statically.io/gl/DandelionSprout/adfilt/master/NorwegianList.txt"
],
"supportURL": "https://github.com/DandelionSprout/adfilt"
},
@@ -519,7 +577,7 @@
"group": "regions",
"off": true,
"title": "POL: Oficjalne Polskie Filtry do AdBlocka, uBlocka Origin i AdGuarda",
- "lang": "pl",
+ "lang": "szl pl",
"contentURL": "https://raw.githubusercontent.com/MajkiIT/polish-ads-filter/master/polish-adblock-filters/adblock.txt",
"supportURL": "https://github.com/MajkiIT/polish-ads-filter/issues",
"instructionURL": "https://github.com/MajkiIT/polish-ads-filter#polish-filters-for-adblock-ublock-origin--adguard"
@@ -529,7 +587,7 @@
"group": "regions",
"off": true,
"title": "POL: Oficjalne polskie filtry przeciwko alertom o Adblocku",
- "lang": "pl",
+ "lang": "szl pl",
"contentURL": "https://raw.githubusercontent.com/olegwukr/polish-privacy-filters/master/anti-adblock.txt",
"supportURL": "https://github.com/olegwukr/polish-privacy-filters/issues"
},
@@ -550,7 +608,7 @@
"group": "regions",
"off": true,
"title": "RUS: RU AdList",
- "lang": "be kk ru uk uz",
+ "lang": "be kk tt ru uk uz",
"contentURL": "https://easylist-downloads.adblockplus.org/advblock+cssfixes.txt",
"supportURL": "https://forums.lanik.us/viewforum.php?f=102",
"instructionURL": "https://forums.lanik.us/viewtopic.php?f=102&t=22512"
@@ -560,7 +618,7 @@
"group": "regions",
"off": true,
"title": "spa: EasyList Spanish",
- "lang": "an ast ca es eu gl",
+ "lang": "an ast ca cak es eu gn gl trs quz",
"contentURL": "https://easylist-downloads.adblockplus.org/easylistspanish.txt",
"supportURL": "https://forums.lanik.us/viewforum.php?f=103"
},
@@ -569,7 +627,7 @@
"group": "regions",
"off": true,
"title": "spa, por: AdGuard Spanish/Portuguese",
- "lang": "an ast ca es eu gl pt",
+ "lang": "an ast ca cak es eu gl gn trs pt quz",
"contentURL": "https://filters.adtidy.org/extension/ublock/filters/9.txt",
"supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters",
"instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters"
diff -Nru ublock-origin-1.37.0+dfsg/assets/resources/scriptlets.js ublock-origin-1.42.0+dfsg/assets/resources/scriptlets.js
--- ublock-origin-1.37.0+dfsg/assets/resources/scriptlets.js 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/assets/resources/scriptlets.js 2022-05-06 01:15:22.000000000 +0000
@@ -723,6 +723,27 @@
})();
+/// refresh-defuser.js
+// https://www.reddit.com/r/uBlockOrigin/comments/q0frv0/while_reading_a_sports_article_i_was_redirected/hf7wo9v/
+(function() {
+ const arg1 = '{{1}}';
+ const defuse = ( ) => {
+ const meta = document.querySelector('meta[http-equiv="refresh" i][content]');
+ if ( meta === null ) { return; }
+ const s = arg1 === '' || arg1 === '{{1}}'
+ ? meta.getAttribute('content')
+ : arg1;
+ const ms = Math.max(parseFloat(s) || 0, 0) * 1000;
+ setTimeout(( ) => { window.stop(); }, ms);
+ };
+ if ( document.readyState === 'loading' ) {
+ document.addEventListener('DOMContentLoaded', defuse, { once: true });
+ } else {
+ defuse();
+ }
+})();
+
+
/// remove-attr.js
/// alias ra.js
(function() {
@@ -767,7 +788,7 @@
rmattr();
if ( /\bstay\b/.test(behavior) === false ) { return; }
const observer = new MutationObserver(mutationHandler);
- observer.observe(document.documentElement, {
+ observer.observe(document, {
attributes: true,
attributeFilter: tokens,
childList: true,
@@ -826,7 +847,7 @@
rmclass();
if ( /\bstay\b/.test(behavior) === false ) { return; }
const observer = new MutationObserver(mutationHandler);
- observer.observe(document.documentElement, {
+ observer.observe(document, {
attributes: true,
attributeFilter: [ 'class' ],
childList: true,
@@ -924,7 +945,7 @@
const odesc = Object.getOwnPropertyDescriptor(owner, prop);
let prevGetter, prevSetter;
if ( odesc instanceof Object ) {
- if ( odesc.configurable === false ) { return; }
+ owner[prop] = cValue;
if ( odesc.get instanceof Function ) {
prevGetter = odesc.get;
}
@@ -932,21 +953,24 @@
prevSetter = odesc.set;
}
}
- Object.defineProperty(owner, prop, {
- configurable,
- get() {
- if ( prevGetter !== undefined ) {
- prevGetter();
- }
- return handler.getter(); // cValue
- },
- set(a) {
- if ( prevSetter !== undefined ) {
- prevSetter(a);
+ try {
+ Object.defineProperty(owner, prop, {
+ configurable,
+ get() {
+ if ( prevGetter !== undefined ) {
+ prevGetter();
+ }
+ return handler.getter(); // cValue
+ },
+ set(a) {
+ if ( prevSetter !== undefined ) {
+ prevSetter(a);
+ }
+ handler.setter(a);
}
- handler.setter(a);
- }
- });
+ });
+ } catch(ex) {
+ }
};
const trapChain = function(owner, chain) {
const pos = chain.indexOf('.');
@@ -1165,6 +1189,111 @@
})();
+/// no-xhr-if.js
+(function() {
+ const xhrInstances = new WeakMap();
+ let arg1 = '{{1}}';
+ if ( arg1 === '{{1}}' ) { arg1 = ''; }
+ const needles = [];
+ for ( const condition of arg1.split(/\s+/) ) {
+ if ( condition === '' ) { continue; }
+ const pos = condition.indexOf(':');
+ let key, value;
+ if ( pos !== -1 ) {
+ key = condition.slice(0, pos);
+ value = condition.slice(pos + 1);
+ } else {
+ key = 'url';
+ value = condition;
+ }
+ if ( value === '' ) {
+ value = '^';
+ } else if ( value.startsWith('/') && value.endsWith('/') ) {
+ value = value.slice(1, -1);
+ } else {
+ value = value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
+ }
+ needles.push({ key, re: new RegExp(value) });
+ }
+ const log = needles.length === 0 ? console.log.bind(console) : undefined;
+ self.XMLHttpRequest = class extends self.XMLHttpRequest {
+ open(...args) {
+ if ( log !== undefined ) {
+ log(`uBO: xhr.open(${args.join(', ')})`);
+ } else {
+ const argNames = [ 'method', 'url' ];
+ const haystack = new Map();
+ for ( let i = 0; i < args.length && i < argNames.length; i++ ) {
+ haystack.set(argNames[i], args[i]);
+ }
+ if ( haystack.size !== 0 ) {
+ let matches = true;
+ for ( const { key, re } of needles ) {
+ matches = re.test(haystack.get(key) || '');
+ if ( matches === false ) { break; }
+ }
+ if ( matches ) {
+ xhrInstances.set(this, haystack);
+ }
+ }
+ }
+ return super.open(...args);
+ }
+ send(...args) {
+ const haystack = xhrInstances.get(this);
+ if ( haystack === undefined ) {
+ return super.send(...args);
+ }
+ Object.defineProperties(this, {
+ readyState: { value: 4, writable: false },
+ response: { value: '', writable: false },
+ responseText: { value: '', writable: false },
+ responseURL: { value: haystack.get('url'), writable: false },
+ responseXML: { value: '', writable: false },
+ status: { value: 200, writable: false },
+ statusText: { value: 'OK', writable: false },
+ });
+ if ( this.onreadystatechange !== null ) {
+ setTimeout(( ) => {
+ const ev = new Event('readystatechange');
+ this.onreadystatechange.call(this, ev);
+ }, 1);
+ }
+ if ( this.onload !== null ) {
+ setTimeout(( ) => {
+ const ev = new Event('load');
+ this.onload.call(this, ev);
+ }, 1);
+ }
+ }
+ };
+})();
+
+
+// https://github.com/uBlockOrigin/uAssets/issues/10323#issuecomment-992312847
+// https://github.com/AdguardTeam/Scriptlets/issues/158
+/// window-close-if.js
+(function() {
+ const arg1 = '{{1}}';
+ let reStr;
+ if ( arg1 === '{{1}}' || arg1 === '' ) {
+ reStr = '^';
+ } else if ( arg1.startsWith('/') && arg1.endsWith('/') ) {
+ reStr = arg1.slice(1, -1);
+ } else {
+ reStr = arg1.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
+ }
+ try {
+ const re = new RegExp(reStr);
+ if ( re.test(`${window.location.pathname}${window.location.search}`) ) {
+ window.close();
+ }
+ } catch(ex) {
+ console.log(ex);
+ }
+})();
+
+
// https://github.com/gorhill/uBlock/issues/1228
/// window.name-defuser
(function() {
@@ -1429,63 +1558,62 @@
/// damoh-defuser.js
(function() {
- var handled = new WeakSet();
- var asyncTimer;
- var cleanVideo = function() {
+ const handled = new WeakSet();
+ let asyncTimer;
+ const cleanVideo = function() {
asyncTimer = undefined;
- var v = document.querySelector('video');
+ const v = document.querySelector('video');
if ( v === null ) { return; }
if ( handled.has(v) ) { return; }
handled.add(v);
v.pause();
v.controls = true;
- var el = v.querySelector('meta[itemprop="contentURL"][content]');
+ let el = v.querySelector('meta[itemprop="contentURL"][content]');
if ( el === null ) { return; }
v.src = el.getAttribute('content');
el = v.querySelector('meta[itemprop="thumbnailUrl"][content]');
if ( el !== null ) { v.poster = el.getAttribute('content'); }
};
- var cleanVideoAsync = function() {
+ const cleanVideoAsync = function() {
if ( asyncTimer !== undefined ) { return; }
asyncTimer = window.requestAnimationFrame(cleanVideo);
};
- var observer = new MutationObserver(cleanVideoAsync);
- observer.observe(document.documentElement, { childList: true, subtree: true });
+ const observer = new MutationObserver(cleanVideoAsync);
+ observer.observe(document, { childList: true, subtree: true });
})();
-// https://github.com/uBlockOrigin/uAssets/issues/5184
/// twitch-videoad.js
+// https://github.com/uBlockOrigin/uAssets/issues/5184
+// https://github.com/pixeltris/TwitchAdSolutions/commit/6be4c5313035
+// https://github.com/pixeltris/TwitchAdSolutions/commit/3d2883ea9e3a
+// https://github.com/pixeltris/TwitchAdSolutions/commit/7233b5fd2284
+// https://github.com/pixeltris/TwitchAdSolutions/commit/aad8946dab2b
(function() {
if ( /(^|\.)twitch\.tv$/.test(document.location.hostname) === false ) { return; }
- var realFetch = window.fetch;
- window.fetch = function(input) {
- if ( arguments.length >= 2 && typeof input === 'string' && input.includes('/access_token') ) {
- var url = new URL(arguments[0]);
- url.searchParams.delete('platform');
- arguments[0] = url.href;
+ window.fetch = new Proxy(window.fetch, {
+ apply: function(target, thisArg, args) {
+ const [ url, init ] = args;
+ if (
+ typeof url === 'string' &&
+ url.includes('gql') &&
+ init instanceof Object &&
+ init.headers instanceof Object &&
+ typeof init.body === 'string' &&
+ init.body.includes('PlaybackAccessToken') &&
+ init.body.includes('"isVod":true') === false
+ ) {
+ const { headers } = init;
+ if ( typeof headers['X-Device-Id'] === 'string' ) {
+ headers['X-Device-Id'] = 'twitch-web-wall-mason';
+ }
+ if ( typeof headers['Device-ID'] === 'string' ) {
+ headers['Device-ID'] = 'twitch-web-wall-mason';
+ }
+ }
+ return Reflect.apply(target, thisArg, args);
}
- return realFetch.apply(this, arguments);
- };
-})();
-
-
-// https://github.com/uBlockOrigin/uAssets/issues/2912
-/// fingerprint2.js
-(function() {
- let browserId = '';
- for ( let i = 0; i < 8; i++ ) {
- browserId += (Math.random() * 0x10000 + 0x1000 | 0).toString(16).slice(-4);
- }
- const fp2 = function(){};
- fp2.get = function(opts, cb) {
- if ( !cb ) { cb = opts; }
- setTimeout(( ) => { cb(browserId, []); }, 1);
- };
- fp2.prototype = {
- get: fp2.get
- };
- window.Fingerprint2 = fp2;
+ });
})();
diff -Nru ublock-origin-1.37.0+dfsg/debian/changelog ublock-origin-1.42.0+dfsg/debian/changelog
--- ublock-origin-1.37.0+dfsg/debian/changelog 2021-08-28 20:29:16.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/debian/changelog 2022-07-01 22:10:52.000000000 +0000
@@ -1,8 +1,36 @@
-ublock-origin (1.37.0+dfsg-1~deb10u1) buster; urgency=medium
+ublock-origin (1.42.0+dfsg-1~deb10u1) buster; urgency=medium
- * Backport to Debian 10 "Buster".
+ * Backport to Buster.
+ * Correct the mistake in debian/changelog and produce a valid changelog file.
+ (Closes: #996249)
- -- Markus Koschany Sat, 28 Aug 2021 22:29:16 +0200
+ -- Markus Koschany Sat, 02 Jul 2022 00:10:52 +0200
+
+ublock-origin (1.42.0+dfsg-1) unstable; urgency=medium
+
+ * New upstream version 1.42.0+dfsg.
+ - Fix FTBFS unexpected token get_local. (Closes: #1005502)
+
+ -- Markus Koschany Fri, 06 May 2022 03:17:53 +0200
+
+ublock-origin (1.40.2+dfsg-1) unstable; urgency=medium
+
+ * New upstream version 1.40.2+dfsg.
+
+ -- Markus Koschany Thu, 30 Dec 2021 23:12:02 +0100
+
+ublock-origin (1.39.0+dfsg-2) unstable; urgency=medium
+
+ * Fix debian/watch to detect new upstream releases.
+
+ -- Markus Koschany Fri, 26 Nov 2021 23:10:11 +0100
+
+ublock-origin (1.39.0+dfsg-1) unstable; urgency=medium
+
+ * New upstream version 1.39.0+dfsg.
+ * Skip the tests.
+
+ -- Markus Koschany Fri, 26 Nov 2021 22:34:21 +0100
ublock-origin (1.37.0+dfsg-1) unstable; urgency=medium
@@ -29,7 +57,6 @@
* Declare compliance with Debian Policy 4.5.1.
-- Markus Koschany Sat, 26 Dec 2020 20:48:03 +0100
->>>>>>> master
ublock-origin (1.30.0+dfsg-1) unstable; urgency=medium
diff -Nru ublock-origin-1.37.0+dfsg/debian/copyright ublock-origin-1.42.0+dfsg/debian/copyright
--- ublock-origin-1.37.0+dfsg/debian/copyright 2021-08-28 20:29:16.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/debian/copyright 2022-07-01 22:10:52.000000000 +0000
@@ -22,8 +22,8 @@
uAssets/thirdparties/someonewhocares.org
Files: *
-Copyright: (C) 2014-2019 The uBlock Origin authors
- (C) 2014-2021 Raymond Hill
+Copyright: (C) 2014-2022 The uBlock Origin authors
+ (C) 2014-2022 Raymond Hill
License: GPL-3+
Files: uAssets/thirdparties/easylist-downloads.adblockplus.org/easylist.txt
@@ -49,7 +49,7 @@
License: MIT
Files: src/lib/lz4/*
-Copyright: 2018, Raymond Hill
+Copyright: 2018-2021, Raymond Hill
License: BSD-2-clause
Files: src/css/fonts/Inter/*
@@ -99,7 +99,7 @@
Files: debian/*
Copyright: 2015 Matthew Bekkema
2016 Sean Whitton
- 2018-2021, Markus Koschany
+ 2018-2022, Markus Koschany
License: GPL-3+
Files: debian/upstream/*
diff -Nru ublock-origin-1.37.0+dfsg/debian/patches/disable-nonfree-filters-by-default.patch ublock-origin-1.42.0+dfsg/debian/patches/disable-nonfree-filters-by-default.patch
--- ublock-origin-1.37.0+dfsg/debian/patches/disable-nonfree-filters-by-default.patch 2021-08-28 20:29:16.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/debian/patches/disable-nonfree-filters-by-default.patch 2022-07-01 22:10:52.000000000 +0000
@@ -1,5 +1,5 @@
From: Markus Koschany
-Date: Thu, 27 Aug 2020 23:48:22 +0200
+Date: Fri, 6 May 2022 03:21:36 +0200
Subject: disable-nonfree-filters-by-default
---
@@ -7,11 +7,11 @@
1 file changed, 1 insertion(+)
diff --git a/assets/assets.json b/assets/assets.json
-index fff3902..eda141f 100644
+index d40b0db..4d81cd2 100644
--- a/assets/assets.json
+++ b/assets/assets.json
-@@ -246,6 +246,7 @@
- "supportURL": "https://winhelp2002.mvps.org/"
+@@ -343,6 +343,7 @@
+ "supportURL": "https://someonewhocares.org/hosts/"
},
"plowe-0": {
+ "off": true,
diff -Nru ublock-origin-1.37.0+dfsg/debian/patches/lz4-block-codec.wat.patch ublock-origin-1.42.0+dfsg/debian/patches/lz4-block-codec.wat.patch
--- ublock-origin-1.37.0+dfsg/debian/patches/lz4-block-codec.wat.patch 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/debian/patches/lz4-block-codec.wat.patch 2022-07-01 22:10:52.000000000 +0000
@@ -0,0 +1,2544 @@
+From: Markus Koschany
+Date: Fri, 6 May 2022 03:26:54 +0200
+Subject: lz4-block-codec.wat
+
+get_local is local.get now. Great.
+
+Bug-Debian: https://bugs.debian.org/1005502
+Forwarded: not yet
+---
+ src/js/wasm/biditrie.wat | 306 +++++++-------
+ src/js/wasm/hntrie.wat | 292 ++++++-------
+ src/lib/lz4/lz4-block-codec.wat | 462 ++++++++++-----------
+ src/lib/publicsuffixlist/wasm/publicsuffixlist.wat | 142 +++----
+ 4 files changed, 601 insertions(+), 601 deletions(-)
+
+diff --git a/src/js/wasm/biditrie.wat b/src/js/wasm/biditrie.wat
+index b98d879..ce0aa3c 100644
+--- a/src/js/wasm/biditrie.wat
++++ b/src/js/wasm/biditrie.wat
+@@ -64,92 +64,92 @@
+ (local $x i32)
+ (local $y i32)
+ ;; trie index is a uint32 offset, need to convert to uint8 offset
+- get_local $icell
++ local.get $icell
+ i32.const 2
+ i32.shl
+- set_local $icell
++ local.set $icell
+ ;; const buf32 = this.buf32;
+ ;; const buf8 = this.buf8;
+ ;; const char0 = buf32[CHAR0_SLOT];
+ i32.const 2060
+ i32.load align=4
+- set_local $char0
++ local.set $char0
+ ;; const aR = buf32[HAYSTACK_SIZE_SLOT];
+ i32.const 2048
+ i32.load align=4
+- set_local $aR
++ local.set $aR
+ ;; let al = ai;
+- get_local $ai
+- set_local $al
++ local.get $ai
++ local.set $al
+ block $matchFound
+ block $matchNotFound
+ ;; for (;;) {
+ loop $mainLoop
+ ;; x = buf8[al];
+- get_local $al
++ local.get $al
+ i32.load8_u
+- set_local $x
++ local.set $x
+ ;; al += 1;
+- get_local $al
++ local.get $al
+ i32.const 1
+ i32.add
+- set_local $al
++ local.set $al
+ ;; // find matching segment
+ ;; for (;;) {
+ block $nextSegment loop $findSegment
+ ;; y = buf32[icell+SEGMENT_INFO];
+- get_local $icell
++ local.get $icell
+ i32.load offset=8 align=4
+- tee_local $y
++ local.tee $y
+ ;; bl = char0 + (y & 0x00FFFFFF);
+ i32.const 0x00FFFFFF
+ i32.and
+- get_local $char0
++ local.get $char0
+ i32.add
+- tee_local $bl
++ local.tee $bl
+ ;; if ( buf8[bl] === x ) {
+ i32.load8_u
+- get_local $x
++ local.get $x
+ i32.eq
+ if
+ ;; y = (y >>> 24) - 1;
+- get_local $y
++ local.get $y
+ i32.const 24
+ i32.shr_u
+ i32.const 1
+ i32.sub
+- tee_local $y
++ local.tee $y
+ ;; if ( n !== 0 ) {
+ if
+ ;; x = al + y;
+- get_local $y
+- get_local $al
++ local.get $y
++ local.get $al
+ i32.add
+- tee_local $x
++ local.tee $x
+ ;; if ( x > aR ) { return 0; }
+- get_local $aR
++ local.get $aR
+ i32.gt_u
+ br_if $matchNotFound
+ ;; for (;;) {
+ loop
+ ;; bl += 1;
+- get_local $bl
++ local.get $bl
+ i32.const 1
+ i32.add
+- tee_local $bl
++ local.tee $bl
+ ;; if ( buf8[bl] !== buf8[al] ) { return 0; }
+ i32.load8_u
+- get_local $al
++ local.get $al
+ i32.load8_u
+ i32.ne
+ br_if $matchNotFound
+ ;; al += 1;
+- get_local $al
++ local.get $al
+ i32.const 1
+ i32.add
+- tee_local $al
++ local.tee $al
+ ;; if ( al === x ) { break; }
+- get_local $x
++ local.get $x
+ i32.ne
+ br_if 0
+ end
+@@ -158,11 +158,11 @@
+ br $nextSegment
+ end
+ ;; icell = buf32[icell+CELL_OR];
+- get_local $icell
++ local.get $icell
+ i32.load offset=4 align=4
+ i32.const 2
+ i32.shl
+- tee_local $icell
++ local.tee $icell
+ ;; if ( icell === 0 ) { return 0; }
+ i32.eqz
+ br_if $matchNotFound
+@@ -171,14 +171,14 @@
+ end end
+ ;; // next segment
+ ;; icell = buf32[icell+CELL_AND];
+- get_local $icell
++ local.get $icell
+ i32.load align=4
+ i32.const 2
+ i32.shl
+- tee_local $icell
++ local.tee $icell
+ ;; const x = buf32[icell+BCELL_EXTRA];
+ i32.load offset=8 align=4
+- tee_local $x
++ local.tee $x
+ ;; if ( x <= BCELL_EXTRA_MAX ) {
+ i32.const 0x00FFFFFF
+ i32.le_u
+@@ -186,43 +186,43 @@
+ ;; if ( x !== 0 && this.matchesExtra(ai, al, x) !== 0 ) {
+ ;; return 1;
+ ;; }
+- get_local $x
++ local.get $x
+ if
+- get_local $ai
+- get_local $al
+- get_local $x
++ local.get $ai
++ local.get $al
++ local.get $x
+ call $matchesExtra
+ br_if $matchFound
+ end
+ ;; x = buf32[icell+BCELL_ALT_AND];
+- get_local $icell
++ local.get $icell
+ i32.load offset=4 align=4
+ i32.const 2
+ i32.shl
+- tee_local $x
++ local.tee $x
+ ;; if ( x !== 0 && this.matchesLeft(x, ai, al) !== 0 ) {
+ if
+- get_local $x
+- get_local $ai
+- get_local $al
++ local.get $x
++ local.get $ai
++ local.get $al
+ call $matchesLeft
+ br_if $matchFound
+ ;; }
+ end
+ ;; icell = buf32[icell+BCELL_NEXT_AND];
+- get_local $icell
++ local.get $icell
+ i32.load align=4
+ i32.const 2
+ i32.shl
+- tee_local $icell
++ local.tee $icell
+ ;; if ( icell === 0 ) { return 0; }
+ i32.eqz
+ br_if $matchNotFound
+ ;; }
+ end
+ ;; if ( al === aR ) { return 0; }
+- get_local $al
+- get_local $aR
++ local.get $al
++ local.get $aR
+ i32.ne
+ br_if $mainLoop
+ ;; }
+@@ -255,60 +255,60 @@
+ ;; const char0 = buf32[CHAR0_SLOT];
+ i32.const 2060
+ i32.load align=4
+- set_local $char0
++ local.set $char0
+ block $matchFound
+ block $matchNotFound
+ ;; for (;;) {
+ loop $mainLoop
+ ;; if ( ar === 0 ) { return 0; }
+- get_local $ar
++ local.get $ar
+ i32.eqz
+ br_if $matchNotFound
+ ;; ar -= 1;
+- get_local $ar
++ local.get $ar
+ i32.const 1
+ i32.sub
+- tee_local $ar
++ local.tee $ar
+ ;; x = buf8[ar];
+ i32.load8_u
+- set_local $x
++ local.set $x
+ ;; // find matching segment
+ ;; for (;;) {
+ block $nextSegment loop $findSegment
+ ;; y = buf32[icell+SEGMENT_INFO];
+- get_local $icell
++ local.get $icell
+ i32.load offset=8 align=4
+- tee_local $y
++ local.tee $y
+ ;; br = char0 + (y & 0x00FFFFFF);
+ i32.const 0x00FFFFFF
+ i32.and
+- get_local $char0
++ local.get $char0
+ i32.add
+- tee_local $br
++ local.tee $br
+ ;; y = (y >>> 24) - 1;
+- get_local $y
++ local.get $y
+ i32.const 24
+ i32.shr_u
+ i32.const 1
+ i32.sub
+- tee_local $y
++ local.tee $y
+ ;; br += y;
+ i32.add
+- tee_local $br
++ local.tee $br
+ ;; if ( buf8[br] === x ) {
+ i32.load8_u
+- get_local $x
++ local.get $x
+ i32.eq
+ if
+ ;; // all characters in segment must match
+ ;; if ( y !== 0 ) {
+- get_local $y
++ local.get $y
+ if
+ ;; x = ar - y;
+- get_local $ar
+- get_local $y
++ local.get $ar
++ local.get $y
+ i32.sub
+- tee_local $x
++ local.tee $x
+ ;; if ( x < 0 ) { return 0; }
+ i32.const 0
+ i32.lt_s
+@@ -317,21 +317,21 @@
+ loop
+ ;; ar -= 1; br -= 1;
+ ;; if ( buf8[ar] !== buf8[br] ) { return 0; }
+- get_local $ar
++ local.get $ar
+ i32.const 1
+ i32.sub
+- tee_local $ar
++ local.tee $ar
+ i32.load8_u
+- get_local $br
++ local.get $br
+ i32.const 1
+ i32.sub
+- tee_local $br
++ local.tee $br
+ i32.load8_u
+ i32.ne
+ br_if $matchNotFound
+ ;; if ( ar === x ) { break; }
+- get_local $ar
+- get_local $x
++ local.get $ar
++ local.get $x
+ i32.ne
+ br_if 0
+ end
+@@ -340,11 +340,11 @@
+ br $nextSegment
+ end
+ ;; icell = buf32[icell+CELL_OR];
+- get_local $icell
++ local.get $icell
+ i32.load offset=4 align=4
+ i32.const 2
+ i32.shl
+- tee_local $icell
++ local.tee $icell
+ ;; if ( icell === 0 ) { return 0; }
+ i32.eqz
+ br_if $matchNotFound
+@@ -353,14 +353,14 @@
+ end end
+ ;; // next segment
+ ;; icell = buf32[icell+CELL_AND];
+- get_local $icell
++ local.get $icell
+ i32.load align=4
+ i32.const 2
+ i32.shl
+- tee_local $icell
++ local.tee $icell
+ ;; const x = buf32[icell+BCELL_EXTRA];
+ i32.load offset=8 align=4
+- tee_local $x
++ local.tee $x
+ ;; if ( x <= BCELL_EXTRA_MAX ) {
+ i32.const 0x00FFFFFF
+ i32.le_u
+@@ -368,20 +368,20 @@
+ ;; if ( x !== 0 && this.matchesExtra(ar, r, x) !== 0 ) {
+ ;; return 1;
+ ;; }
+- get_local $x
++ local.get $x
+ if
+- get_local $ar
+- get_local $r
+- get_local $x
++ local.get $ar
++ local.get $r
++ local.get $x
+ call $matchesExtra
+ br_if $matchFound
+ end
+ ;; icell = buf32[icell+BCELL_NEXT_AND];
+- get_local $icell
++ local.get $icell
+ i32.load align=4
+ i32.const 2
+ i32.shl
+- tee_local $icell
++ local.tee $icell
+ ;; if ( icell === 0 ) { return 0; }
+ i32.eqz
+ br_if $matchNotFound
+@@ -414,35 +414,35 @@
+ ;; if ( ix !== 1 ) {
+ ;; const iu = this.extraHandler(l, r, ix);
+ ;; if ( iu === 0 ) { return 0; }
+- get_local $ix
++ local.get $ix
+ i32.const 1
+ i32.ne
+ if
+- get_local $l
+- get_local $r
+- get_local $ix
++ local.get $l
++ local.get $r
++ local.get $ix
+ call $extraHandler
+- tee_local $iu
++ local.tee $iu
+ i32.eqz
+ br_if $fail
+ ;; } else {
+ ;; iu = -1;
+ else
+ i32.const -1
+- set_local $iu
++ local.set $iu
+ ;; }
+ end
+ ;; this.buf32[RESULT_IU_SLOT] = iu;
+ i32.const 2076
+- get_local $iu
++ local.get $iu
+ i32.store align=4
+ ;; this.buf32[RESULT_L_SLOT] = l;
+ i32.const 2068
+- get_local $l
++ local.get $l
+ i32.store align=4
+ ;; this.buf32[RESULT_R_SLOT] = r;
+ i32.const 2072
+- get_local $r
++ local.get $r
+ i32.store align=4
+ end ;; $succeed
+ i32.const 1
+@@ -470,49 +470,49 @@
+ ;; if ( haystackLeft < 0 || (haystackLeft + needleLen) > haystackRight ) {
+ ;; return 0;
+ ;; }
+- get_local $haystackLeft
++ local.get $haystackLeft
+ i32.const 0
+ i32.lt_s
+ br_if $fail
+- get_local $haystackLeft
+- get_local $needleLen
++ local.get $haystackLeft
++ local.get $needleLen
+ i32.add
+- get_local $haystackRight
++ local.get $haystackRight
+ i32.gt_u
+ br_if $fail
+ ;; const charCodes = this.buf8;
+ ;; needleLeft += this.buf32[CHAR0_SLOT];
+- get_local $needleLeft
++ local.get $needleLeft
+ i32.const 2060 ;; CHAR0_SLOT memory address
+ i32.load align=4 ;; CHAR0 memory address
+ i32.add ;; needle memory address
+- tee_local $needleLeft
++ local.tee $needleLeft
+ ;; const needleRight = needleLeft + needleLen;
+- get_local $needleLen
++ local.get $needleLen
+ i32.add
+- set_local $needleRight
++ local.set $needleRight
+ ;; while ( charCodes[haystackLeft] === charCodes[needleLeft] ) {
+ loop $compare
+- get_local $haystackLeft
++ local.get $haystackLeft
+ i32.load8_u
+- get_local $needleLeft
++ local.get $needleLeft
+ i32.load8_u
+ i32.ne
+ br_if $fail
+ ;; needleLeft += 1;
+- get_local $needleLeft
++ local.get $needleLeft
+ i32.const 1
+ i32.add
+- tee_local $needleLeft
++ local.tee $needleLeft
+ ;; if ( needleLeft === needleRight ) { return 1; }
+- get_local $needleRight
++ local.get $needleRight
+ i32.eq
+ br_if $succeed
+ ;; haystackLeft += 1;
+ i32.const 1
+- get_local $haystackLeft
++ local.get $haystackLeft
+ i32.add
+- set_local $haystackLeft
++ local.set $haystackLeft
+ br $compare
+ end
+ ;; }
+@@ -545,76 +545,76 @@
+ block $fail
+ block $succeed
+ ;; if ( needleLen === 0 ) { return haystackLeft; }
+- get_local $needleLen
++ local.get $needleLen
+ i32.eqz
+ br_if $succeed
+ ;; haystackEnd -= needleLen;
+- get_local $haystackEnd
+- get_local $needleLen
++ local.get $haystackEnd
++ local.get $needleLen
+ i32.sub
+- tee_local $haystackEnd
++ local.tee $haystackEnd
+ ;; if ( haystackEnd < haystackLeft ) { return -1; }
+- get_local $haystackLeft
++ local.get $haystackLeft
+ i32.lt_s
+ br_if $fail
+ ;; needleLeft += this.buf32[CHAR0_SLOT];
+- get_local $needleLeft
++ local.get $needleLeft
+ i32.const 2060 ;; CHAR0_SLOT memory address
+ i32.load align=4 ;; CHAR0 memory address
+ i32.add ;; needle memory address
+- tee_local $needleLeft
++ local.tee $needleLeft
+ ;; const needleRight = needleLeft + needleLen;
+- get_local $needleLen
++ local.get $needleLen
+ i32.add
+- set_local $needleRight
++ local.set $needleRight
+ ;; const charCodes = this.buf8;
+ ;; for (;;) {
+ loop $mainLoop
+ ;; let i = haystackLeft;
+ ;; let j = needleLeft;
+- get_local $haystackLeft
+- set_local $i
+- get_local $needleLeft
+- set_local $j
++ local.get $haystackLeft
++ local.set $i
++ local.get $needleLeft
++ local.set $j
+ ;; while ( charCodes[i] === charCodes[j] ) {
+ block $breakMatchChars loop $matchChars
+- get_local $i
++ local.get $i
+ i32.load8_u
+- get_local $j
++ local.get $j
+ i32.load8_u
+ i32.ne
+ br_if $breakMatchChars
+ ;; j += 1;
+- get_local $j
++ local.get $j
+ i32.const 1
+ i32.add
+- tee_local $j
++ local.tee $j
+ ;; if ( j === needleRight ) { return haystackLeft; }
+- get_local $needleRight
++ local.get $needleRight
+ i32.eq
+ br_if $succeed
+ ;; i += 1;
+- get_local $i
++ local.get $i
+ i32.const 1
+ i32.add
+- set_local $i
++ local.set $i
+ br $matchChars
+ ;; }
+ end end
+ ;; haystackLeft += 1;
+- get_local $haystackLeft
++ local.get $haystackLeft
+ i32.const 1
+ i32.add
+- tee_local $haystackLeft
++ local.tee $haystackLeft
+ ;; if ( haystackLeft > haystackEnd ) { break; }
+- get_local $haystackEnd
++ local.get $haystackEnd
+ i32.gt_u
+ br_if $fail
+ br $mainLoop
+ ;; }
+ end
+ end ;; $succeed
+- get_local $haystackLeft
++ local.get $haystackLeft
+ return
+ end ;; $fail
+ ;; return -1;
+@@ -640,82 +640,82 @@
+ (local $j i32)
+ (local $c0 i32)
+ ;; if ( needleLen === 0 ) { return haystackBeg; }
+- get_local $needleLen
++ local.get $needleLen
+ i32.eqz
+ if
+- get_local $haystackBeg
++ local.get $haystackBeg
+ return
+ end
+ block $fail
+ block $succeed
+ ;; let haystackLeft = haystackEnd - needleLen;
+- get_local $haystackEnd
+- get_local $needleLen
++ local.get $haystackEnd
++ local.get $needleLen
+ i32.sub
+- tee_local $haystackLeft
++ local.tee $haystackLeft
+ ;; if ( haystackLeft < haystackBeg ) { return -1; }
+- get_local $haystackBeg
++ local.get $haystackBeg
+ i32.lt_s
+ br_if $fail
+ ;; needleLeft += this.buf32[CHAR0_SLOT];
+- get_local $needleLeft
++ local.get $needleLeft
+ i32.const 2060 ;; CHAR0_SLOT memory address
+ i32.load align=4 ;; CHAR0 memory address
+ i32.add ;; needle memory address
+- tee_local $needleLeft
++ local.tee $needleLeft
+ ;; const needleRight = needleLeft + needleLen;
+- get_local $needleLen
++ local.get $needleLen
+ i32.add
+- set_local $needleRight
++ local.set $needleRight
+ ;; const charCodes = this.buf8;
+ ;; for (;;) {
+ loop $mainLoop
+ ;; let i = haystackLeft;
+ ;; let j = needleLeft;
+- get_local $haystackLeft
+- set_local $i
+- get_local $needleLeft
+- set_local $j
++ local.get $haystackLeft
++ local.set $i
++ local.get $needleLeft
++ local.set $j
+ ;; while ( charCodes[i] === charCodes[j] ) {
+ block $breakMatchChars loop $matchChars
+- get_local $i
++ local.get $i
+ i32.load8_u
+- get_local $j
++ local.get $j
+ i32.load8_u
+ i32.ne
+ br_if $breakMatchChars
+ ;; j += 1;
+- get_local $j
++ local.get $j
+ i32.const 1
+ i32.add
+- tee_local $j
++ local.tee $j
+ ;; if ( j === needleRight ) { return haystackLeft; }
+- get_local $needleRight
++ local.get $needleRight
+ i32.eq
+ br_if $succeed
+ ;; i += 1;
+- get_local $i
++ local.get $i
+ i32.const 1
+ i32.add
+- set_local $i
++ local.set $i
+ br $matchChars
+ ;; }
+ end end
+ ;; if ( haystackLeft === haystackBeg ) { break; }
+ ;; haystackLeft -= 1;
+- get_local $haystackLeft
+- get_local $haystackBeg
++ local.get $haystackLeft
++ local.get $haystackBeg
+ i32.eq
+ br_if $fail
+- get_local $haystackLeft
++ local.get $haystackLeft
+ i32.const 1
+ i32.sub
+- set_local $haystackLeft
++ local.set $haystackLeft
+ br $mainLoop
+ ;; }
+ end
+ end ;; $succeed
+- get_local $haystackLeft
++ local.get $haystackLeft
+ return
+ end ;; $fail
+ ;; return -1;
+diff --git a/src/js/wasm/hntrie.wat b/src/js/wasm/hntrie.wat
+index cb62b4c..2bcc46f 100644
+--- a/src/js/wasm/hntrie.wat
++++ b/src/js/wasm/hntrie.wat
+@@ -64,19 +64,19 @@
+ ;;
+ i32.const 264 ;; start of char section is stored at addr 264
+ i32.load
+- set_local $char0
++ local.set $char0
+ ;; let ineedle = this.buf[255];
+ i32.const 255 ;; addr of needle is stored at addr 255
+ i32.load8_u
+- set_local $ineedle
++ local.set $ineedle
+ ;; let icell = this.buf32[iroot+0];
+- get_local $iroot
++ local.get $iroot
+ i32.const 2
+ i32.shl
+ i32.load
+ i32.const 2
+ i32.shl
+- tee_local $icell
++ local.tee $icell
+ ;; if ( icell === 0 ) { return -1; }
+ i32.eqz
+ if
+@@ -86,43 +86,43 @@
+ ;; for (;;) {
+ block $noSegment loop $nextSegment
+ ;; if ( ineedle === 0 ) { return -1; }
+- get_local $ineedle
++ local.get $ineedle
+ i32.eqz
+ if
+ i32.const -1
+ return
+ end
+ ;; ineedle -= 1;
+- get_local $ineedle
++ local.get $ineedle
+ i32.const -1
+ i32.add
+- tee_local $ineedle
++ local.tee $ineedle
+ ;; let c = this.buf[ineedle];
+ i32.load8_u
+- set_local $c
++ local.set $c
+ ;; for (;;) {
+ block $foundSegment loop $findSegment
+ ;; v = this.buf32[icell+2];
+- get_local $icell
++ local.get $icell
+ i32.load offset=8
+- tee_local $v
++ local.tee $v
+ ;; i0 = char0 + (v >>> 8);
+ i32.const 8
+ i32.shr_u
+- get_local $char0
++ local.get $char0
+ i32.add
+- tee_local $i0
++ local.tee $i0
+ ;; if ( this.buf[i0] === c ) { break; }
+ i32.load8_u
+- get_local $c
++ local.get $c
+ i32.eq
+ br_if $foundSegment
+ ;; icell = this.buf32[icell+0];
+- get_local $icell
++ local.get $icell
+ i32.load
+ i32.const 2
+ i32.shl
+- tee_local $icell
++ local.tee $icell
+ i32.eqz
+ if
+ i32.const -1
+@@ -131,44 +131,44 @@
+ br 0
+ end end
+ ;; let n = v & 0x7F;
+- get_local $v
++ local.get $v
+ i32.const 0x7F
+ i32.and
+- tee_local $n
++ local.tee $n
+ ;; if ( n > 1 ) {
+ i32.const 1
+ i32.gt_u
+ if
+ ;; n -= 1;
+- get_local $n
++ local.get $n
+ i32.const -1
+ i32.add
+- tee_local $n
++ local.tee $n
+ ;; if ( n > ineedle ) { return -1; }
+- get_local $ineedle
++ local.get $ineedle
+ i32.gt_u
+ if
+ i32.const -1
+ return
+ end
+- get_local $i0
++ local.get $i0
+ i32.const 1
+ i32.add
+- tee_local $i0
++ local.tee $i0
+ ;; const i1 = i0 + n;
+- get_local $n
++ local.get $n
+ i32.add
+- set_local $i1
++ local.set $i1
+ ;; do {
+ loop
+ ;; ineedle -= 1;
+- get_local $ineedle
++ local.get $ineedle
+ i32.const -1
+ i32.add
+- tee_local $ineedle
++ local.tee $ineedle
+ ;; if ( this.buf[i0] !== this.buf[ineedle] ) { return -1; }
+ i32.load8_u
+- get_local $i0
++ local.get $i0
+ i32.load8_u
+ i32.ne
+ if
+@@ -176,47 +176,47 @@
+ return
+ end
+ ;; i0 += 1;
+- get_local $i0
++ local.get $i0
+ i32.const 1
+ i32.add
+- tee_local $i0
++ local.tee $i0
+ ;; } while ( i0 < i1 );
+- get_local $i1
++ local.get $i1
+ i32.lt_u
+ br_if 0
+ end
+ end
+ ;; if ( (v & 0x80) !== 0 ) {
+- get_local $v
++ local.get $v
+ i32.const 0x80
+ i32.and
+ if
+ ;; if ( ineedle === 0 || buf8[ineedle-1] === 0x2E /* '.' */ ) {
+ ;; return ineedle;
+ ;; }
+- get_local $ineedle
++ local.get $ineedle
+ i32.eqz
+ if
+ i32.const 0
+ return
+ end
+- get_local $ineedle
++ local.get $ineedle
+ i32.const -1
+ i32.add
+ i32.load8_u
+ i32.const 0x2E
+ i32.eq
+ if
+- get_local $ineedle
++ local.get $ineedle
+ return
+ end
+ end
+ ;; icell = this.buf32[icell+1];
+- get_local $icell
++ local.get $icell
+ i32.load offset=4
+ i32.const 2
+ i32.shl
+- tee_local $icell
++ local.tee $icell
+ ;; if ( icell === 0 ) { break; }
+ br_if 0
+ end end
+@@ -245,7 +245,7 @@
+ ;; let lhnchar = this.buf[255];
+ i32.const 255
+ i32.load8_u
+- tee_local $lhnchar
++ local.tee $lhnchar
+ ;; if ( lhnchar === 0 ) { return 0; }
+ i32.eqz
+ if
+@@ -281,21 +281,21 @@
+ end
+ end
+ ;; let icell = this.buf32[iroot+0];
+- get_local $iroot
++ local.get $iroot
+ i32.const 2
+ i32.shl
+- tee_local $iroot
++ local.tee $iroot
+ i32.load
+ i32.const 2
+ i32.shl
+- tee_local $icell
++ local.tee $icell
+ ;; if ( this.buf32[icell+2] === 0 ) {
+ i32.eqz
+ if
+ ;; this.buf32[iroot+0] = this.addLeafCell(lhnchar);
+ ;; return 1;
+- get_local $iroot
+- get_local $lhnchar
++ local.get $iroot
++ local.get $lhnchar
+ call $addLeafCell
+ i32.store
+ i32.const 1
+@@ -304,37 +304,37 @@
+ ;; const char0 = this.buf32[HNBIGTRIE_CHAR0_SLOT];
+ i32.const 264
+ i32.load
+- set_local $char0
++ local.set $char0
+ ;; for (;;) {
+ loop $nextSegment
+ ;; const v = this.buf32[icell+2];
+- get_local $icell
++ local.get $icell
+ i32.load offset=8
+- tee_local $v
++ local.tee $v
+ ;; let isegchar0 = char0 + (v >>> 8);
+ i32.const 8
+ i32.shr_u
+- get_local $char0
++ local.get $char0
+ i32.add
+- tee_local $isegchar0
++ local.tee $isegchar0
+ ;; if ( this.buf[isegchar0] !== this.buf[lhnchar-1] ) {
+ i32.load8_u
+- get_local $lhnchar
++ local.get $lhnchar
+ i32.const -1
+ i32.add
+ i32.load8_u
+ i32.ne
+ if
+ ;; inext = this.buf32[icell+0];
+- get_local $icell
++ local.get $icell
+ i32.load
+- tee_local $inext
++ local.tee $inext
+ ;; if ( inext === 0 ) {
+ i32.eqz
+ if
+ ;; this.buf32[icell+0] = this.addLeafCell(lhnchar);
+- get_local $icell
+- get_local $lhnchar
++ local.get $icell
++ local.get $lhnchar
+ call $addLeafCell
+ i32.store
+ ;; return 1;
+@@ -342,25 +342,25 @@
+ return
+ end
+ ;; icell = inext;
+- get_local $inext
++ local.get $inext
+ i32.const 2
+ i32.shl
+- set_local $icell
++ local.set $icell
+ br $nextSegment
+ end
+ ;; let isegchar = 1;
+ i32.const 1
+- set_local $isegchar
++ local.set $isegchar
+ ;; lhnchar -= 1;
+- get_local $lhnchar
++ local.get $lhnchar
+ i32.const -1
+ i32.add
+- set_local $lhnchar
++ local.set $lhnchar
+ ;; const lsegchar = v & 0x7F;
+- get_local $v
++ local.get $v
+ i32.const 0x7F
+ i32.and
+- tee_local $lsegchar
++ local.tee $lsegchar
+ ;; if ( lsegchar !== 1 ) {
+ i32.const 1
+ i32.ne
+@@ -368,69 +368,69 @@
+ ;; for (;;) {
+ block $mismatch loop
+ ;; if ( isegchar === lsegchar ) { break; }
+- get_local $isegchar
+- get_local $lsegchar
++ local.get $isegchar
++ local.get $lsegchar
+ i32.eq
+ br_if $mismatch
+- get_local $lhnchar
++ local.get $lhnchar
+ i32.eqz
+ br_if $mismatch
+ ;; if ( this.buf[isegchar0+isegchar] !== this.buf[lhnchar-1] ) { break; }
+- get_local $isegchar0
+- get_local $isegchar
++ local.get $isegchar0
++ local.get $isegchar
+ i32.add
+ i32.load8_u
+- get_local $lhnchar
++ local.get $lhnchar
+ i32.const -1
+ i32.add
+ i32.load8_u
+ i32.ne
+ br_if $mismatch
+ ;; isegchar += 1;
+- get_local $isegchar
++ local.get $isegchar
+ i32.const 1
+ i32.add
+- set_local $isegchar
++ local.set $isegchar
+ ;; lhnchar -= 1;
+- get_local $lhnchar
++ local.get $lhnchar
+ i32.const -1
+ i32.add
+- set_local $lhnchar
++ local.set $lhnchar
+ br 0
+ end end
+ end
+ ;; const boundaryBit = v & 0x80;
+- get_local $v
++ local.get $v
+ i32.const 0x80
+ i32.and
+- set_local $boundaryBit
++ local.set $boundaryBit
+ ;; if ( isegchar === lsegchar ) {
+- get_local $isegchar
+- get_local $lsegchar
++ local.get $isegchar
++ local.get $lsegchar
+ i32.eq
+ if
+ ;; if ( lhnchar === 0 ) {
+- get_local $lhnchar
++ local.get $lhnchar
+ i32.eqz
+ if
+ ;; if ( boundaryBit !== 0 ) { return 0; }
+- get_local $boundaryBit
++ local.get $boundaryBit
+ if
+ i32.const 0
+ return
+ end
+ ;; this.buf32[icell+2] = v | 0x80;
+- get_local $icell
+- get_local $v
++ local.get $icell
++ local.get $v
+ i32.const 0x80
+ i32.or
+ i32.store offset=8
+ else
+ ;; if ( boundaryBit !== 0 ) {
+- get_local $boundaryBit
++ local.get $boundaryBit
+ if
+ ;; if ( this.buf[lhnchar-1] === 0x2E /* '.' */ ) { return -1; }
+- get_local $lhnchar
++ local.get $lhnchar
+ i32.const -1
+ i32.add
+ i32.load8_u
+@@ -442,36 +442,36 @@
+ end
+ end
+ ;; inext = this.buf32[icell+1];
+- get_local $icell
++ local.get $icell
+ i32.load offset=4
+- tee_local $inext
++ local.tee $inext
+ ;; if ( inext !== 0 ) {
+ if
+ ;; icell = inext;
+- get_local $inext
++ local.get $inext
+ i32.const 2
+ i32.shl
+- set_local $icell
++ local.set $icell
+ ;; continue;
+ br $nextSegment
+ end
+ ;; this.buf32[icell+1] = this.addLeafCell(lhnchar);
+- get_local $icell
+- get_local $lhnchar
++ local.get $icell
++ local.get $lhnchar
+ call $addLeafCell
+ i32.store offset=4
+ end
+ else
+ ;; isegchar0 -= char0;
+- get_local $icell
+- get_local $isegchar0
+- get_local $char0
++ local.get $icell
++ local.get $isegchar0
++ local.get $char0
+ i32.sub
+- tee_local $isegchar0
++ local.tee $isegchar0
+ ;; this.buf32[icell+2] = isegchar0 << 8 | isegchar;
+ i32.const 8
+ i32.shl
+- get_local $isegchar
++ local.get $isegchar
+ i32.or
+ i32.store offset=8
+ ;; inext = this.addCell(
+@@ -479,39 +479,39 @@
+ ;; this.buf32[icell+1],
+ ;; isegchar0 + isegchar << 8 | boundaryBit | lsegchar - isegchar
+ ;; );
+- get_local $icell
++ local.get $icell
+ i32.const 0
+- get_local $icell
++ local.get $icell
+ i32.load offset=4
+- get_local $isegchar0
+- get_local $isegchar
++ local.get $isegchar0
++ local.get $isegchar
+ i32.add
+ i32.const 8
+ i32.shl
+- get_local $boundaryBit
++ local.get $boundaryBit
+ i32.or
+- get_local $lsegchar
+- get_local $isegchar
++ local.get $lsegchar
++ local.get $isegchar
+ i32.sub
+ i32.or
+ call $addCell
+- tee_local $inext
++ local.tee $inext
+ ;; this.buf32[icell+1] = inext;
+ i32.store offset=4
+ ;; if ( lhnchar !== 0 ) {
+- get_local $lhnchar
++ local.get $lhnchar
+ if
+ ;; this.buf32[inext+0] = this.addLeafCell(lhnchar);
+- get_local $inext
++ local.get $inext
+ i32.const 2
+ i32.shl
+- get_local $lhnchar
++ local.get $lhnchar
+ call $addLeafCell
+ i32.store
+ else
+ ;; this.buf32[icell+2] |= 0x80;
+- get_local $icell
+- get_local $icell
++ local.get $icell
++ local.get $icell
+ i32.load offset=8
+ i32.const 0x80
+ i32.or
+@@ -547,24 +547,24 @@
+ i32.const 260
+ i32.const 260
+ i32.load
+- tee_local $icell
++ local.tee $icell
+ i32.const 12
+ i32.add
+ i32.store
+ ;; this.buf32[icell+0] = idown;
+- get_local $icell
+- get_local $idown
++ local.get $icell
++ local.get $idown
+ i32.store
+ ;; this.buf32[icell+1] = iright;
+- get_local $icell
+- get_local $iright
++ local.get $icell
++ local.get $iright
+ i32.store offset=4
+ ;; this.buf32[icell+2] = v;
+- get_local $icell
+- get_local $v
++ local.get $icell
++ local.get $v
+ i32.store offset=8
+ ;; return icell;
+- get_local $icell
++ local.get $icell
+ i32.const 2
+ i32.shr_u
+ )
+@@ -582,58 +582,58 @@
+ ;; const r = this.buf32[TRIE1_SLOT] >>> 2;
+ i32.const 260
+ i32.load
+- tee_local $r
++ local.tee $r
+ ;; let i = r;
+- set_local $i
++ local.set $i
+ ;; while ( lsegchar > 127 ) {
+ block $lastSegment loop
+- get_local $lsegchar
++ local.get $lsegchar
+ i32.const 127
+ i32.le_u
+ br_if $lastSegment
+ ;; this.buf32[i+0] = 0;
+- get_local $i
++ local.get $i
+ i32.const 0
+ i32.store
+ ;; this.buf32[i+1] = i + 3;
+- get_local $i
+- get_local $i
++ local.get $i
++ local.get $i
+ i32.const 12
+ i32.add
+ i32.const 2
+ i32.shr_u
+ i32.store offset=4
+ ;; this.buf32[i+2] = this.addSegment(lsegchar, lsegchar - 127);
+- get_local $i
+- get_local $lsegchar
+- get_local $lsegchar
++ local.get $i
++ local.get $lsegchar
++ local.get $lsegchar
+ i32.const 127
+ i32.sub
+ call $addSegment
+ i32.store offset=8
+ ;; lsegchar -= 127;
+- get_local $lsegchar
++ local.get $lsegchar
+ i32.const 127
+ i32.sub
+- set_local $lsegchar
++ local.set $lsegchar
+ ;; i += 3;
+- get_local $i
++ local.get $i
+ i32.const 12
+ i32.add
+- set_local $i
++ local.set $i
+ br 0
+ end end
+ ;; this.buf32[i+0] = 0;
+- get_local $i
++ local.get $i
+ i32.const 0
+ i32.store
+ ;; this.buf32[i+1] = 0;
+- get_local $i
++ local.get $i
+ i32.const 0
+ i32.store offset=4
+ ;; this.buf32[i+2] = this.addSegment(lsegchar, 0) | 0x80;
+- get_local $i
+- get_local $lsegchar
++ local.get $i
++ local.get $lsegchar
+ i32.const 0
+ call $addSegment
+ i32.const 0x80
+@@ -641,12 +641,12 @@
+ i32.store offset=8
+ ;; this.buf32[TRIE1_SLOT] = i + 3 << 2;
+ i32.const 260
+- get_local $i
++ local.get $i
+ i32.const 12
+ i32.add
+ i32.store
+ ;; return r;
+- get_local $r
++ local.get $r
+ i32.const 2
+ i32.shr_u
+ )
+@@ -666,7 +666,7 @@
+ (local $i i32) ;; iterator
+ ;;
+ ;; if ( lsegchar === 0 ) { return 0; }
+- get_local $lsegchar
++ local.get $lsegchar
+ i32.eqz
+ if
+ i32.const 0
+@@ -675,45 +675,45 @@
+ ;; let char1 = this.buf32[HNBIGTRIE_CHAR1_SLOT];
+ i32.const 268
+ i32.load
+- tee_local $char1
++ local.tee $char1
+ ;; const isegchar = char1 - this.buf32[HNBIGTRIE_CHAR0_SLOT];
+ i32.const 264
+ i32.load
+ i32.sub
+- set_local $isegchar
++ local.set $isegchar
+ ;; let i = lsegchar;
+- get_local $lsegchar
+- set_local $i
++ local.get $lsegchar
++ local.set $i
+ ;; do {
+ loop
+ ;; this.buf[char1++] = this.buf[--i];
+- get_local $char1
+- get_local $i
++ local.get $char1
++ local.get $i
+ i32.const -1
+ i32.add
+- tee_local $i
++ local.tee $i
+ i32.load8_u
+ i32.store8
+- get_local $char1
++ local.get $char1
+ i32.const 1
+ i32.add
+- set_local $char1
++ local.set $char1
+ ;; } while ( i !== lsegend );
+- get_local $i
+- get_local $lsegend
++ local.get $i
++ local.get $lsegend
+ i32.ne
+ br_if 0
+ end
+ ;; this.buf32[HNBIGTRIE_CHAR1_SLOT] = char1;
+ i32.const 268
+- get_local $char1
++ local.get $char1
+ i32.store
+ ;; return isegchar << 8 | lsegchar - lsegend;
+- get_local $isegchar
++ local.get $isegchar
+ i32.const 8
+ i32.shl
+- get_local $lsegchar
+- get_local $lsegend
++ local.get $lsegchar
++ local.get $lsegend
+ i32.sub
+ i32.or
+ )
+diff --git a/src/lib/lz4/lz4-block-codec.wat b/src/lib/lz4/lz4-block-codec.wat
+index 93e5dc1..1181379 100644
+--- a/src/lib/lz4/lz4-block-codec.wat
++++ b/src/lib/lz4/lz4-block-codec.wat
+@@ -68,15 +68,15 @@
+ (func (export "lz4BlockEncodeBound")
+ (param $ilen i32)
+ (result i32)
+- get_local $ilen
++ local.get $ilen
+ i32.const 0x7E000000
+ i32.gt_u
+ if
+ i32.const 0
+ return
+ end
+- get_local $ilen
+- get_local $ilen
++ local.get $ilen
++ local.get $ilen
+ i32.const 255
+ i32.div_u
+ i32.add
+@@ -123,14 +123,14 @@
+ (local $llen i32) ;; length of found literals
+ (local $moffset i32) ;; offset to found match from current input position
+ (local $mlen i32) ;; length of found match
+- get_local $ilen ;; empty input = empty output
++ local.get $ilen ;; empty input = empty output
+ i32.const 0x7E000000 ;; max input size: 0x7E000000
+ i32.gt_u
+ if
+ i32.const 0
+ return
+ end
+- get_local $ilen ;; "blocks < 13 bytes cannot be compressed"
++ local.get $ilen ;; "blocks < 13 bytes cannot be compressed"
+ i32.const 13
+ i32.lt_u
+ if
+@@ -138,78 +138,78 @@
+ return
+ end
+ call $getLinearMemoryOffset ;; hash table is at start of usable memory
+- set_local $hashPtrBeg
+- get_local $inPtr
+- tee_local $anchorPtr
+- get_local $ilen
++ local.set $hashPtrBeg
++ local.get $inPtr
++ local.tee $anchorPtr
++ local.get $ilen
+ i32.add
+- tee_local $inPtrEnd
++ local.tee $inPtrEnd
+ i32.const -5 ;; "The last 5 bytes are always literals."
+ i32.add
+- tee_local $inPtrEnd2
++ local.tee $inPtrEnd2
+ i32.const -7 ;; "The last match must start at least 12 bytes before end of block"
+ i32.add
+- set_local $inPtrEnd1
+- get_local $outPtr
+- set_local $outPtrBeg
++ local.set $inPtrEnd1
++ local.get $outPtr
++ local.set $outPtrBeg
+ ;;
+ ;; sequence processing loop
+ ;;
+ block $noMoreSequence loop $nextSequence
+- get_local $inPtr
+- get_local $inPtrEnd1
++ local.get $inPtr
++ local.get $inPtrEnd1
+ i32.ge_u ;; 5 or less bytes left?
+ br_if $noMoreSequence
+- get_local $inPtr ;; first sequence of 3 bytes before match-finding loop
++ local.get $inPtr ;; first sequence of 3 bytes before match-finding loop
+ i32.load8_u
+ i32.const 8
+ i32.shl
+- get_local $inPtr
++ local.get $inPtr
+ i32.load8_u offset=1
+ i32.const 16
+ i32.shl
+ i32.or
+- get_local $inPtr
++ local.get $inPtr
+ i32.load8_u offset=2
+ i32.const 24
+ i32.shl
+ i32.or
+- set_local $seq32
++ local.set $seq32
+ ;;
+ ;; match-finding loop
+ ;;
+ loop $findMatch block $noMatchFound
+- get_local $inPtr
+- get_local $inPtrEnd2
++ local.get $inPtr
++ local.get $inPtrEnd2
+ i32.gt_u ;; less than 12 bytes left?
+ br_if $noMoreSequence
+- get_local $seq32 ;; update last byte of current sequence
++ local.get $seq32 ;; update last byte of current sequence
+ i32.const 8
+ i32.shr_u
+- get_local $inPtr
++ local.get $inPtr
+ i32.load8_u offset=3
+ i32.const 24
+ i32.shl
+ i32.or
+- tee_local $seq32
++ local.tee $seq32
+ i32.const 0x9E3779B1 ;; compute 16-bit hash
+ i32.mul
+ i32.const 16
+ i32.shr_u ;; hash value is at top of stack
+ i32.const 2 ;; lookup refPtr at hash entry
+ i32.shl
+- get_local $hashPtrBeg
++ local.get $hashPtrBeg
+ i32.add
+- tee_local $hashPtr
++ local.tee $hashPtr
+ i32.load
+- set_local $refPtr
+- get_local $hashPtr ;; update hash entry with inPtr
+- get_local $inPtr
++ local.set $refPtr
++ local.get $hashPtr ;; update hash entry with inPtr
++ local.get $inPtr
+ i32.store
+- get_local $inPtr
+- get_local $refPtr
++ local.get $inPtr
++ local.get $refPtr
+ i32.sub
+- tee_local $moffset ;; remember match offset, we will need it in case of match
++ local.tee $moffset ;; remember match offset, we will need it in case of match
+ i32.const 0xFFFF
+ i32.gt_s ;; match offset > 65535 = unusable match
+ br_if $noMatchFound
+@@ -217,177 +217,177 @@
+ ;; confirm match: different sequences can yield same hash
+ ;; compare-branch each byte to potentially save memory read ops
+ ;;
+- get_local $seq32 ;; byte 0
++ local.get $seq32 ;; byte 0
+ i32.const 0xFF
+ i32.and
+- get_local $refPtr
++ local.get $refPtr
+ i32.load8_u
+ i32.ne ;; refPtr[0] !== inPtr[0]
+ br_if $noMatchFound
+- get_local $seq32 ;; byte 1
++ local.get $seq32 ;; byte 1
+ i32.const 8
+ i32.shr_u
+ i32.const 0xFF
+ i32.and
+- get_local $refPtr
++ local.get $refPtr
+ i32.load8_u offset=1
+ i32.ne
+ br_if $noMatchFound ;; refPtr[1] !== inPtr[1]
+- get_local $seq32 ;; byte 2
++ local.get $seq32 ;; byte 2
+ i32.const 16
+ i32.shr_u
+ i32.const 0xFF
+ i32.and
+- get_local $refPtr
++ local.get $refPtr
+ i32.load8_u offset=2
+ i32.ne ;; refPtr[2] !== inPtr[2]
+ br_if $noMatchFound
+- get_local $seq32 ;; byte 3
++ local.get $seq32 ;; byte 3
+ i32.const 24
+ i32.shr_u
+ i32.const 0xFF
+ i32.and
+- get_local $refPtr
++ local.get $refPtr
+ i32.load8_u offset=3
+ i32.ne ;; refPtr[3] !== inPtr[3]
+ br_if $noMatchFound
+ ;;
+ ;; a valid match has been found at this point
+ ;;
+- get_local $inPtr ;; compute length of literals
+- get_local $anchorPtr
++ local.get $inPtr ;; compute length of literals
++ local.get $anchorPtr
+ i32.sub
+- set_local $llen
+- get_local $inPtr ;; find match length
++ local.set $llen
++ local.get $inPtr ;; find match length
+ i32.const 4 ;; skip over confirmed 4-byte match
+ i32.add
+- set_local $inPtr
+- get_local $refPtr
++ local.set $inPtr
++ local.get $refPtr
+ i32.const 4
+ i32.add
+- tee_local $mlen ;; remember refPtr to later compute match length
+- set_local $refPtr
++ local.tee $mlen ;; remember refPtr to later compute match length
++ local.set $refPtr
+ block $endOfMatch loop ;; scan input buffer until match ends
+- get_local $inPtr
+- get_local $inPtrEnd2
++ local.get $inPtr
++ local.get $inPtrEnd2
+ i32.ge_u
+ br_if $endOfMatch
+- get_local $inPtr
++ local.get $inPtr
+ i32.load8_u
+- get_local $refPtr
++ local.get $refPtr
+ i32.load8_u
+ i32.ne
+ br_if $endOfMatch
+- get_local $inPtr
++ local.get $inPtr
+ i32.const 1
+ i32.add
+- set_local $inPtr
+- get_local $refPtr
++ local.set $inPtr
++ local.get $refPtr
+ i32.const 1
+ i32.add
+- set_local $refPtr
++ local.set $refPtr
+ br 0
+ end end $endOfMatch
+ ;; encode token
+- get_local $outPtr ;; output token
+- get_local $llen
+- get_local $refPtr
+- get_local $mlen
++ local.get $outPtr ;; output token
++ local.get $llen
++ local.get $refPtr
++ local.get $mlen
+ i32.sub
+- tee_local $mlen
++ local.tee $mlen
+ call $writeToken
+- get_local $outPtr
++ local.get $outPtr
+ i32.const 1
+ i32.add
+- set_local $outPtr
+- get_local $llen ;; encode/write length of literals if needed
++ local.set $outPtr
++ local.get $llen ;; encode/write length of literals if needed
+ i32.const 15
+ i32.ge_s
+ if
+- get_local $outPtr
+- get_local $llen
++ local.get $outPtr
++ local.get $llen
+ call $writeLength
+- set_local $outPtr
++ local.set $outPtr
+ end
+ ;; copy literals
+- get_local $outPtr
+- get_local $anchorPtr
+- get_local $llen
++ local.get $outPtr
++ local.get $anchorPtr
++ local.get $llen
+ call $copy
+- get_local $outPtr
+- get_local $llen
++ local.get $outPtr
++ local.get $llen
+ i32.add
+- set_local $outPtr
++ local.set $outPtr
+ ;; encode match offset
+- get_local $outPtr
+- get_local $moffset
++ local.get $outPtr
++ local.get $moffset
+ i32.store8
+- get_local $outPtr
+- get_local $moffset
++ local.get $outPtr
++ local.get $moffset
+ i32.const 8
+ i32.shr_u
+ i32.store8 offset=1
+- get_local $outPtr
++ local.get $outPtr
+ i32.const 2
+ i32.add
+- set_local $outPtr
+- get_local $mlen ;; encode/write length of match if needed
++ local.set $outPtr
++ local.get $mlen ;; encode/write length of match if needed
+ i32.const 15
+ i32.ge_s
+ if
+- get_local $outPtr
+- get_local $mlen
++ local.get $outPtr
++ local.get $mlen
+ call $writeLength
+- set_local $outPtr
++ local.set $outPtr
+ end
+- get_local $inPtr ;; advance anchor to current position
+- set_local $anchorPtr
++ local.get $inPtr ;; advance anchor to current position
++ local.set $anchorPtr
+ br $nextSequence
+ end $noMatchFound
+- get_local $inPtr ;; no match found: advance to next byte
++ local.get $inPtr ;; no match found: advance to next byte
+ i32.const 1
+ i32.add
+- set_local $inPtr
++ local.set $inPtr
+ br $findMatch end ;; match offset > 65535 = unusable match
+ end end $noMoreSequence
+ ;;
+ ;; generate last (match-less) sequence if compression succeeded
+ ;;
+- get_local $outPtr
+- get_local $outPtrBeg
++ local.get $outPtr
++ local.get $outPtrBeg
+ i32.eq
+ if
+ i32.const 0
+ return
+ end
+- get_local $outPtr
+- get_local $inPtrEnd
+- get_local $anchorPtr
++ local.get $outPtr
++ local.get $inPtrEnd
++ local.get $anchorPtr
+ i32.sub
+- tee_local $llen
++ local.tee $llen
+ i32.const 0
+ call $writeToken
+- get_local $outPtr
++ local.get $outPtr
+ i32.const 1
+ i32.add
+- set_local $outPtr
+- get_local $llen
++ local.set $outPtr
++ local.get $llen
+ i32.const 15
+ i32.ge_u
+ if
+- get_local $outPtr
+- get_local $llen
++ local.get $outPtr
++ local.get $llen
+ call $writeLength
+- set_local $outPtr
++ local.set $outPtr
+ end
+- get_local $outPtr
+- get_local $anchorPtr
+- get_local $llen
++ local.get $outPtr
++ local.get $anchorPtr
++ local.get $llen
+ call $copy
+- get_local $outPtr ;; return number of written bytes
+- get_local $llen
++ local.get $outPtr ;; return number of written bytes
++ local.get $llen
+ i32.add
+- get_local $outPtrBeg
++ local.get $outPtrBeg
+ i32.sub
+ )
+
+@@ -413,128 +413,128 @@
+ (local $token i32) ;; sequence token
+ (local $clen i32) ;; number of bytes to copy
+ (local $_ i32) ;; general purpose variable
+- get_local $ilen ;; if ( ilen == 0 ) { return 0; }
++ local.get $ilen ;; if ( ilen == 0 ) { return 0; }
+ i32.eqz
+ if
+ i32.const 0
+ return
+ end
+- get_local $inPtr0
+- tee_local $inPtr ;; current position in input buffer
+- get_local $ilen
++ local.get $inPtr0
++ local.tee $inPtr ;; current position in input buffer
++ local.get $ilen
+ i32.add
+- set_local $inPtrEnd
+- get_local $outPtr0 ;; start of output buffer
+- set_local $outPtr ;; current position in output buffer
++ local.set $inPtrEnd
++ local.get $outPtr0 ;; start of output buffer
++ local.set $outPtr ;; current position in output buffer
+ block $noMoreSequence loop ;; iterate through all sequences
+- get_local $inPtr
+- get_local $inPtrEnd
++ local.get $inPtr
++ local.get $inPtrEnd
+ i32.ge_u
+ br_if $noMoreSequence ;; break when nothing left to read in input buffer
+- get_local $inPtr ;; read token -- consume one byte
++ local.get $inPtr ;; read token -- consume one byte
+ i32.load8_u
+- get_local $inPtr
++ local.get $inPtr
+ i32.const 1
+ i32.add
+- set_local $inPtr
+- tee_local $token ;; extract length of literals from token
++ local.set $inPtr
++ local.tee $token ;; extract length of literals from token
+ i32.const 4
+ i32.shr_u
+- tee_local $clen ;; consume extra length bytes if present
++ local.tee $clen ;; consume extra length bytes if present
+ i32.eqz
+ if else
+- get_local $clen
++ local.get $clen
+ i32.const 15
+ i32.eq
+ if loop
+- get_local $inPtr
++ local.get $inPtr
+ i32.load8_u
+- get_local $inPtr
++ local.get $inPtr
+ i32.const 1
+ i32.add
+- set_local $inPtr
+- tee_local $_
+- get_local $clen
++ local.set $inPtr
++ local.tee $_
++ local.get $clen
+ i32.add
+- set_local $clen
+- get_local $_
++ local.set $clen
++ local.get $_
+ i32.const 255
+ i32.eq
+ br_if 0
+ end end
+- get_local $outPtr ;; copy literals to ouput buffer
+- get_local $inPtr
+- get_local $clen
++ local.get $outPtr ;; copy literals to ouput buffer
++ local.get $inPtr
++ local.get $clen
+ call $copy
+- get_local $outPtr ;; advance output buffer pointer past copy
+- get_local $clen
++ local.get $outPtr ;; advance output buffer pointer past copy
++ local.get $clen
+ i32.add
+- set_local $outPtr
+- get_local $clen ;; advance input buffer pointer past literals
+- get_local $inPtr
++ local.set $outPtr
++ local.get $clen ;; advance input buffer pointer past literals
++ local.get $inPtr
+ i32.add
+- tee_local $inPtr
+- get_local $inPtrEnd ;; exit if this is the last sequence
++ local.tee $inPtr
++ local.get $inPtrEnd ;; exit if this is the last sequence
+ i32.eq
+ br_if $noMoreSequence
+ end
+- get_local $outPtr ;; read match offset
+- get_local $inPtr
++ local.get $outPtr ;; read match offset
++ local.get $inPtr
+ i32.load8_u
+- get_local $inPtr
++ local.get $inPtr
+ i32.load8_u offset=1
+ i32.const 8
+ i32.shl
+ i32.or
+ i32.sub
+- tee_local $matchPtr
+- get_local $outPtr ;; match position can't be outside input buffer bounds
++ local.tee $matchPtr
++ local.get $outPtr ;; match position can't be outside input buffer bounds
+ i32.eq
+ br_if $noMoreSequence
+- get_local $matchPtr
+- get_local $inPtrEnd
++ local.get $matchPtr
++ local.get $inPtrEnd
+ i32.lt_u
+ br_if $noMoreSequence
+- get_local $inPtr ;; advance input pointer past match offset bytes
++ local.get $inPtr ;; advance input pointer past match offset bytes
+ i32.const 2
+ i32.add
+- set_local $inPtr
+- get_local $token ;; extract length of match from token
++ local.set $inPtr
++ local.get $token ;; extract length of match from token
+ i32.const 15
+ i32.and
+ i32.const 4
+ i32.add
+- tee_local $clen
++ local.tee $clen
+ i32.const 19 ;; consume extra length bytes if present
+ i32.eq
+ if loop
+- get_local $inPtr
++ local.get $inPtr
+ i32.load8_u
+- get_local $inPtr
++ local.get $inPtr
+ i32.const 1
+ i32.add
+- set_local $inPtr
+- tee_local $_
+- get_local $clen
++ local.set $inPtr
++ local.tee $_
++ local.get $clen
+ i32.add
+- set_local $clen
+- get_local $_
++ local.set $clen
++ local.get $_
+ i32.const 255
+ i32.eq
+ br_if 0
+ end end
+- get_local $outPtr ;; copy match to ouput buffer
+- get_local $matchPtr
+- get_local $clen
++ local.get $outPtr ;; copy match to ouput buffer
++ local.get $matchPtr
++ local.get $clen
+ call $copy
+- get_local $clen ;; advance output buffer pointer past copy
+- get_local $outPtr
++ local.get $clen ;; advance output buffer pointer past copy
++ local.get $outPtr
+ i32.add
+- set_local $outPtr
++ local.set $outPtr
+ br 0
+ end end $noMoreSequence
+- get_local $outPtr ;; return number of written bytes
+- get_local $outPtr0
++ local.get $outPtr ;; return number of written bytes
++ local.get $outPtr0
+ i32.sub
+ )
+
+@@ -552,18 +552,18 @@
+ (param $outPtr i32)
+ (param $llen i32)
+ (param $mlen i32)
+- get_local $outPtr
+- get_local $llen
++ local.get $outPtr
++ local.get $llen
+ i32.const 15
+- get_local $llen
++ local.get $llen
+ i32.const 15
+ i32.lt_u
+ select
+ i32.const 4
+ i32.shl
+- get_local $mlen
++ local.get $mlen
+ i32.const 15
+- get_local $mlen
++ local.get $mlen
+ i32.const 15
+ i32.lt_u
+ select
+@@ -582,32 +582,32 @@
+ (param $outPtr i32)
+ (param $len i32)
+ (result i32)
+- get_local $len
++ local.get $len
+ i32.const 15
+ i32.sub
+- set_local $len
++ local.set $len
+ loop
+- get_local $outPtr
+- get_local $len
++ local.get $outPtr
++ local.get $len
+ i32.const 255
+- get_local $len
++ local.get $len
+ i32.const 255
+ i32.lt_u
+ select
+ i32.store8
+- get_local $outPtr
++ local.get $outPtr
+ i32.const 1
+ i32.add
+- set_local $outPtr
+- get_local $len
++ local.set $outPtr
++ local.get $len
+ i32.const 255
+ i32.sub
+- tee_local $len
++ local.tee $len
+ i32.const 0
+ i32.ge_s
+ br_if 0
+ end
+- get_local $outPtr
++ local.get $outPtr
+ )
+
+ ;;
+@@ -621,119 +621,119 @@
+ (param $src i32)
+ (param $len i32)
+ block $lessThan8 loop
+- get_local $len
++ local.get $len
+ i32.const 8
+ i32.lt_u
+ br_if $lessThan8
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u
+ i32.store8
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u offset=1
+ i32.store8 offset=1
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u offset=2
+ i32.store8 offset=2
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u offset=3
+ i32.store8 offset=3
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u offset=4
+ i32.store8 offset=4
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u offset=5
+ i32.store8 offset=5
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u offset=6
+ i32.store8 offset=6
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u offset=7
+ i32.store8 offset=7
+- get_local $dst
++ local.get $dst
+ i32.const 8
+ i32.add
+- set_local $dst
+- get_local $src
++ local.set $dst
++ local.get $src
+ i32.const 8
+ i32.add
+- set_local $src
+- get_local $len
++ local.set $src
++ local.get $len
+ i32.const -8
+ i32.add
+- set_local $len
++ local.set $len
+ br 0
+ end end $lessThan8
+- get_local $len
++ local.get $len
+ i32.const 4
+ i32.ge_u
+ if
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u
+ i32.store8
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u offset=1
+ i32.store8 offset=1
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u offset=2
+ i32.store8 offset=2
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u offset=3
+ i32.store8 offset=3
+- get_local $dst
++ local.get $dst
+ i32.const 4
+ i32.add
+- set_local $dst
+- get_local $src
++ local.set $dst
++ local.get $src
+ i32.const 4
+ i32.add
+- set_local $src
+- get_local $len
++ local.set $src
++ local.get $len
+ i32.const -4
+ i32.add
+- set_local $len
++ local.set $len
+ end
+- get_local $len
++ local.get $len
+ i32.const 2
+ i32.ge_u
+ if
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u
+ i32.store8
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u offset=1
+ i32.store8 offset=1
+- get_local $dst
++ local.get $dst
+ i32.const 2
+ i32.add
+- set_local $dst
+- get_local $src
++ local.set $dst
++ local.get $src
+ i32.const 2
+ i32.add
+- set_local $src
+- get_local $len
++ local.set $src
++ local.get $len
+ i32.const -2
+ i32.add
+- set_local $len
++ local.set $len
+ end
+- get_local $len
++ local.get $len
+ i32.eqz
+ if else
+- get_local $dst
+- get_local $src
++ local.get $dst
++ local.get $src
+ i32.load8_u
+ i32.store8
+ end
+diff --git a/src/lib/publicsuffixlist/wasm/publicsuffixlist.wat b/src/lib/publicsuffixlist/wasm/publicsuffixlist.wat
+index ee002a1..8ea7381 100644
+--- a/src/lib/publicsuffixlist/wasm/publicsuffixlist.wat
++++ b/src/lib/publicsuffixlist/wasm/publicsuffixlist.wat
+@@ -83,133 +83,133 @@
+ ;; const iCharData = buf32[CHARDATA_PTR_SLOT];
+ i32.const 404
+ i32.load
+- set_local $iCharData
++ local.set $iCharData
+ ;; let iNode = pslBuffer32[RULES_PTR_SLOT];
+ i32.const 400
+ i32.load
+ i32.const 2
+ i32.shl
+- set_local $iNode
++ local.set $iNode
+ ;; let iLabel = LABEL_INDICES_SLOT;
+ i32.const 256
+- set_local $iLabel
++ local.set $iLabel
+ ;; let cursorPos = -1;
+ i32.const -1
+- set_local $cursorPos
++ local.set $cursorPos
+ ;; label-lookup loop
+ ;; for (;;) {
+ block $labelLookupDone loop $labelLookup
+ ;; // Extract label indices
+ ;; const labelBeg = buf8[iLabel+1];
+ ;; const labelLen = buf8[iLabel+0] - labelBeg;
+- get_local $iLabel
++ local.get $iLabel
+ i32.load8_u
+- get_local $iLabel
++ local.get $iLabel
+ i32.load8_u offset=1
+- tee_local $labelBeg
++ local.tee $labelBeg
+ i32.sub
+- set_local $labelLen
++ local.set $labelLen
+ ;; // Match-lookup loop: binary search
+ ;; let r = buf32[iNode+0] >>> 16;
+ ;; if ( r === 0 ) { break; }
+- get_local $iNode
++ local.get $iNode
+ i32.load16_u offset=2
+- tee_local $r
++ local.tee $r
+ i32.eqz
+ br_if $labelLookupDone
+ ;; const iCandidates = buf32[iNode+2];
+- get_local $iNode
++ local.get $iNode
+ i32.load offset=8
+ i32.const 2
+ i32.shl
+- set_local $iCandidates
++ local.set $iCandidates
+ ;; let l = 0;
+ ;; let iFound = 0;
+ i32.const 0
+- tee_local $l
+- set_local $iFound
++ local.tee $l
++ local.set $iFound
+ ;; while ( l < r ) {
+ block $binarySearchDone loop $binarySearch
+- get_local $l
+- get_local $r
++ local.get $l
++ local.get $r
+ i32.ge_u
+ br_if $binarySearchDone
+ ;; const iCandidate = l + r >>> 1;
+- get_local $l
+- get_local $r
++ local.get $l
++ local.get $r
+ i32.add
+ i32.const 1
+ i32.shr_u
+- tee_local $iCandidate
++ local.tee $iCandidate
+ ;; const iCandidateNode = iCandidates + iCandidate + (iCandidate << 1);
+ i32.const 2
+ i32.shl
+- tee_local $_1
+- get_local $_1
++ local.tee $_1
++ local.get $_1
+ i32.const 1
+ i32.shl
+ i32.add
+- get_local $iCandidates
++ local.get $iCandidates
+ i32.add
+- tee_local $iCandidateNode
++ local.tee $iCandidateNode
+ ;; const candidateLen = buf32[iCandidateNode+0] & 0x000000FF;
+ i32.load8_u
+- set_local $candidateLen
++ local.set $candidateLen
+ ;; let d = labelLen - candidateLen;
+- get_local $labelLen
+- get_local $candidateLen
++ local.get $labelLen
++ local.get $candidateLen
+ i32.sub
+- tee_local $d
++ local.tee $d
+ ;; if ( d === 0 ) {
+ i32.eqz
+ if
+ ;; const iCandidateChar = candidateLen <= 4
+- get_local $candidateLen
++ local.get $candidateLen
+ i32.const 4
+ i32.le_u
+ if
+ ;; ? iCandidateNode + 1 << 2
+- get_local $iCandidateNode
++ local.get $iCandidateNode
+ i32.const 4
+ i32.add
+- set_local $iCandidateChar
++ local.set $iCandidateChar
+ else
+ ;; : buf32[CHARDATA_PTR_SLOT] + buf32[iCandidateNode+1];
+- get_local $iCharData
+- get_local $iCandidateNode
++ local.get $iCharData
++ local.get $iCandidateNode
+ i32.load offset=4
+ i32.add
+- set_local $iCandidateChar
++ local.set $iCandidateChar
+ end
+ ;; for ( let i = 0; i < labelLen; i++ ) {
+- get_local $labelBeg
+- tee_local $_1
+- get_local $labelLen
++ local.get $labelBeg
++ local.tee $_1
++ local.get $labelLen
+ i32.add
+- set_local $_3
+- get_local $iCandidateChar
+- set_local $_2
++ local.set $_3
++ local.get $iCandidateChar
++ local.set $_2
+ block $findDiffDone loop $findDiff
+ ;; d = buf8[labelBeg+i] - buf8[iCandidateChar+i];
+ ;; if ( d !== 0 ) { break; }
+- get_local $_1
++ local.get $_1
+ i32.load8_u
+- get_local $_2
++ local.get $_2
+ i32.load8_u
+ i32.sub
+- tee_local $d
++ local.tee $d
+ br_if $findDiffDone
+- get_local $_1
++ local.get $_1
+ i32.const 1
+ i32.add
+- tee_local $_1
+- get_local $_3
++ local.tee $_1
++ local.get $_3
+ i32.eq
+ br_if $findDiffDone
+- get_local $_2
++ local.get $_2
+ i32.const 1
+ i32.add
+- set_local $_2
++ local.set $_2
+ br $findDiff
+ ;; }
+ end end
+@@ -217,32 +217,32 @@
+ end
+ ;; if ( d < 0 ) {
+ ;; r = iCandidate;
+- get_local $d
++ local.get $d
+ i32.const 0
+ i32.lt_s
+ if
+- get_local $iCandidate
+- set_local $r
++ local.get $iCandidate
++ local.set $r
+ br $binarySearch
+ end
+ ;; } else if ( d > 0 ) {
+ ;; l = iCandidate + 1;
+- get_local $d
++ local.get $d
+ i32.const 0
+ i32.gt_s
+ if
+- get_local $iCandidate
++ local.get $iCandidate
+ i32.const 1
+ i32.add
+- set_local $l
++ local.set $l
+ br $binarySearch
+ end
+ ;; } else /* if ( d === 0 ) */ {
+ ;; iFound = iCandidateNode;
+ ;; break;
+ ;; }
+- get_local $iCandidateNode
+- set_local $iFound
++ local.get $iCandidateNode
++ local.set $iFound
+ end end
+ ;; }
+ ;; // 2. If no rules match, the prevailing rule is "*".
+@@ -251,10 +251,10 @@
+ ;; buf8[SUFFIX_NOT_FOUND_SLOT] = 1;
+ ;; iFound = iCandidates;
+ ;; }
+- get_local $iFound
++ local.get $iFound
+ i32.eqz
+ if
+- get_local $iCandidates
++ local.get $iCandidates
+ i32.load offset=4
+ i32.const 0x2A
+ i32.ne
+@@ -262,12 +262,12 @@
+ i32.const 399
+ i32.const 1
+ i32.store8
+- get_local $iCandidates
+- set_local $iFound
++ local.get $iCandidates
++ local.set $iFound
+ end
+ ;; iNode = iFound;
+- get_local $iFound
+- tee_local $iNode
++ local.get $iFound
++ local.tee $iNode
+ ;; // 5. If the prevailing rule is a exception rule, modify it by
+ ;; // removing the leftmost label.
+ ;; if ( (buf32[iNode+0] & 0x00000200) !== 0 ) {
+@@ -277,15 +277,15 @@
+ ;; break;
+ ;; }
+ i32.load8_u offset=1
+- tee_local $_1
++ local.tee $_1
+ i32.const 0x02
+ i32.and
+ if
+- get_local $iLabel
++ local.get $iLabel
+ i32.const 256
+ i32.gt_u
+ if
+- get_local $iLabel
++ local.get $iLabel
+ i32.const -2
+ i32.add
+ return
+@@ -295,25 +295,25 @@
+ ;; if ( (buf32[iNode+0] & 0x00000100) !== 0 ) {
+ ;; cursorPos = labelBeg;
+ ;; }
+- get_local $_1
++ local.get $_1
+ i32.const 0x01
+ i32.and
+ if
+- get_local $iLabel
+- set_local $cursorPos
++ local.get $iLabel
++ local.set $cursorPos
+ end
+ ;; if ( labelBeg === 0 ) { break; }
+- get_local $labelBeg
++ local.get $labelBeg
+ i32.eqz
+ br_if $labelLookupDone
+ ;; iLabel += 2;
+- get_local $iLabel
++ local.get $iLabel
+ i32.const 2
+ i32.add
+- set_local $iLabel
++ local.set $iLabel
+ br $labelLookup
+ end end
+- get_local $cursorPos
++ local.get $cursorPos
+ )
+
+ ;;
diff -Nru ublock-origin-1.37.0+dfsg/debian/patches/make-assets.sh-for-Debian.patch ublock-origin-1.42.0+dfsg/debian/patches/make-assets.sh-for-Debian.patch
--- ublock-origin-1.37.0+dfsg/debian/patches/make-assets.sh-for-Debian.patch 2021-08-28 20:29:16.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/debian/patches/make-assets.sh-for-Debian.patch 2022-07-01 22:10:52.000000000 +0000
@@ -1,40 +1,26 @@
From: Markus Koschany
-Date: Thu, 27 Aug 2020 23:49:51 +0200
+Date: Fri, 26 Nov 2021 22:40:50 +0100
Subject: make-assets.sh-for-Debian
+Forwarded: not-needed
---
- tools/make-assets.sh | 17 ++++-------------
- 1 file changed, 4 insertions(+), 13 deletions(-)
+ tools/make-assets.sh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+diff --git a/tools/make-assets.sh b/tools/make-assets.sh
+index 3850f35..c2dca11 100755
--- a/tools/make-assets.sh
+++ b/tools/make-assets.sh
-@@ -4,25 +4,16 @@
-
- DES=$1/assets
-
--printf "*** Packaging assets in $DES... "
--
--if [ -n "${TRAVIS_TAG}" ]; then
-- pushd .. > /dev/null
-- git clone --depth 1 https://github.com/uBlockOrigin/uAssets.git
-- popd > /dev/null
--fi
--
- rm -rf $DES
- cp -R ./assets $DES/
+@@ -13,11 +13,9 @@ cp -R ./assets $DES/
mkdir $DES/thirdparties
--cp -R ../uAssets/thirdparties/easylist-downloads.adblockplus.org $DES/thirdparties/
--cp -R ../uAssets/thirdparties/pgl.yoyo.org $DES/thirdparties/
--cp -R ../uAssets/thirdparties/publicsuffix.org $DES/thirdparties/
--cp -R ../uAssets/thirdparties/urlhaus-filter $DES/thirdparties/
-+cp -R ./uAssets/thirdparties/easylist-downloads.adblockplus.org $DES/thirdparties/
-+cp -R ./uAssets/thirdparties/publicsuffix.org $DES/thirdparties/
-+cp -R ./uAssets/thirdparties/urlhaus-filter $DES/thirdparties/
- mkdir $DES/ublock
--cp -R ../uAssets/filters/* $DES/ublock/
-+cp -R ./uAssets/filters/* $DES/ublock/
- # Optional filter lists: do not include in package
- rm $DES/ublock/annoyances.txt
+-git submodule update --depth 1 --init
+-UASSETS=submodules/uAssets
++UASSETS=./uAssets
+
+ cp -R $UASSETS/thirdparties/easylist-downloads.adblockplus.org $DES/thirdparties/
+-cp -R $UASSETS/thirdparties/pgl.yoyo.org $DES/thirdparties/
+ cp -R $UASSETS/thirdparties/publicsuffix.org $DES/thirdparties/
+ cp -R $UASSETS/thirdparties/urlhaus-filter $DES/thirdparties/
diff -Nru ublock-origin-1.37.0+dfsg/debian/patches/python3.patch ublock-origin-1.42.0+dfsg/debian/patches/python3.patch
--- ublock-origin-1.37.0+dfsg/debian/patches/python3.patch 2021-08-28 20:29:16.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/debian/patches/python3.patch 2022-07-01 22:10:52.000000000 +0000
@@ -1,17 +1,17 @@
From: Markus Koschany
-Date: Mon, 24 Feb 2020 01:04:26 +0100
+Date: Fri, 26 Nov 2021 22:38:46 +0100
Subject: python3
+Forwarded: no
---
tools/make-chromium.sh | 2 +-
- tools/make-firefox.sh | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
+ 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/make-chromium.sh b/tools/make-chromium.sh
-index e1f6e5c..963831f 100755
+index cd901f3..afdb25d 100755
--- a/tools/make-chromium.sh
+++ b/tools/make-chromium.sh
-@@ -15,7 +15,7 @@ bash ./tools/copy-common-files.sh $DES
+@@ -23,7 +23,7 @@ cp platform/chromium/*.json $DES/
cp -R $DES/_locales/nb $DES/_locales/no
echo "*** uBlock0.chromium: Generating meta..."
@@ -20,16 +20,3 @@
if [ "$1" = all ]; then
echo "*** uBlock0.chromium: Creating plain package..."
-diff --git a/tools/make-firefox.sh b/tools/make-firefox.sh
-index d1708cd..e6336a1 100755
---- a/tools/make-firefox.sh
-+++ b/tools/make-firefox.sh
-@@ -22,7 +22,7 @@ cp platform/firefox/vapi-webrequest.js $DES/js/
- rm $DES/img/icon_128.png
-
- echo "*** uBlock0.firefox: Generating meta..."
--python tools/make-firefox-meta.py $DES/
-+python3 tools/make-firefox-meta.py $DES/
-
- if [ "$1" = all ]; then
- echo "*** uBlock0.firefox: Creating package..."
diff -Nru ublock-origin-1.37.0+dfsg/debian/patches/series ublock-origin-1.42.0+dfsg/debian/patches/series
--- ublock-origin-1.37.0+dfsg/debian/patches/series 2021-08-28 20:29:16.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/debian/patches/series 2022-07-01 22:10:52.000000000 +0000
@@ -1,3 +1,4 @@
python3.patch
-disable-nonfree-filters-by-default.patch
make-assets.sh-for-Debian.patch
+disable-nonfree-filters-by-default.patch
+lz4-block-codec.wat.patch
diff -Nru ublock-origin-1.37.0+dfsg/debian/rules ublock-origin-1.42.0+dfsg/debian/rules
--- ublock-origin-1.37.0+dfsg/debian/rules 2021-08-28 20:29:16.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/debian/rules 2022-07-01 22:10:52.000000000 +0000
@@ -20,6 +20,9 @@
dh_install -p webext-ublock-origin-firefox -X LICENSE.txt
dh_install -p webext-ublock-origin-chromium -X LICENSE.txt
+override_dh_auto_test:
+ # Skip the tests
+
override_dh_auto_clean:
./tools/make-clean.sh
diff -Nru ublock-origin-1.37.0+dfsg/debian/watch ublock-origin-1.42.0+dfsg/debian/watch
--- ublock-origin-1.37.0+dfsg/debian/watch 2021-08-28 20:29:16.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/debian/watch 2022-07-01 22:10:52.000000000 +0000
@@ -1,3 +1,3 @@
version=3
opts=repacksuffix=+dfsg,dversionmangle=s/\+(repack|dfsg|ds|deb)\d*$// \
-https://github.com/gorhill/uBlock/releases .*/archive/(\d.*)\.tar\.gz
+https://github.com/gorhill/uBlock/releases .*/(\d.*)\.tar\.gz
diff -Nru ublock-origin-1.37.0+dfsg/dist/README.md ublock-origin-1.42.0+dfsg/dist/README.md
--- ublock-origin-1.37.0+dfsg/dist/README.md 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/dist/README.md 2022-05-06 01:15:22.000000000 +0000
@@ -60,19 +60,22 @@
### Build instructions (for developers)
-- Clone [uBlock](https://github.com/gorhill/uBlock) and [uAssets](https://github.com/uBlockOrigin/uAssets) repositories in the same parent directory
- - `git clone https://github.com/gorhill/uBlock.git`
- - `git clone https://github.com/uBlockOrigin/uAssets.git`
+- Clone [uBlock repo](https://github.com/gorhill/uBlock): `git clone https://github.com/gorhill/uBlock.git`
- Set path to uBlock: `cd uBlock`
- The official version of uBO is in the `master` branch
- `git checkout master`
- Build the plugin:
- - Chromium: `./tools/make-chromium.sh`
- - Firefox webext: `./tools/make-firefox.sh all`
- - Firefox legacy:
- - `git checkout firefox-legacy`
- - `./tools/make-firefox-legacy.sh all`
+ - Chromium: `make chromium`
+ - Firefox: `make firefox`
+ - NPM package: `make npm`
- Load the result of the build into your browser:
- - Chromium: load the unpacked extension folder `/uBlock/dist/build/uBlock0.chromium/` in Chromium to use the extension.
- - Firefox: drag-and-drop `/uBlock/dist/build/uBlock0.firefox.xpi` or `/uBlock/dist/build/uBlock0.firefox-legacy.xpi` into Firefox.
+ - Chromium:
+ - Navigate to `chrome://extensions/`
+ - Check _"Developer mode"_
+ - Click _"Load unpacked"_
+ - Select `/uBlock/dist/build/uBlock0.chromium/`
+ - Firefox:
+ - Navigate to `about:debugging#/runtime/this-firefox`
+ - Click _"Load Temporary Add-on..."_
+ - Select `/uBlock/dist/build/uBlock0.firefox/`
diff -Nru ublock-origin-1.37.0+dfsg/dist/description/description-bn.txt ublock-origin-1.42.0+dfsg/dist/description/description-bn.txt
--- ublock-origin-1.37.0+dfsg/dist/description/description-bn.txt 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/dist/description/description-bn.txt 2022-05-06 01:15:22.000000000 +0000
@@ -2,7 +2,7 @@
এটির কার্যকারিতার সচিত্র সংক্ষিপ্ত বিবরণ: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared
-ব্যবহার: পপআপে বড় বোতামটি বর্তমান ওয়েব সাইটকে স্থায়ীভাবে জন্য ইউব্লক দ্বারা সক্রিয়/নিষ্ক্রিয় করবে। এটা শুধুমাত্র বর্তমান ওয়েব সাইটে প্রযোজ্য, এটি একটি সার্বজনীন পাওয়ার বোতাম নয়।
+ব্যবহার: পপআপের বড় পাওয়ার বাটনটি হলো বর্তমান ওয়েবসাইটে uBlock কে স্থায়ীভাবে সক্রিয় / নিষ্ক্রিয় করার জন্য। এটা শুধুমাত্র বর্তমান ওয়েব সাইটে প্রযোজ্য, এটি একটি সার্বজনীন পাওয়ার বোতাম নয়।
***
@@ -18,7 +18,7 @@
আপনি যদি চান আপনি নির্বাচন করার জন্য আরো তালিকা পাবেন:
- ফ্যানবয়ের বর্ধিত অনুসরণকরণ তালিকা
-- ডেন পোলোক-এর হোস্ট ফাইল
+- Dan Pollock’s hosts file
- এইচপিহোস্টসের বিজ্ঞাপন এবং অনুসরণকরণ সার্ভার
- MVPS হোস্টসমূহ
- স্প্যাম৪০৪
diff -Nru ublock-origin-1.37.0+dfsg/dist/description/description-bs.txt ublock-origin-1.42.0+dfsg/dist/description/description-bs.txt
--- ublock-origin-1.37.0+dfsg/dist/description/description-bs.txt 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/dist/description/description-bs.txt 2022-05-06 01:15:22.000000000 +0000
@@ -1,36 +1,36 @@
-Efikasan bloker: lagan je na otisak/zahtjev memorije i procesora, a može učitati i primijeniti tisuće/hiljade više filtera nego ostali popularni blokeri.
+Efikasan bloker: lagan na memoriju i procesor, a može učitati i primijeniti još hiljadu više drugih filtera nego drugi poznati blokeri.
-Ilustrovani/Ilustrirani pregled njegove efikasnosti: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared
+Ilustrovani pregled njegove efikasnosti: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared
-Korištenje/Upotreba: Veliko dugme/gumb u iskočnom prozoru je da se trajno omogući/onemogući uBlock na trenutačnoj stranici. To se odnosi samo na trenutnu web-stranicu, nije da se kompletno isključi.
+Upotreba: Veliko dugme u skočnom prozoru je da trajno omogućite/onemogućite uBlock na trenutačnoj web-stranici. To se odnosi samo na trenutačnu web-stranicu, pa nije da ga kompletno isključite.
***
-Fleksibilan je, više je od "blokatora reklama": može i učitati i napraviti filtere iz izvornih datoteka.
+Baš je fleksibilan, nije samo da blokira reklame: može čitati i napraviti filtere iz hosts datoteka.
-Odmah po instalaciji/instaliranju, ovi slijedeći popisi/spisci filtera su pokrenuti i provođeni:
+Odmah po instaliranju, slijedeći spisci filtera su pokrenuti i sprovedeni:
- EasyList
-- Peter Lowe’s Ad server list
+- Peter Lowe-ov popis reklamnih servera
- EasyPrivacy
-- Malware domains
+- Malverske domene
-Ostale liste/spisci su dostupni za odabir/izbor ako ih želite:
+Sljedeće liste su dostupne po odabiru ako ih želite:
-- Fanboy’s Enhanced Tracking List
-- Dan Pollock’s hosts file
-- hpHosts’s Ad and tracking servers
+- Fanboy-eva Poboljšana Lista za Praćenje
+- Dan Pollock-ova hosts datoteka
+- hpHosts-ovi serveri za reklame i praćenje
- MVPS HOSTS
- Spam404
- I mnogi drugi
-Naravno, što je više omogućeno filtera, veća je i upotreba memorije. Ipak, čak i nakon dodavanja Fanboy-ova dva dodatna popisa/spiska, hpHosts servera za reklame i praćenje, uBlock još uvijek ima manji memorijski otisak/zahtjev od drugih/ostalih poznatih blokera.
+Naravno, sa više omogućenih filtera, veća je i upotreba memorije. Ipak, čak i nakon što Fanboy-ova dva dodatna spiska, i hpHosts serveri za reklame i praćenje, su dodata, uBlock još uvijek ima manju upotrebu memorije od drugih poznatih blokera.
-Također, čuvajte na umu da odabirom/izbor nekih od ovih dodatnih popisa može povećati prilike da se web-stranica pokvari -- posebno/naručito onih popisa/spiskova koji se obično koriste kao izvorne datoteke.
+Također, držite na umu da ako odaberete nekih od ovih pomoćnih spisaka možete i povećati prilike kvara web-stranice -- pogotovo onih spisaka koji se obično koriste kao hosts datoteke.
***
-Bez napredne liste/spiska filtera, ovo proširenje neće raditi. Tako da ako ikad želite doprinijeti nešto, razmislite o ljudima koji naporno rade održavajući popise/spiskove filtera koje vi koristite, i koji su dostupni svima za besplatnu korist.
+Bez prednaštimanih listih filtera, ovo proširenje neće raditi. Tako da ako ikad želite doprinijeti nešto, razmislite o ljudima koji naporno rade održavajući spiske filtera koje vi koristite i koji su dostupni za besplatno korištenje svima.
***
@@ -38,10 +38,10 @@
Otvorenog koda sa javnom licencom (GPLv3)
Za korisnike od korisnika.
-Suradnici @ Github: https://github.com/gorhill/uBlock/graphs/contributors
-Suradnici @ Crowdin: https://crowdin.net/project/ublock
+Saradnici @ Github: https://github.com/gorhill/uBlock/graphs/contributors
+Saradnici @ Crowdin: https://crowdin.net/project/ublock
***
-Popis/izvješće promjena:
+Spiska promjena:
https://github.com/gorhill/uBlock/releases
diff -Nru ublock-origin-1.37.0+dfsg/dist/description/description-ja.txt ublock-origin-1.42.0+dfsg/dist/description/description-ja.txt
--- ublock-origin-1.37.0+dfsg/dist/description/description-ja.txt 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/dist/description/description-ja.txt 2022-05-06 01:15:22.000000000 +0000
@@ -1,8 +1,8 @@
-効率的なブロッカー:メモリーとCPUに優しいため、人気のある他のブロッカーと比べて何千も多くのフィルターを使用することができます。
+効率的なブロッカー: メモリーとCPUに優しいため、人気のある他のブロッカーと比べて何千も多くのフィルターを使用することができます。
-他ソフトとの比較: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared
+他ソフトとの比較: https://github.com/gorhill/uBlock/wiki/uBlock-vs.-ABP:-efficiency-compared
-使用法: ポップアップに表示される大きな電源ボタンは、現在のサイトでuBlockの有効/無効を切り替えます。 変更は現在のサイトへのみ適用されます。他のサイトとの共通ボタンではありません。
+使用法: ポップアップに表示される大きな電源ボタンで、現在のサイトのuBlockの有効/無効を切り替えます。 変更は現在のサイトへのみ適用されます。他のサイトとの共通ボタンではありません。
***
diff -Nru ublock-origin-1.37.0+dfsg/dist/firefox/publish-signed-beta.py ublock-origin-1.42.0+dfsg/dist/firefox/publish-signed-beta.py
--- ublock-origin-1.37.0+dfsg/dist/firefox/publish-signed-beta.py 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/dist/firefox/publish-signed-beta.py 2022-05-06 01:15:22.000000000 +0000
@@ -201,7 +201,7 @@
headers = { 'Authorization': get_jwt_auth(), }
data = { 'channel': 'unlisted' }
files = { 'upload': f, }
- signing_url = 'https://addons.mozilla.org/api/v3/addons/{0}/versions/{1}/'.format(extension_id, ext_version)
+ signing_url = 'https://addons.mozilla.org/api/v4/addons/{0}/versions/{1}/'.format(extension_id, ext_version)
print('Submitting package to be signed...')
response = requests.put(signing_url, headers=headers, data=data, files=files)
if response.status_code != 202:
diff -Nru ublock-origin-1.37.0+dfsg/dist/firefox/updates.json ublock-origin-1.42.0+dfsg/dist/firefox/updates.json
--- ublock-origin-1.37.0+dfsg/dist/firefox/updates.json 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/dist/firefox/updates.json 2022-05-06 01:15:22.000000000 +0000
@@ -3,9 +3,9 @@
"uBlock0@raymondhill.net": {
"updates": [
{
- "version": "1.36.3.101",
- "browser_specific_settings": { "gecko": { "strict_min_version": "57" } },
- "update_link": "https://github.com/gorhill/uBlock/releases/download/1.36.3rc1/uBlock0_1.36.3rc1.firefox.signed.xpi"
+ "version": "1.41.9.103",
+ "browser_specific_settings": { "gecko": { "strict_min_version": "60" } },
+ "update_link": "https://github.com/gorhill/uBlock/releases/download/1.41.9rc3/uBlock0_1.41.9rc3.firefox.signed.xpi"
}
]
}
diff -Nru ublock-origin-1.37.0+dfsg/dist/firefox/updates.template.json ublock-origin-1.42.0+dfsg/dist/firefox/updates.template.json
--- ublock-origin-1.37.0+dfsg/dist/firefox/updates.template.json 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/dist/firefox/updates.template.json 2022-05-06 01:15:22.000000000 +0000
@@ -4,7 +4,7 @@
"updates": [
{
"version": "$ext_version",
- "browser_specific_settings": { "gecko": { "strict_min_version": "57" } },
+ "browser_specific_settings": { "gecko": { "strict_min_version": "60" } },
"update_link": "https://github.com/gorhill/uBlock/releases/download/$tag_version/uBlock0_$tag_version.firefox.signed.xpi"
}
]
diff -Nru ublock-origin-1.37.0+dfsg/dist/version ublock-origin-1.42.0+dfsg/dist/version
--- ublock-origin-1.37.0+dfsg/dist/version 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/dist/version 2022-05-06 01:15:22.000000000 +0000
@@ -1 +1 @@
-1.37.0
+1.42.0
diff -Nru ublock-origin-1.37.0+dfsg/docs/tests/procedural-cosmetic-filters.html ublock-origin-1.42.0+dfsg/docs/tests/procedural-cosmetic-filters.html
--- ublock-origin-1.37.0+dfsg/docs/tests/procedural-cosmetic-filters.html 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/docs/tests/procedural-cosmetic-filters.html 2022-05-06 01:15:22.000000000 +0000
@@ -73,118 +73,133 @@
Tests
-
+
-
#pcf #a1 .fail:has(b)
+
.fail:has(b)
-
+
-
#pcf #a2 .fail:has(> a > b)
+
.fail:has(> a > b)
-
+
+
+
+
+
.fail:has(:scope + a > b)
+
+
+
+
+
.fail:has(:is(.pass a > b))
+
+
+
-
#pcf #a3 .fail:not(:has(c))
+
.fail:not(:has(c))
-
+
-
#pcf #a4 .fail:has-text(needle)
+
.fail:has-text(needle)
-
+
-
#pcf #a5 .fail:has-text(/NEEDLE/i)
+
.fail:has-text(/NEEDLE/i)
-
+
-
#pcf #a6 .fail:not(:has-text(haystack))
+
.fail:not(:has-text(haystack))
-
+
-
#pcf #a7 .fail:matches-css(position: absolute)
+
.fail:matches-css(position: absolute)
-
+
-
#pcf #a8 .fail:has(a:matches-css-before(opacity: 0))
+
.fail:has(a:matches-css-before(opacity: 0))
-
+
-
#pcf #a9 .fail:has(b:matches-css-after(opacity: 0))
+
.fail:has(b:matches-css-after(opacity: 0))
-
+
-
#pcf #a10 .fail > a > b:nth-ancestor(2)
+
.fail > a > b:nth-ancestor(2)
-
+
-
#pcf #a11:xpath(.//b/../..)
+
:xpath(.//b/../..)
-
+
-
#pcf #a12 .fail:min-text-length(300)
+
.fail:min-text-length(300)
-
+
-
#pcf #a13 .pass > a:has(b) + .fail
+
.pass > a:has(b) + .fail
-
+
-
#pcf #a14 .pass > a:has(b) + .fail:has(b)
+
.pass > a:has(b) + .fail:has(b)
-
+
-
#pcf #a15 .pass:watch-attr(class) > .fail:has(b.notok)
+
.pass:watch-attr(class) > .fail:has(b.notok)
-
+
-
#pcf #a16 .fail:has(+ a)
+
.fail:has(+ a)
-
+
-
#pcf #a17 .fail:has(~ a:has(b))
+
.fail:has(~ a:has(b))
-
+
-
#pcf #a18 .fail:remove()
+
.fail:remove()
-
+
-
#pcf #a19 b:upward(2)
+
b:upward(2)
-
+
-
#pcf #a20 b:upward(.fail)
+
b:upward(.fail)
-
+
-
#pcf #a21 b:upward(.fail):style(visibility: hidden !important)
+
b:upward(.fail):style(visibility: hidden !important)
@@ -193,10 +208,17 @@
const hostname = self.location.hostname;
const filters = [];
const fragment = document.createDocumentFragment();
- for ( const node of document.querySelectorAll('code') ) {
+ let i = 1;
+ for ( const tile of document.querySelectorAll('.tile') ) {
+ const id = `a${i}`;
+ tile.id = id;
+ const code = tile.querySelector('code');
+ const filter = `#pcf #${id}${code.textContent}`;
+ code.textContent = filter;
const div = document.createElement('div');
- div.textContent = `${hostname}##${node.textContent}`;
+ div.textContent = `${hostname}#?#${filter}`;
fragment.appendChild(div);
+ i += 1;
}
const parent = document.querySelector('.filters');
while ( parent.lastElementChild !== null ) {
diff -Nru ublock-origin-1.37.0+dfsg/docs/tests/static-filtering-parser-checklist.txt ublock-origin-1.42.0+dfsg/docs/tests/static-filtering-parser-checklist.txt
--- ublock-origin-1.37.0+dfsg/docs/tests/static-filtering-parser-checklist.txt 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/docs/tests/static-filtering-parser-checklist.txt 2022-05-06 01:15:22.000000000 +0000
@@ -7,7 +7,7 @@
! invalid cases, by typically adding the list to uBO, disabling the list,
! and viewing it in uBO's asset viewer.
!
-! Feel free to add more entries to more throughly validate the static
+! Feel free to add more entries to more thoroughly validate the static
! filtering parser, submit the changes in your fork of uBO by opening an
! issue at https://github.com/uBlockOrigin/uBlock-issues/issues
diff -Nru ublock-origin-1.37.0+dfsg/platform/browser/main.js ublock-origin-1.42.0+dfsg/platform/browser/main.js
--- ublock-origin-1.37.0+dfsg/platform/browser/main.js 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/browser/main.js 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,125 @@
+/*******************************************************************************
+
+ uBlock Origin - a browser extension to block requests.
+ Copyright (C) 2014-present Raymond Hill
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see {http://www.gnu.org/licenses/}.
+
+ Home: https://github.com/gorhill/uBlock
+*/
+
+'use strict';
+
+/******************************************************************************/
+
+import publicSuffixList from './lib/publicsuffixlist/publicsuffixlist.js';
+import punycode from './lib/punycode.js';
+
+import staticNetFilteringEngine from './js/static-net-filtering.js';
+import { FilteringContext } from './js/filtering-context.js';
+import { LineIterator } from './js/text-utils.js';
+import { StaticFilteringParser } from './js/static-filtering-parser.js';
+
+import {
+ CompiledListReader,
+ CompiledListWriter
+} from './js/static-filtering-io.js';
+
+/******************************************************************************/
+
+function compileList(rawText, writer) {
+ const lineIter = new LineIterator(rawText);
+ const parser = new StaticFilteringParser(true);
+ const compiler = staticNetFilteringEngine.createCompiler(parser);
+
+ parser.setMaxTokenLength(staticNetFilteringEngine.MAX_TOKEN_LENGTH);
+
+ while ( lineIter.eot() === false ) {
+ let line = lineIter.next();
+
+ while ( line.endsWith(' \\') ) {
+ if ( lineIter.peek(4) !== ' ' ) { break; }
+ line = line.slice(0, -2).trim() + lineIter.next().trim();
+ }
+ parser.analyze(line);
+
+ if ( parser.shouldIgnore() ) { continue; }
+ if ( parser.category !== parser.CATStaticNetFilter ) { continue; }
+ if ( parser.patternHasUnicode() && parser.toASCII() === false ) {
+ continue;
+ }
+ if ( compiler.compile(parser, writer) ) { continue; }
+ if ( compiler.error !== undefined ) {
+ console.info(JSON.stringify({
+ realm: 'message',
+ type: 'error',
+ text: compiler.error
+ }));
+ }
+ }
+
+ return writer.toString();
+}
+
+function applyList(name, raw) {
+ const writer = new CompiledListWriter();
+ writer.properties.set('name', name);
+ const compiled = compileList(raw, writer);
+ const reader = new CompiledListReader(compiled);
+ staticNetFilteringEngine.fromCompiled(reader);
+}
+
+function enableWASM(path) {
+ return Promise.all([
+ publicSuffixList.enableWASM(`${path}/lib/publicsuffixlist`),
+ staticNetFilteringEngine.enableWASM(`${path}/js`),
+ ]);
+}
+
+function pslInit(raw) {
+ if ( typeof raw !== 'string' || raw.trim() === '' ) {
+ console.info('Unable to populate public suffix list');
+ return;
+ }
+ publicSuffixList.parse(raw, punycode.toASCII);
+ console.info('Public suffix list populated');
+}
+
+function restart(lists) {
+ // Remove all filters
+ reset();
+
+ if ( Array.isArray(lists) && lists.length !== 0 ) {
+ // Populate filtering engine with filter lists
+ for ( const { name, raw } of lists ) {
+ applyList(name, raw);
+ }
+ // Commit changes
+ staticNetFilteringEngine.freeze();
+ staticNetFilteringEngine.optimize();
+ }
+
+ return staticNetFilteringEngine;
+}
+
+function reset() {
+ staticNetFilteringEngine.reset();
+}
+
+export {
+ FilteringContext,
+ enableWASM,
+ pslInit,
+ restart,
+};
diff -Nru ublock-origin-1.37.0+dfsg/platform/browser/test.html ublock-origin-1.42.0+dfsg/platform/browser/test.html
--- ublock-origin-1.37.0+dfsg/platform/browser/test.html 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/browser/test.html 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,71 @@
+
+
+
+
+
uBO Static Network Filtering Engine
+
+
+
+
+
diff -Nru ublock-origin-1.37.0+dfsg/platform/chromium/manifest.json ublock-origin-1.42.0+dfsg/platform/chromium/manifest.json
--- ublock-origin-1.37.0+dfsg/platform/chromium/manifest.json 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/chromium/manifest.json 2022-05-06 01:15:22.000000000 +0000
@@ -26,6 +26,9 @@
},
"relax-blocking-mode": {
"description": "__MSG_relaxBlockingMode__"
+ },
+ "toggle-cosmetic-filtering": {
+ "description": "__MSG_toggleCosmeticFiltering__"
}
},
"content_scripts": [
@@ -50,7 +53,8 @@
"https://filterlists.com/*",
"https://forums.lanik.us/*",
"https://github.com/*",
- "https://*.github.io/*"
+ "https://*.github.io/*",
+ "https://*.letsblock.it/*"
],
"js": [
"/js/scriptlets/subscriber.js"
@@ -70,7 +74,7 @@
},
"incognito": "split",
"manifest_version": 2,
- "minimum_chrome_version": "55.0",
+ "minimum_chrome_version": "66.0",
"name": "uBlock Origin",
"options_ui": {
"page": "dashboard.html",
diff -Nru ublock-origin-1.37.0+dfsg/platform/chromium/vapi-background-ext.js ublock-origin-1.42.0+dfsg/platform/chromium/vapi-background-ext.js
--- ublock-origin-1.37.0+dfsg/platform/chromium/vapi-background-ext.js 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/chromium/vapi-background-ext.js 2022-05-06 01:15:22.000000000 +0000
@@ -28,6 +28,8 @@
// https://github.com/uBlockOrigin/uBlock-issues/issues/1659
// Chromium fails to dispatch onCreatedNavigationTarget() events sometimes,
// so we synthetize these missing events when this happens.
+// https://github.com/uBlockOrigin/uAssets/issues/10323
+// Also mind whether the new tab is launched from an external application.
vAPI.Tabs = class extends vAPI.Tabs {
constructor() {
@@ -65,12 +67,11 @@
synthesizeNavigationTargetEvent(details) {
if ( this.tabIds.has(details.tabId) === false ) { return; }
this.tabIds.delete(details.tabId);
- if (
- Array.isArray(details.transitionQualifiers) === false ||
- details.transitionQualifiers.includes('client_redirect') === false
- ) {
- return;
- }
+ const isClientRedirect =
+ Array.isArray(details.transitionQualifiers) &&
+ details.transitionQualifiers.includes('client_redirect');
+ const isStartPage = details.transitionType === 'start_page';
+ if ( isClientRedirect === false && isStartPage === false ) { return; }
this.onCreatedNavigationTargetHandler({
tabId: details.tabId,
sourceTabId: details.tabId,
@@ -182,12 +183,16 @@
suspendOneRequest(details) {
this.suspendedTabIds.add(details.tabId);
- return { cancel: true };
+ return {
+ redirectUrl: vAPI.getURL(`web_accessible_resources/empty?secret=${vAPI.warSecret()}`)
+ };
}
- unsuspendAllRequests() {
- for ( const tabId of this.suspendedTabIds ) {
- vAPI.tabs.reload(tabId);
+ unsuspendAllRequests(discard = false) {
+ if ( discard !== true ) {
+ for ( const tabId of this.suspendedTabIds ) {
+ vAPI.tabs.reload(tabId);
+ }
}
this.suspendedTabIds.clear();
}
diff -Nru ublock-origin-1.37.0+dfsg/platform/chromium/webext.js ublock-origin-1.42.0+dfsg/platform/chromium/webext.js
--- ublock-origin-1.37.0+dfsg/platform/chromium/webext.js 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/chromium/webext.js 2022-05-06 01:15:22.000000000 +0000
@@ -24,9 +24,6 @@
// `webext` is a promisified api of `chrome`. Entries are added as
// the promisification of uBO progress.
-const webext = (( ) => { // jshint ignore:line
-// >>>>> start of private scope
-
const promisifyNoFail = function(thisArg, fnName, outFn = r => r) {
const fn = thisArg[fnName];
return function() {
@@ -164,7 +161,4 @@
webext.tabs.removeCSS = promisifyNoFail(chrome.tabs, 'removeCSS');
}
-return webext;
-
-// <<<<< end of private scope
-})();
+export default webext;
diff -Nru ublock-origin-1.37.0+dfsg/platform/common/vapi-background.js ublock-origin-1.42.0+dfsg/platform/common/vapi-background.js
--- ublock-origin-1.37.0+dfsg/platform/common/vapi-background.js 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/common/vapi-background.js 2022-05-06 01:15:22.000000000 +0000
@@ -26,13 +26,11 @@
/******************************************************************************/
-{
-// >>>>> start of local scope
+import webext from './webext.js';
+import { ubolog } from './console.js';
/******************************************************************************/
-/******************************************************************************/
-const browser = self.browser;
const manifest = browser.runtime.getManifest();
vAPI.cantWebsocket =
@@ -42,28 +40,11 @@
vAPI.canWASM = vAPI.webextFlavor.soup.has('chromium') === false;
if ( vAPI.canWASM === false ) {
const csp = manifest.content_security_policy;
- vAPI.canWASM = csp !== undefined && csp.indexOf("'wasm-eval'") !== -1;
+ vAPI.canWASM = csp !== undefined && csp.indexOf("'unsafe-eval'") !== -1;
}
vAPI.supportsUserStylesheets = vAPI.webextFlavor.soup.has('user_stylesheet');
-// The real actual webextFlavor value may not be set in stone, so listen
-// for possible future changes.
-window.addEventListener('webextFlavor', function() {
- vAPI.supportsUserStylesheets =
- vAPI.webextFlavor.soup.has('user_stylesheet');
-}, { once: true });
-
-/******************************************************************************/
-
-vAPI.randomToken = function() {
- const n = Math.random();
- return String.fromCharCode(n * 26 + 97) +
- Math.floor(
- (0.25 + n * 0.75) * Number.MAX_SAFE_INTEGER
- ).toString(36).slice(-8);
-};
-
/******************************************************************************/
vAPI.app = {
@@ -125,82 +106,10 @@
if ( bp instanceof Object === false ) { return; }
return {
- // Whether the WebRTC-related privacy API is crashy is an open question
- // only for Chromium proper (because it can be compiled without the
- // WebRTC feature): hence avoid overhead of the evaluation (which uses
- // an iframe) for platforms where it's a non-issue.
- // https://github.com/uBlockOrigin/uBlock-issues/issues/9
- // Some Chromium builds are made to look like a Chrome build.
- webRTCSupported: vAPI.webextFlavor.soup.has('chromium') === false || undefined,
-
- // Calling with `true` means IP address leak is not prevented.
- // https://github.com/gorhill/uBlock/issues/533
- // We must first check wether this Chromium-based browser was compiled
- // with WebRTC support. To do this, we use an iframe, this way the
- // empty RTCPeerConnection object we create to test for support will
- // be properly garbage collected. This prevents issues such as
- // a computer unable to enter into sleep mode, as reported in the
- // Chrome store:
- // https://github.com/gorhill/uBlock/issues/533#issuecomment-167931681
- setWebrtcIPAddress: function(setting) {
- // We don't know yet whether this browser supports WebRTC: find out.
- if ( this.webRTCSupported === undefined ) {
- // If asked to leave WebRTC setting alone at this point in the
- // code, this means we never grabbed the setting in the first
- // place.
- if ( setting ) { return; }
- this.webRTCSupported = { setting: setting };
- let iframe = document.createElement('iframe');
- const messageHandler = ev => {
- if ( ev.origin !== self.location.origin ) { return; }
- window.removeEventListener('message', messageHandler);
- const setting = this.webRTCSupported.setting;
- this.webRTCSupported = ev.data === 'webRTCSupported';
- this.setWebrtcIPAddress(setting);
- iframe.parentNode.removeChild(iframe);
- iframe = null;
- };
- window.addEventListener('message', messageHandler);
- iframe.src = 'is-webrtc-supported.html';
- document.body.appendChild(iframe);
- return;
- }
-
- // We are waiting for a response from our iframe. This makes the code
- // safe to re-entrancy.
- if ( typeof this.webRTCSupported === 'object' ) {
- this.webRTCSupported.setting = setting;
- return;
- }
-
- // https://github.com/gorhill/uBlock/issues/533
- // WebRTC not supported: `webRTCMultipleRoutesEnabled` can NOT be
- // safely accessed. Accessing the property will cause full browser
- // crash.
- if ( this.webRTCSupported !== true ) { return; }
-
- const bpn = bp.network;
-
- if ( setting ) {
- bpn.webRTCIPHandlingPolicy.clear({
- scope: 'regular',
- });
- } else {
- // https://github.com/uBlockOrigin/uAssets/issues/333#issuecomment-289426678
- // Leverage virtuous side-effect of strictest setting.
- // https://github.com/gorhill/uBlock/issues/3009
- // Firefox currently works differently, use
- // `default_public_interface_only` for now.
- // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/privacy/network#Browser_compatibility
- // Firefox 70+ supports `disable_non_proxied_udp`
- const value =
- vAPI.webextFlavor.soup.has('firefox') === false ||
- vAPI.webextFlavor.major < 70
- ? 'default_public_interface_only'
- : 'disable_non_proxied_udp';
- bpn.webRTCIPHandlingPolicy.set({ value, scope: 'regular' });
- }
- },
+ // https://github.com/uBlockOrigin/uBlock-issues/issues/1723#issuecomment-919913361
+ canLeakLocalIPAddresses:
+ vAPI.webextFlavor.soup.has('firefox') &&
+ vAPI.webextFlavor.soup.has('mobile'),
set: function(details) {
for ( const setting in details ) {
@@ -236,10 +145,36 @@
}
break;
- case 'webrtcIPAddress':
- this.setWebrtcIPAddress(!!details[setting]);
+ case 'webrtcIPAddress': {
+ // https://github.com/uBlockOrigin/uBlock-issues/issues/1928
+ // https://www.reddit.com/r/uBlockOrigin/comments/sl7p74/
+ // Hypothetical: some browsers _think_ uBO is still using
+ // the setting possibly based on cached state from the
+ // past, and making an explicit API call that uBO is not
+ // using the setting appears to solve those unexpected
+ // reported occurrences of uBO interfering despite never
+ // using the API.
+ const mustEnable = !details[setting];
+ if ( this.canLeakLocalIPAddresses === false ) {
+ if ( mustEnable && vAPI.webextFlavor.soup.has('chromium') ) {
+ bp.network.webRTCIPHandlingPolicy.clear({
+ scope: 'regular',
+ });
+ }
+ continue;
+ }
+ if ( mustEnable ) {
+ bp.network.webRTCIPHandlingPolicy.set({
+ value: 'default_public_interface_only',
+ scope: 'regular'
+ });
+ } else {
+ bp.network.webRTCIPHandlingPolicy.clear({
+ scope: 'regular',
+ });
+ }
break;
-
+ }
default:
break;
}
@@ -476,16 +411,6 @@
return;
}
- // https://github.com/gorhill/uBlock/issues/3053#issuecomment-332276818
- // Do not try to lookup uBO's own pages with FF 55 or less.
- if (
- vAPI.webextFlavor.soup.has('firefox') &&
- vAPI.webextFlavor.major < 56
- ) {
- this.create(targetURL, details);
- return;
- }
-
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query#Parameters
// "Note that fragment identifiers are not matched."
// Fragment identifiers ARE matched -- we need to remove the fragment.
@@ -600,9 +525,12 @@
}
onUpdatedHandler(tabId, changeInfo, tab) {
+ // Ignore uninteresting update events
+ const { status = '', title = '', url = '' } = changeInfo;
+ if ( status === '' && title === '' && url === '' ) { return; }
// https://github.com/gorhill/uBlock/issues/3073
// Fall back to `tab.url` when `changeInfo.url` is not set.
- if ( typeof changeInfo.url !== 'string' ) {
+ if ( url === '' ) {
changeInfo.url = tab && tab.url;
}
if ( changeInfo.url ) {
@@ -896,12 +824,18 @@
// content scripts. Whether a message can trigger a privileged operation is
// decided based on whether the port from which a message is received is
// privileged, which is a status evaluated once, at port connection time.
+//
+// https://github.com/uBlockOrigin/uBlock-issues/issues/1992
+// If present, use MessageSender.origin to determine whether the port is
+// from a privileged page, otherwise use MessageSender.url.
+// MessageSender.origin is more reliable as it is not spoofable by a
+// compromised renderer.
vAPI.messaging = {
ports: new Map(),
listeners: new Map(),
defaultHandler: null,
- PRIVILEGED_URL: vAPI.getURL(''),
+ PRIVILEGED_ORIGIN: vAPI.getURL('').slice(0, -1),
NOOPFUNC: function(){},
UNHANDLED: 'vAPI.messaging.notHandled',
@@ -927,10 +861,12 @@
);
const portDetails = { port };
const sender = port.sender;
- const { tab, url } = sender;
+ const { origin, tab, url } = sender;
portDetails.frameId = sender.frameId;
portDetails.frameURL = url;
- portDetails.privileged = url.startsWith(this.PRIVILEGED_URL);
+ portDetails.privileged = origin !== undefined
+ ? origin === this.PRIVILEGED_ORIGIN
+ : url.startsWith(this.PRIVILEGED_ORIGIN);
if ( tab ) {
portDetails.tabId = tab.id;
portDetails.tabURL = tab.url;
@@ -1143,7 +1079,7 @@
}
// Auxiliary process to main process: no handler
- log.info(
+ ubolog(
`vAPI.messaging.onPortMessage > unhandled request: ${JSON.stringify(request.msg)}`,
request
);
@@ -1301,12 +1237,10 @@
}
unsuspendAllRequests() {
}
- suspend(force = false) {
- if ( this.canSuspend() || force ) {
- this.suspendDepth += 1;
- }
+ suspend() {
+ this.suspendDepth += 1;
}
- unsuspend(all = false) {
+ unsuspend({ all = false, discard = false } = {}) {
if ( this.suspendDepth === 0 ) { return; }
if ( all ) {
this.suspendDepth = 0;
@@ -1314,55 +1248,11 @@
this.suspendDepth -= 1;
}
if ( this.suspendDepth !== 0 ) { return; }
- this.unsuspendAllRequests();
+ this.unsuspendAllRequests(discard);
}
- canSuspend() {
+ static canSuspend() {
return false;
}
- async benchmark() {
- if ( typeof µBlock !== 'object' ) { return; }
- const requests = await µBlock.loadBenchmarkDataset();
- if ( Array.isArray(requests) === false || requests.length === 0 ) {
- console.info('No requests found to benchmark');
- return;
- }
- const mappedTypes = new Map([
- [ 'document', 'main_frame' ],
- [ 'subdocument', 'sub_frame' ],
- ]);
- console.info('vAPI.net.onBeforeSuspendableRequest()...');
- const t0 = self.performance.now();
- const promises = [];
- const details = {
- documentUrl: '',
- tabId: -1,
- parentFrameId: -1,
- frameId: 0,
- type: '',
- url: '',
- };
- for ( const request of requests ) {
- details.documentUrl = request.frameUrl;
- details.tabId = -1;
- details.parentFrameId = -1;
- details.frameId = 0;
- details.type = mappedTypes.get(request.cpt) || request.cpt;
- details.url = request.url;
- if ( details.type === 'main_frame' ) { continue; }
- promises.push(this.onBeforeSuspendableRequest(details));
- }
- return Promise.all(promises).then(results => {
- let blockCount = 0;
- for ( const r of results ) {
- if ( r !== undefined ) { blockCount += 1; }
- }
- const t1 = self.performance.now();
- const dur = t1 - t0;
- console.info(`Evaluated ${requests.length} requests in ${dur.toFixed(0)} ms`);
- console.info(`\tBlocked ${blockCount} requests`);
- console.info(`\tAverage: ${(dur / requests.length).toFixed(3)} ms per request`);
- });
- }
};
/******************************************************************************/
@@ -1719,9 +1609,3 @@
})();
/******************************************************************************/
-/******************************************************************************/
-
-// <<<<< end of local scope
-}
-
-/******************************************************************************/
diff -Nru ublock-origin-1.37.0+dfsg/platform/common/vapi-client.js ublock-origin-1.42.0+dfsg/platform/common/vapi-client.js
--- ublock-origin-1.37.0+dfsg/platform/common/vapi-client.js 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/common/vapi-client.js 2022-05-06 01:15:22.000000000 +0000
@@ -40,7 +40,7 @@
vAPI.randomToken = function() {
const n = Math.random();
- return String.fromCharCode(n * 26 + 97) +
+ return String.fromCharCode(n * 25 + 97) +
Math.floor(
(0.25 + n * 0.75) * Number.MAX_SAFE_INTEGER
).toString(36).slice(-8);
@@ -97,9 +97,12 @@
// as world-ending, i.e. stay around. Except for embedded frames.
disconnectListener: function() {
+ void browser.runtime.lastError;
this.port = null;
if ( window !== window.top ) {
vAPI.shutdown.exec();
+ } else {
+ this.destroyPort();
}
},
disconnectListenerBound: null,
@@ -129,11 +132,10 @@
messageListenerBound: null,
canDestroyPort: function() {
- return this.pending.size === 0 &&
- (
- this.extensions.length === 0 ||
- this.extensions.every(e => e.canDestroyPort())
- );
+ return this.pending.size === 0 && (
+ this.extensions.length === 0 ||
+ this.extensions.every(e => e.canDestroyPort())
+ );
},
mustDestroyPort: function() {
diff -Nru ublock-origin-1.37.0+dfsg/platform/common/vapi-common.js ublock-origin-1.42.0+dfsg/platform/common/vapi-common.js
--- ublock-origin-1.37.0+dfsg/platform/common/vapi-common.js 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/common/vapi-common.js 2022-05-06 01:15:22.000000000 +0000
@@ -66,19 +66,16 @@
typeof browser.runtime.getBrowserInfo === 'function'
) {
browser.runtime.getBrowserInfo().then(info => {
- flavor.major = parseInt(info.version, 10) || 60;
+ flavor.major = parseInt(info.version, 10) || flavor.major;
soup.add(info.vendor.toLowerCase())
.add(info.name.toLowerCase());
- if ( soup.has('firefox') && flavor.major < 57 ) {
- soup.delete('html_filtering');
- }
dispatch();
});
if ( browser.runtime.getURL('').startsWith('moz-extension://') ) {
soup.add('firefox')
.add('user_stylesheet')
.add('html_filtering');
- flavor.major = 60;
+ flavor.major = 91;
}
return;
}
@@ -86,12 +83,9 @@
// Synchronous -- order of tests is important
const match = /\bChrom(?:e|ium)\/([\d.]+)/.exec(ua);
if ( match !== null ) {
- soup.add('chromium');
+ soup.add('chromium')
+ .add('user_stylesheet');
flavor.major = parseInt(match[1], 10) || 0;
- // https://github.com/gorhill/uBlock/issues/3588
- if ( flavor.major >= 66 ) {
- soup.add('user_stylesheet');
- }
}
// Don't starve potential listeners
@@ -100,59 +94,6 @@
/******************************************************************************/
-{
- const punycode = self.punycode;
- const reCommonHostnameFromURL = /^https?:\/\/([0-9a-z_][0-9a-z._-]*[0-9a-z])\//;
- const reAuthorityFromURI = /^(?:[^:\/?#]+:)?(\/\/[^\/?#]+)/;
- const reHostFromNakedAuthority = /^[0-9a-z._-]+[0-9a-z]$/i;
- const reHostFromAuthority = /^(?:[^@]*@)?([^:]+)(?::\d*)?$/;
- const reIPv6FromAuthority = /^(?:[^@]*@)?(\[[0-9a-f:]+\])(?::\d*)?$/i;
- const reMustNormalizeHostname = /[^0-9a-z._-]/;
-
- vAPI.hostnameFromURI = function(uri) {
- let matches = reCommonHostnameFromURL.exec(uri);
- if ( matches !== null ) { return matches[1]; }
- matches = reAuthorityFromURI.exec(uri);
- if ( matches === null ) { return ''; }
- const authority = matches[1].slice(2);
- if ( reHostFromNakedAuthority.test(authority) ) {
- return authority.toLowerCase();
- }
- matches = reHostFromAuthority.exec(authority);
- if ( matches === null ) {
- matches = reIPv6FromAuthority.exec(authority);
- if ( matches === null ) { return ''; }
- }
- let hostname = matches[1];
- while ( hostname.endsWith('.') ) {
- hostname = hostname.slice(0, -1);
- }
- if ( reMustNormalizeHostname.test(hostname) ) {
- hostname = punycode.toASCII(hostname.toLowerCase());
- }
- return hostname;
- };
-
- const reHostnameFromNetworkURL =
- /^(?:http|ws|ftp)s?:\/\/([0-9a-z_][0-9a-z._-]*[0-9a-z])(?::\d+)?\//;
-
- vAPI.hostnameFromNetworkURL = function(url) {
- const matches = reHostnameFromNetworkURL.exec(url);
- return matches !== null ? matches[1] : '';
- };
-
- const psl = self.publicSuffixList;
- const reIPAddressNaive = /^\d+\.\d+\.\d+\.\d+$|^\[[\da-zA-Z:]+\]$/;
-
- vAPI.domainFromHostname = function(hostname) {
- return reIPAddressNaive.test(hostname)
- ? hostname
- : psl.getDomain(hostname);
- };
-}
-
-/******************************************************************************/
-
vAPI.download = function(details) {
if ( !details.url ) { return; }
const a = document.createElement('a');
diff -Nru ublock-origin-1.37.0+dfsg/platform/common/vapi.js ublock-origin-1.42.0+dfsg/platform/common/vapi.js
--- ublock-origin-1.37.0+dfsg/platform/common/vapi.js 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/common/vapi.js 2022-05-06 01:15:22.000000000 +0000
@@ -27,7 +27,10 @@
/******************************************************************************/
-if ( self.browser instanceof Object ) {
+if (
+ self.browser instanceof Object &&
+ self.browser instanceof Element === false
+) {
self.chrome = self.browser;
} else {
self.browser = self.chrome;
diff -Nru ublock-origin-1.37.0+dfsg/platform/dig/package.json ublock-origin-1.42.0+dfsg/platform/dig/package.json
--- ublock-origin-1.37.0+dfsg/platform/dig/package.json 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/dig/package.json 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,28 @@
+{
+ "name": "@gorhill/ubo-dig",
+ "version": "0.1.0",
+ "description": "To investigate code changes (not for publication)",
+ "type": "module",
+ "main": "index.js",
+ "scripts": {
+ "build": "node build.js",
+ "snfe": "node snfe.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/gorhill/uBlock.git"
+ },
+ "author": "Raymond Hill",
+ "license": "GPL-3.0-or-later",
+ "bugs": {
+ "url": "https://github.com/gorhill/uBlock/issues"
+ },
+ "homepage": "https://github.com/gorhill/uBlock#readme",
+ "engines": {
+ "node": ">=14.0.0",
+ "npm": ">=6.14.4"
+ },
+ "devDependencies": {
+ "scaling-palm-tree": "github:mjethani/scaling-palm-tree#15cf1ab"
+ }
+}
diff -Nru ublock-origin-1.37.0+dfsg/platform/dig/snfe.js ublock-origin-1.42.0+dfsg/platform/dig/snfe.js
--- ublock-origin-1.37.0+dfsg/platform/dig/snfe.js 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/dig/snfe.js 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,392 @@
+/*******************************************************************************
+
+ uBlock Origin - a browser extension to block requests.
+ Copyright (C) 2014-present Raymond Hill
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see {http://www.gnu.org/licenses/}.
+
+ Home: https://github.com/gorhill/uBlock
+*/
+
+/* eslint-disable-next-line no-redeclare */
+/* globals process */
+
+'use strict';
+
+/******************************************************************************/
+
+import { strict as assert } from 'assert';
+import { createRequire } from 'module';
+import { readFileSync, writeFileSync } from 'fs';
+import { dirname, resolve } from 'path';
+import { fileURLToPath } from 'url';
+
+const __dirname = dirname(fileURLToPath(import.meta.url));
+
+import { enableWASM, StaticNetFilteringEngine } from './index.js';
+
+/******************************************************************************/
+
+const FLAGS = process.argv.slice(2);
+const COMPARE = FLAGS.includes('compare');
+const MAXCOST = FLAGS.includes('maxcost');
+const MEDCOST = FLAGS.includes('medcost');
+const MINCOST = FLAGS.includes('mincost');
+const MODIFIERS = FLAGS.includes('modifiers');
+const RECORD = FLAGS.includes('record');
+const WASM = FLAGS.includes('wasm');
+const NEED_RESULTS = COMPARE || MAXCOST || MEDCOST || MINCOST || RECORD;
+
+// This maps puppeteer types to WebRequest types
+const WEBREQUEST_OPTIONS = {
+ // Consider document requests as sub_document. This is because the request
+ // dataset does not contain sub_frame or main_frame but only 'document' and
+ // different blockers have different behaviours.
+ document: 'sub_frame',
+ stylesheet: 'stylesheet',
+ image: 'image',
+ media: 'media',
+ font: 'font',
+ script: 'script',
+ xhr: 'xmlhttprequest',
+ fetch: 'xmlhttprequest',
+ websocket: 'websocket',
+ ping: 'ping',
+ // other
+ other: 'other',
+ eventsource: 'other',
+ manifest: 'other',
+ texttrack: 'other',
+};
+
+/******************************************************************************/
+
+function nanoToMilli(bigint) {
+ return (Number(bigint) / 1000000).toFixed(2) + ' ms';
+}
+
+function nanoToMicro(bigint) {
+ return (Number(bigint) / 1000).toFixed(2) + ' µs';
+}
+
+async function read(path) {
+ return readFileSync(resolve(__dirname, path), 'utf8');
+}
+
+async function write(path, data) {
+ return writeFileSync(resolve(__dirname, path), data, 'utf8');
+}
+
+/******************************************************************************/
+
+async function matchRequests(engine, requests) {
+ const results = [];
+ const details = {
+ r: 0,
+ f: undefined,
+ type: '',
+ url: '',
+ originURL: '',
+ t: 0,
+ };
+
+ let notBlockedCount = 0;
+ let blockedCount = 0;
+ let unblockedCount = 0;
+
+ const start = process.hrtime.bigint();
+
+ for ( let i = 0; i < requests.length; i++ ) {
+ const request = requests[i];
+ const reqstart = process.hrtime.bigint();
+ details.type = WEBREQUEST_OPTIONS[request.cpt];
+ details.url = request.url;
+ details.originURL = request.frameUrl;
+ const r = engine.matchRequest(details);
+ if ( r === 0 ) {
+ notBlockedCount += 1;
+ } else if ( r === 1 ) {
+ blockedCount += 1;
+ } else {
+ unblockedCount += 1;
+ }
+ if ( NEED_RESULTS !== true ) { continue; }
+ const reqstop = process.hrtime.bigint();
+ details.r = r;
+ details.f = r !== 0 ? engine.toLogData().raw : undefined;
+ details.t = Math.round(Number(reqstop - reqstart) / 10) / 100;
+ results.push([ i, Object.assign({}, details) ]);
+ }
+
+ const stop = process.hrtime.bigint();
+
+ console.log(`Matched ${requests.length} requests in ${nanoToMilli(stop - start)}`);
+ console.log(`\tNot blocked: ${notBlockedCount} requests`);
+ console.log(`\tBlocked: ${blockedCount} requests`);
+ console.log(`\tUnblocked: ${unblockedCount} requests`);
+ console.log(`\tAverage: ${nanoToMicro((stop - start) / BigInt(requests.length))} per request`);
+
+ if ( RECORD ) {
+ write('data/snfe.json', JSON.stringify(results, null, 2));
+ }
+
+ if ( COMPARE ) {
+ const diffs = await compare(results);
+ if ( Array.isArray(diffs) ) {
+ write('data/snfe.diffs.json', JSON.stringify(diffs, null, 2));
+ }
+ console.log(`Compare: ${diffs.length} requests differ`);
+ }
+
+ if ( MAXCOST ) {
+ const costly = results.slice().sort((a,b) => b[1].t - a[1].t).slice(0, 1000);
+ write('data/snfe.maxcost.json', JSON.stringify(costly, null, 2));
+ }
+
+ if ( MEDCOST ) {
+ const median = results.length >>> 1;
+ const costly = results.slice().sort((a,b) => b[1].t - a[1].t).slice(median - 500, median + 500);
+ write('data/snfe.medcost.json', JSON.stringify(costly, null, 2));
+ }
+
+ if ( MINCOST ) {
+ const costly = results.slice().sort((a,b) => b[1].t - a[1].t).slice(-1000);
+ write('data/snfe.mincost.json', JSON.stringify(costly, null, 2));
+ }
+}
+
+async function compare(results) {
+ let before;
+ try {
+ const raw = await read('data/snfe.json');
+ before = new Map(JSON.parse(raw));
+ } catch(ex) {
+ console.log(ex);
+ console.log('Nothing to compare');
+ return;
+ }
+ const after = new Map(results);
+ const diffs = [];
+ for ( let i = 0; i < results.length; i++ ) {
+ const a = before.get(i);
+ const b = after.get(i);
+ if ( a.r === b.r ) { continue; }
+ diffs.push([ i, {
+ type: a.type,
+ url: a.url,
+ originURL: a.originURL,
+ before: { r: a.r, f: a.f, t: a.t },
+ after: { r: b.r, f: b.f, t: b.t },
+ }]);
+ }
+ return diffs;
+}
+
+/******************************************************************************/
+
+async function matchRequestModifiers(engine, requests) {
+ const results = {
+ 'csp': [],
+ 'redirect-rule': [],
+ 'removeparam': [],
+ };
+
+ const details = {
+ f: undefined,
+ type: '',
+ url: '',
+ originURL: '',
+ t: 0,
+ };
+
+ let modifiedCount = 0;
+
+ const start = process.hrtime.bigint();
+ for ( let i = 0; i < requests.length; i++ ) {
+ const request = requests[i];
+ details.type = WEBREQUEST_OPTIONS[request.cpt];
+ details.url = request.url;
+ details.originURL = request.frameUrl;
+ const r = engine.matchRequest(details);
+ let modified = false;
+ if ( r !== 1 && details.type === 'sub_frame' ) {
+ const reqstart = process.hrtime.bigint();
+ const directives = engine.matchAndFetchModifiers(details, 'csp');
+ if ( directives !== undefined ) {
+ modified = true;
+ if ( NEED_RESULTS ) {
+ const reqstop = process.hrtime.bigint();
+ details.f = directives.map(a => `${a.result}:${a.logData().raw}`).sort();
+ details.t = Math.round(Number(reqstop - reqstart) / 10) / 100;
+ results['csp'].push([ i, Object.assign({}, details) ]);
+ }
+ }
+ }
+ if ( r === 1 ) {
+ const reqstart = process.hrtime.bigint();
+ const directives = engine.matchAndFetchModifiers(details, 'redirect-rule');
+ if ( directives !== undefined ) {
+ modified = true;
+ if ( NEED_RESULTS ) {
+ const reqstop = process.hrtime.bigint();
+ details.f = directives.map(a => `${a.result}:${a.logData().raw}`).sort();
+ details.t = Math.round(Number(reqstop - reqstart) / 10) / 100;
+ results['redirect-rule'].push([ i, Object.assign({}, details) ]);
+ }
+ }
+ }
+ if ( r !== 1 && engine.hasQuery(details) ) {
+ const reqstart = process.hrtime.bigint();
+ const directives = engine.matchAndFetchModifiers(details, 'removeparam');
+ if ( directives !== undefined ) {
+ modified = true;
+ if ( NEED_RESULTS ) {
+ const reqstop = process.hrtime.bigint();
+ details.f = directives.map(a => `${a.result}:${a.logData().raw}`).sort();
+ details.t = Math.round(Number(reqstop - reqstart) / 10) / 100;
+ results['removeparam'].push([ i, Object.assign({}, details) ]);
+ }
+ }
+ }
+ if ( modified ) {
+ modifiedCount += 1;
+ }
+ }
+ const stop = process.hrtime.bigint();
+
+ console.log(`Matched-modified ${requests.length} requests in ${nanoToMilli(stop - start)}`);
+ console.log(`\t${modifiedCount} modifiers found`);
+ console.log(`\tAverage: ${nanoToMicro((stop - start) / BigInt(requests.length))} per request`);
+
+ if ( RECORD ) {
+ write('data/snfe.modifiers.json', JSON.stringify(results, null, 2));
+ }
+
+ if ( COMPARE ) {
+ const diffs = await compareModifiers(results);
+ if ( Array.isArray(diffs) ) {
+ write('data/snfe.modifiers.diffs.json', JSON.stringify(diffs, null, 2));
+ }
+ console.log(`Compare: ${diffs.length} modified requests differ`);
+ }
+}
+
+async function compareModifiers(afterResults) {
+ let beforeResults;
+ try {
+ const raw = await read('data/snfe.modifiers.json');
+ beforeResults = JSON.parse(raw);
+ } catch(ex) {
+ console.log(ex);
+ console.log('Nothing to compare');
+ return;
+ }
+ const diffs = [];
+ for ( const modifier of [ 'csp', 'redirect-rule', 'removeparam' ] ) {
+ const before = new Map(beforeResults[modifier]);
+ const after = new Map(afterResults[modifier]);
+ for ( const [ i, b ] of before ) {
+ const a = after.get(i);
+ if ( a !== undefined && JSON.stringify(a.f) === JSON.stringify(b.f) ) { continue; }
+ diffs.push([ i, {
+ type: b.type,
+ url: b.url,
+ originURL: b.originURL,
+ before: { f: b.f, t: b.t },
+ after: a !== undefined ? { f: a.f, t: a.t } : null,
+ }]);
+ }
+ for ( const [ i, a ] of after ) {
+ const b = before.get(i);
+ if ( b !== undefined ) { continue; }
+ diffs.push([ i, {
+ type: a.type,
+ url: a.url,
+ originURL: a.originURL,
+ before: null,
+ after: { f: a.f, t: a.t },
+ }]);
+ }
+ }
+ return diffs;
+}
+
+/******************************************************************************/
+
+async function bench() {
+ if ( WASM ) {
+ try {
+ const result = await enableWASM();
+ if ( result === true ) {
+ console.log('WASM code paths enabled');
+ }
+ } catch(ex) {
+ console.log(ex);
+ }
+ }
+
+ const require = createRequire(import.meta.url); // jshint ignore:line
+ const requests = await require('./node_modules/scaling-palm-tree/requests.json');
+ const engine = await StaticNetFilteringEngine.create();
+
+ let start = process.hrtime.bigint();
+ await engine.useLists([
+ read('assets/ublock/badware.txt')
+ .then(raw => ({ name: 'badware', raw })),
+ read('assets/ublock/filters.txt')
+ .then(raw => ({ name: 'filters', raw })),
+ read('assets/ublock/filters-2020.txt')
+ .then(raw => ({ name: 'filters-2020', raw })),
+ read('assets/ublock/filters-2021.txt')
+ .then(raw => ({ name: 'filters-2021', raw })),
+ read('assets/ublock/privacy.txt')
+ .then(raw => ({ name: 'privacy', raw })),
+ read('assets/ublock/resource-abuse.txt')
+ .then(raw => ({ name: 'resource-abuse', raw })),
+ read('assets/ublock/unbreak.txt')
+ .then(raw => ({ name: 'unbreak.txt', raw })),
+ read('assets/thirdparties/easylist-downloads.adblockplus.org/easylist.txt')
+ .then(raw => ({ name: 'easylist', raw })),
+ read('assets/thirdparties/easylist-downloads.adblockplus.org/easyprivacy.txt')
+ .then(raw => ({ name: 'easyprivacy', raw })),
+ read('assets/thirdparties/pgl.yoyo.org/as/serverlist')
+ .then(raw => ({ name: 'PGL', raw })),
+ read('assets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt')
+ .then(raw => ({ name: 'urlhaus', raw })),
+ ]);
+ let stop = process.hrtime.bigint();
+ console.log(`Filter lists parsed-compiled-loaded in ${nanoToMilli(stop - start)}`);
+
+ // Dry run to let JS engine optimize hot JS code paths
+ for ( let i = 0; i < requests.length; i += 8 ) {
+ const request = requests[i];
+ void engine.matchRequest({
+ type: WEBREQUEST_OPTIONS[request.cpt],
+ url: request.url,
+ originURL: request.frameUrl,
+ });
+ }
+
+ if ( MODIFIERS === false ) {
+ matchRequests(engine, requests);
+ } else {
+ matchRequestModifiers(engine, requests);
+ }
+
+ StaticNetFilteringEngine.release();
+}
+
+bench();
+
+/******************************************************************************/
diff -Nru ublock-origin-1.37.0+dfsg/platform/firefox/manifest.json ublock-origin-1.42.0+dfsg/platform/firefox/manifest.json
--- ublock-origin-1.37.0+dfsg/platform/firefox/manifest.json 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/firefox/manifest.json 2022-05-06 01:15:22.000000000 +0000
@@ -15,7 +15,7 @@
"browser_specific_settings": {
"gecko": {
"id": "uBlock0@raymondhill.net",
- "strict_min_version": "57.0"
+ "strict_min_version": "68.0"
}
},
"commands": {
@@ -35,6 +35,9 @@
},
"relax-blocking-mode": {
"description": "__MSG_relaxBlockingMode__"
+ },
+ "toggle-cosmetic-filtering": {
+ "description": "__MSG_toggleCosmeticFiltering__"
}
},
"content_scripts": [
@@ -60,7 +63,8 @@
"https://filterlists.com/*",
"https://forums.lanik.us/*",
"https://github.com/*",
- "https://*.github.io/*"
+ "https://*.github.io/*",
+ "https://*.letsblock.it/*"
],
"js": [
"/js/scriptlets/subscriber.js"
diff -Nru ublock-origin-1.37.0+dfsg/platform/firefox/vapi-background-ext.js ublock-origin-1.42.0+dfsg/platform/firefox/vapi-background-ext.js
--- ublock-origin-1.37.0+dfsg/platform/firefox/vapi-background-ext.js 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/firefox/vapi-background-ext.js 2022-05-06 01:15:22.000000000 +0000
@@ -25,30 +25,17 @@
/******************************************************************************/
+import {
+ domainFromHostname,
+ hostnameFromNetworkURL,
+} from './uri-utils.js';
+
+/******************************************************************************/
+
(( ) => {
// https://github.com/uBlockOrigin/uBlock-issues/issues/407
if ( vAPI.webextFlavor.soup.has('firefox') === false ) { return; }
- // https://github.com/gorhill/uBlock/issues/2950
- // Firefox 56 does not normalize URLs to ASCII, uBO must do this itself.
- // https://bugzilla.mozilla.org/show_bug.cgi?id=945240
- const evalMustPunycode = ( ) => {
- return vAPI.webextFlavor.soup.has('firefox') &&
- vAPI.webextFlavor.major < 57;
- };
-
- let mustPunycode = evalMustPunycode();
-
- // The real actual webextFlavor value may not be set in stone, so listen
- // for possible future changes.
- window.addEventListener('webextFlavor', ( ) => {
- mustPunycode = evalMustPunycode();
- }, { once: true });
-
- const punycode = self.punycode;
- const reAsciiHostname = /^https?:\/\/[0-9a-z_.:@-]+[/?#]/;
- const parsedURL = new URL('about:blank');
-
// Canonical name-uncloaking feature.
let cnameUncloakEnabled = browser.dns instanceof Object;
let cnameUncloakProxied = false;
@@ -144,14 +131,6 @@
}
}
normalizeDetails(details) {
- if ( mustPunycode && !reAsciiHostname.test(details.url) ) {
- parsedURL.href = details.url;
- details.url = details.url.replace(
- parsedURL.hostname,
- punycode.toASCII(parsedURL.hostname)
- );
- }
-
const type = details.type;
if ( type === 'imageset' ) {
@@ -231,7 +210,7 @@
if (
cname !== '' &&
this.cnameIgnore1stParty &&
- vAPI.domainFromHostname(cname) === vAPI.domainFromHostname(hn)
+ domainFromHostname(cname) === domainFromHostname(hn)
) {
cname = '';
}
@@ -284,7 +263,7 @@
) {
return;
}
- const hn = vAPI.hostnameFromNetworkURL(details.url);
+ const hn = hostnameFromNetworkURL(details.url);
const cname = this.cnames.get(hn);
if ( cname === '' ) { return; }
if ( cname !== undefined ) {
@@ -313,14 +292,18 @@
this.pendingRequests.push(pending);
return pending.promise;
}
- unsuspendAllRequests() {
+ unsuspendAllRequests(discard = false) {
const pendingRequests = this.pendingRequests;
this.pendingRequests = [];
for ( const entry of pendingRequests ) {
- entry.resolve(this.onBeforeSuspendableRequest(entry.details));
+ entry.resolve(
+ discard !== true
+ ? this.onBeforeSuspendableRequest(entry.details)
+ : undefined
+ );
}
}
- canSuspend() {
+ static canSuspend() {
return true;
}
};
diff -Nru ublock-origin-1.37.0+dfsg/platform/firefox/webext.js ublock-origin-1.42.0+dfsg/platform/firefox/webext.js
--- ublock-origin-1.37.0+dfsg/platform/firefox/webext.js 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/firefox/webext.js 2022-05-06 01:15:22.000000000 +0000
@@ -21,4 +21,4 @@
'use strict';
-const webext = browser; // jshint ignore:line
+export default browser;
diff -Nru ublock-origin-1.37.0+dfsg/platform/nodejs/README.md ublock-origin-1.42.0+dfsg/platform/nodejs/README.md
--- ublock-origin-1.37.0+dfsg/platform/nodejs/README.md 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/nodejs/README.md 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,158 @@
+# uBlock Origin Core
+
+The core filtering engines used in the uBlock Origin ("uBO") extension, and has
+no external dependencies.
+
+## Installation
+
+Install: `npm install @gorhill/ubo-core`
+
+This is a very early version and the API is subject to change at any time.
+
+This package uses [native JavaScript modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules).
+
+
+## Description
+
+The package contains uBO's static network filtering engine ("SNFE"), which
+purpose is to parse and enforce filter lists. The matching algorithm is highly
+efficient, and _especially_ optimized to match against large sets of pure
+hostnames.
+
+The SNFE can be fed filter lists from a variety of sources, such as [EasyList/EasyPrivacy](https://easylist.to/),
+[uBlock filters](https://github.com/uBlockOrigin/uAssets/tree/master/filters),
+and also lists of domain names or hosts file format (i.e. block lists from [The Block List Project](https://github.com/blocklistproject/Lists#the-block-list-project),
+[Steven Black's HOSTS](https://github.com/StevenBlack/hosts#readme), etc).
+
+
+## Usage
+
+At the moment, there can be only one instance of the static network filtering
+engine ("SNFE"), which proxy API must be imported as follow:
+
+```js
+import { StaticNetFilteringEngine } from '@gorhill/ubo-core';
+```
+
+If you must import as a NodeJS module:
+
+```js
+const { StaticNetFilteringEngine } = await import('@gorhill/ubo-core');
+```
+
+
+Create an instance of SNFE:
+
+```js
+const snfe = StaticNetFilteringEngine.create();
+```
+
+Feed the SNFE with filter lists -- `useLists()` accepts an array of
+objects (or promises to object) which expose the raw text of a list
+through the `raw` property, and optionally the name of the list through the
+`name` property (how you fetch the lists is up to you):
+
+```js
+await snfe.useLists([
+ fetch('easylist').then(raw => ({ name: 'easylist', raw })),
+ fetch('easyprivacy').then(raw => ({ name: 'easyprivacy', raw })),
+]);
+```
+
+Now we are ready to match network requests:
+
+```js
+// Not blocked
+if ( snfe.matchRequest({
+ originURL: 'https://www.bloomberg.com/',
+ url: 'https://www.bloomberg.com/tophat/assets/v2.6.1/that.css',
+ type: 'stylesheet'
+}) !== 0 ) {
+ console.log(snfe.toLogData());
+}
+
+// Blocked
+if ( snfe.matchRequest({
+ originURL: 'https://www.bloomberg.com/',
+ url: 'https://securepubads.g.doubleclick.net/tag/js/gpt.js',
+ type: 'script'
+}) !== 0 ) {
+ console.log(snfe.toLogData());
+}
+
+// Unblocked
+if ( snfe.matchRequest({
+ originURL: 'https://www.bloomberg.com/',
+ url: 'https://sourcepointcmp.bloomberg.com/ccpa.js',
+ type: 'script'
+}) !== 0 ) {
+ console.log(snfe.toLogData());
+}
+```
+
+It is possible to pre-parse filter lists and save the intermediate results for
+later use -- useful to speed up the loading of filter lists. This will be
+documented eventually, but if you feel adventurous, you can look at the code
+and use this capability now if you figure out the details.
+
+---
+
+## Extras
+
+You can directly use specific APIs exposed by this package, here are some of
+them, which are used internally by uBO's SNFE.
+
+### HNTrieContainer
+
+A well optimised [compressed trie](https://en.wikipedia.org/wiki/Trie#Compressing_tries)
+container specialized to specifically store and lookup hostnames.
+
+The matching algorithm is designed for hostnames, i.e. the hostname labels
+making up a hostname are matched from right to left, such that `www.example.org`
+with be a match if `example.org` is stored into the trie, while
+`anotherexample.org` won't be a match.
+
+`HNTrieContainer` is designed to store a large number of hostnames with CPU and
+memory efficiency as a main concern -- and is a key component of uBO.
+
+To create and use a standalone `HNTrieContainer` object:
+
+```js
+import HNTrieContainer from '@gorhill/ubo-core/js/hntrie.js';
+
+const trieContainer = new HNTrieContainer();
+
+const aTrie = trieContainer.createOne();
+trieContainer.add(aTrie, 'example.org');
+trieContainer.add(aTrie, 'example.com');
+
+const anotherTrie = trieContainer.createOne();
+trieContainer.add(anotherTrie, 'foo.invalid');
+trieContainer.add(anotherTrie, 'bar.invalid');
+
+// matches() return the position at which the match starts, or -1 when
+// there is no match.
+
+// Matches: return 4
+console.log("trieContainer.matches(aTrie, 'www.example.org')", trieContainer.matches(aTrie, 'www.example.org'));
+
+// Does not match: return -1
+console.log("trieContainer.matches(aTrie, 'www.foo.invalid')", trieContainer.matches(aTrie, 'www.foo.invalid'));
+
+// Does not match: return -1
+console.log("trieContainer.matches(anotherTrie, 'www.example.org')", trieContainer.matches(anotherTrie, 'www.example.org'));
+
+// Matches: return 0
+console.log("trieContainer.matches(anotherTrie, 'foo.invalid')", trieContainer.matches(anotherTrie, 'foo.invalid'));
+```
+
+The `reset()` method must be used to remove all the tries from a trie container,
+you can't remove a single trie from the container.
+
+```js
+trieContainer.reset();
+```
+
+When you reset a trie container, you can't use the reference to prior instances
+of trie, i.e. `aTrie` and `anotherTrie` are no longer valid and shouldn't be
+used following a reset.
diff -Nru ublock-origin-1.37.0+dfsg/platform/nodejs/build.js ublock-origin-1.42.0+dfsg/platform/nodejs/build.js
--- ublock-origin-1.37.0+dfsg/platform/nodejs/build.js 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/nodejs/build.js 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,34 @@
+/*******************************************************************************
+
+ uBlock Origin - a browser extension to block requests.
+ Copyright (C) 2014-present Raymond Hill
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see {http://www.gnu.org/licenses/}.
+
+ Home: https://github.com/gorhill/uBlock
+*/
+
+'use strict';
+
+/******************************************************************************/
+
+import fs from 'fs';
+
+import { pslInit } from './index.js';
+
+/******************************************************************************/
+
+fs.mkdirSync('./build', { recursive: true });
+fs.writeFileSync('./build/publicsuffixlist.json',
+ JSON.stringify(pslInit().toSelfie()));
diff -Nru ublock-origin-1.37.0+dfsg/platform/nodejs/index.js ublock-origin-1.42.0+dfsg/platform/nodejs/index.js
--- ublock-origin-1.37.0+dfsg/platform/nodejs/index.js 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/nodejs/index.js 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,282 @@
+/*******************************************************************************
+
+ uBlock Origin - a browser extension to block requests.
+ Copyright (C) 2014-present Raymond Hill
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see {http://www.gnu.org/licenses/}.
+
+ Home: https://github.com/gorhill/uBlock
+*/
+
+/* globals WebAssembly */
+
+'use strict';
+
+/******************************************************************************/
+
+import { createRequire } from 'module';
+
+import { readFileSync } from 'fs';
+import { dirname, resolve } from 'path';
+import { domainToASCII, fileURLToPath } from 'url';
+
+const __dirname = dirname(fileURLToPath(import.meta.url));
+
+import publicSuffixList from './lib/publicsuffixlist/publicsuffixlist.js';
+
+import snfe from './js/static-net-filtering.js';
+import { FilteringContext } from './js/filtering-context.js';
+import { LineIterator } from './js/text-utils.js';
+import { StaticFilteringParser } from './js/static-filtering-parser.js';
+
+import {
+ CompiledListReader,
+ CompiledListWriter,
+} from './js/static-filtering-io.js';
+
+/******************************************************************************/
+
+function loadJSON(path) {
+ return JSON.parse(readFileSync(resolve(__dirname, path), 'utf8'));
+}
+
+/******************************************************************************/
+
+async function enableWASM() {
+ const wasmModuleFetcher = function(path) {
+ const require = createRequire(import.meta.url); // jshint ignore:line
+ const wasm = new Uint8Array(require(`${path}.wasm.json`));
+ return WebAssembly.compile(wasm);
+ };
+ try {
+ const results = await Promise.all([
+ publicSuffixList.enableWASM(wasmModuleFetcher, './lib/publicsuffixlist/wasm/'),
+ snfe.enableWASM(wasmModuleFetcher, './js/wasm/'),
+ ]);
+ return results.every(a => a === true);
+ } catch(reason) {
+ console.log(reason);
+ }
+ return false;
+}
+
+/******************************************************************************/
+
+function pslInit(raw) {
+ if ( typeof raw === 'string' && raw.trim() !== '' ) {
+ publicSuffixList.parse(raw, domainToASCII);
+ return publicSuffixList;
+ }
+
+ // Use serialized version if available
+ let serialized = null;
+ try {
+ // Use loadJSON() because require() would keep the string in memory.
+ serialized = loadJSON('build/publicsuffixlist.json');
+ } catch (error) {
+ if ( process.env.npm_lifecycle_event !== 'build' ) {
+ // This should never happen except during package building.
+ console.error(error);
+ }
+ }
+ if ( serialized !== null ) {
+ publicSuffixList.fromSelfie(serialized);
+ return publicSuffixList;
+ }
+
+ raw = readFileSync(
+ resolve(__dirname, './assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat'),
+ 'utf8'
+ );
+ if ( typeof raw !== 'string' || raw.trim() === '' ) {
+ console.error('Unable to populate public suffix list');
+ return;
+ }
+ publicSuffixList.parse(raw, domainToASCII);
+ return publicSuffixList;
+}
+
+/******************************************************************************/
+
+function compileList({ name, raw }, compiler, writer, options = {}) {
+ const lineIter = new LineIterator(raw);
+ const events = Array.isArray(options.events) ? options.events : undefined;
+
+ if ( name ) {
+ writer.properties.set('name', name);
+ }
+
+ const { parser } = compiler;
+
+ while ( lineIter.eot() === false ) {
+ let line = lineIter.next();
+ while ( line.endsWith(' \\') ) {
+ if ( lineIter.peek(4) !== ' ' ) { break; }
+ line = line.slice(0, -2).trim() + lineIter.next().trim();
+ }
+ parser.analyze(line);
+ if ( parser.shouldIgnore() ) { continue; }
+ if ( parser.category !== parser.CATStaticNetFilter ) { continue; }
+ if ( parser.patternHasUnicode() && parser.toASCII() === false ) {
+ continue;
+ }
+ if ( compiler.compile(writer) ) { continue; }
+ if ( compiler.error !== undefined && events !== undefined ) {
+ options.events.push({
+ type: 'error',
+ text: compiler.error
+ });
+ }
+ }
+
+ return writer.toString();
+}
+
+/******************************************************************************/
+
+async function useLists(lists, options = {}) {
+ if ( useLists.promise !== null ) {
+ throw new Error('Pending useLists() operation');
+ }
+
+ // Remove all filters
+ snfe.reset();
+
+ if ( Array.isArray(lists) === false || lists.length === 0 ) {
+ return;
+ }
+
+ let compiler = null;
+
+ const consumeList = list => {
+ let { compiled } = list;
+ if ( typeof compiled !== 'string' || compiled === '' ) {
+ const writer = new CompiledListWriter();
+ if ( compiler === null ) {
+ compiler = snfe.createCompiler(new StaticFilteringParser());
+ }
+ compiled = compileList(list, compiler, writer, options);
+ }
+ snfe.fromCompiled(new CompiledListReader(compiled));
+ };
+
+ // Populate filtering engine with resolved filter lists
+ const promises = [];
+ for ( const list of lists ) {
+ const promise = list instanceof Promise ? list : Promise.resolve(list);
+ promises.push(promise.then(list => consumeList(list)));
+ }
+
+ useLists.promise = Promise.all(promises);
+ await useLists.promise;
+ useLists.promise = null; // eslint-disable-line require-atomic-updates
+
+ // Commit changes
+ snfe.freeze();
+ snfe.optimize();
+}
+
+useLists.promise = null;
+
+/******************************************************************************/
+
+const fctx = new FilteringContext();
+let snfeProxyInstance = null;
+
+class StaticNetFilteringEngine {
+ constructor() {
+ if ( snfeProxyInstance !== null ) {
+ throw new Error('Only a single instance is supported.');
+ }
+ snfeProxyInstance = this;
+ }
+
+ useLists(lists) {
+ return useLists(lists);
+ }
+
+ matchRequest(details) {
+ return snfe.matchRequest(fctx.fromDetails(details));
+ }
+
+ matchAndFetchModifiers(details, modifier) {
+ return snfe.matchAndFetchModifiers(fctx.fromDetails(details), modifier);
+ }
+
+ hasQuery(details) {
+ return snfe.hasQuery(details);
+ }
+
+ filterQuery(details) {
+ const directives = snfe.filterQuery(fctx.fromDetails(details));
+ if ( directives === undefined ) { return; }
+ return { redirectURL: fctx.redirectURL, directives };
+ }
+
+ isBlockImportant() {
+ return snfe.isBlockImportant();
+ }
+
+ toLogData() {
+ return snfe.toLogData();
+ }
+
+ createCompiler(parser) {
+ return snfe.createCompiler(parser);
+ }
+
+ compileList(...args) {
+ return compileList(...args);
+ }
+
+ serialize() {
+ return snfe.serialize();
+ }
+
+ deserialize(serialized) {
+ return snfe.unserialize(serialized);
+ }
+
+ static async create({ noPSL = false } = {}) {
+ const instance = new StaticNetFilteringEngine();
+
+ if ( noPSL !== true && !pslInit() ) {
+ throw new Error('Failed to initialize public suffix list.');
+ }
+
+ return instance;
+ }
+
+ static async release() {
+ if ( snfeProxyInstance === null ) { return; }
+ snfeProxyInstance = null;
+ await useLists([]);
+ }
+}
+
+/******************************************************************************/
+
+// rollup.js needs module.exports to be set back to the local exports object.
+// This is because some of the code (e.g. publicsuffixlist.js) sets
+// module.exports. Once all included files are written like ES modules, using
+// export statements, this should no longer be necessary.
+if ( typeof module !== 'undefined' && typeof exports !== 'undefined' ) {
+ module.exports = exports;
+}
+
+export {
+ enableWASM,
+ pslInit,
+ StaticNetFilteringEngine,
+};
diff -Nru ublock-origin-1.37.0+dfsg/platform/npm/.eslintrc.json ublock-origin-1.42.0+dfsg/platform/npm/.eslintrc.json
--- ublock-origin-1.37.0+dfsg/platform/npm/.eslintrc.json 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/npm/.eslintrc.json 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,38 @@
+{
+ "root": true,
+ "env": {
+ "es2021": true,
+ "node": true
+ },
+ "extends": "eslint:recommended",
+ "parserOptions": {
+ "ecmaVersion": 12,
+ "sourceType": "module"
+ },
+ "rules": {
+ "eqeqeq": [ "warn", "always" ],
+ "indent": [
+ "warn",
+ 4,
+ {
+ "ArrayExpression": "first",
+ "CallExpression": { "arguments": "first" },
+ "MemberExpression": "off",
+ "ObjectExpression": "off",
+ "ignoreComments": true,
+ "ignoredNodes": [
+ "AssignmentExpression:has(Literal)"
+ ]
+ }
+ ],
+ "getter-return": "off",
+ "no-control-regex": "off",
+ "no-empty": [ "error", { "allowEmptyCatch": true } ],
+ "no-promise-executor-return": [ "error" ],
+ "no-template-curly-in-string": [ "error" ],
+ "no-unreachable-loop": [ "error" ],
+ "no-useless-backreference": [ "error" ],
+ "no-useless-escape": "off",
+ "require-atomic-updates": [ "warn" ]
+ }
+}
diff -Nru ublock-origin-1.37.0+dfsg/platform/npm/.npmignore ublock-origin-1.42.0+dfsg/platform/npm/.npmignore
--- ublock-origin-1.37.0+dfsg/platform/npm/.npmignore 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/npm/.npmignore 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,5 @@
+assets/
+coverage/
+tests/
+.eslintrc.json
+test.js
diff -Nru ublock-origin-1.37.0+dfsg/platform/npm/package-lock.json ublock-origin-1.42.0+dfsg/platform/npm/package-lock.json
--- ublock-origin-1.37.0+dfsg/platform/npm/package-lock.json 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/npm/package-lock.json 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,1658 @@
+{
+ "name": "@gorhill/ubo-core",
+ "version": "0.1.9",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
+ "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ }
+ }
+ },
+ "@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true
+ },
+ "@eslint/eslintrc": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
+ "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^13.9.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ }
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
+ "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
+ "dev": true,
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.0",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "@humanwhocodes/object-schema": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz",
+ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==",
+ "dev": true
+ },
+ "@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true
+ },
+ "@types/istanbul-lib-coverage": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
+ "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==",
+ "dev": true
+ },
+ "@ungap/promise-all-settled": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
+ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
+ "dev": true
+ },
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "c8": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/c8/-/c8-7.8.0.tgz",
+ "integrity": "sha512-x2Bx+IIEd608B1LmjiNQ/kizRPkCWo5XzuV57J9afPjAHSnYXALwbCSOkQ7cSaNXBNblfqcvdycj+klmL+j6yA==",
+ "dev": true,
+ "requires": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@istanbuljs/schema": "^0.1.2",
+ "find-up": "^5.0.0",
+ "foreground-child": "^2.0.0",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-reports": "^3.0.2",
+ "rimraf": "^3.0.0",
+ "test-exclude": "^6.0.0",
+ "v8-to-istanbul": "^8.0.0",
+ "yargs": "^16.2.0",
+ "yargs-parser": "^20.2.7"
+ },
+ "dependencies": {
+ "yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true
+ }
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "chokidar": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+ "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ }
+ },
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+ "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ }
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "diff": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^4.1.1"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ },
+ "eslint": {
+ "version": "7.32.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
+ "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.3",
+ "@humanwhocodes/config-array": "^0.5.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.1.2",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^6.0.9",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ }
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ },
+ "esm-world": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/esm-world/-/esm-world-0.1.1.tgz",
+ "integrity": "sha512-BrUju/zoltW1L3MXWM3WZFpZddekSLnl0st7L//luZs3fbJ/o/3knWByewSic3RsMWCp3lGIh0GfA9WOEU8QxQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ }
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
+ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
+ "dev": true
+ },
+ "foreground-child": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+ "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "globals": {
+ "version": "13.11.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz",
+ "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "growl": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
+ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true
+ },
+ "html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true
+ },
+ "is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "istanbul-lib-coverage": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
+ "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
+ "dev": true
+ },
+ "istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "istanbul-reports": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
+ "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
+ "dev": true,
+ "requires": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ }
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
+ "lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+ "dev": true
+ },
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "requires": {
+ "semver": "^6.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "mocha": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.0.3.tgz",
+ "integrity": "sha512-hnYFrSefHxYS2XFGtN01x8un0EwNu2bzKvhpRFhgoybIvMaOkkL60IVPmkb5h6XDmUl4IMSB+rT5cIO4/4bJgg==",
+ "dev": true,
+ "requires": {
+ "@ungap/promise-all-settled": "1.1.2",
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.2",
+ "debug": "4.3.1",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.1.7",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "3.0.4",
+ "ms": "2.1.3",
+ "nanoid": "3.1.23",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "which": "2.0.2",
+ "wide-align": "1.1.3",
+ "workerpool": "6.1.5",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "nanoid": {
+ "version": "3.1.23",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
+ "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ },
+ "scaling-palm-tree": {
+ "version": "github:mjethani/scaling-palm-tree#15cf1ab37e038771e1ff8005edc46d95f176739f",
+ "from": "github:mjethani/scaling-palm-tree#15cf1ab37e038771e1ff8005edc46d95f176739f",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "table": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
+ "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==",
+ "dev": true,
+ "requires": {
+ "ajv": "^8.0.1",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.6.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz",
+ "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ }
+ }
+ },
+ "test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "requires": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "v8-to-istanbul": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz",
+ "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^1.6.0",
+ "source-map": "^0.7.3"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "wide-align": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+ "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.2 || 2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
+ "workerpool": {
+ "version": "6.1.5",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz",
+ "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true
+ },
+ "yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ }
+ },
+ "yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true
+ }
+ }
+}
diff -Nru ublock-origin-1.37.0+dfsg/platform/npm/package.json ublock-origin-1.42.0+dfsg/platform/npm/package.json
--- ublock-origin-1.37.0+dfsg/platform/npm/package.json 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/npm/package.json 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,44 @@
+{
+ "name": "@gorhill/ubo-core",
+ "version": "0.1.25",
+ "description": "To create a working instance of uBlock Origin's static network filtering engine",
+ "type": "module",
+ "main": "index.js",
+ "scripts": {
+ "build": "node build.js",
+ "lint": "eslint js/ *.js tests/*.js",
+ "test": "c8 --include=index.js --include=js/**/*.js node test.js --mocha",
+ "test-full-battery": "c8 --include=index.js --include=js/**/*.js node test.js --mocha --full-battery",
+ "check-leaks": "mocha --check-leaks tests/leaks.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/gorhill/uBlock.git"
+ },
+ "keywords": [
+ "uBlock",
+ "uBO",
+ "adblock",
+ "trie"
+ ],
+ "author": "Raymond Hill (https://github.com/gorhill)",
+ "license": "GPL-3.0-or-later",
+ "contributors": [
+ "Manish Jethani
"
+ ],
+ "bugs": {
+ "url": "https://github.com/uBlockOrigin/uBlock-issues/issues"
+ },
+ "homepage": "https://github.com/gorhill/uBlock#readme",
+ "engines": {
+ "node": ">=14.0.0",
+ "npm": ">=6.14.4"
+ },
+ "devDependencies": {
+ "c8": "^7.8.0",
+ "eslint": "^7.32.0",
+ "esm-world": "0.1.1",
+ "mocha": "^9.0.3",
+ "scaling-palm-tree": "github:mjethani/scaling-palm-tree#15cf1ab37e038771e1ff8005edc46d95f176739f"
+ }
+}
diff -Nru ublock-origin-1.37.0+dfsg/platform/npm/test.js ublock-origin-1.42.0+dfsg/platform/npm/test.js
--- ublock-origin-1.37.0+dfsg/platform/npm/test.js 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/npm/test.js 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,59 @@
+/*******************************************************************************
+
+ uBlock Origin - a browser extension to block requests.
+ Copyright (C) 2014-present Raymond Hill
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see {http://www.gnu.org/licenses/}.
+
+ Home: https://github.com/gorhill/uBlock
+*/
+
+/* eslint-disable-next-line no-redeclare */
+/* globals process */
+
+'use strict';
+
+/******************************************************************************/
+
+import { spawn } from "child_process";
+import { promisify } from 'util';
+
+/******************************************************************************/
+
+async function spawnMocha() {
+ const files = [
+ 'tests/wasm.js',
+ 'tests/snfe.js',
+ ];
+
+ const options = [];
+
+ if ( process.argv[3] === '--full-battery' ) {
+ files.push('tests/request-data.js');
+
+ options.push('--reporter', 'progress');
+ }
+
+ await promisify(spawn)('mocha', [ '--experimental-vm-modules', '--no-warnings', ...files, ...options ], { stdio: [ 'inherit', 'inherit', 'inherit' ] });
+}
+
+async function main() {
+ if ( process.argv[2] === '--mocha' ) {
+ await spawnMocha();
+ }
+}
+
+main();
+
+/******************************************************************************/
diff -Nru ublock-origin-1.37.0+dfsg/platform/npm/tests/.eslintrc.json ublock-origin-1.42.0+dfsg/platform/npm/tests/.eslintrc.json
--- ublock-origin-1.37.0+dfsg/platform/npm/tests/.eslintrc.json 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/npm/tests/.eslintrc.json 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,5 @@
+{
+ "env": {
+ "mocha": true
+ }
+}
diff -Nru ublock-origin-1.37.0+dfsg/platform/npm/tests/_common.js ublock-origin-1.42.0+dfsg/platform/npm/tests/_common.js
--- ublock-origin-1.37.0+dfsg/platform/npm/tests/_common.js 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/npm/tests/_common.js 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,34 @@
+/*******************************************************************************
+
+ uBlock Origin - a browser extension to block requests.
+ Copyright (C) 2014-present Raymond Hill
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see {http://www.gnu.org/licenses/}.
+
+ Home: https://github.com/gorhill/uBlock
+*/
+
+'use strict';
+
+/******************************************************************************/
+
+import process from 'process';
+
+process.on('warning', warning => {
+ // Ignore warnings about experimental features like
+ // --experimental-vm-modules
+ if ( warning.name !== 'ExperimentalWarning' ) {
+ console.warn(warning.stack);
+ }
+});
Binary files /srv/release.debian.org/tmp/Kcg7p4leK6/ublock-origin-1.37.0+dfsg/platform/npm/tests/data/bundle.tgz and /srv/release.debian.org/tmp/6shuIU8Ibw/ublock-origin-1.42.0+dfsg/platform/npm/tests/data/bundle.tgz differ
diff -Nru ublock-origin-1.37.0+dfsg/platform/npm/tests/leaks.js ublock-origin-1.42.0+dfsg/platform/npm/tests/leaks.js
--- ublock-origin-1.37.0+dfsg/platform/npm/tests/leaks.js 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/npm/tests/leaks.js 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,30 @@
+/*******************************************************************************
+
+ uBlock Origin - a browser extension to block requests.
+ Copyright (C) 2014-present Raymond Hill
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see {http://www.gnu.org/licenses/}.
+
+ Home: https://github.com/gorhill/uBlock
+*/
+
+'use strict';
+
+/******************************************************************************/
+
+describe('Leaks', () => {
+ it('should not leak global variables', async () => {
+ await import('../index.js');
+ });
+});
diff -Nru ublock-origin-1.37.0+dfsg/platform/npm/tests/request-data.js ublock-origin-1.42.0+dfsg/platform/npm/tests/request-data.js
--- ublock-origin-1.37.0+dfsg/platform/npm/tests/request-data.js 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/npm/tests/request-data.js 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,117 @@
+/*******************************************************************************
+
+ uBlock Origin - a browser extension to block requests.
+ Copyright (C) 2014-present Raymond Hill
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see {http://www.gnu.org/licenses/}.
+
+ Home: https://github.com/gorhill/uBlock
+*/
+
+'use strict';
+
+/******************************************************************************/
+
+import { strict as assert } from 'assert';
+import { readFile } from 'fs/promises';
+import { createRequire } from 'module';
+import { dirname, resolve } from 'path';
+import { fileURLToPath } from 'url';
+
+import { createWorld } from 'esm-world';
+
+import './_common.js';
+
+const __dirname = dirname(fileURLToPath(import.meta.url));
+
+const require = createRequire(import.meta.url);
+
+const requests = require('scaling-palm-tree/requests.json');
+const results = require('./data/results.json');
+
+async function read(path) {
+ return readFile(resolve(__dirname, path), 'utf8');
+}
+
+describe('Request data', () => {
+ const typeMap = {
+ document: 'sub_frame',
+ stylesheet: 'stylesheet',
+ image: 'image',
+ media: 'media',
+ font: 'font',
+ script: 'script',
+ xhr: 'xmlhttprequest',
+ fetch: 'xmlhttprequest',
+ websocket: 'websocket',
+ ping: 'ping',
+
+ other: 'other',
+ eventsource: 'other',
+ manifest: 'other',
+ texttrack: 'other',
+ };
+
+ for ( let wasm of [ false, true ] ) {
+ context(`${wasm ? 'Wasm on' : 'Wasm off'}`, () => {
+ let engine = null;
+
+ before(async () => {
+ const { StaticNetFilteringEngine, enableWASM } = await createWorld('./index.js', { globals: global });
+
+ if ( wasm ) {
+ assert(await enableWASM());
+ }
+
+ engine = await StaticNetFilteringEngine.create();
+
+ await engine.useLists([
+ read('./data/assets/ublock/badware.txt')
+ .then(raw => ({ name: 'badware', raw })),
+ read('./data/assets/ublock/filters.txt')
+ .then(raw => ({ name: 'filters', raw })),
+ read('./data/assets/ublock/filters-2020.txt')
+ .then(raw => ({ name: 'filters-2020', raw })),
+ read('./data/assets/ublock/filters-2021.txt')
+ .then(raw => ({ name: 'filters-2021', raw })),
+ read('./data/assets/ublock/privacy.txt')
+ .then(raw => ({ name: 'privacy', raw })),
+ read('./data/assets/ublock/resource-abuse.txt')
+ .then(raw => ({ name: 'resource-abuse', raw })),
+ read('./data/assets/ublock/unbreak.txt')
+ .then(raw => ({ name: 'unbreak.txt', raw })),
+ read('./data/assets/thirdparties/easylist-downloads.adblockplus.org/easylist.txt')
+ .then(raw => ({ name: 'easylist', raw })),
+ read('./data/assets/thirdparties/easylist-downloads.adblockplus.org/easyprivacy.txt')
+ .then(raw => ({ name: 'easyprivacy', raw })),
+ read('./data/assets/thirdparties/pgl.yoyo.org/as/serverlist')
+ .then(raw => ({ name: 'PGL', raw })),
+ read('./data/assets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt')
+ .then(raw => ({ name: 'urlhaus', raw })),
+ ]);
+ });
+
+ for ( let i = 0; i < requests.length; i++ ) {
+ const { url, frameUrl, cpt } = requests[i];
+ const request = { url, originURL: frameUrl, type: typeMap[cpt] };
+
+ const expected = results[i];
+
+ it(`should ${expected === 1 ? 'block' : 'allow'} ${request.type} URL ${request.url} from origin ${request.originURL}`, () => {
+ assert.equal(engine.matchRequest(request), expected);
+ });
+ }
+ });
+ }
+});
diff -Nru ublock-origin-1.37.0+dfsg/platform/npm/tests/snfe.js ublock-origin-1.42.0+dfsg/platform/npm/tests/snfe.js
--- ublock-origin-1.37.0+dfsg/platform/npm/tests/snfe.js 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/npm/tests/snfe.js 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,372 @@
+/*******************************************************************************
+
+ uBlock Origin - a browser extension to block requests.
+ Copyright (C) 2014-present Raymond Hill
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see {http://www.gnu.org/licenses/}.
+
+ Home: https://github.com/gorhill/uBlock
+*/
+
+'use strict';
+
+/******************************************************************************/
+
+import { strict as assert } from 'assert';
+
+import { createWorld } from 'esm-world';
+
+import './_common.js';
+
+describe('SNFE', () => {
+ for ( let wasm of [ false/*, true*/ ] ) {
+ context(`${wasm ? 'Wasm on' : 'Wasm off'}`, () => {
+ let module = null;
+ let engine = null;
+
+ beforeEach(async () => {
+ module = await createWorld('./index.js', { globals: global });
+
+ if ( wasm ) {
+ assert(await module.enableWASM());
+ }
+ });
+
+ afterEach(() => {
+ engine = null;
+ module = null;
+ });
+
+ describe('Initialization', () => {
+ it('should not reject on first attempt', async () => {
+ await module.StaticNetFilteringEngine.create();
+ });
+
+ it('should reject on second attempt', async () => {
+ await module.StaticNetFilteringEngine.create();
+ await assert.rejects(module.StaticNetFilteringEngine.create());
+ });
+
+ it('should reject on third attempt', async () => {
+ await module.StaticNetFilteringEngine.create();
+
+ try {
+ await module.StaticNetFilteringEngine.create();
+ } catch (error) {
+ }
+
+ await assert.rejects(module.StaticNetFilteringEngine.create());
+ });
+ });
+
+ describe('Filter loading', () => {
+ beforeEach(async () => {
+ engine = await module.StaticNetFilteringEngine.create();
+ });
+
+ it('should not reject on no lists', async () => {
+ await engine.useLists([]);
+ });
+
+ it('should not reject on one empty list', async () => {
+ await engine.useLists([
+ { name: 'easylist', raw: '' },
+ ]);
+ });
+
+ it('should not reject on one list containing one filter', async () => {
+ await engine.useLists([
+ { name: 'easylist', raw: '/foo^' },
+ ]);
+ });
+
+ it('should not reject on one list containing multiple filters', async () => {
+ await engine.useLists([
+ { name: 'easylist', raw: '/foo^\n||example.com^' },
+ ]);
+ });
+
+ it('should not reject on multiple lists containing multiple filters', async () => {
+ await engine.useLists([
+ { name: 'easylist', raw: '/foo^\n||example.com^' },
+ { name: 'easyprivacy', raw: '||example.net/bar/\n^bar.js?' },
+ ]);
+ });
+
+ it('should not reject on promised-based lists', async () => {
+ await engine.useLists([
+ Promise.resolve({ name: 'easylist', raw: '/foo^\n||example.com^' }),
+ Promise.resolve({ name: 'easyprivacy', raw: '||example.net/bar/\n^bar.js?' }),
+ ]);
+ });
+
+ it('should reject on promised-based lists in which a promise is rejected', async () => {
+ await assert.rejects(engine.useLists([
+ Promise.reject({ name: 'easylist', raw: '/foo^\n||example.com^' }),
+ Promise.resolve({ name: 'easyprivacy', raw: '||example.net/bar/\n^bar.js?' }),
+ ]));
+ });
+
+ it('should reject on promised-based lists in which all promises are rejected', async () => {
+ await assert.rejects(engine.useLists([
+ Promise.reject({ name: 'easylist', raw: '/foo^\n||example.com^' }),
+ Promise.reject({ name: 'easyprivacy', raw: '||example.net/bar/\n^bar.js?' }),
+ ]));
+ });
+
+ it('should not reject on second call in sequence', async () => {
+ await engine.useLists([
+ Promise.resolve({ name: 'easylist', raw: '/foo^\n||example.com^' }),
+ Promise.resolve({ name: 'easyprivacy', raw: '||example.net/bar/\n^bar.js?' }),
+ ]);
+
+ await engine.useLists([
+ Promise.resolve({ name: 'easylist', raw: '/foo^\n||example.com^' }),
+ Promise.resolve({ name: 'easyprivacy', raw: '||example.net/bar/\n^bar.js?' }),
+ ]);
+ });
+ });
+
+ describe('Serialization', () => {
+ beforeEach(async () => {
+ engine = await module.StaticNetFilteringEngine.create();
+ });
+
+ it('should not reject with no lists', async () => {
+ await engine.useLists([]);
+
+ await engine.serialize();
+ });
+
+ it('should not reject with one empty list', async () => {
+ await engine.useLists([
+ { name: 'easylist', raw: '' },
+ ]);
+
+ await engine.serialize();
+ });
+
+ it('should not reject with one list containing one filter', async () => {
+ await engine.useLists([
+ { name: 'easylist', raw: '/foo^' },
+ ]);
+
+ await engine.serialize();
+ });
+
+ it('should not reject with one list containing multiple filters', async () => {
+ await engine.useLists([
+ { name: 'easylist', raw: '/foo^\n||example.com^' },
+ ]);
+
+ await engine.serialize();
+ });
+
+ it('should not reject with multiple lists containing multiple filters', async () => {
+ await engine.useLists([
+ { name: 'easylist', raw: '/foo^\n||example.com^' },
+ { name: 'easyprivacy', raw: '||example.net/bar/\n^bar.js?' },
+ ]);
+
+ await engine.serialize();
+ });
+ });
+
+ describe('Deserialization', () => {
+ beforeEach(async () => {
+ engine = await module.StaticNetFilteringEngine.create();
+ });
+
+ it('should not reject with no lists', async () => {
+ await engine.useLists([]);
+
+ const serialized = await engine.serialize();
+ await engine.deserialize(serialized);
+ });
+
+ it('should not reject with one empty list', async () => {
+ await engine.useLists([
+ { name: 'easylist', raw: '' },
+ ]);
+
+ const serialized = await engine.serialize();
+ await engine.deserialize(serialized);
+ });
+
+ it('should not reject with one list containing one filter', async () => {
+ await engine.useLists([
+ { name: 'easylist', raw: '/foo^' },
+ ]);
+
+ const serialized = await engine.serialize();
+ await engine.deserialize(serialized);
+ });
+
+ it('should not reject with one list containing multiple filters', async () => {
+ await engine.useLists([
+ { name: 'easylist', raw: '/foo^\n||example.com^' },
+ ]);
+
+ const serialized = await engine.serialize();
+ await engine.deserialize(serialized);
+ });
+
+ it('should not reject with multiple lists containing multiple filters', async () => {
+ await engine.useLists([
+ { name: 'easylist', raw: '/foo^\n||example.com^' },
+ { name: 'easyprivacy', raw: '||example.net/bar/\n^bar.js?' },
+ ]);
+
+ const serialized = await engine.serialize();
+ await engine.deserialize(serialized);
+ });
+
+ // https://github.com/gorhill/uBlock/commit/8f461072f576cdf72c088a952ef342281a7c44d6
+ it('should correctly remove query parameter following deserialization', async () => {
+ await engine.useLists([
+ { name: 'custom', raw: '*$removeparam=/^utm_/' },
+ ]);
+ const request = {
+ originURL: 'https://www.example.com/?utm_source=1',
+ type: 'document',
+ url: 'https://www.example.com/?utm_source=1',
+ };
+ let result = engine.filterQuery(request);
+ assert.strictEqual(result.redirectURL, 'https://www.example.com/');
+ const serialized = await engine.serialize();
+ await engine.deserialize(serialized);
+ result = engine.filterQuery(request);
+ assert.strictEqual(result.redirectURL, 'https://www.example.com/');
+ });
+ });
+
+ describe('Filter matching', () => {
+ beforeEach(async () => {
+ engine = await module.StaticNetFilteringEngine.create();
+ });
+
+ it('should match pure-hostname block filter', async () => {
+ await engine.useLists([
+ { name: 'test', raw: '||example.net^' },
+ ]);
+ const r = engine.matchRequest({
+ originURL: 'https://www.example.com/',
+ type: 'image',
+ url: 'https://www.example.net/',
+ });
+ assert.strictEqual(r, 1);
+ });
+
+ it('should match pure-hostname exception filter', async () => {
+ await engine.useLists([
+ { name: 'test', raw: '||example.net^\n@@||example.net^' },
+ ]);
+ const r = engine.matchRequest({
+ originURL: 'https://www.example.com/',
+ type: 'image',
+ url: 'https://www.example.net/',
+ });
+ assert.strictEqual(r, 2);
+ });
+
+ it('should match pure-hostname block-important filter', async () => {
+ await engine.useLists([
+ { name: 'test', raw: '@@||example.net^\n||example.net^$important' },
+ ]);
+ const r = engine.matchRequest({
+ originURL: 'https://www.example.com/',
+ type: 'image',
+ url: 'https://www.example.net/',
+ });
+ assert.strictEqual(r, 1);
+ assert(engine.isBlockImportant());
+ });
+
+ it('should detect the filter is block-important', async () => {
+ await engine.useLists([
+ { name: 'test', raw: '||example.net^$important' },
+ ]);
+ engine.matchRequest({
+ originURL: 'https://www.example.com/',
+ type: 'image',
+ url: 'https://www.example.net/',
+ });
+ assert(engine.isBlockImportant());
+ });
+
+ it('should block all except stylesheets #1', async () => {
+ await engine.useLists([
+ { name: 'test', raw: '||example.com^$~stylesheet,all' },
+ ]);
+ const r = engine.matchRequest({
+ originURL: 'https://www.example.com/',
+ type: 'stylesheet',
+ url: 'https://www.example.com/',
+ });
+ assert.strictEqual(r, 0);
+ });
+
+ it('should block all except stylesheets #2', async () => {
+ await engine.useLists([
+ { name: 'test', raw: '||example.com^$all,~stylesheet' },
+ ]);
+ const r = engine.matchRequest({
+ originURL: 'https://www.example.com/',
+ type: 'stylesheet',
+ url: 'https://www.example.com/',
+ });
+ assert.strictEqual(r, 0);
+ });
+
+ // https://github.com/gorhill/uBlock/commit/d66cd1116c0e
+ it('should not match on localhost', async () => {
+ await engine.useLists([
+ { name: 'test', raw: '.js$domain=foo.*|bar.*\n/^/$domain=example.*|foo.*' },
+ ]);
+ const r = engine.matchRequest({
+ originURL: 'https://localhost/',
+ type: 'script',
+ url: 'https://localhost/baz.js',
+ });
+ assert.strictEqual(r, 0);
+ });
+
+ // https://github.com/AdguardTeam/AdguardFilters/issues/88067#issuecomment-1019518277
+ it('should match regex-based filter without `match-case` option', async () => {
+ await engine.useLists([
+ { name: 'test', raw: '/\.com\/[a-z]{9,}\/[a-z]{9,}\.js$/$script,1p' },
+ ]);
+ const r = engine.matchRequest({
+ originURL: 'https://example.com/',
+ type: 'script',
+ url: 'https://example.com/LQMDQSMLDAZAEHERE/LQMDQSMLDAZAEHERE.js',
+ });
+ assert.strictEqual(r, 1);
+ });
+
+ it('should not match regex-based filter with `match-case` option', async () => {
+ await engine.useLists([
+ { name: 'test', raw: '/\.com\/[a-z]{9,}\/[a-z]{9,}\.js$/$script,1p,match-case' },
+ ]);
+ const r = engine.matchRequest({
+ originURL: 'https://example.com/',
+ type: 'script',
+ url: 'https://example.com/LQMDQSMLDAZAEHERE/LQMDQSMLDAZAEHERE.js',
+ });
+ assert.strictEqual(r, 0);
+ });
+ });
+ });
+ }
+});
diff -Nru ublock-origin-1.37.0+dfsg/platform/npm/tests/wasm.js ublock-origin-1.42.0+dfsg/platform/npm/tests/wasm.js
--- ublock-origin-1.37.0+dfsg/platform/npm/tests/wasm.js 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/npm/tests/wasm.js 2022-05-06 01:15:22.000000000 +0000
@@ -0,0 +1,53 @@
+/*******************************************************************************
+
+ uBlock Origin - a browser extension to block requests.
+ Copyright (C) 2014-present Raymond Hill
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see {http://www.gnu.org/licenses/}.
+
+ Home: https://github.com/gorhill/uBlock
+*/
+
+/* globals WebAssembly */
+
+'use strict';
+
+/******************************************************************************/
+
+import { strict as assert } from 'assert';
+
+import { createWorld } from 'esm-world';
+
+import './_common.js';
+
+describe('WASM', () => {
+ context('WebAssembly available', () => {
+ it('should fulfill with true', async () => {
+ const { enableWASM } = await createWorld('./index.js', { globals: { URL, WebAssembly } });
+
+ assert.equal(await enableWASM(), true);
+ });
+ });
+
+ context('WebAssembly not available', () => {
+ it('should fulfill with false', async () => {
+ // WebAssembly must be set to undefined explicitly; otherwise
+ // createWorld() ends up using the global WebAssembly object
+ // anyway.
+ const { enableWASM } = await createWorld('./index.js', { globals: { URL, WebAssembly: undefined } });
+
+ assert.equal(await enableWASM(), false);
+ });
+ });
+});
diff -Nru ublock-origin-1.37.0+dfsg/platform/opera/manifest.json ublock-origin-1.42.0+dfsg/platform/opera/manifest.json
--- ublock-origin-1.37.0+dfsg/platform/opera/manifest.json 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/opera/manifest.json 2022-05-06 01:15:22.000000000 +0000
@@ -26,6 +26,9 @@
},
"relax-blocking-mode": {
"description": "__MSG_relaxBlockingMode__"
+ },
+ "toggle-cosmetic-filtering": {
+ "description": "__MSG_toggleCosmeticFiltering__"
}
},
"content_scripts": [
@@ -50,7 +53,8 @@
"https://filterlists.com/*",
"https://forums.lanik.us/*",
"https://github.com/*",
- "https://*.github.io/*"
+ "https://*.github.io/*",
+ "https://*.letsblock.it/*"
],
"js": [
"/js/scriptlets/subscriber.js"
@@ -69,7 +73,7 @@
},
"incognito": "split",
"manifest_version": 2,
- "minimum_opera_version": "42.0",
+ "minimum_opera_version": "53.0",
"name": "uBlock Origin",
"options_page": "dashboard.html",
"permissions": [
diff -Nru ublock-origin-1.37.0+dfsg/platform/thunderbird/manifest.json ublock-origin-1.42.0+dfsg/platform/thunderbird/manifest.json
--- ublock-origin-1.37.0+dfsg/platform/thunderbird/manifest.json 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/platform/thunderbird/manifest.json 2022-05-06 01:15:22.000000000 +0000
@@ -2,7 +2,7 @@
"applications": {
"gecko": {
"id": "uBlock0@raymondhill.net",
- "strict_min_version": "65.0"
+ "strict_min_version": "78.0"
}
},
"author": "Raymond Hill & contributors",
@@ -41,7 +41,8 @@
"https://filterlists.com/*",
"https://forums.lanik.us/*",
"https://github.com/*",
- "https://*.github.io/*"
+ "https://*.github.io/*",
+ "https://*.letsblock.it/*"
],
"js": [
"/js/scriptlets/subscriber.js"
diff -Nru ublock-origin-1.37.0+dfsg/src/1p-filters.html ublock-origin-1.42.0+dfsg/src/1p-filters.html
--- ublock-origin-1.37.0+dfsg/src/1p-filters.html 2021-08-18 18:52:39.000000000 +0000
+++ ublock-origin-1.42.0+dfsg/src/1p-filters.html 2022-05-06 01:15:22.000000000 +0000
@@ -26,11 +26,11 @@
question-circle
-
-
+
+
-
-
+
+
@@ -50,11 +50,10 @@
-
+
-
@@ -65,8 +64,7 @@
-
-
+